x86/emul: Move CPUID Faulting fault generation into the emulator

In hindsight, this is a better position for it, as it avoids opencoding
hvmemul_inject_hw_exception() in hvmemul_cpuid(), and reduces the requirements
on other ops->cpuid() hooks wanting to implement cpuid faulting in the future.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Andrew Cooper committed 2016-10-26 14:41:37 +01:00
1 parent 0888d36bb2
commit 9f47f3d69f
3 files changed
+10 -13

No files matched your search

-11
View File
@@ -1556,18 +1556,7 @@ static int hvmemul_cpuid(
*/
if ( ctxt->opcode == X86EMUL_OPC(0x0f, 0xa2) &&
hvm_check_cpuid_faulting(current) )
{
struct hvm_emulate_ctxt *hvmemul_ctxt =
container_of(ctxt, struct hvm_emulate_ctxt, ctxt);
hvmemul_ctxt->exn_pending = 1;
hvmemul_ctxt->trap.vector = TRAP_gp_fault;
hvmemul_ctxt->trap.type = X86_EVENTTYPE_HW_EXCEPTION;
hvmemul_ctxt->trap.error_code = 0;
hvmemul_ctxt->trap.insn_len = 0;
return X86EMUL_EXCEPTION;
}
hvm_funcs.cpuid_intercept(eax, ebx, ecx, edx);
return X86EMUL_OKAY;
+4 -1
View File
@@ -4995,7 +4995,10 @@ x86_emulate(
unsigned int eax = _regs.eax, ebx = _regs.ebx;
unsigned int ecx = _regs.ecx, edx = _regs.edx;
fail_if(ops->cpuid == NULL);
if ( (rc = ops->cpuid(&eax, &ebx, &ecx, &edx, ctxt)) != 0 )
rc = ops->cpuid(&eax, &ebx, &ecx, &edx, ctxt);
generate_exception_if(rc == X86EMUL_EXCEPTION,
EXC_GP, 0); /* CPUID Faulting? */
if ( rc != X86EMUL_OKAY )
goto done;
_regs.eax = eax; _regs.ebx = ebx;
_regs.ecx = ecx; _regs.edx = edx;
+6 -1
View File
@@ -352,7 +352,12 @@ struct x86_emulate_ops
int (*wbinvd)(
struct x86_emulate_ctxt *ctxt);
/* cpuid: Emulate CPUID via given set of EAX-EDX inputs/outputs. */
/*
* cpuid: Emulate CPUID via given set of EAX-EDX inputs/outputs.
*
* May return X86EMUL_EXCEPTION, which causes the emulator to inject
* #GP[0]. Used to implement CPUID faulting.
*/
int (*cpuid)(
unsigned int *eax,
unsigned int *ebx,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.