[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 5/5] xen/xsm: Address hypercall ABI problems
On 18.11.2021 00:14, Andrew Cooper wrote: > On 08/11/2021 09:50, Jan Beulich wrote: >> On 05.11.2021 14:55, Andrew Cooper wrote: >>> Currently, __HYPERVISOR_xsm_op enters xsm_ops.do_{xsm,compat}_op() which >>> means >>> that if any other XSM module registers a handler, we'll break the hypercall >>> ABI totally by having the behaviour depend on the selected XSM module. >>> >>> There are 2 options: >>> 1) Rename __HYPERVISOR_xsm_op to __HYPERVISOR_flask_op. If another XSM >>> module wants hypercalls, they'll have to introduce a new top-level >>> hypercall. >>> 2) Make the current flask_op() be common, and require new hypercalls to >>> fit >>> compatibly with xen_flask_op_t. This can be done fairly easily by >>> subdividing the .cmd space. >>> >>> In this patch, we implement option 2. >>> >>> Move the stub {do,compat}_xsm_op() implementation into a new xsm_op.c so we >>> can more easily do multi-inclusion compat magic. Also add a new private.h, >>> because flask/hook.c's local declaration of {do,compat}_flask_op() wasn't >>> remotely safe. >>> >>> The top level now dispatches into {do,compat}_flask_op() based on op.cmd, >>> and >>> handles the primary copy in/out. >> I'm not convinced this is the only reasonable way of implementing 2). >> I could also see number space to be separated in different ways, ... >> >>> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >>> --- >>> CC: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> >>> CC: Daniel Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> >>> >>> Only lightly tested. Slightly RFC. There are several things which aren't >>> great, but probably want addressing in due course. >>> >>> 1) The public headers probably want to lose the flask name (in a >>> compatible >>> way), now that the hypercall is common. This probably wants to be >>> combined with no longer taking a void handle. >> ... leaving per-module public headers and perhaps merely adding an >> abstracting >> >> struct xen_xsm_op_t { >> uint32_t op; >> ... /* placeholder */ >> }; >> >> or (making explicit one possible variant of number space splitting) >> >> union xen_xsm_op_t { >> uint32_t op; >> struct { >> uint16_t cmd; >> uint16_t mod; >> } u; >> ... /* placeholder */ >> }; >> >> in, say, a new public/xsm.h. > > That doesn't work. The ABI is fixed at sizeof(xen_flask_op_t) for all > other modules, because a caller which doesn't know which module is in > use must not have Xen over-read/write the object passed while it's > trying to figure things out. Well, imo figuring out which module is in use should be via a sysctl. Then there would be no restrictions by one module's interface definitions on other modules. >> As a result I consider this change either going too far (because of >> not knowing future needs) or not far enough (by e.g. leaving >> do_xsm_op() to use xen_flask_op_t. > > Well - what it does is prevent someone from breaking the ABI with > literally this patch > > diff --git a/xen/xsm/silo.c b/xen/xsm/silo.c > index 3550dded7b4e..36b82fd3bd3e 100644 > --- a/xen/xsm/silo.c > +++ b/xen/xsm/silo.c > @@ -100,6 +100,11 @@ static int silo_argo_send(const struct domain *d1, > const struct domain *d2) > > #endif > > +static long silo_do_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op) > +{ > + /* ... */ > +} > + > static const struct xsm_ops __initconstrel silo_xsm_ops = { > .evtchn_unbound = silo_evtchn_unbound, > .evtchn_interdomain = silo_evtchn_interdomain, > @@ -110,6 +115,7 @@ static const struct xsm_ops __initconstrel > silo_xsm_ops = { > .argo_register_single_source = silo_argo_register_single_source, > .argo_send = silo_argo_send, > #endif > + .do_xsm_op = silo_do_xsm_op, > }; > > const struct xsm_ops *__init silo_init(void) So I'm afraid I don't see any ABI breakage here. Provided of course silo_do_xsm_op() avoids the FLASK_* number space and uses a struct layout compatible with the head of struct xen_flask_op. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |