aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-08-02 16:11:27 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-08-02 16:11:27 -0400
commit221bb8a46e230b9824204ae86537183d9991ff2a (patch)
tree92510d72285b2285be7cb87288bf088cb28af4c1 /arch/mips/kernel
parentf7b32e4c021fd788f13f6785e17efbc3eb05b351 (diff)
parent23528bb21ee2c9b27f3feddd77a2a3351a8df148 (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.c70
-rw-r--r--arch/mips/kernel/branch.c8
-rw-r--r--arch/mips/kernel/traps.c23
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
342void 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
351void output_kvm_defines(void) 342void 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
1861unsigned long ebase; 1861unsigned long ebase;
1862EXPORT_SYMBOL_GPL(ebase);
1862unsigned long exception_handlers[32]; 1863unsigned long exception_handlers[32];
1863unsigned long vi_handlers[64]; 1864unsigned 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
2067unsigned int hwrena;
2068EXPORT_SYMBOL_GPL(hwrena);
2069
2066/* configure HWRENA register */ 2070/* configure HWRENA register */
2067static void configure_hwrena(void) 2071static 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);