[PATCH][AArch32] Add support for HLT to Mixed Mode models

Tamar Christina <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hi All,

The Semihosting v2 protocol requires us to output the Armv8-a HLT instruction
when in mixed mode (SEMIHOST_V2_MIXED_MODE), however it also requires this to
be done for Armv7-a and earlier architectures.

The HLT instruction is defined in the undefined encoding space for older
architectures but simulators such as QEMU already trap on it [1] for all
architectures and is a requirement for semihosting v2 [2]

Unfortunately the GAS restricts the use of HLT to Armv8-a which requires us to
use the instruction encodings we want directly in crt0.

This patch does this, I have not updated newlib/libc/* as that is quite out of
date already.  A proper sync is needed in order to get things back in sync.

A different patch for this would be best.

[1] https://github.com/qemu/qemu/commit/19a6e31c9d2701ef648b70ddcfc3bf64cec8c37e
[2] https://developer.arm.com/docs/100863/latest/the-semihosting-interface

Regtested on arm-none-eabi and no issues.

Ok for trunk?

Thanks,
Tamar

libgloss/ChangeLog:

2019-02-07  Tamar Christina  <[email protected]>

	PR libgloss/24070
	* arm/crt0.S: Convert macros to function Macros.
	* arm/swi.h (AngelSWI_ARM, AngelSWI): Use raw insn encoding for
	SEMIHOST_V2_MIXED_MODE case.
	(AngelSWIAsm): Make function.
	(AngelSWIInsn, AngelSWIAsm): Use .inst directive as instruction.

--
rb10668.patch (text/x-diff, 2.1 KB)
diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index 48f3d6b1db9d82d542966752c367239b4e796b9d..c708f63d8361a8862880a40687f3cdd979762a15 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -116,10 +116,10 @@
 	bkpt	AngelSWI
 #elif defined(__thumb2__)
 	/*  We are in thumb mode for startup on armv7 architectures. */
-	AngelSWIAsm	AngelSWI
+	AngelSWIAsm (AngelSWI)
 #else
 	/*  We are always in ARM mode for startup on pre armv7 archs. */
-	AngelSWIAsm	AngelSWI_ARM
+	AngelSWIAsm (AngelSWI_ARM)
 #endif
 	ldr	r0, .LC0	/*  point at values read */
 
@@ -297,7 +297,7 @@ __change_mode:
 #else
 	movs	r0, #AngelSWI_Reason_GetCmdLine
 	ldr	r1, .LC30	/*  Space for command line */
-	AngelSWIAsm	AngelSWI
+	AngelSWIAsm (AngelSWI)
 	ldr	r1, .LC30
 	ldr	r1, [r1]
 #endif
diff --git a/libgloss/arm/swi.h b/libgloss/arm/swi.h
index 67eb36b3fa1ad5fb3367e25d3b626da89d496e52..8f50ee7d9b58984537dc60675f6ace954f682341 100644
--- a/libgloss/arm/swi.h
+++ b/libgloss/arm/swi.h
@@ -31,9 +31,9 @@
 
 /* Now the SWI numbers and reason codes for RDI (Angel) monitors.  */
 #if defined (SEMIHOST_V2) && defined (SEMIHOST_V2_MIXED_MODE)
-  #define AngelSWI_ARM			0xF000 /* HLT A32.  */
+  #define AngelSWI_ARM			0xE10F0070 /* HLT #0xF000 A32.  */
   #ifdef __thumb__
-    #define AngelSWI			0x3C /* HLT T32.  */
+    #define AngelSWI			0xBABC /* HLT #0x3c T32.  */
   #else /* __thumb__.  */
     #define AngelSWI			AngelSWI_ARM
   #endif /* __thumb__.  */
@@ -49,10 +49,16 @@
 /* For thumb only architectures use the BKPT instruction instead of SWI.  */
 #ifdef THUMB_VXM
   #define AngelSWIInsn			"bkpt"
-  #define AngelSWIAsm			bkpt
+  #define AngelSWIAsm(IMM)		bkpt IMM
+#elif defined (SEMIHOST_V2) && defined (SEMIHOST_V2_MIXED_MODE)
+  /* This is actually encoding the HLT instruction, however we don't have
+     support for this in older assemblers.  So we have to encode the
+     instruction manually.  */
+  #define AngelSWIInsn			".inst"
+  #define AngelSWIAsm(IMM)		.inst IMM
 #else
   #define AngelSWIInsn			"swi"
-  #define AngelSWIAsm			swi
+  #define AngelSWIAsm(IMM)		swi IMM
 #endif
 
 /* The reason codes:  */
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.