diff options
Diffstat (limited to 'arch/arm/include/asm/kexec.h')
| -rw-r--r-- | arch/arm/include/asm/kexec.h | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index b37e02c9169..c0094d8edae 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h @@ -33,10 +33,20 @@ static inline void crash_setup_regs(struct pt_regs *newregs,  	if (oldregs) {  		memcpy(newregs, oldregs, sizeof(*newregs));  	} else { -		__asm__ __volatile__ ("stmia %0, {r0 - r15}" -				      : : "r" (&newregs->ARM_r0) : "memory"); -		__asm__ __volatile__ ("mrs %0, cpsr" -				      : "=r" (newregs->ARM_cpsr)); +		__asm__ __volatile__ ( +			"stmia	%[regs_base], {r0-r12}\n\t" +			"mov	%[_ARM_sp], sp\n\t" +			"str	lr, %[_ARM_lr]\n\t" +			"adr	%[_ARM_pc], 1f\n\t" +			"mrs	%[_ARM_cpsr], cpsr\n\t" +		"1:" +			: [_ARM_pc] "=r" (newregs->ARM_pc), +			  [_ARM_cpsr] "=r" (newregs->ARM_cpsr), +			  [_ARM_sp] "=r" (newregs->ARM_sp), +			  [_ARM_lr] "=o" (newregs->ARM_lr) +			: [regs_base] "r" (&newregs->ARM_r0) +			: "memory" +		);  	}  }  |