public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources
@ 2019-08-02 12:33 Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 2/4] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit Alexander Fedotov
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Alexander Fedotov @ 2019-08-02 12:33 UTC (permalink / raw)
  To: newlib

This series of patches is intended to syncronize libgloss and newlib/libc/sys/arm
sources. As Richard mentioned many times new patches for libgloss/arm requires the
same changes to be applied libc/sys/arm. And vice versa. For the moment they are
totally different (e.g. syscalls.c) and this comlicates it's maintainance.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 4/4] Align libgloss/arm and libc/sys/arm sources: miscellaneous fixes
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 2/4] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit Alexander Fedotov
@ 2019-08-02 12:34 ` Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 1/4] Align libgloss/arm and libc/sys/arm sources: Fix GetCmdLine semihosting directives Alexander Fedotov
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Alexander Fedotov @ 2019-08-02 12:34 UTC (permalink / raw)
  To: newlib; +Cc: Alexander Fedotov

1. Trim trailing spaces
2. Align comments, function declarations and definitions
---
 libgloss/arm/crt0.S            |   2 +-
 libgloss/arm/syscalls.c        | 106 ++++++++++++++-------------------
 newlib/libc/sys/arm/arm.h      |   2 +-
 newlib/libc/sys/arm/syscalls.c |  50 +++++++++++-----
 4 files changed, 82 insertions(+), 78 deletions(-)

diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S
index 3e740c654..8490bde2f 100644
--- a/libgloss/arm/crt0.S
+++ b/libgloss/arm/crt0.S
@@ -440,7 +440,7 @@ __change_mode:
 	beq	.LC10
 
 /* See whether we are scanning a string.  */
-	cmp	r3, #'"'
+	cmp	r3, #'\"'
 #ifdef __thumb__
 	beq	.LC20
 	cmp	r3, #'\''
diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c
index 3605e0fd0..fc394f94b 100644
--- a/libgloss/arm/syscalls.c
+++ b/libgloss/arm/syscalls.c
@@ -18,30 +18,30 @@
 #include "swi.h"
 
 /* Forward prototypes.  */
-int     _system     (const char *);
-int     _rename     (const char *, const char *);
-int     _isatty		(int);
+int	_system		(const char *);
+int	_rename		(const char *, const char *);
+int	_isatty		(int);
 clock_t _times		(struct tms *);
-int     _gettimeofday	(struct timeval *, void *);
-int     _unlink		(const char *);
-int     _link 		(const char *, const char *);
-int     _stat 		(const char *, struct stat *);
-int     _fstat 		(int, struct stat *);
+int	_gettimeofday	(struct timeval *, void *);
+int	_unlink		(const char *);
+int	_link		(const char *, const char *);
+int	_stat		(const char *, struct stat *);
+int	_fstat		(int, struct stat *);
 int	_swistat	(int fd, struct stat * st);
-void *  _sbrk		(ptrdiff_t);
-pid_t   _getpid	        (void);
-int     _close		(int);
-clock_t _clock		(void);
-int     _swiclose	(int);
-int     _open		(const char *, int, ...);
-int     _swiopen	(const char *, int);
-int     _write 		(int, const void *, size_t);
-int     _swiwrite	(int, const void *, size_t);
-_off_t  _lseek		(int, _off_t, int);
-_off_t  _swilseek	(int, _off_t, int);
-int     _read		(int, void *, size_t);
-int     _swiread	(int, void *, size_t);
-void    initialise_monitor_handles (void);
+void *	_sbrk		(ptrdiff_t);
+pid_t	_getpid		(void);
+int	_close		(int);
+clock_t	_clock		(void);
+int	_swiclose	(int);
+int	_open		(const char *, int, ...);
+int	_swiopen	(const char *, int);
+int	_write		(int, const void *, size_t);
+int	_swiwrite	(int, const void *, size_t);
+_off_t	_lseek		(int, _off_t, int);
+_off_t	_swilseek	(int, _off_t, int);
+int	_read		(int, void *, size_t);
+int	_swiread	(int, void *, size_t);
+void	initialise_monitor_handles (void);
 
 static int	checkerror	(int);
 static int	error		(int);
@@ -143,7 +143,7 @@ initialise_monitor_handles (void)
   int i;
   
   /* Open the standard file descriptors by opening the special
-   * teletype device, ":tt", read-only to obtain a descritpor for
+   * teletype device, ":tt", read-only to obtain a descriptor for
    * standard input and write-only to obtain a descriptor for standard
    * output. Finally, open ":tt" in append mode to obtain a descriptor
    * for standard error. Since this is a write mode, most kernels will
@@ -154,7 +154,7 @@ initialise_monitor_handles (void)
 
 #ifdef ARM_RDI_MONITOR
   int volatile block[3];
-  
+
   block[0] = (int) ":tt";
   block[2] = 3;     /* length of filename */
   block[1] = 0;     /* mode "r" */
@@ -351,17 +351,15 @@ checkerror (int result)
    len, is the length in bytes to read. 
    Returns the number of bytes *not* written. */
 int
-_swiread (int fh,
-	  void * ptr,
-	  size_t len)
+_swiread (int fh, void * ptr, size_t len)
 {
 #ifdef ARM_RDI_MONITOR
   int block[3];
-  
+
   block[0] = fh;
   block[1] = (int) ptr;
   block[2] = (int) len;
-  
+
   return checkerror (do_AngelSWI (AngelSWI_Reason_Read, block));
 #else
   register int r0 asm("r0");
@@ -381,9 +379,7 @@ _swiread (int fh,
    Translates the return of _swiread into
    bytes read. */
 int __attribute__((weak))
-_read (int fd,
-       void * ptr,
-       size_t len)
+_read (int fd, void * ptr, size_t len)
 {
   int res;
   struct fdent *pfd;
@@ -409,9 +405,7 @@ _read (int fd,
 
 /* fd, is a user file descriptor. */
 off_t
-_swilseek (int fd,
-	off_t ptr,
-	int dir)
+_swilseek (int fd, off_t ptr, int dir)
 {
   off_t res;
   struct fdent *pfd;
@@ -447,7 +441,7 @@ _swilseek (int fd,
         }
       dir = SEEK_SET;
     }
- 
+
 #ifdef ARM_RDI_MONITOR
   int block[2];
   if (dir == SEEK_END)
@@ -458,7 +452,7 @@ _swilseek (int fd,
         return -1;
       ptr += res;
     }
-  
+
   /* This code only does absolute seeks.  */
   block[0] = pfd->handle;
   block[1] = (int) ptr;
@@ -494,9 +488,7 @@ _swilseek (int fd,
 }
 
 off_t
-_lseek (int fd,
-	off_t ptr,
-	int dir)
+_lseek (int fd, off_t ptr, int dir)
 {
   return _swilseek (fd, ptr, dir);
 }
@@ -504,18 +496,15 @@ _lseek (int fd,
 /* fh, is a valid internal file handle.
    Returns the number of bytes *not* written. */
 int
-_swiwrite (
-	   int    fh,
-	   const void * ptr,
-	   size_t    len)
+_swiwrite (int fh, const void * ptr, size_t len)
 {
 #ifdef ARM_RDI_MONITOR
   int block[3];
-  
+
   block[0] = fh;
   block[1] = (int) ptr;
   block[2] = (int) len;
-  
+
   return checkerror (do_AngelSWI (AngelSWI_Reason_Write, block));
 #else
   register int r0 asm("r0");
@@ -533,9 +522,7 @@ _swiwrite (
 
 /* fd, is a user file descriptor. */
 int __attribute__((weak))
-_write (int    fd,
-	const void * ptr,
-	size_t    len)
+_write (int fd, const void * ptr, size_t len)
 {
   int res;
   struct fdent *pfd;
@@ -593,7 +580,7 @@ _swiopen (const char * path, int flags)
         }
     }
 
-  /* The flags are Unix-style, so we need to convert them. */ 
+  /* The flags are Unix-style, so we need to convert them.  */
 #ifdef O_BINARY
   if (flags & O_BINARY)
     aflags |= 1;
@@ -611,25 +598,24 @@ _swiopen (const char * path, int flags)
 
   if (flags & O_APPEND)
     {
-      /* Can't ask for w AND a; means just 'a'.  */
-      aflags &= ~4;
+      aflags &= ~4; /* Can't ask for w AND a; means just 'a'.  */
       aflags |= 8;
     }
-  
+
 #ifdef ARM_RDI_MONITOR
   block[0] = (int) path;
   block[2] = strlen (path);
   block[1] = aflags;
-  
+
   fh = do_AngelSWI (AngelSWI_Reason_Open, block);
-  
+
 #else
   asm ("mov r0,%2; mov r1, %3; swi %a1; mov %0, r0"
        : "=r"(fh)
        : "i" (SWI_Open),"r"(path),"r"(aflags)
        : "r0","r1");
 #endif
-  
+
   /* Return a user file descriptor or an error. */
   if (fh >= 0)
     {
@@ -784,13 +770,13 @@ _stat (const char *fname, struct stat *st)
 {
   int fd, res;
   memset (st, 0, sizeof (* st));
-  /* The best we can do is try to open the file readonly.  
-     If it exists, then we can guess a few things about it. */
+  /* The best we can do is try to open the file readonly.  If it exists,
+     then we can guess a few things about it.  */
   if ((fd = _open (fname, O_RDONLY)) == -1)
     return -1;
   st->st_mode |= S_IFREG | S_IREAD;
   res = _swistat (fd, st);
-  /* Not interested in the error. */
+  /* Not interested in the error.  */
   _close (fd); 
   return res;
 }
@@ -880,7 +866,7 @@ _times (struct tms * tp)
       tp->tms_cutime = 0;	/* user time, children */
       tp->tms_cstime = 0;	/* system time, children */
     }
-  
+
   return timeval;
 };
 
diff --git a/newlib/libc/sys/arm/arm.h b/newlib/libc/sys/arm/arm.h
index dbed81750..10e5b0509 100644
--- a/newlib/libc/sys/arm/arm.h
+++ b/newlib/libc/sys/arm/arm.h
@@ -85,6 +85,6 @@
 #define CPSR_F_MASK			0x40	/* FIQ bit.  */
 #define CPSR_I_MASK			0x80	/* IRQ bit.  */
 
-#define CPSR_M_MASK			0x0F	/* Mode mask except M[4] */
+#define CPSR_M_MASK			0x0F	/* Mode mask except M[4].  */
 
 #endif /* _LIBGLOSS_ARM_H */
diff --git a/newlib/libc/sys/arm/syscalls.c b/newlib/libc/sys/arm/syscalls.c
index a2997b44c..1f7222980 100644
--- a/newlib/libc/sys/arm/syscalls.c
+++ b/newlib/libc/sys/arm/syscalls.c
@@ -114,6 +114,16 @@ void
 initialise_monitor_handles (void)
 {
   int i;
+  
+  /* Open the standard file descriptors by opening the special
+   * teletype device, ":tt", read-only to obtain a descriptor for
+   * standard input and write-only to obtain a descriptor for standard
+   * output. Finally, open ":tt" in append mode to obtain a descriptor
+   * for standard error. Since this is a write mode, most kernels will
+   * probably return the same value as for standard output, but the
+   * kernel can differentiate the two using the mode flag and return a
+   * different descriptor for standard error.
+   */
 
 #ifdef ARM_RDI_MONITOR
   int volatile block[3];
@@ -163,11 +173,12 @@ get_errno (void)
   return do_AngelSWI (AngelSWI_Reason_Errno, NULL);
 #else
   register int r0 asm("r0");
-  asm ("swi %a1" : "=r"(r0): "i" (SWI_GetErrno));
+  asm ("swi %a1" : "=r"(r0) : "i" (SWI_GetErrno));
   return r0;
 #endif
 }
 
+/* Set errno and return result. */
 static int
 error (int result)
 {
@@ -183,7 +194,10 @@ wrap (int result)
   return result;
 }
 
-/* Returns # chars not! written.  */
+/* file, is a valid user file handle.
+   ptr, is a null terminated string.
+   len, is the length in bytes to read. 
+   Returns the number of bytes *not* written. */
 int
 _swiread (int file, void * ptr, size_t len)
 {
@@ -207,6 +221,9 @@ _swiread (int file, void * ptr, size_t len)
 #endif
 }
 
+/* file, is a valid user file handle.
+   Translates the return of _swiread into
+   bytes read. */
 int __attribute__((weak))
 _read (int file, void * ptr, size_t len)
 {
@@ -223,15 +240,13 @@ _read (int file, void * ptr, size_t len)
   return len - x;
 }
 
+/* file, is a user file descriptor. */
 off_t
 _swilseek (int file, off_t ptr, int dir)
 {
   _off_t res;
   int fh = remap_handle (file);
   int slot = findslot (fh);
-#ifdef ARM_RDI_MONITOR
-  int block[2];
-#endif
 
   if (dir == SEEK_CUR)
     {
@@ -249,6 +264,7 @@ _swilseek (int file, off_t ptr, int dir)
     }
 
 #ifdef ARM_RDI_MONITOR
+  int block[2];
   if (dir == SEEK_END)
     {
       block[0] = fh;
@@ -294,7 +310,8 @@ _lseek (int file, off_t ptr, int dir)
   return wrap (_swilseek (file, ptr, dir));
 }
 
-/* Returns #chars not! written.  */
+/* file, is a valid internal file handle.
+   Returns the number of bytes *not* written. */
 int
 _swiwrite (int file, const void * ptr, size_t len)
 {
@@ -319,6 +336,7 @@ _swiwrite (int file, const void * ptr, size_t len)
 #endif
 }
 
+/* file, is a user file descriptor. */
 int __attribute__((weak))
 _write (int file, const void * ptr, size_t len)
 {
@@ -366,7 +384,7 @@ _swiopen (const char * path, int flags)
 
   if (flags & O_APPEND)
     {
-      aflags &= ~4;     /* Can't ask for w AND a; means just 'a'.  */
+      aflags &= ~4; /* Can't ask for w AND a; means just 'a'.  */
       aflags |= 8;
     }
 
@@ -527,7 +545,7 @@ _sbrk (ptrdiff_t incr)
 
 extern void memset (struct stat *, int, unsigned int);
 
-int
+int __attribute__((weak))
 _fstat (int file, struct stat * st)
 {
   memset (st, 0, sizeof (* st));
@@ -537,7 +555,8 @@ _fstat (int file, struct stat * st)
   file = file;
 }
 
-int _stat (const char *fname, struct stat *st)
+int __attribute__((weak))
+_stat (const char *fname, struct stat *st)
 {
   int file;
 
@@ -553,20 +572,19 @@ int _stat (const char *fname, struct stat *st)
   return 0;
 }
 
-int
-_link (const char *__path1 __attribute__ ((unused)),
-       const char *__path2 __attribute__ ((unused)))
+int __attribute__((weak))
+_link (const char *__path1 __attribute__ ((unused)), const char *__path2 __attribute__ ((unused)))
 {
   errno = ENOSYS;
   return -1;
 }
 
 int
-_unlink (const char *path __attribute__ ((unused)))
+_unlink (const char *path)
 {
 #ifdef ARM_RDI_MONITOR
   int block[2];
-  block[0] = (int) path;
+  block[0] = (int)path;
   block[1] = strlen(path);
   return wrap (do_AngelSWI (AngelSWI_Reason_Remove, block)) ? -1 : 0;
 #else
@@ -659,13 +677,13 @@ _system (const char *s)
      meaning to its return value.  Try to do something reasonable....  */
   if (!s)
     return 1;  /* maybe there is a shell available? we can hope. :-P */
-  block[0] = (int) s;
+  block[0] = (int)s;
   block[1] = strlen (s);
   e = wrap (do_AngelSWI (AngelSWI_Reason_System, block));
   if ((e >= 0) && (e < 256))
     {
       /* We have to convert e, an exit status to the encoded status of
-	 the command.  To avoid hard coding the exit status, we simply
+         the command.  To avoid hard coding the exit status, we simply
 	 loop until we find the right position.  */
       int exit_code;
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/4] Align libgloss/arm and libc/sys/arm sources: Fix GetCmdLine semihosting directives
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 2/4] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 4/4] Align libgloss/arm and libc/sys/arm sources: miscellaneous fixes Alexander Fedotov
@ 2019-08-02 12:34 ` Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 3/4] Align libgloss/arm and libc/sys/arm sources: Lite exit support Alexander Fedotov
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Alexander Fedotov @ 2019-08-02 12:34 UTC (permalink / raw)
  To: newlib; +Cc: Alexander Fedotov

