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