|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 5/8] x86/domctl: Stop using XLAT_cpu_user_regs()
On 11.03.2025 22:10, Andrew Cooper wrote:
> In order to support FRED, we're going to have to remove the {ds..gs} fields
> from struct cpu_user_regs, meaning that it is going to have to become a
> different type to the structure embedded in vcpu_guest_context_u.
>
> In both arch_{get,set}_info_guest(), expand the memcpy()/XLAT_cpu_user_regs()
> to copy the fields individually. This will allow us to eventually make them
> different types.
>
> No practical change. The compat cases are identical, while the non-compat
> cases no longer copy _pad fields.
That's fine for "set", but potentially not for "get": Someone simply doing
memcmp() on two pieces of output might then break.
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>
> Should we really be copying error_code/entry_vector? They're already listed
> as explicitly private fields, and I don't think anything good can come of
> providing/consuming them.
I don't see a reason why we'd need to copy them in arch_set_info_guest();
arch_set_info_hvm_guest() doesn't copy them either. For
arch_get_info_guest() it's less clear - toolstack components may have
grown a dependency on them (e.g. introspection?), so I'd err on the side
of retaining prior behavior. (Of course there's then the corner case of
someone calling "get" right after "set", expecting the two fields to come
back unchanged.)
> @@ -1204,7 +1223,26 @@ int arch_set_info_guest(
> #ifdef CONFIG_COMPAT
> else
> {
> - XLAT_cpu_user_regs(&v->arch.user_regs, &c.cmp->user_regs);
> + v->arch.user_regs.ebx = c.cmp->user_regs.ebx;
> + v->arch.user_regs.ecx = c.cmp->user_regs.ecx;
> + v->arch.user_regs.edx = c.cmp->user_regs.edx;
> + v->arch.user_regs.esi = c.cmp->user_regs.esi;
> + v->arch.user_regs.edi = c.cmp->user_regs.edi;
> + v->arch.user_regs.ebp = c.cmp->user_regs.ebp;
> + v->arch.user_regs.eax = c.cmp->user_regs.eax;
> + v->arch.user_regs.error_code = c.cmp->user_regs.error_code;
> + v->arch.user_regs.entry_vector = c.cmp->user_regs.entry_vector;
> + v->arch.user_regs.eip = c.cmp->user_regs.eip;
> + v->arch.user_regs.cs = c.cmp->user_regs.cs;
> + v->arch.user_regs.saved_upcall_mask =
> c.cmp->user_regs.saved_upcall_mask;
> + v->arch.user_regs.eflags = c.cmp->user_regs.eflags;
> + v->arch.user_regs.esp = c.cmp->user_regs.esp;
> + v->arch.user_regs.ss = c.cmp->user_regs.ss;
> + v->arch.user_regs.es = c.cmp->user_regs.es;
> + v->arch.user_regs.ds = c.cmp->user_regs.ds;
> + v->arch.user_regs.fs = c.cmp->user_regs.fs;
> + v->arch.user_regs.gs = c.cmp->user_regs.gs;
Just to mention it (there's no change in behavior here afaict): Us writing
only half of the register fields looks like a latent (but perhaps only
theoretical) problem to me. A dis-aggregated toolstack may set 64-bit PV
context, then toggle address size, then set 32-bit context. That'll leave
the high halves of respective fields non-zero. I didn't check whether any
badness could result from that, as for the time being
XEN_DOMCTL_set_address_size isn't marked dis-aggregation-safe, and hence
this at least isn't of immediate concern.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |