On Wed, Sep 29, 2021 at 11:42:54AM +0200, Jan Beulich wrote:
> 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 their dumping
> altogether for 64-bit Dom0.
I'm slightly lost by this last sentence...
> Fixes: cc0de53a903c ("x86: improve output resulting from sending '0' over
> serial")
> Signed-off-by: Jan Beulich <[email protected]>
> ---
> An alternative to suppressing the dump for 64-bit would be to make
> do_page_fault() guest-user-mode aware.
>
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -254,7 +254,6 @@ static void compat_show_guest_stack(stru
> 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(stru
> }
> 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
> {
> struct vcpu *vcpu;
>
> - ASSERT(guest_kernel_mode(v, regs));
> + if ( !guest_kernel_mode(v, regs) )
> + {
> + printk("User mode stack\n");
> + return;
> + }
...as you seem to unconditionally prevent the dump regardless of
whether it's dom0 or domU as long as it's not a kernel stack?
I assume when running in PV 64bit mode user-space could be executing a
32bit program and hence Xen could then misprint the stack as a 64bit
one?
Thanks, Roger.