This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH] ARM / AArch64: Fix GetCmdLine semihosting directives
- From: Laurent Alfonsi <laurent dot alfonsi at st dot com>
- To: <newlib at sourceware dot org>
- Date: Tue, 2 May 2017 14:46:59 +0200
- Subject: [PATCH] ARM / AArch64: Fix GetCmdLine semihosting directives
- Authentication-results: sourceware.org; auth=none
All,
There's currently a problem in ARM & AArch64 crt0 on the GetCommandLine
semihosting invocation.
I am proposing this patch to fix the issue.
Tested with versions : gcc 5.4, binutils 2.26, qemu-arm / qemu-aarch64
2.5.0.
Would it be ok to commit ?
Regards,
Laurent Alfonsi
>From 12968a3744777fe4daac6a03cb76303e952664cc Mon Sep 17 00:00:00 2001
From: Laurent ALFONSI <laurent.alfonsi@st.com>
Date: Tue, 18 Apr 2017 17:50:16 +0200
Subject: [PATCH] ARM/AArch64: Fix GetCmdLine semihosting directives
When simulating arm code, the target program startup code (crt0) uses
semihosting invocations to get the command line from the simulator. The
simulator returns the command line and its size into the area passed in
parameter. (ARM 32-bit specifications :
http://infocenter.arm.com/help/topic/com.arm.doc.dui0058d/DUI0058.pdf
chapter "5.4.19 SYS_GET_CMDLINE").
The memory area pointed by the semihosting register argument is located
in .text section (usually not writtable (RX)).
If we run this code on a simulator that respects this rights properties
(qemu user-mode for instance), the command line will not be written to
the .text program memory, in particular the length of the string. The
program runs with an empty command line. This problem hasn't been seen
earlier probably because qemu user-mode is not so much used, but this can
happen with another simulator that refuse to write in a read-only segment.
With this modification, the command line can be correctly passed to the
target program.
Changes:
- libgloss/arm/crt0.S : Arguments passed to the AngelSWI_Reason_GetCmdLine
semihosting invocation are placed into .data section instead of .text
- libgloss/aarch64/crt0.S : Idem for aarch64 AngelSVC_Reason_GetCmdLine
semihosting.
---
libgloss/aarch64/crt0.S | 11 +++++++----
libgloss/arm/crt0.S | 9 ++++++---
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/libgloss/aarch64/crt0.S b/libgloss/aarch64/crt0.S
index fdfc174..42673fb 100644
--- a/libgloss/aarch64/crt0.S
+++ b/libgloss/aarch64/crt0.S
@@ -166,11 +166,12 @@
/* Fetch and parse the command line. */
#ifdef ARM_RDI_MONITOR
- adr x1, .Lcmdline /* Command line descriptor. */
+ ldr x1, .Lcmdline /* Command line descriptor. */
mov w0, #AngelSVC_Reason_GetCmdLine
AngelSVCAsm AngelSVC
#endif
ldr x8, .Lcmdline
+ ldr x8, [x8]
mov x0, #0 /* argc */
mov x1, sp /* argv */
@@ -267,9 +268,8 @@ FUNCTION (_cpu_init_reset):
.Lenvp:
GEN_DWORD env
.Lcmdline:
- GEN_DWORD CommandLine
- .dword 511
-
+ GEN_DWORD AngelSVCArgs
+
/* Workspace for Angel calls. */
.data
.align 3
@@ -287,3 +287,6 @@ StackBase: GEN_DWORD __stack
StackLimit: .dword 0
env: .dword 0 /* Dummy environment array */
CommandLine: .space 512,0 /* Maximum length of 511 chars handled. */
+AngelSVCArgs:
+ GEN_DWORD CommandLine
+ .dword 511
diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index 78bc467..709b71c 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -294,9 +294,10 @@ __change_mode:
movs r1, r0
#else
movs r0, #AngelSWI_Reason_GetCmdLine
- adr r1, .LC30 /* Space for command line */
+ ldr r1, .LC30 /* Space for command line */
AngelSWIAsm AngelSWI
ldr r1, .LC30
+ ldr r1, [r1]
#endif
/* Parse string at r1 */
movs r0, #0 /* count of arguments so far */
@@ -503,8 +504,7 @@ change_back:
#endif
#ifdef ARM_RDI_MONITOR
.LC30:
- .word CommandLine
- .word 511
+ .word AngelSWIArgs
.LC31:
.word __end__
@@ -517,6 +517,9 @@ HeapLimit: .word 0
__stack_base__: .word 0
StackLimit: .word 0
CommandLine: .space 512,0 /* Maximum length of 511 chars handled. */
+AngelSWIArgs:
+ .word CommandLine
+ .word 511
#endif
#ifdef __pe__
--
1.9.1