|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 6/6] xen: use DEFINE_SYMBOL as required
On Tue, 26 Feb 2019, Jan Beulich wrote:
> >>> On 25.02.19 at 21:50, <sstabellini@xxxxxxxxxx> wrote:
> > @@ -210,7 +210,8 @@ static int __apply_alternatives_multi_stop(void *unused)
> > region.begin = __alt_instructions;
> > region.end = (struct alt_instr *)__alt_instructions_end;
> >
> > - ret = __apply_alternatives(®ion, xenmap - (void *)_start);
> > + ret = __apply_alternatives(®ion, (uintptr_t)xenmap -
> > + (uintptr_t)_start);
>
> Undesirable (but in this case maybe indeed unavoidable) casting
> instead. I don't think this belongs in a patch with the given title
> though.
It's in this patch because this is the patch dealing with _start and
_end. Let me know how would you like the patches to be split.
> > @@ -78,7 +78,19 @@ void arch_livepatch_revert(const struct livepatch_func
> > *func)
> > uint32_t *new_ptr;
> > unsigned int len;
> >
> > - new_ptr = func->old_addr - (void *)_start + vmap_of_xen_text;
> > + /*
> > + * We need to calculate the offset of the address from _start, and
> > + * apply that to our own map, to find where we have this mapped.
> > + * Doing these kind of games directly with pointers is contrary to
> > + * the C rules for what pointers may be compared and computed. So
> > + * we do the offset calculation with integers, which is always
> > + * legal. The subsequent addition of the offset to the
> > + * vmap_of_xen_text pointer is legal because the computed pointer is
> > + * indeed a valid part of the object referred to by vmap_of_xen_text
> > + * - namely, the byte array of our mapping of the Xen text.
> > + */
> > + new_ptr = ((uintptr_t)func->old_addr, - (uintptr_t)_start) +
> > + vmap_of_xen_text;
>
> You not using the intended helper inlines has allowed for a bug to
> slip in that the compiler can't even help notice, due to - being both
> a valid unary and a valid binary operator.
Well spotted! I'll fix the bug. I would also be happy to use the helper
inlines, but we discussed not to use them in cases like this, with three
operators. Even if I wanted to use them, none of the inline helpers fit
this case. Or do you suggest:
new_ptr = xen_diff(_start, (struct abstract_xen *)func->old_addr) +
vmap_of_xen_text;
Is that what you are asking?
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |