浏览代码

[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>
David Wilder 18 年之前
父节点
当前提交
b70842df77
共有 1 个文件被更改,包括 1 次插入1 次删除
  1. 1 1
      arch/s390/kernel/kprobes.c

+ 1 - 1
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
 	 * shall not cross any page boundaries (vmalloc area!) when writing
 	 * the new instruction.
 	 * the new instruction.
 	 */
 	 */
-	addr = (u32 *)ALIGN((unsigned long)args->ptr, 4);
+	addr = (u32 *)((unsigned long)args->ptr & -4UL);
 	if ((unsigned long)args->ptr & 2)
 	if ((unsigned long)args->ptr & 2)
 		instr = ((*addr) & 0xffff0000) | args->new;
 		instr = ((*addr) & 0xffff0000) | args->new;
 	else
 	else