mirror of
https://github.com/torvalds/linux.git
synced 2026-03-14 00:56:20 +01:00
x86/alternatives: Provide text_poke_copy_locked()
The upcoming call thunk patching must hold text_mutex and needs access to text_poke_copy(), which takes text_mutex. Provide a _locked postfixed variant to expose the inner workings. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20220915111147.159977224@infradead.org
This commit is contained in:
parent
80e4c1cd42
commit
fe54d07937
2 changed files with 23 additions and 15 deletions
|
|
@ -45,6 +45,7 @@ extern void *text_poke(void *addr, const void *opcode, size_t len);
|
|||
extern void text_poke_sync(void);
|
||||
extern void *text_poke_kgdb(void *addr, const void *opcode, size_t len);
|
||||
extern void *text_poke_copy(void *addr, const void *opcode, size_t len);
|
||||
extern void *text_poke_copy_locked(void *addr, const void *opcode, size_t len, bool core_ok);
|
||||
extern void *text_poke_set(void *addr, int c, size_t len);
|
||||
extern int poke_int3_handler(struct pt_regs *regs);
|
||||
extern void text_poke_bp(void *addr, const void *opcode, size_t len, const void *emulate);
|
||||
|
|
|
|||
|
|
@ -1236,6 +1236,27 @@ void *text_poke_kgdb(void *addr, const void *opcode, size_t len)
|
|||
return __text_poke(text_poke_memcpy, addr, opcode, len);
|
||||
}
|
||||
|
||||
void *text_poke_copy_locked(void *addr, const void *opcode, size_t len,
|
||||
bool core_ok)
|
||||
{
|
||||
unsigned long start = (unsigned long)addr;
|
||||
size_t patched = 0;
|
||||
|
||||
if (WARN_ON_ONCE(!core_ok && core_kernel_text(start)))
|
||||
return NULL;
|
||||
|
||||
while (patched < len) {
|
||||
unsigned long ptr = start + patched;
|
||||
size_t s;
|
||||
|
||||
s = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(ptr), len - patched);
|
||||
|
||||
__text_poke(text_poke_memcpy, (void *)ptr, opcode + patched, s);
|
||||
patched += s;
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
/**
|
||||
* text_poke_copy - Copy instructions into (an unused part of) RX memory
|
||||
* @addr: address to modify
|
||||
|
|
@ -1250,22 +1271,8 @@ void *text_poke_kgdb(void *addr, const void *opcode, size_t len)
|
|||
*/
|
||||
void *text_poke_copy(void *addr, const void *opcode, size_t len)
|
||||
{
|
||||
unsigned long start = (unsigned long)addr;
|
||||
size_t patched = 0;
|
||||
|
||||
if (WARN_ON_ONCE(core_kernel_text(start)))
|
||||
return NULL;
|
||||
|
||||
mutex_lock(&text_mutex);
|
||||
while (patched < len) {
|
||||
unsigned long ptr = start + patched;
|
||||
size_t s;
|
||||
|
||||
s = min_t(size_t, PAGE_SIZE * 2 - offset_in_page(ptr), len - patched);
|
||||
|
||||
__text_poke(text_poke_memcpy, (void *)ptr, opcode + patched, s);
|
||||
patched += s;
|
||||
}
|
||||
addr = text_poke_copy_locked(addr, opcode, len, false);
|
||||
mutex_unlock(&text_mutex);
|
||||
return addr;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue