[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/PV32: fix physdev_op_compat handling
On 08.10.2021 19:47, Andrew Cooper wrote: > On 08/10/2021 11:47, Jan Beulich wrote: >> The conversion of the original code failed to recognize that the 32-bit >> compat variant of this (sorry, two different meanings of "compat" here) >> needs to continue to invoke the compat handler, not the native one. >> Arrange for this and also remove the one #define that hasn't been >> necessary anymore as of that change. >> >> Affected functions (having existed prior to the introduction of the new >> hypercall) are PHYSDEVOP_set_iobitmap and PHYSDEVOP_apic_{read,write}. >> For all others the operand struct layout doesn't differ. > > :-/ > > Neither of those ABI breakages would be subtle. But why didn't XTF > notice? Edit: It appears as if my PHYSDEVOP_set_iobitmap tests never > got completed. But the XTF would have used the modern hypercall, wouldn't it? At least the pv-iopl test does. >> Additionally the XSA-344 fix causes guest register corruption afaict, >> when EVTCHNOP_reset gets called through the compat function and needs a >> continuation. While guests shouldn't invoke that function this way, I >> think we would better have forced all pre-3.2-unavailable functions into >> an error path, rather than forwarding them to the actual handler. I'm >> not sure though how relevant we consider it to fix this (one way or >> another). > > EVTCHNOP_reset{,_cont} are -ENOSYS'd in do_event_channel_op_compat() > without being forwarded. I can't see a problem. You're right - I think I did look at do_physdev_op_compat() deriving evtchn-compat behavior from there as well. >> --- a/xen/arch/x86/x86_64/compat.c >> +++ b/xen/arch/x86/x86_64/compat.c >> @@ -10,8 +10,8 @@ EMIT_FILE; >> >> #define physdev_op compat_physdev_op >> #define physdev_op_t physdev_op_compat_t >> -#define do_physdev_op compat_physdev_op > > This is still needed, technically. It impacts the typeof() expression: > > typeof(do_physdev_op) *fn = > (void *)pv_hypercall_table[__HYPERVISOR_physdev_op].native; > > and the reason why everything compiles is because > {do,compat}_physdev_op() have identical types. Oh, indeed - thanks for pointing out. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |