x86: refine guest_mode()

The 2nd of the assertions as well as the macro's return value have been
assuming we're on the primary stack. While for most IST exceptions we
switch back to the main one when user mode was interrupted, for #DF we
intentionally never do, and hence a #DF actually triggering on a user
mode insn (which then is still a Xen bug) would in turn trigger this
assertion, rather than cleanly logging state.

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
Jan Beulich committed 2021-04-09 09:12:51 +02:00
1 parent 025eacc13f
commit dfcf494f96
1 file changed
+3 -2
+3 -2
View File
@@ -10,9 +10,10 @@
/* Frame pointer must point into current CPU stack. */ \
ASSERT(diff < STACK_SIZE); \
/* If not a guest frame, it must be a hypervisor frame. */ \
ASSERT((diff == 0) || (r->cs == __HYPERVISOR_CS)); \
if ( diff < PRIMARY_STACK_SIZE ) \
ASSERT(!diff || ((r)->cs == __HYPERVISOR_CS)); \
/* Return TRUE if it's a guest frame. */ \
(diff == 0); \
!diff || ((r)->cs != __HYPERVISOR_CS); \
})
#define read_sreg(name) ({ \
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.