[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 07/13] xen/arm: Simplify alternative patching
On Fri, 25 May 2018, Julien Grall wrote: > On Fri, 25 May 2018, 22:54 Stefano Stabellini, <sstabellini@xxxxxxxxxx> wrote: > You might want to CC Konrad next time on this patch > > > May I ask why? This code falls under Arm maintainership. I know, but I appreciate his input if he has time for it > > > On Tue, 22 May 2018, Julien Grall wrote: > > This is part of XSA-263. > > > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > > > --- > > I am aware of the missing commit message here. I wanted to send > the > > series on the ML to get some feedback first. > > --- > > xen/arch/arm/alternative.c | 35 +++++++++++++---------------------- > > 1 file changed, 13 insertions(+), 22 deletions(-) > > > > diff --git a/xen/arch/arm/alternative.c b/xen/arch/arm/alternative.c > > index 9ffdc475d6..bd62183def 100644 > > --- a/xen/arch/arm/alternative.c > > +++ b/xen/arch/arm/alternative.c > > @@ -97,12 +97,16 @@ static u32 get_alt_insn(const struct alt_instr > *alt, > > /* > > * The region patched should be read-write to allow > __apply_alternatives > > * to replacing the instructions when necessary. > > + * > > + * @update_offset: Offset between the region patched and the writable > > + * region for the update. 0 if the patched region is writable. > > */ > > -static int __apply_alternatives(const struct alt_region *region) > > +static int __apply_alternatives(const struct alt_region *region, > > + paddr_t update_offset) > > { > > const struct alt_instr *alt; > > - const u32 *replptr; > > - u32 *origptr; > > + const u32 *replptr, *origptr; > > + u32 *updptr; > > > > printk(XENLOG_INFO "alternatives: Patching with alt table %p -> > %p\n", > > region->begin, region->end); > > @@ -118,6 +122,7 @@ static int __apply_alternatives(const struct > alt_region *region) > > BUG_ON(alt->alt_len != alt->orig_len); > > > > origptr = ALT_ORIG_PTR(alt); > > + updptr = (void *)origptr + update_offset; > > replptr = ALT_REPL_PTR(alt); > > > > nr_inst = alt->alt_len / sizeof(insn); > > @@ -125,7 +130,7 @@ static int __apply_alternatives(const struct > alt_region *region) > > for ( i = 0; i < nr_inst; i++ ) > > { > > insn = get_alt_insn(alt, origptr + i, replptr + i); > > - *(origptr + i) = cpu_to_le32(insn); > > + *(updptr + i) = cpu_to_le32(insn); > > } > > > > /* Ensure the new instructions reached the memory and nuke */ > > @@ -162,9 +167,6 @@ static int __apply_alternatives_multi_stop(void > *unused) > > paddr_t xen_size = _end - _start; > > unsigned int xen_order = get_order_from_bytes(xen_size); > > void *xenmap; > > - struct virtual_region patch_region = { > > - .list = LIST_HEAD_INIT(patch_region.list), > > - }; > > > > BUG_ON(patched); > > > > @@ -178,30 +180,19 @@ static int __apply_alternatives_multi_stop(void > *unused) > > BUG_ON(!xenmap); > > > > /* > > - * If we generate a new branch instruction, the target will > be > > - * calculated in this re-mapped Xen region. So we have to > register > > - * this re-mapped Xen region as a virtual region temporarily. > > - */ > > - patch_region.start = xenmap; > > - patch_region.end = xenmap + xen_size; > > - register_virtual_region(&patch_region); > > - > > - /* > > * Find the virtual address of the alternative region in the > new > > * mapping. > > * alt_instr contains relative offset, so the function > > * __apply_alternatives will patch in the re-mapped version > of > > * Xen. > > */ > > - region.begin = (void *)__alt_instructions - (void *)_start + > xenmap; > > - region.end = (void *)__alt_instructions_end - (void *)_start > + xenmap; > > + region.begin = __alt_instructions; > > + region.end = __alt_instructions_end; > > > > - ret = __apply_alternatives(®ion); > > + ret = __apply_alternatives(®ion, xenmap - (void *)_start); > > /* The patching is not expected to fail during boot. */ > > BUG_ON(ret != 0); > > > > - unregister_virtual_region(&patch_region); > > - > > vunmap(xenmap); > > > > /* Barriers provided by the cache flushing */ > > @@ -235,7 +226,7 @@ int apply_alternatives(const struct alt_instr > *start, const struct alt_instr *en > > .end = end, > > }; > > > > - return __apply_alternatives(®ion); > > + return __apply_alternatives(®ion, 0); > > } > > > > /* > > -- > > 2.11.0 > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |