[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v6 3/6] livepatch: NOP if func->new_addr is zero.



>>> On 16.09.16 at 17:29, <konrad.wilk@xxxxxxxxxx> wrote:
> @@ -31,11 +30,11 @@ void arch_livepatch_revive(void)
>  
>  int arch_livepatch_verify_func(const struct livepatch_func *func)
>  {
> -    /* No NOP patching yet. */
> -    if ( !func->new_size )
> +    /* If NOPing only do up to maximum amount we can put in the ->opaque. */
> +    if ( !func->new_addr && func->new_size > sizeof(func->opaque) )
>          return -EOPNOTSUPP;
>  
> -    if ( func->old_size < PATCH_INSN_SIZE )
> +    if ( func->old_size < ARCH_PATCH_INSN_SIZE )
>          return -EINVAL;

Is that indeed a requirement when NOPing? You can easily NOP out
just a single byte on x86. Or shouldn't in that case old_size == new_size
anyway? In which case the comment further down stating that new_size
can be zero would also be wrong.

> @@ -43,23 +42,36 @@ int arch_livepatch_verify_func(const struct 
> livepatch_func *func)
>  
>  void arch_livepatch_apply_jmp(struct livepatch_func *func)
>  {
> -    int32_t val;
>      uint8_t *old_ptr;
> -
> -    BUILD_BUG_ON(PATCH_INSN_SIZE > sizeof(func->opaque));
> -    BUILD_BUG_ON(PATCH_INSN_SIZE != (1 + sizeof(val)));
> +    uint8_t insn[sizeof(func->opaque)];
> +    unsigned int len;
>  
>      old_ptr = func->old_addr;
> -    memcpy(func->opaque, old_ptr, PATCH_INSN_SIZE);
> +    len = livepatch_insn_len(func);
> +    if ( !len )
> +        return;
> +
> +    memcpy(func->opaque, old_ptr, len);
> +    if ( func->new_addr )
> +    {
> +        int32_t val;
> +
> +        BUILD_BUG_ON(ARCH_PATCH_INSN_SIZE != (1 + sizeof(val)));
> +
> +        insn[0] = 0xe9;
> +        val = func->new_addr - func->old_addr - ARCH_PATCH_INSN_SIZE;
> +
> +        memcpy(&insn[1], &val, sizeof(val));
> +    }
> +    else
> +        add_nops(&insn, len);
>  
> -    *old_ptr++ = 0xe9; /* Relative jump */

Are you btw intentionally getting rid of this comment? And with the
NOP addition here, perhaps worth dropping the _jmp from the
function name (and its revert counterpart)?

> +static inline size_t livepatch_insn_len(const struct livepatch_func *func)

I think it would be nice to use consistent types: The current sole caller
stores the result of the function in an unsigned int, and I see no reason
why the function couldn't also return such.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.