mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
powerpc/kprobes: Implement Optprobes
Current infrastructure of kprobe uses the unconditional trap instruction to probe a running kernel. Optprobe allows kprobe to replace the trap with a branch instruction to a detour buffer. Detour buffer contains instructions to create an in memory pt_regs. Detour buffer also has a call to optimized_callback() which in turn call the pre_handler(). After the execution of the pre-handler, a call is made for instruction emulation. The NIP is determined in advanced through dummy instruction emulation and a branch instruction is created to the NIP at the end of the trampoline. To address the limitation of branch instruction in POWER architecture, detour buffer slot is allocated from a reserved area. For the time being, 64KB is reserved in memory for this purpose. Instructions which can be emulated using analyse_instr() are the candidates for optimization. Before optimization ensure that the address range between the detour buffer allocated and the instruction being probed is within +/- 32MB. Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
30176466e3
commit
51c9c08439
7 changed files with 530 additions and 1 deletions
|
@ -54,6 +54,27 @@ bool is_offset_in_branch_range(long offset)
|
|||
return (offset >= -0x2000000 && offset <= 0x1fffffc && !(offset & 0x3));
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper to check if a given instruction is a conditional branch
|
||||
* Derived from the conditional checks in analyse_instr()
|
||||
*/
|
||||
bool __kprobes is_conditional_branch(unsigned int instr)
|
||||
{
|
||||
unsigned int opcode = instr >> 26;
|
||||
|
||||
if (opcode == 16) /* bc, bca, bcl, bcla */
|
||||
return true;
|
||||
if (opcode == 19) {
|
||||
switch ((instr >> 1) & 0x3ff) {
|
||||
case 16: /* bclr, bclrl */
|
||||
case 528: /* bcctr, bcctrl */
|
||||
case 560: /* bctar, bctarl */
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int create_branch(const unsigned int *addr,
|
||||
unsigned long target, int flags)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue