|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/5] x86/livepatch: Use text_poke() and plumb a live parameter through
Update text_poke() to return void (rather than void *), take a live parameter,
and export it for arch_livepatch_apply() to use.
arch_livepatch_apply() can therefore lose its noinline for i-cache safey, as
text_poke() is doing the heavy lifting.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
CC: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
---
xen/arch/x86/alternative.c | 9 +++++----
xen/arch/x86/livepatch.c | 8 ++------
xen/include/asm-x86/alternative.h | 2 ++
3 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
index 5b3fb80..0b309c3 100644
--- a/xen/arch/x86/alternative.c
+++ b/xen/arch/x86/alternative.c
@@ -136,6 +136,7 @@ void init_or_livepatch add_nops(void *insns, unsigned int
len)
* @addr: address to modify
* @opcode: source of the copy
* @len: length to copy
+ * @live: whether @addr is liable to be executed during patching
*
* When you use this code to patch more than one byte of an instruction
* you need to make sure that other CPUs cannot execute this code in parallel.
@@ -149,10 +150,10 @@ void init_or_livepatch add_nops(void *insns, unsigned int
len)
* "noinline" to cause control flow change and thus invalidate I$ and
* cause refetch after modification.
*/
-static void *init_or_livepatch noinline
-text_poke(void *addr, const void *opcode, size_t len)
+void init_or_livepatch noinline
+text_poke(void *addr, const void *opcode, size_t len, bool live)
{
- return memcpy(addr, opcode, len);
+ memcpy(addr, opcode, len);
}
/*
@@ -199,7 +200,7 @@ void init_or_livepatch apply_alternatives(const struct
alt_instr *start,
add_nops(insnbuf + a->replacementlen,
a->instrlen - a->replacementlen);
- text_poke(instr, insnbuf, a->instrlen);
+ text_poke(instr, insnbuf, a->instrlen, live);
}
}
diff --git a/xen/arch/x86/livepatch.c b/xen/arch/x86/livepatch.c
index 406eb91..e624474 100644
--- a/xen/arch/x86/livepatch.c
+++ b/xen/arch/x86/livepatch.c
@@ -46,11 +46,7 @@ int arch_livepatch_verify_func(const struct livepatch_func
*func)
return 0;
}
-/*
- * "noinline" to cause control flow change and thus invalidate I$ and
- * cause refetch after modification.
- */
-void noinline arch_livepatch_apply(struct livepatch_func *func)
+void arch_livepatch_apply(struct livepatch_func *func)
{
uint8_t *old_ptr;
uint8_t insn[sizeof(func->opaque)];
@@ -76,7 +72,7 @@ void noinline arch_livepatch_apply(struct livepatch_func
*func)
else
add_nops(insn, len);
- memcpy(old_ptr, insn, len);
+ text_poke(old_ptr, insn, len, true);
}
/*
diff --git a/xen/include/asm-x86/alternative.h
b/xen/include/asm-x86/alternative.h
index 07ff424..2d7cca5 100644
--- a/xen/include/asm-x86/alternative.h
+++ b/xen/include/asm-x86/alternative.h
@@ -20,6 +20,8 @@ struct alt_instr {
#define ALT_ORIG_PTR(a) __ALT_PTR(a, instr_offset)
#define ALT_REPL_PTR(a) __ALT_PTR(a, repl_offset)
+extern void text_poke(void *addr, const void *opcode, size_t len, bool live);
+
extern void add_nops(void *insns, unsigned int len);
/* Similar to alternative_instructions except it can be run with IRQs enabled.
*/
extern void apply_alternatives(const struct alt_instr *start,
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |