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