diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S index 48f3d6b1d..c708f63d8 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 67eb36b3f..8f50ee7d9 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: */