From 7d9524051edd3fbf07cccddf47f81dc5f996ba2b Mon Sep 17 00:00:00 2001 From: andrewfish Date: Wed, 15 Dec 2010 02:39:00 +0000 Subject: Fix semihosting on gcc. We need to save lr as svc instruction will change it. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11171 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Library/SemihostLib/Arm/GccSemihost.S | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'ArmPkg') diff --git a/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S b/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S index aa8b16ad51..2d33664f7d 100755 --- a/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S +++ b/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S @@ -26,10 +26,16 @@ INTERWORK_FUNC(GccSemihostCall) BKPT 0xAB for ARMv7-M (Thumb-2 only) R0 - operation type - R1 - block containing all other parametes + R1 - block containing all other parametes + + lr - must be saved as svc instruction will cause an svc exception and write + the svc lr register. That happens to be the one we are using, so we must + save it or we will not be able to return. */ ASM_PFX(GccSemihostCall): + stmfd sp!, {lr} svc #0x123456 + ldmfd sp!, {lr} bx lr -- cgit v1.2.3