]> xenbits.xensource.com Git - xen.git/commitdiff
x86/PV: replace assertions in '0' debug key stack dumping
authorJan Beulich <jbeulich@suse.com>
Tue, 19 Oct 2021 08:07:42 +0000 (10:07 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 19 Oct 2021 08:07:42 +0000 (10:07 +0200)
While it was me to add them, I'm afraid I don't see justification for
the assertions: A vCPU may very well have got preempted while in user
mode. Limit compat guest user mode stack dumps to the containing page
(like is done when using do_page_walk()), and suppress user mode stack
dumping altogether for 64-bit domains.

Fixes: cc0de53a903c ("x86: improve output resulting from sending '0' over serial")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
xen/arch/x86/traps.c

index 4f3a7131d6788be2fce548f8a4f9e9035d6bf9bd..a1c2adb7ad4b5f8d5b0f7a724d5c00312863eb5e 100644 (file)
@@ -254,7 +254,6 @@ static void compat_show_guest_stack(struct vcpu *v,
         struct vcpu *vcpu;
         unsigned long mfn;
 
-        ASSERT(guest_kernel_mode(v, regs));
         mfn = read_cr3() >> PAGE_SHIFT;
         for_each_vcpu( v->domain, vcpu )
             if ( pagetable_get_pfn(vcpu->arch.guest_table) == mfn )
@@ -269,6 +268,8 @@ static void compat_show_guest_stack(struct vcpu *v,
             }
             mask = PAGE_SIZE;
         }
+        else if ( !guest_kernel_mode(v, regs) )
+            mask = PAGE_SIZE;
     }
 
     for ( i = 0; i < debug_stack_lines * 8; i++ )
@@ -328,7 +329,12 @@ static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs)
     {
         struct vcpu *vcpu;
 
-        ASSERT(guest_kernel_mode(v, regs));
+        if ( !guest_kernel_mode(v, regs) )
+        {
+            printk("User mode stack\n");
+            return;
+        }
+
         vcpu = maddr_get_owner(read_cr3()) == v->domain ? v : NULL;
         if ( !vcpu )
         {