public inbox for newlib-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] ARM/AArch64: Fix GetCmdLine semihosting directives
@ 2017-05-19 19:45 Jeff Johnston
  0 siblings, 0 replies; only message in thread
From: Jeff Johnston @ 2017-05-19 19:45 UTC (permalink / raw)
  To: newlib-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9b1167219a11311dd5a3db4b6802feea2f2ee765

commit 9b1167219a11311dd5a3db4b6802feea2f2ee765
Author: Laurent ALFONSI <laurent.alfonsi@st.com>
Date:   Tue Apr 18 17:50:16 2017 +0200

    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.

Diff:
---
 libgloss/aarch64/crt0.S | 10 ++++++----
 libgloss/arm/crt0.S     |  9 ++++++---
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/libgloss/aarch64/crt0.S b/libgloss/aarch64/crt0.S
index ae6264d..ed4dafc 100644
--- a/libgloss/aarch64/crt0.S
+++ b/libgloss/aarch64/crt0.S
@@ -156,10 +156,11 @@
 	bl	FUNCTION (_init)
 
 	/* Fetch and parse the command line.  */
-	adr	x1, .Lcmdline		/* Command line descriptor.  */
+	ldr	x1, .Lcmdline		/* Command line descriptor.  */
 	mov	w0, #AngelSVC_Reason_GetCmdLine
 	AngelSVCAsm AngelSVC
 	ldr	x8, .Lcmdline
+	ldr	x8, [x8]
 
 	mov	x0, #0		/* argc */
 	mov	x1, sp		/* argv */
@@ -239,9 +240,7 @@ FUNCTION (_cpu_init_hook):
 .Lenvp:
 	GEN_DWORD env
 .Lcmdline:
-	GEN_DWORD CommandLine
-	.dword	255
-
+	GEN_DWORD AngelSVCArgs
 /*  Workspace for Angel calls.  */
 	.data
 	.align 3
@@ -258,3 +257,6 @@ StackBase:	.dword	0
 StackLimit:	.dword	0
 env:		.dword	0	/* Dummy environment array */
 CommandLine:	.space	256,0	/*  Maximum length of 255 chars handled.  */
+AngelSVCArgs:
+	GEN_DWORD CommandLine
+	.dword	255
diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index 35c306b..48f3d6b 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -296,9 +296,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 */
@@ -505,8 +506,7 @@ change_back:
 #endif
 #ifdef ARM_RDI_MONITOR
 .LC30:
-	.word	CommandLine
-	.word	255
+	.word	AngelSWIArgs
 .LC31:
 	.word	__end__
 
@@ -519,6 +519,9 @@ HeapLimit:	.word	0
 __stack_base__:	.word	0
 StackLimit:	.word	0
 CommandLine:	.space	256,0	/*  Maximum length of 255 chars handled.  */
+AngelSWIArgs:
+	.word	CommandLine
+	.word	255
 #endif
 	
 #ifdef __pe__


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-05-19 19:45 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-19 19:45 [newlib-cygwin] ARM/AArch64: Fix GetCmdLine semihosting directives Jeff Johnston

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).