forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Paolo Bonzini: "Much x86 work was pushed out to 5.12, but ARM more than made up for it. ARM: - PSCI relay at EL2 when "protected KVM" is enabled - New exception injection code - Simplification of AArch32 system register handling - Fix PMU accesses when no PMU is enabled - Expose CSV3 on non-Meltdown hosts - Cache hierarchy discovery fixes - PV steal-time cleanups - Allow function pointers at EL2 - Various host EL2 entry cleanups - Simplification of the EL2 vector allocation s390: - memcg accouting for s390 specific parts of kvm and gmap - selftest for diag318 - new kvm_stat for when async_pf falls back to sync x86: - Tracepoints for the new pagetable code from 5.10 - Catch VFIO and KVM irqfd events before userspace - Reporting dirty pages to userspace with a ring buffer - SEV-ES host support - Nested VMX support for wait-for-SIPI activity state - New feature flag (AVX512 FP16) - New system ioctl to report Hyper-V-compatible paravirtualization features Generic: - Selftest improvements" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (171 commits) KVM: SVM: fix 32-bit compilation KVM: SVM: Add AP_JUMP_TABLE support in prep for AP booting KVM: SVM: Provide support to launch and run an SEV-ES guest KVM: SVM: Provide an updated VMRUN invocation for SEV-ES guests KVM: SVM: Provide support for SEV-ES vCPU loading KVM: SVM: Provide support for SEV-ES vCPU creation/loading KVM: SVM: Update ASID allocation to support SEV-ES guests KVM: SVM: Set the encryption mask for the SVM host save area KVM: SVM: Add NMI support for an SEV-ES guest KVM: SVM: Guest FPU state save/restore not needed for SEV-ES guest KVM: SVM: Do not report support for SMM for an SEV-ES guest KVM: x86: Update __get_sregs() / __set_sregs() to support SEV-ES KVM: SVM: Add support for CR8 write traps for an SEV-ES guest KVM: SVM: Add support for CR4 write traps for an SEV-ES guest KVM: SVM: Add support for CR0 write traps for an SEV-ES guest KVM: SVM: Add support for EFER write traps for an SEV-ES guest KVM: SVM: Support string IO operations for an SEV-ES guest KVM: SVM: Support MMIO for an SEV-ES guest KVM: SVM: Create trace events for VMGEXIT MSR protocol processing KVM: SVM: Create trace events for VMGEXIT processing ...
- Loading branch information
Showing
171 changed files
with
7,242 additions
and
2,750 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* Copyright (C) 2012,2013 - ARM Ltd | ||
* Author: Marc Zyngier <[email protected]> | ||
*/ | ||
|
||
#ifndef __ARM_KVM_INIT_H__ | ||
#define __ARM_KVM_INIT_H__ | ||
|
||
#ifndef __ASSEMBLY__ | ||
#error Assembly-only header | ||
#endif | ||
|
||
#include <asm/kvm_arm.h> | ||
#include <asm/ptrace.h> | ||
#include <asm/sysreg.h> | ||
#include <linux/irqchip/arm-gic-v3.h> | ||
|
||
.macro __init_el2_sctlr | ||
mov_q x0, INIT_SCTLR_EL2_MMU_OFF | ||
msr sctlr_el2, x0 | ||
isb | ||
.endm | ||
|
||
/* | ||
* Allow Non-secure EL1 and EL0 to access physical timer and counter. | ||
* This is not necessary for VHE, since the host kernel runs in EL2, | ||
* and EL0 accesses are configured in the later stage of boot process. | ||
* Note that when HCR_EL2.E2H == 1, CNTHCTL_EL2 has the same bit layout | ||
* as CNTKCTL_EL1, and CNTKCTL_EL1 accessing instructions are redefined | ||
* to access CNTHCTL_EL2. This allows the kernel designed to run at EL1 | ||
* to transparently mess with the EL0 bits via CNTKCTL_EL1 access in | ||
* EL2. | ||
*/ | ||
.macro __init_el2_timers mode | ||
.ifeqs "\mode", "nvhe" | ||
mrs x0, cnthctl_el2 | ||
orr x0, x0, #3 // Enable EL1 physical timers | ||
msr cnthctl_el2, x0 | ||
.endif | ||
msr cntvoff_el2, xzr // Clear virtual offset | ||
.endm | ||
|
||
.macro __init_el2_debug mode | ||
mrs x1, id_aa64dfr0_el1 | ||
sbfx x0, x1, #ID_AA64DFR0_PMUVER_SHIFT, #4 | ||
cmp x0, #1 | ||
b.lt 1f // Skip if no PMU present | ||
mrs x0, pmcr_el0 // Disable debug access traps | ||
ubfx x0, x0, #11, #5 // to EL2 and allow access to | ||
1: | ||
csel x2, xzr, x0, lt // all PMU counters from EL1 | ||
|
||
/* Statistical profiling */ | ||
ubfx x0, x1, #ID_AA64DFR0_PMSVER_SHIFT, #4 | ||
cbz x0, 3f // Skip if SPE not present | ||
|
||
.ifeqs "\mode", "nvhe" | ||
mrs_s x0, SYS_PMBIDR_EL1 // If SPE available at EL2, | ||
and x0, x0, #(1 << SYS_PMBIDR_EL1_P_SHIFT) | ||
cbnz x0, 2f // then permit sampling of physical | ||
mov x0, #(1 << SYS_PMSCR_EL2_PCT_SHIFT | \ | ||
1 << SYS_PMSCR_EL2_PA_SHIFT) | ||
msr_s SYS_PMSCR_EL2, x0 // addresses and physical counter | ||
2: | ||
mov x0, #(MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT) | ||
orr x2, x2, x0 // If we don't have VHE, then | ||
// use EL1&0 translation. | ||
.else | ||
orr x2, x2, #MDCR_EL2_TPMS // For VHE, use EL2 translation | ||
// and disable access from EL1 | ||
.endif | ||
|
||
3: | ||
msr mdcr_el2, x2 // Configure debug traps | ||
.endm | ||
|
||
/* LORegions */ | ||
.macro __init_el2_lor | ||
mrs x1, id_aa64mmfr1_el1 | ||
ubfx x0, x1, #ID_AA64MMFR1_LOR_SHIFT, 4 | ||
cbz x0, 1f | ||
msr_s SYS_LORC_EL1, xzr | ||
1: | ||
.endm | ||
|
||
/* Stage-2 translation */ | ||
.macro __init_el2_stage2 | ||
msr vttbr_el2, xzr | ||
.endm | ||
|
||
/* GICv3 system register access */ | ||
.macro __init_el2_gicv3 | ||
mrs x0, id_aa64pfr0_el1 | ||
ubfx x0, x0, #ID_AA64PFR0_GIC_SHIFT, #4 | ||
cbz x0, 1f | ||
|
||
mrs_s x0, SYS_ICC_SRE_EL2 | ||
orr x0, x0, #ICC_SRE_EL2_SRE // Set ICC_SRE_EL2.SRE==1 | ||
orr x0, x0, #ICC_SRE_EL2_ENABLE // Set ICC_SRE_EL2.Enable==1 | ||
msr_s SYS_ICC_SRE_EL2, x0 | ||
isb // Make sure SRE is now set | ||
mrs_s x0, SYS_ICC_SRE_EL2 // Read SRE back, | ||
tbz x0, #0, 1f // and check that it sticks | ||
msr_s SYS_ICH_HCR_EL2, xzr // Reset ICC_HCR_EL2 to defaults | ||
1: | ||
.endm | ||
|
||
.macro __init_el2_hstr | ||
msr hstr_el2, xzr // Disable CP15 traps to EL2 | ||
.endm | ||
|
||
/* Virtual CPU ID registers */ | ||
.macro __init_el2_nvhe_idregs | ||
mrs x0, midr_el1 | ||
mrs x1, mpidr_el1 | ||
msr vpidr_el2, x0 | ||
msr vmpidr_el2, x1 | ||
.endm | ||
|
||
/* Coprocessor traps */ | ||
.macro __init_el2_nvhe_cptr | ||
mov x0, #0x33ff | ||
msr cptr_el2, x0 // Disable copro. traps to EL2 | ||
.endm | ||
|
||
/* SVE register access */ | ||
.macro __init_el2_nvhe_sve | ||
mrs x1, id_aa64pfr0_el1 | ||
ubfx x1, x1, #ID_AA64PFR0_SVE_SHIFT, #4 | ||
cbz x1, 1f | ||
|
||
bic x0, x0, #CPTR_EL2_TZ // Also disable SVE traps | ||
msr cptr_el2, x0 // Disable copro. traps to EL2 | ||
isb | ||
mov x1, #ZCR_ELx_LEN_MASK // SVE: Enable full vector | ||
msr_s SYS_ZCR_EL2, x1 // length for EL1. | ||
1: | ||
.endm | ||
|
||
.macro __init_el2_nvhe_prepare_eret | ||
mov x0, #INIT_PSTATE_EL1 | ||
msr spsr_el2, x0 | ||
.endm | ||
|
||
/** | ||
* Initialize EL2 registers to sane values. This should be called early on all | ||
* cores that were booted in EL2. | ||
* | ||
* Regs: x0, x1 and x2 are clobbered. | ||
*/ | ||
.macro init_el2_state mode | ||
.ifnes "\mode", "vhe" | ||
.ifnes "\mode", "nvhe" | ||
.error "Invalid 'mode' argument" | ||
.endif | ||
.endif | ||
|
||
__init_el2_sctlr | ||
__init_el2_timers \mode | ||
__init_el2_debug \mode | ||
__init_el2_lor | ||
__init_el2_stage2 | ||
__init_el2_gicv3 | ||
__init_el2_hstr | ||
|
||
/* | ||
* When VHE is not in use, early init of EL2 needs to be done here. | ||
* When VHE _is_ in use, EL1 will not be used in the host and | ||
* requires no configuration, and all non-hyp-specific EL2 setup | ||
* will be done via the _EL1 system register aliases in __cpu_setup. | ||
*/ | ||
.ifeqs "\mode", "nvhe" | ||
__init_el2_nvhe_idregs | ||
__init_el2_nvhe_cptr | ||
__init_el2_nvhe_sve | ||
__init_el2_nvhe_prepare_eret | ||
.endif | ||
.endm | ||
|
||
#endif /* __ARM_KVM_INIT_H__ */ |
Oops, something went wrong.