From dfcf494f96671a9d3ee2fed70250ef1eedc1c00e Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 9 Apr 2021 09:12:51 +0200 Subject: [PATCH] x86: refine guest_mode() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Jan Beulich Reviewed-by: Roger Pau Monné --- xen/include/asm-x86/regs.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xen/include/asm-x86/regs.h b/xen/include/asm-x86/regs.h index 8d984ea388..3fb94deedc 100644 --- a/xen/include/asm-x86/regs.h +++ b/xen/include/asm-x86/regs.h @@ -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) ({ \ -- 2.30.2