summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/SemihostLib/Arm/GccSemihost.S
diff options
context:
space:
mode:
Diffstat (limited to 'ArmPkg/Library/SemihostLib/Arm/GccSemihost.S')
-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