Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Paolo Bonzini: - ARM: GICv3 ITS emulation and various fixes. Removal of the old VGIC implementation. - s390: support for trapping software breakpoints, nested virtualization (vSIE), the STHYI opcode, initial extensions for CPU model support. - MIPS: support for MIPS64 hosts (32-bit guests only) and lots of cleanups, preliminary to this and the upcoming support for hardware virtualization extensions. - x86: support for execute-only mappings in nested EPT; reduced vmexit latency for TSC deadline timer (by about 30%) on Intel hosts; support for more than 255 vCPUs. - PPC: bugfixes. * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (302 commits) KVM: PPC: Introduce KVM_CAP_PPC_HTM MIPS: Select HAVE_KVM for MIPS64_R{2,6} MIPS: KVM: Reset CP0_PageMask during host TLB flush MIPS: KVM: Fix ptr->int cast via KVM_GUEST_KSEGX() MIPS: KVM: Sign extend MFC0/RDHWR results MIPS: KVM: Fix 64-bit big endian dynamic translation MIPS: KVM: Fail if ebase doesn't fit in CP0_EBase MIPS: KVM: Use 64-bit CP0_EBase when appropriate MIPS: KVM: Set CP0_Status.KX on MIPS64 MIPS: KVM: Make entry code MIPS64 friendly MIPS: KVM: Use kmap instead of CKSEG0ADDR() MIPS: KVM: Use virt_to_phys() to get commpage PFN MIPS: Fix definition of KSEGX() for 64-bit KVM: VMX: Add VMCS to CPU's loaded VMCSs before VMPTRLD kvm: x86: nVMX: maintain internal copy of current VMCS KVM: PPC: Book3S HV: Save/restore TM state in H_CEDE KVM: PPC: Book3S HV: Pull out TM state save/restore into separate procedures KVM: arm64: vgic-its: Simplify MAPI error handling KVM: arm64: vgic-its: Make vgic_its_cmd_handle_mapi similar to other handlers KVM: arm64: vgic-its: Turn device_id validation into generic ID validation ...
This commit is contained in:
@@ -339,71 +339,9 @@ void output_pm_defines(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void output_cpuinfo_defines(void)
|
||||
{
|
||||
COMMENT(" MIPS cpuinfo offsets. ");
|
||||
DEFINE(CPUINFO_SIZE, sizeof(struct cpuinfo_mips));
|
||||
#ifdef CONFIG_MIPS_ASID_BITS_VARIABLE
|
||||
OFFSET(CPUINFO_ASID_MASK, cpuinfo_mips, asid_mask);
|
||||
#endif
|
||||
}
|
||||
|
||||
void output_kvm_defines(void)
|
||||
{
|
||||
COMMENT(" KVM/MIPS Specfic offsets. ");
|
||||
DEFINE(VCPU_ARCH_SIZE, sizeof(struct kvm_vcpu_arch));
|
||||
OFFSET(VCPU_RUN, kvm_vcpu, run);
|
||||
OFFSET(VCPU_HOST_ARCH, kvm_vcpu, arch);
|
||||
|
||||
OFFSET(VCPU_HOST_EBASE, kvm_vcpu_arch, host_ebase);
|
||||
OFFSET(VCPU_GUEST_EBASE, kvm_vcpu_arch, guest_ebase);
|
||||
|
||||
OFFSET(VCPU_HOST_STACK, kvm_vcpu_arch, host_stack);
|
||||
OFFSET(VCPU_HOST_GP, kvm_vcpu_arch, host_gp);
|
||||
|
||||
OFFSET(VCPU_HOST_CP0_BADVADDR, kvm_vcpu_arch, host_cp0_badvaddr);
|
||||
OFFSET(VCPU_HOST_CP0_CAUSE, kvm_vcpu_arch, host_cp0_cause);
|
||||
OFFSET(VCPU_HOST_EPC, kvm_vcpu_arch, host_cp0_epc);
|
||||
OFFSET(VCPU_HOST_ENTRYHI, kvm_vcpu_arch, host_cp0_entryhi);
|
||||
|
||||
OFFSET(VCPU_GUEST_INST, kvm_vcpu_arch, guest_inst);
|
||||
|
||||
OFFSET(VCPU_R0, kvm_vcpu_arch, gprs[0]);
|
||||
OFFSET(VCPU_R1, kvm_vcpu_arch, gprs[1]);
|
||||
OFFSET(VCPU_R2, kvm_vcpu_arch, gprs[2]);
|
||||
OFFSET(VCPU_R3, kvm_vcpu_arch, gprs[3]);
|
||||
OFFSET(VCPU_R4, kvm_vcpu_arch, gprs[4]);
|
||||
OFFSET(VCPU_R5, kvm_vcpu_arch, gprs[5]);
|
||||
OFFSET(VCPU_R6, kvm_vcpu_arch, gprs[6]);
|
||||
OFFSET(VCPU_R7, kvm_vcpu_arch, gprs[7]);
|
||||
OFFSET(VCPU_R8, kvm_vcpu_arch, gprs[8]);
|
||||
OFFSET(VCPU_R9, kvm_vcpu_arch, gprs[9]);
|
||||
OFFSET(VCPU_R10, kvm_vcpu_arch, gprs[10]);
|
||||
OFFSET(VCPU_R11, kvm_vcpu_arch, gprs[11]);
|
||||
OFFSET(VCPU_R12, kvm_vcpu_arch, gprs[12]);
|
||||
OFFSET(VCPU_R13, kvm_vcpu_arch, gprs[13]);
|
||||
OFFSET(VCPU_R14, kvm_vcpu_arch, gprs[14]);
|
||||
OFFSET(VCPU_R15, kvm_vcpu_arch, gprs[15]);
|
||||
OFFSET(VCPU_R16, kvm_vcpu_arch, gprs[16]);
|
||||
OFFSET(VCPU_R17, kvm_vcpu_arch, gprs[17]);
|
||||
OFFSET(VCPU_R18, kvm_vcpu_arch, gprs[18]);
|
||||
OFFSET(VCPU_R19, kvm_vcpu_arch, gprs[19]);
|
||||
OFFSET(VCPU_R20, kvm_vcpu_arch, gprs[20]);
|
||||
OFFSET(VCPU_R21, kvm_vcpu_arch, gprs[21]);
|
||||
OFFSET(VCPU_R22, kvm_vcpu_arch, gprs[22]);
|
||||
OFFSET(VCPU_R23, kvm_vcpu_arch, gprs[23]);
|
||||
OFFSET(VCPU_R24, kvm_vcpu_arch, gprs[24]);
|
||||
OFFSET(VCPU_R25, kvm_vcpu_arch, gprs[25]);
|
||||
OFFSET(VCPU_R26, kvm_vcpu_arch, gprs[26]);
|
||||
OFFSET(VCPU_R27, kvm_vcpu_arch, gprs[27]);
|
||||
OFFSET(VCPU_R28, kvm_vcpu_arch, gprs[28]);
|
||||
OFFSET(VCPU_R29, kvm_vcpu_arch, gprs[29]);
|
||||
OFFSET(VCPU_R30, kvm_vcpu_arch, gprs[30]);
|
||||
OFFSET(VCPU_R31, kvm_vcpu_arch, gprs[31]);
|
||||
OFFSET(VCPU_LO, kvm_vcpu_arch, lo);
|
||||
OFFSET(VCPU_HI, kvm_vcpu_arch, hi);
|
||||
OFFSET(VCPU_PC, kvm_vcpu_arch, pc);
|
||||
BLANK();
|
||||
|
||||
OFFSET(VCPU_FPR0, kvm_vcpu_arch, fpu.fpr[0]);
|
||||
OFFSET(VCPU_FPR1, kvm_vcpu_arch, fpu.fpr[1]);
|
||||
@@ -441,14 +379,6 @@ void output_kvm_defines(void)
|
||||
OFFSET(VCPU_FCR31, kvm_vcpu_arch, fpu.fcr31);
|
||||
OFFSET(VCPU_MSA_CSR, kvm_vcpu_arch, fpu.msacsr);
|
||||
BLANK();
|
||||
|
||||
OFFSET(VCPU_COP0, kvm_vcpu_arch, cop0);
|
||||
OFFSET(VCPU_GUEST_KERNEL_ASID, kvm_vcpu_arch, guest_kernel_asid);
|
||||
OFFSET(VCPU_GUEST_USER_ASID, kvm_vcpu_arch, guest_user_asid);
|
||||
|
||||
OFFSET(COP0_TLB_HI, mips_coproc, reg[MIPS_CP0_TLB_HI][0]);
|
||||
OFFSET(COP0_STATUS, mips_coproc, reg[MIPS_CP0_STATUS][0]);
|
||||
BLANK();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MIPS_CPS
|
||||
|
@@ -790,7 +790,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
||||
epc += 4 + (insn.i_format.simmediate << 2);
|
||||
regs->cp0_epc = epc;
|
||||
break;
|
||||
case beqzcjic_op:
|
||||
case pop66_op:
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
@@ -798,7 +798,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
||||
/* Compact branch: BEQZC || JIC */
|
||||
regs->cp0_epc += 8;
|
||||
break;
|
||||
case bnezcjialc_op:
|
||||
case pop76_op:
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
@@ -809,8 +809,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
||||
regs->cp0_epc += 8;
|
||||
break;
|
||||
#endif
|
||||
case cbcond0_op:
|
||||
case cbcond1_op:
|
||||
case pop10_op:
|
||||
case pop30_op:
|
||||
/* Only valid for MIPS R6 */
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
|
@@ -619,17 +619,17 @@ static int simulate_rdhwr(struct pt_regs *regs, int rd, int rt)
|
||||
perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,
|
||||
1, regs, 0);
|
||||
switch (rd) {
|
||||
case 0: /* CPU number */
|
||||
case MIPS_HWR_CPUNUM: /* CPU number */
|
||||
regs->regs[rt] = smp_processor_id();
|
||||
return 0;
|
||||
case 1: /* SYNCI length */
|
||||
case MIPS_HWR_SYNCISTEP: /* SYNCI length */
|
||||
regs->regs[rt] = min(current_cpu_data.dcache.linesz,
|
||||
current_cpu_data.icache.linesz);
|
||||
return 0;
|
||||
case 2: /* Read count register */
|
||||
case MIPS_HWR_CC: /* Read count register */
|
||||
regs->regs[rt] = read_c0_count();
|
||||
return 0;
|
||||
case 3: /* Count register resolution */
|
||||
case MIPS_HWR_CCRES: /* Count register resolution */
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_20KC:
|
||||
case CPU_25KF:
|
||||
@@ -639,7 +639,7 @@ static int simulate_rdhwr(struct pt_regs *regs, int rd, int rt)
|
||||
regs->regs[rt] = 2;
|
||||
}
|
||||
return 0;
|
||||
case 29:
|
||||
case MIPS_HWR_ULR: /* Read UserLocal register */
|
||||
regs->regs[rt] = ti->tp_value;
|
||||
return 0;
|
||||
default:
|
||||
@@ -1859,6 +1859,7 @@ void __noreturn nmi_exception_handler(struct pt_regs *regs)
|
||||
#define VECTORSPACING 0x100 /* for EI/VI mode */
|
||||
|
||||
unsigned long ebase;
|
||||
EXPORT_SYMBOL_GPL(ebase);
|
||||
unsigned long exception_handlers[32];
|
||||
unsigned long vi_handlers[64];
|
||||
|
||||
@@ -2063,16 +2064,22 @@ static void configure_status(void)
|
||||
status_set);
|
||||
}
|
||||
|
||||
unsigned int hwrena;
|
||||
EXPORT_SYMBOL_GPL(hwrena);
|
||||
|
||||
/* configure HWRENA register */
|
||||
static void configure_hwrena(void)
|
||||
{
|
||||
unsigned int hwrena = cpu_hwrena_impl_bits;
|
||||
hwrena = cpu_hwrena_impl_bits;
|
||||
|
||||
if (cpu_has_mips_r2_r6)
|
||||
hwrena |= 0x0000000f;
|
||||
hwrena |= MIPS_HWRENA_CPUNUM |
|
||||
MIPS_HWRENA_SYNCISTEP |
|
||||
MIPS_HWRENA_CC |
|
||||
MIPS_HWRENA_CCRES;
|
||||
|
||||
if (!noulri && cpu_has_userlocal)
|
||||
hwrena |= (1 << 29);
|
||||
hwrena |= MIPS_HWRENA_ULR;
|
||||
|
||||
if (hwrena)
|
||||
write_c0_hwrena(hwrena);
|
||||
|
مرجع در شماره جدید
Block a user