[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 04/17] x86/PV: harden guest memory accesses against speculative abuse
On 11.02.2021 09:11, Roger Pau Monné wrote: > On Wed, Feb 10, 2021 at 05:55:52PM +0100, Jan Beulich wrote: >> On 09.02.2021 17:26, Roger Pau Monné wrote: >>> On Thu, Jan 14, 2021 at 04:04:57PM +0100, Jan Beulich wrote: >>>> --- a/xen/arch/x86/usercopy.c >>>> +++ b/xen/arch/x86/usercopy.c >>>> @@ -10,12 +10,19 @@ >>>> #include <xen/sched.h> >>>> #include <asm/uaccess.h> >>>> >>>> -unsigned __copy_to_user_ll(void __user *to, const void *from, unsigned n) >>>> +#ifndef GUARD >>>> +# define GUARD UA_KEEP >>>> +#endif >>>> + >>>> +unsigned int copy_to_guest_ll(void __user *to, const void *from, unsigned >>>> int n) >>>> { >>>> unsigned dummy; >>>> >>>> stac(); >>>> asm volatile ( >>>> + GUARD( >>>> + " guest_access_mask_ptr %[to], %q[scratch1], %q[scratch2]\n" >>> >>> Don't you need to also take 'n' into account here to assert that the >>> address doesn't end in hypervisor address space? Or that's fine as >>> speculation wouldn't go that far? >> >> Like elsewhere this leverages that the hypervisor VA range starts >> immediately after the non-canonical hole. I'm unaware of >> speculation being able to cross over that hole. >> >>> I also wonder why this needs to be done in assembly, could you check >>> the address(es) using C? >> >> For this to be efficient (in avoiding speculation) the insn >> sequence would better not have any conditional jumps. I don't >> think the compiler can be told so. > > Why not use evaluate_nospec to check the address like we do in other > places? Because LFENCE is far heavier than what we do here, which is effectively a (distant) relative of array_index_nospec(). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |