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