|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 2/2] xen/x86: Livepatch: support patching CET-enhanced functions
On Tue, Mar 08, 2022 at 12:44:54PM +0000, Andrew Cooper wrote:
> On 08/03/2022 10:29, Bjoern Doebel wrote:
> > @@ -104,18 +122,34 @@ void noinline arch_livepatch_revive(void)
> >
> > int arch_livepatch_verify_func(const struct livepatch_func *func)
> > {
> > + BUILD_BUG_ON(sizeof(struct x86_livepatch_meta) !=
> > LIVEPATCH_OPAQUE_SIZE);
> > +
> > /* If NOPing.. */
> > if ( !func->new_addr )
> > {
> > /* Only do up to maximum amount we can put in the ->opaque. */
> > - if ( func->new_size > sizeof(func->opaque) )
> > + if ( func->new_size > sizeof_field(struct x86_livepatch_meta,
> > + instruction) )
> > return -EOPNOTSUPP;
> >
> > if ( func->old_size < func->new_size )
> > return -EINVAL;
> > }
> > - else if ( func->old_size < ARCH_PATCH_INSN_SIZE )
> > - return -EINVAL;
> > + else
> > + {
> > + /*
> > + * Space needed now depends on whether the target function
> > + * starts with an ENDBR64 instruction.
> > + */
> > + uint8_t needed;
> > +
> > + needed = ARCH_PATCH_INSN_SIZE;
> > + if ( is_endbr64(func->old_addr) )
> > + needed += ENDBR64_LEN;
>
> This won't work for cf_clobber targets, I don't think. The ENDBR gets
> converted to NOP4 and fails this check, but the altcalls calling
> old_func had their displacements adjusted by +4.
>
> The is_endbr64() check will fail, and the 5-byte jmp will be written at
> the start of the function, and corrupt the instruction stream for the
> altcall()'d callers.
>
> Let me write an incremental patch to help.
Please add Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
on the patches.
Thank you
>
> ~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |