summaryrefslogtreecommitdiff
path: root/ArmPkg
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-12-15 02:39:00 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-12-15 02:39:00 +0000
commit7d9524051edd3fbf07cccddf47f81dc5f996ba2b (patch)
tree4c4c1f10b99034e0b5ea0823d33b93c085edf422 /ArmPkg
parent32732a333ae22cc0283c09df947d7b8bad50144e (diff)
downloadedk2-platforms-7d9524051edd3fbf07cccddf47f81dc5f996ba2b.tar.xz
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
Diffstat (limited to 'ArmPkg')
-rwxr-xr-xArmPkg/Library/SemihostLib/Arm/GccSemihost.S8
1 files changed, 7 insertions, 1 deletions
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