|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/domctl: restore all registers in arch_{get,set}_info_guest()
commit bedbc17d8407c456c7fbe126c0df55610559d8c6
Author: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
AuthorDate: Mon Jul 20 11:11:37 2026 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Jul 20 11:11:37 2026 +0200
x86/domctl: restore all registers in arch_{get,set}_info_guest()
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 <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Teddy Astie <teddy.astie@xxxxxxxxxx>
Release-acked-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
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 4252339978..53a86ba373 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 07f712a0a4..3ea4c650ee 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;
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |