x86/hvm: Raise #SS faults for %ss-based segmentation violations

Raising #GP under such circumstances is architecturally wrong.

Refer to the Intel or AMD manuals describing faults, and the conditions
under which #SS is raised.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Tim Deegan <tim@xen.org>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Andrew Cooper committed 2016-05-10 18:08:50 +01:00
1 parent 60935158cb
commit a94b35dded
2 files changed
+4 -2

No files matched your search

+2 -1
View File
@@ -566,7 +566,8 @@ static int hvmemul_virtual_to_linear(
/* This is a singleton operation: fail it with an exception. */
hvmemul_ctxt->exn_pending = 1;
hvmemul_ctxt->trap.vector = TRAP_gp_fault;
hvmemul_ctxt->trap.vector =
(seg == x86_seg_ss) ? TRAP_stack_error : TRAP_gp_fault;
hvmemul_ctxt->trap.type = X86_EVENTTYPE_HW_EXCEPTION;
hvmemul_ctxt->trap.error_code = 0;
hvmemul_ctxt->trap.insn_len = 0;
+2 -1
View File
@@ -148,7 +148,8 @@ static int hvm_translate_linear_addr(
if ( !okay )
{
hvm_inject_hw_exception(TRAP_gp_fault, 0);
hvm_inject_hw_exception(
(seg == x86_seg_ss) ? TRAP_stack_error : TRAP_gp_fault, 0);
return X86EMUL_EXCEPTION;
}
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.