diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2010-12-02 22:35:47 +0300 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2010-12-02 22:35:47 +0300 |
commit | 8ae0b98903893e68a52baa9a2e3df574f0d7a39e (patch) | |
tree | e6810305a55e34b3b0598e4d04e236ace3b606c6 /libgloss/cr16/sbrk.c | |
parent | 874a87f8cd93365c3bea0e6e5d14c265e9bb01f6 (diff) |
2010-12-02 Jayant Sonar jayant.sonar@kpitcummins.com
Kaushik Phatak kaushik.phatak@kpitcummins.com
* configure.in: Add CR16 support.
* configure: Regenerated.
* cr16/aclocal.m4: New.
* cr16/close.c: New.
* cr16/configure: New.
* cr16/configure.in: New.
* cr16/crt1.S: New.
* cr16/crti.S: New.
* cr16/crtn.S: New.
* cr16/dvz_hndl.c: New.
* cr16/_exit.c: New.
* cr16/flg_hndl.c: New.
* cr16/fstat.c: New.
* cr16/_getenv.c: New.
* cr16/getpid.c: New.
* cr16/iad_hndl.c: New.
* cr16/intable.c: New.
* cr16/isatty.c: New.
* cr16/kill.c: New.
* cr16/lseek.c: New.
* cr16/Makefile.in: New.
* cr16/open.c: New.
* cr16/putnum.c: New.
* cr16/read.c: New.
* cr16/_rename.c: New.
* cr16/sbrk.c: New.
* cr16/sim.ld: New.
* cr16/stat.c: New.
* cr16/svc_hndl.c: New.
* cr16/time.c: New.
* cr16/und_hndl.c: New.
* cr16/unlink.c: New.
* cr16/write.c: New.
Diffstat (limited to 'libgloss/cr16/sbrk.c')
-rw-r--r-- | libgloss/cr16/sbrk.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/libgloss/cr16/sbrk.c b/libgloss/cr16/sbrk.c new file mode 100644 index 000000000..7c9604726 --- /dev/null +++ b/libgloss/cr16/sbrk.c @@ -0,0 +1,56 @@ +/* sbrk.c -- Implementation of the low-level sbrk() routine + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include <errno.h> +#include <stddef.h> /* where ptrdiff_t is defined */ +#include <stdlib.h> + +/* Extend heap space by size bytes. + Return start of new space allocated, or -1 for errors + Error cases: + 1. Allocation is not within heap range */ + +void * _sbrk (ptrdiff_t size) +{ + /* + * The following two memory locations should be defined in the linker script file + */ + extern const char _HEAP_START; /* start of heap */ + extern const char _HEAP_MAX; /* end of heap (maximum value of heap_ptr) */ + + static const char * heap_ptr; /* pointer to head of heap */ + const char * old_heap_ptr; + static unsigned char init_sbrk = 0; + + /* heap_ptr is initialized to HEAP_START */ + if (init_sbrk == 0) + { + heap_ptr = &_HEAP_START; + init_sbrk = 1; + } + + old_heap_ptr = heap_ptr; + + if ((heap_ptr + size) > &_HEAP_MAX) + { + /* top of heap is bigger than _HEAP_MAX */ + errno = ENOMEM; + return (void *) -1; + } + + /* success: update heap_ptr and return previous value */ + heap_ptr += size; + return (void *)old_heap_ptr; +} |