Applied changes from the commit 9b11672:

	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:
	- newlib/libc/sys/arm/crt0.S : Arguments passed to the
	AngelSWI_Reason_GetCmdLine semihosting invocation are placed into .data
	section instead of .text
---
 newlib/libc/sys/arm/crt0.S | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S
index 9c262428d..40bbc3d69 100644
--- a/newlib/libc/sys/arm/crt0.S
+++ b/newlib/libc/sys/arm/crt0.S
@@ -393,13 +393,14 @@ __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.  */
 #ifdef THUMB_VXM
 	bkpt	AngelSWI
 #else
  	AngelSWIAsm	AngelSWI
 #endif
 	ldr	r1, .LC30
+	ldr	r1, [r1]
 #endif
 	/*  Parse string at r1.  */
 	movs	r0, #0		/* Count of arguments so far.  */
@@ -586,8 +587,7 @@ change_back:
 #endif
 #ifdef ARM_RDI_MONITOR
 .LC30:
-	.word	CommandLine
-	.word	255
+	.word	AngelSWIArgs
 .LC31:
 	.word	__end__
 
@@ -600,6 +600,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__
-- 
2.17.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 3/4] Align libgloss/arm and libc/sys/arm sources: Lite exit support
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
                   ` (2 preceding siblings ...)
  2019-08-02 12:34 ` [PATCH v2 1/4] Align libgloss/arm and libc/sys/arm sources: Fix GetCmdLine semihosting directives Alexander Fedotov
@ 2019-08-02 12:34 ` Alexander Fedotov
  2019-08-05 11:17 ` [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Corinna Vinschen
  2019-08-05 12:03 ` Richard Earnshaw (lists)
  5 siblings, 0 replies; 7+ messages in thread
From: Alexander Fedotov @ 2019-08-02 12:34 UTC (permalink / raw)
  To: newlib; +Cc: Alexander Fedotov

Applied changes from commit 2404223:

	* arm/crt0.S (_mainCRTStartup): Weak reference to atexit and _fini
		when lite exit is enabled.
---
 newlib/libc/sys/arm/crt0.S | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S
index a55aa365b..5e677a23c 100644
--- a/newlib/libc/sys/arm/crt0.S
+++ b/newlib/libc/sys/arm/crt0.S
@@ -518,8 +518,17 @@ __change_mode:
 	   for _fini to be called at program exit.  */
 	movs	r4, r0
 	movs	r5, r1
+#ifdef _LITE_EXIT
+	/* Make reference to atexit weak to avoid unconditionally pulling in
+	   support code.  Refer to comments in __atexit.c for more details.  */
+	.weak	FUNCTION(atexit)
+	ldr	r0, .Latexit
+	cmp	r0, #0
+	beq	.Lweak_atexit
+#endif
 	ldr	r0, .Lfini
 	bl	FUNCTION (atexit)
+.Lweak_atexit:
 	bl	FUNCTION (_init)
 	movs	r0, r4
 	movs	r1, r5
@@ -589,6 +598,13 @@ change_back:
 .LC2:
 	.word	__bss_end__
 #ifdef __USES_INITFINI__
+#ifdef _LITE_EXIT
+.Latexit:
+	.word	FUNCTION(atexit)
+
+	/* Weak reference _fini in case of lite exit.  */
+	.weak	FUNCTION(_fini)
+#endif
 .Lfini:
 	.word	FUNCTION(_fini)
 #endif
-- 
2.17.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 2/4] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
@ 2019-08-02 12:34 ` Alexander Fedotov
  2019-08-02 12:34 ` [PATCH v2 4/4] Align libgloss/arm and libc/sys/arm sources: miscellaneous fixes Alexander Fedotov
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Alexander Fedotov @ 2019-08-02 12:34 UTC (permalink / raw)
  To: newlib; +Cc: Alexander Fedotov

Applied changes from commit 8d98f95:

	* arm/crt0.S: Initialise __heap_limit when ARM_RDI_MONITOR is defined.
	* arm/syscalls.c: define __heap_limit global symbol.
	* arm/syscalls.c (_sbrk): Honour __heap_limit.

Applied changes from commit 8d98f95:
	Fixed semihosting for ARM when heapinfo not provided by debugger
---
 libgloss/arm/syscalls.c        | 12 ++++++------
 newlib/libc/sys/arm/crt0.S     |  7 +++++++
 newlib/libc/sys/arm/syscalls.c |  9 +++++++--
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c
index dacd1a9d3..3605e0fd0 100644
--- a/libgloss/arm/syscalls.c
+++ b/libgloss/arm/syscalls.c
@@ -707,15 +707,15 @@ uint __heap_limit = 0xcafedead;
 void * __attribute__((weak))
 _sbrk (ptrdiff_t incr)
 {
-  extern char end asm ("end"); /* Defined by the linker.  */
+  extern char   end asm ("end"); /* Defined by the linker.  */
   static char * heap_end;
-  char * prev_heap_end;
+  char *        prev_heap_end;
 
   if (heap_end == NULL)
     heap_end = & end;
-  
+
   prev_heap_end = heap_end;
-  
+
   if ((heap_end + incr > stack_ptr)
       /* Honour heap limit if it's valid.  */
       || (__heap_limit != 0xcafedead && heap_end + incr > (char *)__heap_limit))
@@ -726,14 +726,14 @@ _sbrk (ptrdiff_t incr)
       extern void abort (void);
 
       _write (1, "_sbrk: Heap and stack collision\n", 32);
-      
+
       abort ();
 #else
       errno = ENOMEM;
       return (void *) -1;
 #endif
     }
-  
+
   heap_end += incr;
 
   return (void *) prev_heap_end;
diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S
index 40bbc3d69..a55aa365b 100644
--- a/newlib/libc/sys/arm/crt0.S
+++ b/newlib/libc/sys/arm/crt0.S
@@ -282,6 +282,13 @@
 #endif
 	ldr	r0, .LC0	/*  Point at values read.  */
 
+	/* Set __heap_limit.  */
+	ldr     r1, [r0, #4]
+	cmp     r1, #0
+	beq     .LC33
+	ldr     r2, =__heap_limit
+	str     r1, [r2]
+.LC33:
 	ldr     r1, [r0, #0]
 	cmp     r1, #0
 	bne     .LC32
diff --git a/newlib/libc/sys/arm/syscalls.c b/newlib/libc/sys/arm/syscalls.c
index b52107491..a2997b44c 100644
--- a/newlib/libc/sys/arm/syscalls.c
+++ b/newlib/libc/sys/arm/syscalls.c
@@ -487,10 +487,13 @@ _getpid (void)
   return (pid_t)1;
 }
 
+/* Heap limit returned from SYS_HEAPINFO Angel semihost call.  */
+uint __heap_limit = 0xcafedead;
+
 void * __attribute__((weak))
 _sbrk (ptrdiff_t incr)
 {
-  extern char   end asm ("end");	/* Defined by the linker.  */
+  extern char   end asm ("end"); /* Defined by the linker.  */
   static char * heap_end;
   char *        prev_heap_end;
 
@@ -499,7 +502,9 @@ _sbrk (ptrdiff_t incr)
 
   prev_heap_end = heap_end;
 
-  if (heap_end + incr > stack_ptr)
+  if ((heap_end + incr > stack_ptr)
+      /* Honour heap limit if it's valid.  */
+      || (__heap_limit != 0xcafedead && heap_end + incr > (char *)__heap_limit))
     {
       /* Some of the libstdc++-v3 tests rely upon detecting
 	 out of memory errors, so do not abort here.  */
-- 
2.17.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
                   ` (3 preceding siblings ...)
  2019-08-02 12:34 ` [PATCH v2 3/4] Align libgloss/arm and libc/sys/arm sources: Lite exit support Alexander Fedotov
@ 2019-08-05 11:17 ` Corinna Vinschen
  2019-08-05 12:03 ` Richard Earnshaw (lists)
  5 siblings, 0 replies; 7+ messages in thread
From: Corinna Vinschen @ 2019-08-05 11:17 UTC (permalink / raw)
  To: Alexander Fedotov; +Cc: newlib, Richard.Earnshaw

[-- Attachment #1: Type: text/plain, Size: 515 bytes --]

On Aug  2 07:33, Alexander Fedotov wrote:
> This series of patches is intended to syncronize libgloss and newlib/libc/sys/arm
> sources. As Richard mentioned many times new patches for libgloss/arm requires the
> same changes to be applied libc/sys/arm. And vice versa. For the moment they are
> totally different (e.g. syscalls.c) and this comlicates it's maintainance.

Your subjects are still a bit long, but it's ok.

Richard?


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources
  2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
                   ` (4 preceding siblings ...)
  2019-08-05 11:17 ` [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Corinna Vinschen
@ 2019-08-05 12:03 ` Richard Earnshaw (lists)
  5 siblings, 0 replies; 7+ messages in thread
From: Richard Earnshaw (lists) @ 2019-08-05 12:03 UTC (permalink / raw)
  To: Alexander Fedotov, newlib



On 02/08/2019 13:33, Alexander Fedotov wrote:
> This series of patches is intended to syncronize libgloss and newlib/libc/sys/arm
> sources. As Richard mentioned many times new patches for libgloss/arm requires the
> same changes to be applied libc/sys/arm. And vice versa. For the moment they are
> totally different (e.g. syscalls.c) and this comlicates it's maintainance.
> 
> 

Pushed.

Thanks for doing this.

R.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-08-05 12:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-02 12:33 [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Alexander Fedotov
2019-08-02 12:34 ` [PATCH v2 2/4] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit Alexander Fedotov
2019-08-02 12:34 ` [PATCH v2 4/4] Align libgloss/arm and libc/sys/arm sources: miscellaneous fixes Alexander Fedotov
2019-08-02 12:34 ` [PATCH v2 1/4] Align libgloss/arm and libc/sys/arm sources: Fix GetCmdLine semihosting directives Alexander Fedotov
2019-08-02 12:34 ` [PATCH v2 3/4] Align libgloss/arm and libc/sys/arm sources: Lite exit support Alexander Fedotov
2019-08-05 11:17 ` [PATCH v2 0/4] Align libgloss/arm and libc/sys/arm sources Corinna Vinschen
2019-08-05 12:03 ` Richard Earnshaw (lists)

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).