Fix AArch32 semihosting SYS_EXIT call on semihosting v1.

The current SYS_EXIT has a bug that when making the call it always uses
the v2 calling convention.  This is undefined behavior according to the
semihosting specification:
https://developer.arm.com/docs/100863/latest/semihosting-operations/sys_exit-0x18

This patch fixes it by making sure v1 passes the argument directly in the register instead
of in a block. And for v2 it does the same if the v2 extension isn't supported.

The sequence generated now is

   12424:       ebfffecd        bl      11f60 <_has_ext_exit_extended>
   12428:       e3500000        cmp     r0, #0
   1242c:       11a0500d        movne   r5, sp
   12430:       059d5000        ldreq   r5, [sp]
   12434:       e1a00004        mov     r0, r4
   12438:       e1a01005        mov     r1, r5
   1243c:       ef00f000        svc     0x0000f000

Signed-off-by: Tamar Christina <tamar.christina@arm.com>
This commit is contained in:
Tamar Christina 2018-07-11 13:26:16 +01:00 committed by Corinna Vinschen
parent 81dc535bb9
commit 430b529111
1 changed files with 6 additions and 0 deletions

View File

@ -39,7 +39,13 @@ _kill (int pid, int sig)
}
}
#if SEMIHOST_V2
if (_has_ext_exit_extended ())
return do_AngelSWI (insn, block);
else
#endif
return do_AngelSWI (insn, (void*)block[0]);
#else
asm ("swi %a0" :: "i" (SWI_Exit));
#endif