Re: [PATCH] x86/domctl: restore all registers in arch_{get,set}_info_guest()
Frediano Ziglio <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <CAHt6W4derNf71m6hjB=8DOeghtSQ6N+sMenJZd2iOn1EJxRaiw@mail.gmail.com> |
On Mon, 20 Jul 2026 at 01:13, Marek Marczykowski-Górecki <[email protected]> wrote: > > Commit 9f892f84c279 ("x86/domctl: Stop using XLAT_cpu_user_regs()") > converted memcpy() of the cpu_user_regs structure to explicit copy of > its fields. In the compat case, it intentionally missed few of them, > named in the commit message. But the 64bit case missed also r8-r15 > registers, which was not intentional. This, at least, caused Linux > 6.18.x crash when resuming PVH domU. > > Fix it by adding missing assignments. > > Fixes: 9f892f84c279 ("x86/domctl: Stop using XLAT_cpu_user_regs()") > Signed-off-by: Marek Marczykowski-Górecki <[email protected]> > --- > xen/arch/x86/domain.c | 8 ++++++++ > xen/arch/x86/domctl.c | 8 ++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c > index 1d458f1372e5..ba7244ccc513 100644 > --- a/xen/arch/x86/domain.c > +++ b/xen/arch/x86/domain.c > @@ -1255,6 +1255,14 @@ int arch_set_info_guest( > > if ( !compat ) > { > + v->arch.user_regs.r15 = c.nat->user_regs.r15; > + v->arch.user_regs.r14 = c.nat->user_regs.r14; > + v->arch.user_regs.r13 = c.nat->user_regs.r13; > + v->arch.user_regs.r12 = c.nat->user_regs.r12; > + v->arch.user_regs.r11 = c.nat->user_regs.r11; > + v->arch.user_regs.r10 = c.nat->user_regs.r10; > + v->arch.user_regs.r9 = c.nat->user_regs.r9; > + v->arch.user_regs.r8 = c.nat->user_regs.r8; > v->arch.user_regs.rbx = c.nat->user_regs.rbx; > v->arch.user_regs.rcx = c.nat->user_regs.rcx; > v->arch.user_regs.rdx = c.nat->user_regs.rdx; > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c > index 07f712a0a40d..3ea4c650eee0 100644 > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c > @@ -1481,6 +1481,14 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c) > if ( !compat ) > { > /* Backing memory is pre-zeroed. */ > + c.nat->user_regs.r15 = v->arch.user_regs.r15; > + c.nat->user_regs.r14 = v->arch.user_regs.r14; > + c.nat->user_regs.r13 = v->arch.user_regs.r13; > + c.nat->user_regs.r12 = v->arch.user_regs.r12; > + c.nat->user_regs.r11 = v->arch.user_regs.r11; > + c.nat->user_regs.r10 = v->arch.user_regs.r10; > + c.nat->user_regs.r9 = v->arch.user_regs.r9; > + c.nat->user_regs.r8 = v->arch.user_regs.r8; > c.nat->user_regs.rbx = v->arch.user_regs.rbx; > c.nat->user_regs.rcx = v->arch.user_regs.rcx; > c.nat->user_regs.rdx = v->arch.user_regs.rdx; Reviewed-by: Frediano Ziglio <[email protected]> Frediano