[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 05/20] arm64/alternatives: Make it possible to patch outside of hypervisor.
With livepatching the alternatives that should be patched are outside the Xen hypervisor _start -> _end. As such having to use an alternative VA is not neccessary. In fact we can use the ones that the caller provided us with. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Julien Grall <julien.grall@xxxxxxx> v2: First version --- xen/arch/arm/alternative.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/xen/arch/arm/alternative.c b/xen/arch/arm/alternative.c index aba06db..90a857a 100644 --- a/xen/arch/arm/alternative.c +++ b/xen/arch/arm/alternative.c @@ -94,24 +94,30 @@ static int __apply_alternatives(const struct alt_region *region) { const struct alt_instr *alt; const u32 *origptr, *replptr; - u32 *writeptr, *writemap; + u32 *writeptr, *writemap = NULL; mfn_t text_mfn = _mfn(virt_to_mfn(_stext)); unsigned int text_order = get_order_from_bytes(_end - _start); - printk(XENLOG_INFO "alternatives: Patching kernel code\n"); - - /* - * The text section is read-only. So re-map Xen to be able to patch - * the code. - */ - writemap = __vmap(&text_mfn, 1 << text_order, 1, 1, PAGE_HYPERVISOR, - VMAP_DEFAULT); - if ( !writemap ) + if ( region->begin >= __alt_instructions && + region->end <= __alt_instructions_end ) { - printk(XENLOG_ERR "alternatives: Unable to map the text section (size %u)\n", - 1 << text_order); - return -ENOMEM; + printk(XENLOG_INFO "alternatives: Patching kernel code\n"); + /* + * The text section is read-only. So re-map Xen to be able to patch + * the code. + */ + writemap = __vmap(&text_mfn, 1 << text_order, 1, 1, PAGE_HYPERVISOR, + VMAP_DEFAULT); + if ( !writemap ) + { + printk(XENLOG_ERR "alternatives: Unable to map the text section (size %u)\n", + 1 << text_order); + return -ENOMEM; + } } + else + printk(XENLOG_INFO "alternatives: Patching %p -> %p\n", + region->begin, region->end); for ( alt = region->begin; alt < region->end; alt++ ) { @@ -124,8 +130,11 @@ static int __apply_alternatives(const struct alt_region *region) BUG_ON(alt->alt_len != alt->orig_len); origptr = ALT_ORIG_PTR(alt); - writeptr = origptr - (u32 *)_start + writemap; replptr = ALT_REPL_PTR(alt); + if ( writemap ) + writeptr = origptr - (u32 *)_start + writemap; + else + writeptr = (u32 *)origptr; nr_inst = alt->alt_len / sizeof(insn); @@ -143,7 +152,8 @@ static int __apply_alternatives(const struct alt_region *region) /* Nuke the instruction cache */ invalidate_icache(); - vunmap(writemap); + if ( writemap ) + vunmap(writemap); return 0; } -- 2.4.11 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |