openblt/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_K.../Boot/Libraries/Newlib/syscalls.c

101 lines
3.9 KiB
C

/*********************************************************************************************************************
* @file syscalls.c
* @brief Newlib stubs
* @version V1.6
* @date 20 Apr 2017
*
* @cond
*********************************************************************************************************************
* Copyright (c) 2015-2017, Infineon Technologies AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,are permitted provided that the
* following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
* Infineon Technologies AG dave@infineon.com).
*********************************************************************************************************************
*
* *************************** Change history ********************************
* V0.1 : Initial version
* V0.2 : Label updates
* V1.0 : Made _sbrk device agnostic
* V1.1 : C++ support
* V1.2 : Restored compatibility with old project files
* V1.3 Jan 2014, PKB : Encapsulating everything in this file for use only with GCC
* V1.4 11 Dec 2015, JFT : Fix heap overflow
* V1.5 09 Mar 2016, JFT : Add dso_handle to support destructors call at exit
* V1.6 20 Apr 2017, JFT : Foward declaration of __sbrk to fix link time optimization (-flto) compilation errors
* @endcond
*/
/*
* This file contains stubs for standard C library functionality that must
* typically be provided for the underlying platform.
*
*/
#if defined ( __GNUC__ )
#include <stdint.h>
#include <errno.h>
#include <sys/types.h>
/* Forward prototypes. */
caddr_t _sbrk(int nbytes) __attribute__((externally_visible));
void _init(void) __attribute__((externally_visible));
/* c++ destructor dynamic shared object needed if -fuse-cxa-atexit is used*/
void *__dso_handle __attribute__ ((weak));
// defined in linker script
extern caddr_t Heap_Bank1_Start;
extern caddr_t Heap_Bank1_End;
caddr_t _sbrk(int nbytes)
{
static caddr_t heap_ptr = NULL;
caddr_t base;
if (heap_ptr == NULL) {
heap_ptr = (caddr_t)&Heap_Bank1_Start;
}
base = heap_ptr;
/* heap word alignment */
nbytes = (nbytes + 3) & ~0x3U;
if ((caddr_t)&Heap_Bank1_End > (heap_ptr + nbytes))
{
heap_ptr += nbytes;
return (base);
}
else
{
/* Heap overflow */
errno = ENOMEM;
return ((caddr_t)-1);
}
}
/* Init */
void _init(void)
{}
#endif /* __GNUC__ */