mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-14 12:16:42 +07:00
1c0cd66adb
Add guest exception handling for floating point exceptions and coprocessor 1 unusable exceptions. Floating point exceptions from the guest need passing to the guest kernel, so for these a guest FPE is emulated. Also, coprocessor 1 unusable exceptions are normally passed straight through to the guest (because no guest FPU was supported), but the hypervisor can now handle them if the guest has its FPU enabled by restoring the guest FPU context and enabling the FPU. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Paul Burton <paul.burton@imgtec.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Gleb Natapov <gleb@kernel.org> Cc: linux-mips@linux-mips.org Cc: kvm@vger.kernel.org
83 lines
1.5 KiB
C
83 lines
1.5 KiB
C
/*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* KVM/MIPS: COP0 access histogram
|
|
*
|
|
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
|
* Authors: Sanjay Lal <sanjayl@kymasys.com>
|
|
*/
|
|
|
|
#include <linux/kvm_host.h>
|
|
|
|
char *kvm_mips_exit_types_str[MAX_KVM_MIPS_EXIT_TYPES] = {
|
|
"WAIT",
|
|
"CACHE",
|
|
"Signal",
|
|
"Interrupt",
|
|
"COP0/1 Unusable",
|
|
"TLB Mod",
|
|
"TLB Miss (LD)",
|
|
"TLB Miss (ST)",
|
|
"Address Err (ST)",
|
|
"Address Error (LD)",
|
|
"System Call",
|
|
"Reserved Inst",
|
|
"Break Inst",
|
|
"Trap Inst",
|
|
"FPE",
|
|
"D-Cache Flushes",
|
|
};
|
|
|
|
char *kvm_cop0_str[N_MIPS_COPROC_REGS] = {
|
|
"Index",
|
|
"Random",
|
|
"EntryLo0",
|
|
"EntryLo1",
|
|
"Context",
|
|
"PG Mask",
|
|
"Wired",
|
|
"HWREna",
|
|
"BadVAddr",
|
|
"Count",
|
|
"EntryHI",
|
|
"Compare",
|
|
"Status",
|
|
"Cause",
|
|
"EXC PC",
|
|
"PRID",
|
|
"Config",
|
|
"LLAddr",
|
|
"Watch Lo",
|
|
"Watch Hi",
|
|
"X Context",
|
|
"Reserved",
|
|
"Impl Dep",
|
|
"Debug",
|
|
"DEPC",
|
|
"PerfCnt",
|
|
"ErrCtl",
|
|
"CacheErr",
|
|
"TagLo",
|
|
"TagHi",
|
|
"ErrorEPC",
|
|
"DESAVE"
|
|
};
|
|
|
|
void kvm_mips_dump_stats(struct kvm_vcpu *vcpu)
|
|
{
|
|
#ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
|
|
int i, j;
|
|
|
|
kvm_info("\nKVM VCPU[%d] COP0 Access Profile:\n", vcpu->vcpu_id);
|
|
for (i = 0; i < N_MIPS_COPROC_REGS; i++) {
|
|
for (j = 0; j < N_MIPS_COPROC_SEL; j++) {
|
|
if (vcpu->arch.cop0->stat[i][j])
|
|
kvm_info("%s[%d]: %lu\n", kvm_cop0_str[i], j,
|
|
vcpu->arch.cop0->stat[i][j]);
|
|
}
|
|
}
|
|
#endif
|
|
}
|