Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: MIPS/VZ: Handle Octeon III guest.PRid register

Octeon III implements a read-only guest CP0_PRid register, so add cases
to the KVM register access API for Octeon to ensure the correct value is
read and writes are ignored.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: David Daney <david.daney@cavium.com>
Cc: Andreas Herrmann <andreas.herrmann@caviumnetworks.com>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org

+19 -2
+2
arch/mips/include/asm/mipsregs.h
··· 2025 2025 #define read_gc0_epc() __read_ulong_gc0_register(14, 0) 2026 2026 #define write_gc0_epc(val) __write_ulong_gc0_register(14, 0, val) 2027 2027 2028 + #define read_gc0_prid() __read_32bit_gc0_register(15, 0) 2029 + 2028 2030 #define read_gc0_ebase() __read_32bit_gc0_register(15, 1) 2029 2031 #define write_gc0_ebase(val) __write_32bit_gc0_register(15, 1, val) 2030 2032
+17 -2
arch/mips/kvm/vz.c
··· 1938 1938 *v = (long)read_gc0_epc(); 1939 1939 break; 1940 1940 case KVM_REG_MIPS_CP0_PRID: 1941 - *v = (long)kvm_read_c0_guest_prid(cop0); 1941 + switch (boot_cpu_type()) { 1942 + case CPU_CAVIUM_OCTEON3: 1943 + /* Octeon III has a read-only guest.PRid */ 1944 + *v = read_gc0_prid(); 1945 + break; 1946 + default: 1947 + *v = (long)kvm_read_c0_guest_prid(cop0); 1948 + break; 1949 + }; 1942 1950 break; 1943 1951 case KVM_REG_MIPS_CP0_EBASE: 1944 1952 *v = kvm_vz_read_gc0_ebase(); ··· 2178 2170 write_gc0_epc(v); 2179 2171 break; 2180 2172 case KVM_REG_MIPS_CP0_PRID: 2181 - kvm_write_c0_guest_prid(cop0, v); 2173 + switch (boot_cpu_type()) { 2174 + case CPU_CAVIUM_OCTEON3: 2175 + /* Octeon III has a guest.PRid, but its read-only */ 2176 + break; 2177 + default: 2178 + kvm_write_c0_guest_prid(cop0, v); 2179 + break; 2180 + }; 2182 2181 break; 2183 2182 case KVM_REG_MIPS_CP0_EBASE: 2184 2183 kvm_vz_write_gc0_ebase(v);