From 8d98f956cc398d086794e19051c3380d599022da Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 17 Feb 2015 09:30:52 +0000 Subject: [PATCH] * 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. --- libgloss/ChangeLog | 6 ++++++ libgloss/arm/crt0.S | 5 +++++ libgloss/arm/syscalls.c | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index c6ac6a0bc..ff28585df 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,9 @@ +2015-02-17 Renlin Li + + * 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. + 2015-02-11 Stefan Wallentowitz * or1k/or1k_uart.c: Write bugfix and cleanup/documentation. diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S index cc1c37091..cb9021df3 100644 --- a/libgloss/arm/crt0.S +++ b/libgloss/arm/crt0.S @@ -123,6 +123,11 @@ #endif ldr r0, .LC0 /* point at values read */ + /* Set __heap_limit. */ + ldr r1, [r0, #4] + ldr r2, =__heap_limit + str r1, [r2] + ldr r1, [r0, #0] cmp r1, #0 bne .LC32 diff --git a/libgloss/arm/syscalls.c b/libgloss/arm/syscalls.c index 54e3d74f0..0ccad215c 100644 --- a/libgloss/arm/syscalls.c +++ b/libgloss/arm/syscalls.c @@ -587,6 +587,9 @@ _getpid (int n __attribute__ ((unused))) return 1; } +/* Heap limit returned from SYS_HEAPINFO Angel semihost call. */ +uint __heap_limit = 0xcafedead; + caddr_t __attribute__((weak)) _sbrk (int incr) { @@ -599,7 +602,9 @@ _sbrk (int 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 > __heap_limit)) { /* Some of the libstdc++-v3 tests rely upon detecting out of memory errors, so do not abort here. */