1 /**
2 *****************************************************************************
3 **
4 ** File : syscalls.c
5 **
6 ** Author : Auto-generated by System workbench for STM32
7 **
8 ** Abstract : System Workbench Minimal System calls file
9 **
10 ** For more information about which c-functions
11 ** need which of these lowlevel functions
12 ** please consult the Newlib libc-manual
13 **
14 ** Target : STMicroelectronics STM32
15 **
16 ** Distribution: The file is distributed ?as is,? without any warranty
17 ** of any kind.
18 **
19 *****************************************************************************
20 ** @attention
21 **
22 ** <h2><center>© COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
23 **
24 ** Redistribution and use in source and binary forms, with or without modification,
25 ** are permitted provided that the following conditions are met:
26 ** 1. Redistributions of source code must retain the above copyright notice,
27 ** this list of conditions and the following disclaimer.
28 ** 2. Redistributions in binary form must reproduce the above copyright notice,
29 ** this list of conditions and the following disclaimer in the documentation
30 ** and/or other materials provided with the distribution.
31 ** 3. Neither the name of STMicroelectronics nor the names of its contributors
32 ** may be used to endorse or promote products derived from this software
33 ** without specific prior written permission.
34 **
35 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
36 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
39 ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
41 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
42 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
43 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 **
46 *****************************************************************************
47 */
48
49 /* Includes */
50 #include <sys/stat.h>
51 #include <stdlib.h>
52 #include <errno.h>
53 #include <stdio.h>
54 #include <signal.h>
55 #include <time.h>
56 #include <sys/time.h>
57 #include <sys/times.h>
58
59
60 /* Variables */
61 //#undef errno
62 extern int errno;
63 extern int __io_putchar(int ch) __attribute__((weak));
64 extern int __io_getchar(void) __attribute__((weak));
65
66 register char * stack_ptr asm("sp");
67
68 char *__env[1] = { 0 };
69 char **environ = __env;
70
71
72 /* Functions */
initialise_monitor_handles()73 void initialise_monitor_handles()
74 {
75 }
76
_getpid(void)77 int _getpid(void)
78 {
79 return 1;
80 }
81
_kill(int pid,int sig)82 int _kill(int pid, int sig)
83 {
84 errno = EINVAL;
85 return -1;
86 }
87
_exit(int status)88 void _exit (int status)
89 {
90 _kill(status, -1);
91 while (1) {} /* Make sure we hang here */
92 }
93
_read(int file,char * ptr,int len)94 __attribute__((weak)) int _read(int file, char *ptr, int len)
95 {
96 int DataIdx;
97
98 for (DataIdx = 0; DataIdx < len; DataIdx++)
99 {
100 *ptr++ = __io_getchar();
101 }
102
103 return len;
104 }
105
_write(int file,char * ptr,int len)106 __attribute__((weak)) int _write(int file, char *ptr, int len)
107 {
108 int DataIdx;
109
110 for (DataIdx = 0; DataIdx < len; DataIdx++)
111 {
112 __io_putchar(*ptr++);
113 }
114 return len;
115 }
116
_sbrk(int incr)117 caddr_t _sbrk(int incr)
118 {
119 extern char end asm("end");
120 static char *heap_end;
121 char *prev_heap_end;
122
123 if (heap_end == 0)
124 heap_end = &end;
125
126 prev_heap_end = heap_end;
127 if (heap_end + incr > stack_ptr)
128 {
129 // write(1, "Heap and stack collision\n", 25);
130 // abort();
131 errno = ENOMEM;
132 return (caddr_t) -1;
133 }
134
135 heap_end += incr;
136
137 return (caddr_t) prev_heap_end;
138 }
139
_close(int file)140 int _close(int file)
141 {
142 return -1;
143 }
144
145
_fstat(int file,struct stat * st)146 int _fstat(int file, struct stat *st)
147 {
148 st->st_mode = S_IFCHR;
149 return 0;
150 }
151
_isatty(int file)152 int _isatty(int file)
153 {
154 return 1;
155 }
156
_lseek(int file,int ptr,int dir)157 int _lseek(int file, int ptr, int dir)
158 {
159 return 0;
160 }
161
_open(char * path,int flags,...)162 int _open(char *path, int flags, ...)
163 {
164 /* Pretend like we always fail */
165 return -1;
166 }
167
_wait(int * status)168 int _wait(int *status)
169 {
170 errno = ECHILD;
171 return -1;
172 }
173
_unlink(char * name)174 int _unlink(char *name)
175 {
176 errno = ENOENT;
177 return -1;
178 }
179
_times(struct tms * buf)180 int _times(struct tms *buf)
181 {
182 return -1;
183 }
184
_stat(char * file,struct stat * st)185 int _stat(char *file, struct stat *st)
186 {
187 st->st_mode = S_IFCHR;
188 return 0;
189 }
190
_link(char * old,char * new)191 int _link(char *old, char *new)
192 {
193 errno = EMLINK;
194 return -1;
195 }
196
_fork(void)197 int _fork(void)
198 {
199 errno = EAGAIN;
200 return -1;
201 }
202
_execve(char * name,char ** argv,char ** env)203 int _execve(char *name, char **argv, char **env)
204 {
205 errno = ENOMEM;
206 return -1;
207 }
208