diff options
author | David Wilder <dwilder@us.ibm.com> | 2007-03-26 20:42:40 +0200 |
---|---|---|
committer | Heiko Carstens <heiko.carstens@de.ibm.com> | 2007-03-26 20:43:46 +0200 |
commit | b70842df77615309d76bcdd63bd289993e0844f2 (patch) | |
tree | 1bfcc510b19b87375ee21b0782e3d2e964b92e49 /arch/s390/kernel/kprobes.c | |
parent | afbc1e994ddcf3b6fe2dc928ee8dc31a5d0c3118 (diff) | |
download | linux-b70842df77615309d76bcdd63bd289993e0844f2.tar.gz linux-b70842df77615309d76bcdd63bd289993e0844f2.tar.bz2 linux-b70842df77615309d76bcdd63bd289993e0844f2.zip |
[S390] kprobes: Align probe address.
Running a probe on s390 with a probe address that is not 4 byte aligned
results in a Kernel BUG. The problem is that the stura instruction used
by swap_instruction requires the destination address to be 4 byte aligned.
As stura only writes 4 bytes, aligning to the next 4 byte aligned address
results in the breakpoint instruction being stored past the probe address.
The fix is to align the address backward (to the previous 4 byte aligned
address) and writing the two byte breakpoint instruction in the appropriate
bytes.
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: David Wilder <dwilder@us.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/kprobes.c')
-rw-r--r-- | arch/s390/kernel/kprobes.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index 8af549e95730..993f35381496 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c @@ -167,7 +167,7 @@ static int __kprobes swap_instruction(void *aref) * shall not cross any page boundaries (vmalloc area!) when writing * the new instruction. */ - addr = (u32 *)ALIGN((unsigned long)args->ptr, 4); + addr = (u32 *)((unsigned long)args->ptr & -4UL); if ((unsigned long)args->ptr & 2) instr = ((*addr) & 0xffff0000) | args->new; else |