[PATCH][AArch32][libgloss] Fix semihosting SYS_EXIT call on semihosting v1.

Tamar Christina <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <HE1PR08MB0746C576A375E7027EFDA174FF5A0@HE1PR08MB0746.eurprd08.prod.outlook.com>
Hi All,

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

Cross compiled arm-none-eabi and regtested using check-gcc and no regressions.

Ok for master?

PS. I do not have commit rights so if OK can someone apply for me?

Thanks,
Tamar
0001-Fix-AArch32-semihosting-SYS_EXIT-call-on-semihosting.patch (text/x-patch, 1.6 KB)
From 5c8c95cdf19602fb3ad569fbcbeda4ce5304b537 Mon Sep 17 00:00:00 2001
From: Tamar Christina <[email protected]>
Date: Wed, 11 Jul 2018 13:26:16 +0100
Subject: [PATCH] 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 <[email protected]>
---
 libgloss/arm/_kill.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/libgloss/arm/_kill.c b/libgloss/arm/_kill.c
index fc77e8097..278ded73a 100644
--- a/libgloss/arm/_kill.c
+++ b/libgloss/arm/_kill.c
@@ -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
-- 
2.17.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.