1 /**
2 * \file
3 *
4 * \brief Syscalls for SAM0 (GCC).
5 *
6 * Copyright (C) 2015-2016 Atmel Corporation. All rights reserved.
7 *
8 * \asf_license_start
9 *
10 * \page License
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright notice,
16 * this list of conditions and the following disclaimer.
17 *
18 * 2. Redistributions in binary form must reproduce the above copyright notice,
19 * this list of conditions and the following disclaimer in the documentation
20 * and/or other materials provided with the distribution.
21 *
22 * 3. The name of Atmel may not be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * 4. This software may only be redistributed and used in connection with an
26 * Atmel microcontroller product.
27 *
28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 *
40 * \asf_license_stop
41 *
42 */
43
44 #include <stdio.h>
45 #include <stdarg.h>
46 #include <sys/types.h>
47 #include <sys/stat.h>
48
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52
53 #undef errno
54 extern int errno;
55 extern int _end;
56
57 extern caddr_t _sbrk(int incr);
58 extern int link(char *old, char *_new);
59 extern int _close(int file);
60 extern int _fstat(int file, struct stat *st);
61 extern int _isatty(int file);
62 extern int _lseek(int file, int ptr, int dir);
63 extern void _exit(int status);
64 extern void _kill(int pid, int sig);
65 extern int _getpid(void);
66
67 /**
68 * \brief Replacement of C library of _sbrk
69 */
_sbrk(int incr)70 extern caddr_t _sbrk(int incr)
71 {
72 static unsigned char *heap = NULL;
73 unsigned char * prev_heap;
74
75 if (heap == NULL) {
76 heap = (unsigned char *)&_end;
77 }
78 prev_heap = heap;
79
80 heap += incr;
81
82 return (caddr_t)prev_heap;
83 }
84
85 /**
86 * \brief Replacement of C library of link
87 */
link(char * old,char * _new)88 extern int link(char *old, char *_new)
89 {
90 (void)old, (void)_new;
91 return -1;
92 }
93
94 /**
95 * \brief Replacement of C library of _close
96 */
_close(int file)97 extern int _close(int file)
98 {
99 (void)file;
100 return -1;
101 }
102
103 /**
104 * \brief Replacement of C library of _fstat
105 */
_fstat(int file,struct stat * st)106 extern int _fstat(int file, struct stat *st)
107 {
108 (void)file;
109 st->st_mode = S_IFCHR;
110
111 return 0;
112 }
113
114 /**
115 * \brief Replacement of C library of _isatty
116 */
_isatty(int file)117 extern int _isatty(int file)
118 {
119 (void)file;
120 return 1;
121 }
122
123 /**
124 * \brief Replacement of C library of _lseek
125 */
_lseek(int file,int ptr,int dir)126 extern int _lseek(int file, int ptr, int dir)
127 {
128 (void)file, (void)ptr, (void)dir;
129 return 0;
130 }
131
132 /**
133 * \brief Replacement of C library of _exit
134 */
_exit(int status)135 extern void _exit(int status)
136 {
137 printf("Exiting with status %d.\n", status);
138
139 for (;;)
140 ;
141 }
142
143 /**
144 * \brief Replacement of C library of _kill
145 */
_kill(int pid,int sig)146 extern void _kill(int pid, int sig)
147 {
148 (void)pid, (void)sig;
149 return;
150 }
151
152 /**
153 * \brief Replacement of C library of _getpid
154 */
_getpid(void)155 extern int _getpid(void)
156 {
157 return -1;
158 }
159
160 #ifdef __cplusplus
161 }
162 #endif
163