diff options
author | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-12-15 02:39:00 +0000 |
---|---|---|
committer | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2010-12-15 02:39:00 +0000 |
commit | 7d9524051edd3fbf07cccddf47f81dc5f996ba2b (patch) | |
tree | 4c4c1f10b99034e0b5ea0823d33b93c085edf422 /ArmPkg | |
parent | 32732a333ae22cc0283c09df947d7b8bad50144e (diff) | |
download | edk2-7d9524051edd3fbf07cccddf47f81dc5f996ba2b.tar.gz edk2-7d9524051edd3fbf07cccddf47f81dc5f996ba2b.tar.bz2 edk2-7d9524051edd3fbf07cccddf47f81dc5f996ba2b.zip |
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-x | ArmPkg/Library/SemihostLib/Arm/GccSemihost.S | 8 |
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 |