Skip to content

Commit

Permalink
ARM: kprobes: Move find_str_pc_offset into kprobes-common.c
Browse files Browse the repository at this point in the history
Move str_pc_offset into kprobes-common.c as it will be needed by common
code later.

Signed-off-by: Jon Medhurst <tixy@yxit.co.uk>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
  • Loading branch information
Jon Medhurst authored and Tixy committed Jul 13, 2011
1 parent 1b59d87 commit 6c8df33
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 28 deletions.
28 changes: 0 additions & 28 deletions arch/arm/kernel/kprobes-arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,29 +91,6 @@ union reg_pair {
#endif
};

/*
* For STR and STM instructions, an ARM core may choose to use either
* a +8 or a +12 displacement from the current instruction's address.
* Whichever value is chosen for a given core, it must be the same for
* both instructions and may not change. This function measures it.
*/

static int str_pc_offset;

static void __init find_str_pc_offset(void)
{
int addr, scratch, ret;

__asm__ (
"sub %[ret], pc, #4 \n\t"
"str pc, %[addr] \n\t"
"ldr %[scr], %[addr] \n\t"
"sub %[ret], %[scr], %[ret] \n\t"
: [ret] "=r" (ret), [scr] "=r" (scratch), [addr] "+m" (addr));

str_pc_offset = ret;
}

/*
* The insnslot_?arg_r[w]flags() functions below are to keep the
* msr -> *fn -> mrs instruction sequences indivisible so that
Expand Down Expand Up @@ -1569,8 +1546,3 @@ arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi)

return space_cccc_11xx(insn, asi);
}

void __init arm_kprobe_decode_init(void)
{
find_str_pc_offset();
}
33 changes: 33 additions & 0 deletions arch/arm/kernel/kprobes-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
*
* Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>.
*
* Some contents moved here from arch/arm/include/asm/kprobes-arm.c which is
* Copyright (C) 2006, 2007 Motorola Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
Expand All @@ -14,6 +17,36 @@
#include "kprobes.h"


/*
* For STR and STM instructions, an ARM core may choose to use either
* a +8 or a +12 displacement from the current instruction's address.
* Whichever value is chosen for a given core, it must be the same for
* both instructions and may not change. This function measures it.
*/

int str_pc_offset;

void __init find_str_pc_offset(void)
{
int addr, scratch, ret;

__asm__ (
"sub %[ret], pc, #4 \n\t"
"str pc, %[addr] \n\t"
"ldr %[scr], %[addr] \n\t"
"sub %[ret], %[scr], %[ret] \n\t"
: [ret] "=r" (ret), [scr] "=r" (scratch), [addr] "+m" (addr));

str_pc_offset = ret;
}


void __init arm_kprobe_decode_init(void)
{
find_str_pc_offset();
}


static unsigned long __kprobes __check_eq(unsigned long cpsr)
{
return cpsr & PSR_Z_BIT;
Expand Down
2 changes: 2 additions & 0 deletions arch/arm/kernel/kprobes.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ void __init arm_kprobe_decode_init(void);

extern kprobe_check_cc * const kprobe_condition_checks[16];

extern int str_pc_offset;

/*
* Test if load/store instructions writeback the address register.
* if P (bit 24) == 0 or W (bit 21) == 1
Expand Down

0 comments on commit 6c8df33

Please sign in to comment.