On 2/6/19 16:03, Jan Beulich wrote: >>>> On 29.01.19 at 15:43, <nmant...@amazon.de> wrote: >> @@ -908,10 +909,10 @@ void watchdog_domain_destroy(struct domain *d); >> * (that is, this would not be suitable for a driver domain) >> * - There is never a reason to deny the hardware domain access to this >> */ >> -#define is_hardware_domain(_d) ((_d) == hardware_domain) >> +#define is_hardware_domain(_d) evaluate_nospec((_d) == hardware_domain) >> >> /* This check is for functionality specific to a control domain */ >> -#define is_control_domain(_d) ((_d)->is_privileged) >> +#define is_control_domain(_d) evaluate_nospec((_d)->is_privileged) > I'm afraid there's another fly in the ointment here: While looking at > the still questionable grant table change I've started wondering > about constructs like > > case XENMEM_machphys_mapping: > { > struct xen_machphys_mapping mapping = { > .v_start = MACH2PHYS_VIRT_START, > .v_end = MACH2PHYS_VIRT_END, > .max_mfn = MACH2PHYS_NR_ENTRIES - 1 > }; > > if ( !mem_hotplug && is_hardware_domain(current->domain) ) > mapping.max_mfn = max_page - 1; > if ( copy_to_guest(arg, &mapping, 1) ) > return -EFAULT; > > return 0; > } > > Granted the example here could be easily re-arranged, but there > are others where this is less easy or not possible at all. What I'm > trying to get at are constructs where the such-protected > predicates sit on the right side of && or || - afaict (also from > looking at some much simplified code examples) the intended > protection is gone in these cases.
I do not follow this. Independently of other conditionals in the if statement, there should be an lfence instruction between the "is_domain_control(...)" evaluation and accessing the max_page variable - in case the code actually protects accessing that variable via that function. I validated this property for the above code snippet in the generated assembly. However, I just noticed another problem: while my initial version just placed the lfence instruction right into the code, not the arch_barrier_nospec_true method is called via callq. I would like to get the instructions to be embedded into the code directly, without the call detour. In case I cannot force the compiler to do that, I would go back to using a fixed lfence statement on all x86 platforms. Best, Norbert Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrer: Christian Schlaeger, Ralf Herbrich Ust-ID: DE 289 237 879 Eingetragen am Amtsgericht Charlottenburg HRB 149173 B _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel