diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-02 16:11:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-02 16:11:27 -0400 |
commit | 221bb8a46e230b9824204ae86537183d9991ff2a (patch) | |
tree | 92510d72285b2285be7cb87288bf088cb28af4c1 /arch/mips/kernel | |
parent | f7b32e4c021fd788f13f6785e17efbc3eb05b351 (diff) | |
parent | 23528bb21ee2c9b27f3feddd77a2a3351a8df148 (diff) |
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
...
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/asm-offsets.c | 70 | ||||
-rw-r--r-- | arch/mips/kernel/branch.c | 8 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 23 |
3 files changed, 19 insertions, 82 deletions
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c index 1ea973b2abb1..fae2f9447792 100644 --- a/arch/mips/kernel/asm-offsets.c +++ b/arch/mips/kernel/asm-offsets.c | |||
@@ -339,71 +339,9 @@ void output_pm_defines(void) | |||
339 | } | 339 | } |
340 | #endif | 340 | #endif |
341 | 341 | ||
342 | void output_cpuinfo_defines(void) | ||
343 | { | ||
344 | COMMENT(" MIPS cpuinfo offsets. "); | ||
345 | DEFINE(CPUINFO_SIZE, sizeof(struct cpuinfo_mips)); | ||
346 | #ifdef CONFIG_MIPS_ASID_BITS_VARIABLE | ||
347 | OFFSET(CPUINFO_ASID_MASK, cpuinfo_mips, asid_mask); | ||
348 | #endif | ||
349 | } | ||
350 | |||
351 | void output_kvm_defines(void) | 342 | void output_kvm_defines(void) |
352 | { | 343 | { |
353 | COMMENT(" KVM/MIPS Specfic offsets. "); | 344 | COMMENT(" KVM/MIPS Specfic offsets. "); |
354 | DEFINE(VCPU_ARCH_SIZE, sizeof(struct kvm_vcpu_arch)); | ||
355 | OFFSET(VCPU_RUN, kvm_vcpu, run); | ||
356 | OFFSET(VCPU_HOST_ARCH, kvm_vcpu, arch); | ||
357 | |||
358 | OFFSET(VCPU_HOST_EBASE, kvm_vcpu_arch, host_ebase); | ||
359 | OFFSET(VCPU_GUEST_EBASE, kvm_vcpu_arch, guest_ebase); | ||
360 | |||
361 | OFFSET(VCPU_HOST_STACK, kvm_vcpu_arch, host_stack); | ||
362 | OFFSET(VCPU_HOST_GP, kvm_vcpu_arch, host_gp); | ||
363 | |||
364 | OFFSET(VCPU_HOST_CP0_BADVADDR, kvm_vcpu_arch, host_cp0_badvaddr); | ||
365 | OFFSET(VCPU_HOST_CP0_CAUSE, kvm_vcpu_arch, host_cp0_cause); | ||
366 | OFFSET(VCPU_HOST_EPC, kvm_vcpu_arch, host_cp0_epc); | ||
367 | OFFSET(VCPU_HOST_ENTRYHI, kvm_vcpu_arch, host_cp0_entryhi); | ||
368 | |||
369 | OFFSET(VCPU_GUEST_INST, kvm_vcpu_arch, guest_inst); | ||
370 | |||
371 | OFFSET(VCPU_R0, kvm_vcpu_arch, gprs[0]); | ||
372 | OFFSET(VCPU_R1, kvm_vcpu_arch, gprs[1]); | ||
373 | OFFSET(VCPU_R2, kvm_vcpu_arch, gprs[2]); | ||
374 | OFFSET(VCPU_R3, kvm_vcpu_arch, gprs[3]); | ||
375 | OFFSET(VCPU_R4, kvm_vcpu_arch, gprs[4]); | ||
376 | OFFSET(VCPU_R5, kvm_vcpu_arch, gprs[5]); | ||
377 | OFFSET(VCPU_R6, kvm_vcpu_arch, gprs[6]); | ||
378 | OFFSET(VCPU_R7, kvm_vcpu_arch, gprs[7]); | ||
379 | OFFSET(VCPU_R8, kvm_vcpu_arch, gprs[8]); | ||
380 | OFFSET(VCPU_R9, kvm_vcpu_arch, gprs[9]); | ||
381 | OFFSET(VCPU_R10, kvm_vcpu_arch, gprs[10]); | ||
382 | OFFSET(VCPU_R11, kvm_vcpu_arch, gprs[11]); | ||
383 | OFFSET(VCPU_R12, kvm_vcpu_arch, gprs[12]); | ||
384 | OFFSET(VCPU_R13, kvm_vcpu_arch, gprs[13]); | ||
385 | OFFSET(VCPU_R14, kvm_vcpu_arch, gprs[14]); | ||
386 | OFFSET(VCPU_R15, kvm_vcpu_arch, gprs[15]); | ||
387 | OFFSET(VCPU_R16, kvm_vcpu_arch, gprs[16]); | ||
388 | OFFSET(VCPU_R17, kvm_vcpu_arch, gprs[17]); | ||
389 | OFFSET(VCPU_R18, kvm_vcpu_arch, gprs[18]); | ||
390 | OFFSET(VCPU_R19, kvm_vcpu_arch, gprs[19]); | ||
391 | OFFSET(VCPU_R20, kvm_vcpu_arch, gprs[20]); | ||
392 | OFFSET(VCPU_R21, kvm_vcpu_arch, gprs[21]); | ||
393 | OFFSET(VCPU_R22, kvm_vcpu_arch, gprs[22]); | ||
394 | OFFSET(VCPU_R23, kvm_vcpu_arch, gprs[23]); | ||
395 | OFFSET(VCPU_R24, kvm_vcpu_arch, gprs[24]); | ||
396 | OFFSET(VCPU_R25, kvm_vcpu_arch, gprs[25]); | ||
397 | OFFSET(VCPU_R26, kvm_vcpu_arch, gprs[26]); | ||
398 | OFFSET(VCPU_R27, kvm_vcpu_arch, gprs[27]); | ||
399 | OFFSET(VCPU_R28, kvm_vcpu_arch, gprs[28]); | ||
400 | OFFSET(VCPU_R29, kvm_vcpu_arch, gprs[29]); | ||
401 | OFFSET(VCPU_R30, kvm_vcpu_arch, gprs[30]); | ||
402 | OFFSET(VCPU_R31, kvm_vcpu_arch, gprs[31]); | ||
403 | OFFSET(VCPU_LO, kvm_vcpu_arch, lo); | ||
404 | OFFSET(VCPU_HI, kvm_vcpu_arch, hi); | ||
405 | OFFSET(VCPU_PC, kvm_vcpu_arch, pc); | ||
406 | BLANK(); | ||
407 | 345 | ||
408 | OFFSET(VCPU_FPR0, kvm_vcpu_arch, fpu.fpr[0]); | 346 | OFFSET(VCPU_FPR0, kvm_vcpu_arch, fpu.fpr[0]); |
409 | OFFSET(VCPU_FPR1, kvm_vcpu_arch, fpu.fpr[1]); | 347 | OFFSET(VCPU_FPR1, kvm_vcpu_arch, fpu.fpr[1]); |
@@ -441,14 +379,6 @@ void output_kvm_defines(void) | |||
441 | OFFSET(VCPU_FCR31, kvm_vcpu_arch, fpu.fcr31); | 379 | OFFSET(VCPU_FCR31, kvm_vcpu_arch, fpu.fcr31); |
442 | OFFSET(VCPU_MSA_CSR, kvm_vcpu_arch, fpu.msacsr); | 380 | OFFSET(VCPU_MSA_CSR, kvm_vcpu_arch, fpu.msacsr); |
443 | BLANK(); | 381 | BLANK(); |
444 | |||
445 | OFFSET(VCPU_COP0, kvm_vcpu_arch, cop0); | ||
446 | OFFSET(VCPU_GUEST_KERNEL_ASID, kvm_vcpu_arch, guest_kernel_asid); | ||
447 | OFFSET(VCPU_GUEST_USER_ASID, kvm_vcpu_arch, guest_user_asid); | ||
448 | |||
449 | OFFSET(COP0_TLB_HI, mips_coproc, reg[MIPS_CP0_TLB_HI][0]); | ||
450 | OFFSET(COP0_STATUS, mips_coproc, reg[MIPS_CP0_STATUS][0]); | ||
451 | BLANK(); | ||
452 | } | 382 | } |
453 | 383 | ||
454 | #ifdef CONFIG_MIPS_CPS | 384 | #ifdef CONFIG_MIPS_CPS |
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c index 6dc3f1fdaccc..46c227fc98f5 100644 --- a/arch/mips/kernel/branch.c +++ b/arch/mips/kernel/branch.c | |||
@@ -790,7 +790,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs, | |||
790 | epc += 4 + (insn.i_format.simmediate << 2); | 790 | epc += 4 + (insn.i_format.simmediate << 2); |
791 | regs->cp0_epc = epc; | 791 | regs->cp0_epc = epc; |
792 | break; | 792 | break; |
793 | case beqzcjic_op: | 793 | case pop66_op: |
794 | if (!cpu_has_mips_r6) { | 794 | if (!cpu_has_mips_r6) { |
795 | ret = -SIGILL; | 795 | ret = -SIGILL; |
796 | break; | 796 | break; |
@@ -798,7 +798,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs, | |||
798 | /* Compact branch: BEQZC || JIC */ | 798 | /* Compact branch: BEQZC || JIC */ |
799 | regs->cp0_epc += 8; | 799 | regs->cp0_epc += 8; |
800 | break; | 800 | break; |
801 | case bnezcjialc_op: | 801 | case pop76_op: |
802 | if (!cpu_has_mips_r6) { | 802 | if (!cpu_has_mips_r6) { |
803 | ret = -SIGILL; | 803 | ret = -SIGILL; |
804 | break; | 804 | break; |
@@ -809,8 +809,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs, | |||
809 | regs->cp0_epc += 8; | 809 | regs->cp0_epc += 8; |
810 | break; | 810 | break; |
811 | #endif | 811 | #endif |
812 | case cbcond0_op: | 812 | case pop10_op: |
813 | case cbcond1_op: | 813 | case pop30_op: |
814 | /* Only valid for MIPS R6 */ | 814 | /* Only valid for MIPS R6 */ |
815 | if (!cpu_has_mips_r6) { | 815 | if (!cpu_has_mips_r6) { |
816 | ret = -SIGILL; | 816 | ret = -SIGILL; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 4a1712b5abdf..6fb4704bd156 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -619,17 +619,17 @@ static int simulate_rdhwr(struct pt_regs *regs, int rd, int rt) | |||
619 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, | 619 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, |
620 | 1, regs, 0); | 620 | 1, regs, 0); |
621 | switch (rd) { | 621 | switch (rd) { |
622 | case 0: /* CPU number */ | 622 | case MIPS_HWR_CPUNUM: /* CPU number */ |
623 | regs->regs[rt] = smp_processor_id(); | 623 | regs->regs[rt] = smp_processor_id(); |
624 | return 0; | 624 | return 0; |
625 | case 1: /* SYNCI length */ | 625 | case MIPS_HWR_SYNCISTEP: /* SYNCI length */ |
626 | regs->regs[rt] = min(current_cpu_data.dcache.linesz, | 626 | regs->regs[rt] = min(current_cpu_data.dcache.linesz, |
627 | current_cpu_data.icache.linesz); | 627 | current_cpu_data.icache.linesz); |
628 | return 0; | 628 | return 0; |
629 | case 2: /* Read count register */ | 629 | case MIPS_HWR_CC: /* Read count register */ |
630 | regs->regs[rt] = read_c0_count(); | 630 | regs->regs[rt] = read_c0_count(); |
631 | return 0; | 631 | return 0; |
632 | case 3: /* Count register resolution */ | 632 | case MIPS_HWR_CCRES: /* Count register resolution */ |
633 | switch (current_cpu_type()) { | 633 | switch (current_cpu_type()) { |
634 | case CPU_20KC: | 634 | case CPU_20KC: |
635 | case CPU_25KF: | 635 | case CPU_25KF: |
@@ -639,7 +639,7 @@ static int simulate_rdhwr(struct pt_regs *regs, int rd, int rt) | |||
639 | regs->regs[rt] = 2; | 639 | regs->regs[rt] = 2; |
640 | } | 640 | } |
641 | return 0; | 641 | return 0; |
642 | case 29: | 642 | case MIPS_HWR_ULR: /* Read UserLocal register */ |
643 | regs->regs[rt] = ti->tp_value; | 643 | regs->regs[rt] = ti->tp_value; |
644 | return 0; | 644 | return 0; |
645 | default: | 645 | default: |
@@ -1859,6 +1859,7 @@ void __noreturn nmi_exception_handler(struct pt_regs *regs) | |||
1859 | #define VECTORSPACING 0x100 /* for EI/VI mode */ | 1859 | #define VECTORSPACING 0x100 /* for EI/VI mode */ |
1860 | 1860 | ||
1861 | unsigned long ebase; | 1861 | unsigned long ebase; |
1862 | EXPORT_SYMBOL_GPL(ebase); | ||
1862 | unsigned long exception_handlers[32]; | 1863 | unsigned long exception_handlers[32]; |
1863 | unsigned long vi_handlers[64]; | 1864 | unsigned long vi_handlers[64]; |
1864 | 1865 | ||
@@ -2063,16 +2064,22 @@ static void configure_status(void) | |||
2063 | status_set); | 2064 | status_set); |
2064 | } | 2065 | } |
2065 | 2066 | ||
2067 | unsigned int hwrena; | ||
2068 | EXPORT_SYMBOL_GPL(hwrena); | ||
2069 | |||
2066 | /* configure HWRENA register */ | 2070 | /* configure HWRENA register */ |
2067 | static void configure_hwrena(void) | 2071 | static void configure_hwrena(void) |
2068 | { | 2072 | { |
2069 | unsigned int hwrena = cpu_hwrena_impl_bits; | 2073 | hwrena = cpu_hwrena_impl_bits; |
2070 | 2074 | ||
2071 | if (cpu_has_mips_r2_r6) | 2075 | if (cpu_has_mips_r2_r6) |
2072 | hwrena |= 0x0000000f; | 2076 | hwrena |= MIPS_HWRENA_CPUNUM | |
2077 | MIPS_HWRENA_SYNCISTEP | | ||
2078 | MIPS_HWRENA_CC | | ||
2079 | MIPS_HWRENA_CCRES; | ||
2073 | 2080 | ||
2074 | if (!noulri && cpu_has_userlocal) | 2081 | if (!noulri && cpu_has_userlocal) |
2075 | hwrena |= (1 << 29); | 2082 | hwrena |= MIPS_HWRENA_ULR; |
2076 | 2083 | ||
2077 | if (hwrena) | 2084 | if (hwrena) |
2078 | write_c0_hwrena(hwrena); | 2085 | write_c0_hwrena(hwrena); |