mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	[ARM] 3200/1: Singlestep over ARM BX and BLX instructions using ptrace fix
Patch from Nikola Valerjev
Single stepping an application using ptrace() fails over ARM instructions BX and BLX.
Steps to reproduce:
Compile and link the following files
main.c
-----
void foo();
int main() {
    foo();
    return 0;
}
foo.s
-----
	.text
	.globl foo
foo:
	BX LR
Using ptrace() functionality, run to main(), and start singlestepping.
Singlestep over \"BX LR\" instruction won\'t transfer the control back
to main, but run the code to completion.
This problems seems to be in the function get_branch_address() in
arch/arm/kernel/ptrace.c. The function doesn\'t seem to recognize BX
and BLX instructions as branches. BX and BLX instructions can be used
to convert from ARM to Thumb mode if the target address has the low
bit set. However, they are also perfectly legal in the ARM only mode.
Although other things in the kernel seem to indicate that only ARM
mode is accepted (and not Thumb), many compilers will generate BX
and BLX instructions even when generating ARM only code.
Signed-off-by: Nikola Valerjev <nikola@ghs.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
			
			
This commit is contained in:
		
							parent
							
								
									5b35193f58
								
							
						
					
					
						commit
						22f975f4ff
					
				
					 1 changed files with 9 additions and 0 deletions
				
			
		|  | @ -242,6 +242,15 @@ get_branch_address(struct task_struct *child, unsigned long pc, unsigned long in | |||
| 		 */ | ||||
| 		long aluop1, aluop2, ccbit; | ||||
| 
 | ||||
| 	        if ((insn & 0x0fffffd0) == 0x012fff10) { | ||||
| 		        /*
 | ||||
| 			 * bx or blx | ||||
| 			 */ | ||||
| 			alt = get_user_reg(child, insn & 15); | ||||
| 			break; | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		if ((insn & 0xf000) != 0xf000) | ||||
| 			break; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Nikola Valerjev
						Nikola Valerjev