public inbox for newlib-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit
@ 2019-08-05 12:02 Richard Earnshaw
0 siblings, 0 replies; only message in thread
From: Richard Earnshaw @ 2019-08-05 12:02 UTC (permalink / raw)
To: newlib-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=dfffe683038357d106893ef1ba30462b31e7b589
commit dfffe683038357d106893ef1ba30462b31e7b589
Author: Alexander Fedotov <alfedotov@gmail.com>
Date: Fri Aug 2 07:33:44 2019 -0500
Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit
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
Diff:
---
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 dacd1a9..3605e0f 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 40bbc3d..a55aa36 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 b521074..a2997b4 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. */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2019-08-05 12:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-05 12:02 [newlib-cygwin] Align libgloss/arm and libc/sys/arm sources: HeapInfo and __heap_limit Richard Earnshaw
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).