]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix semihosting on gcc. We need to save lr as svc instruction will change it.
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 15 Dec 2010 02:39:00 +0000 (02:39 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 15 Dec 2010 02:39:00 +0000 (02:39 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11171 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Library/SemihostLib/Arm/GccSemihost.S

index aa8b16ad51e629f2a5bbe0c5299b2fbc36f1fe3d..2d33664f7da00bec8a8235946623ea756b5db3b9 100755 (executable)
@@ -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} \r
   svc     #0x123456  
+  ldmfd   sp!, {lr}\r
   bx      lr