MIPS: KVM: Don't hardcode restored HWREna
authorJames Hogan <james.hogan@imgtec.com>
Wed, 15 Jun 2016 18:29:53 +0000 (19:29 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 15 Jun 2016 21:58:31 +0000 (23:58 +0200)
KVM modifies CP0_HWREna during guest execution so it can trap and
emulate RDHWR instructions, however it always restores the hardcoded
value 0x2000000F. This assumes the presence of the UserLocal register,
and the absence of any implementation dependent or future HW registers.

Fix by exporting the value that traps.c write into CP0_HWREna, and
loading from there instead of hard coding.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/mips/include/asm/setup.h
arch/mips/kernel/traps.c
arch/mips/kvm/locore.S

index d7bfdeba9e845acfa83270f01bb280a687d785ad..4f5279a8308d7cd1138f873586b0e38eba488ee7 100644 (file)
@@ -21,6 +21,7 @@ extern void *set_vi_handler(int n, vi_handler_t addr);
 
 extern void *set_except_vector(int n, void *addr);
 extern unsigned long ebase;
+extern unsigned int hwrena;
 extern void per_cpu_trap_init(bool);
 extern void cpu_cache_init(void);
 
index 7176a6057e26d63bdb41cd8762082588ffb5cd60..6fb4704bd156adeabf8cead8509a6058745a9960 100644 (file)
@@ -2064,10 +2064,13 @@ 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 |= MIPS_HWRENA_CPUNUM |
index f87bec546366f2e211d792f03367457b522d1540..698286c0f7323f80c1cec409c66beb0097fca3e2 100644 (file)
@@ -381,7 +381,7 @@ NESTED (MIPSX(GuestException), CALLFRAME_SIZ, ra)
        mtc0    k0, CP0_DDATA_LO
 
        /* Restore RDHWR access */
-       PTR_LI  k0, 0x2000000F
+       INT_L   k0, hwrena
        mtc0    k0, CP0_HWRENA
 
        /* Jump to handler */
@@ -553,7 +553,7 @@ __kvm_mips_return_to_host:
        mtlo    k0
 
        /* Restore RDHWR access */
-       PTR_LI  k0, 0x2000000F
+       INT_L   k0, hwrena
        mtc0    k0, CP0_HWRENA
 
        /* Restore RA, which is the address we will return to */