]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_Renode_Emulator_SoftConsole/Microsemi_Code/riscv_hal/syscall.c
Update to the latest atomic.h.
[freertos] / FreeRTOS / Demo / RISC-V_Renode_Emulator_SoftConsole / Microsemi_Code / riscv_hal / syscall.c
1 /*******************************************************************************\r
2  * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
3  *\r
4  * @file syscall.c\r
5  * @author Microsemi SoC Products Group\r
6  * @brief Stubs for system calls.\r
7  *\r
8  * SVN $Revision: 9661 $\r
9  * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
10  */\r
11 #include <stdint.h>\r
12 #include <stdlib.h>\r
13 #include <stddef.h>\r
14 #include <unistd.h>\r
15 #include <errno.h>\r
16 #include <sys/stat.h>\r
17 #include <sys/times.h>\r
18 #include <stdio.h>\r
19 #include <string.h>\r
20 \r
21 #include "encoding.h"\r
22 \r
23 #ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
24 \r
25 #include "core_uart_apb.h"\r
26 #include "hw_platform.h"\r
27 \r
28 #endif  /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
29 \r
30 #ifdef __cplusplus\r
31 extern "C" {\r
32 #endif\r
33 \r
34 #ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
35 \r
36 /*------------------------------------------------------------------------------\r
37  * CoreUARTapb instance data for the CoreUARTapb instance used for standard\r
38  * output.\r
39  */\r
40 static UART_instance_t g_stdio_uart;\r
41 \r
42 /*==============================================================================\r
43  * Flag used to indicate if the UART driver needs to be initialized.\r
44  */\r
45 static int g_stdio_uart_init_done = 0;\r
46 #endif /*MSCC_STDIO_THRU_CORE_UART_APB*/\r
47 \r
48 #undef errno\r
49 int errno;\r
50 \r
51 char *__env[1] = { 0 };\r
52 char **environ = __env;\r
53 \r
54 void write_hex(int fd, uint32_t hex)\r
55 {\r
56     uint8_t ii;\r
57     uint8_t jj;\r
58     char towrite;\r
59     uint8_t digit;\r
60 \r
61     write( fd , "0x", 2 );\r
62 \r
63     for (ii = 8 ; ii > 0; ii--)\r
64     {\r
65         jj = ii-1;\r
66         digit = ((hex & (0xF << (jj*4))) >> (jj*4));\r
67         towrite = digit < 0xA ? ('0' + digit) : ('A' +  (digit - 0xA));\r
68         write( fd, &towrite, 1);\r
69     }\r
70 }\r
71 \r
72                \r
73 void _exit(int code)\r
74 {\r
75 #ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
76     const char * message = "\nProgam has exited with code:";\r
77 \r
78     write(STDERR_FILENO, message, strlen(message));\r
79     write_hex(STDERR_FILENO, code);\r
80 #endif\r
81 \r
82     while (1);\r
83 }\r
84 \r
85 void *_sbrk(ptrdiff_t incr)\r
86 {\r
87     extern char _end[];\r
88     extern char _heap_end[];\r
89     static char *curbrk = _end;\r
90 \r
91     if ((curbrk + incr < _end) || (curbrk + incr > _heap_end))\r
92     {\r
93         return ((char *) - 1);\r
94     }\r
95 \r
96     curbrk += incr;\r
97     return curbrk - incr;\r
98 }\r
99 \r
100 int _isatty(int fd)\r
101 {\r
102     if (fd == STDOUT_FILENO || fd == STDERR_FILENO)\r
103     {\r
104         return 1;\r
105     }\r
106 \r
107     errno = EBADF;\r
108     return 0;\r
109 }\r
110 \r
111 static int stub(int err)\r
112 {\r
113     errno = err;\r
114     return -1;\r
115 }\r
116 \r
117 int _open(const char* name, int flags, int mode)\r
118 {\r
119     return stub(ENOENT);\r
120 }\r
121 \r
122 int _openat(int dirfd, const char* name, int flags, int mode)\r
123 {\r
124     return stub(ENOENT);\r
125 }\r
126 \r
127 int _close(int fd)\r
128 {\r
129     return stub(EBADF);\r
130 }\r
131 \r
132 int _execve(const char* name, char* const argv[], char* const env[])\r
133 {\r
134     return stub(ENOMEM);\r
135 }\r
136 \r
137 int _fork()\r
138 {\r
139     return stub(EAGAIN);\r
140 }\r
141 \r
142 int _fstat(int fd, struct stat *st)\r
143 {\r
144     if (isatty(fd))\r
145     {\r
146         st->st_mode = S_IFCHR;\r
147         return 0;\r
148     }\r
149 \r
150     return stub(EBADF);\r
151 }\r
152 \r
153 int _getpid()\r
154 {\r
155     return 1;\r
156 }\r
157 \r
158 int _kill(int pid, int sig)\r
159 {\r
160     return stub(EINVAL);\r
161 }\r
162 \r
163 int _link(const char *old_name, const char *new_name)\r
164 {\r
165     return stub(EMLINK);\r
166 }\r
167 \r
168 off_t _lseek(int fd, off_t ptr, int dir)\r
169 {\r
170     if (_isatty(fd))\r
171     {\r
172         return 0;\r
173     }\r
174 \r
175     return stub(EBADF);\r
176 }\r
177 \r
178 ssize_t _read(int fd, void* ptr, size_t len)\r
179 {\r
180 #ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
181     if (_isatty(fd))\r
182     {\r
183         /*--------------------------------------------------------------------------\r
184         * Initialize the UART driver if it is the first time this function is\r
185         * called.\r
186         */\r
187         if ( !g_stdio_uart_init_done )\r
188         {\r
189             /******************************************************************************\r
190             * Baud value:\r
191             * This value is calculated using the following equation:\r
192             *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
193             *****************************************************************************/\r
194             UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
195             g_stdio_uart_init_done = 1;\r
196         }\r
197 \r
198         return UART_get_rx(&g_stdio_uart, (uint8_t*) ptr, len);\r
199     }\r
200 #endif\r
201 \r
202     return stub(EBADF);\r
203 }\r
204 \r
205 int _stat(const char* file, struct stat* st)\r
206 {\r
207     return stub(EACCES);\r
208 }\r
209 \r
210 clock_t _times(struct tms* buf)\r
211 {\r
212     return stub(EACCES);\r
213 }\r
214 \r
215 int _unlink(const char* name)\r
216 {\r
217     return stub(ENOENT);\r
218 }\r
219 \r
220 int _wait(int* status)\r
221 {\r
222     return stub(ECHILD);\r
223 }\r
224 \r
225 ssize_t _write(int fd, const void* ptr, size_t len)\r
226 {\r
227 \r
228 #ifdef MSCC_STDIO_THRU_CORE_UART_APB\r
229   const uint8_t * current = (const uint8_t *) ptr;\r
230   size_t jj;\r
231 \r
232   if (_isatty(fd))\r
233   {\r
234         /*--------------------------------------------------------------------------\r
235         * Initialize the UART driver if it is the first time this function is\r
236         * called.\r
237         */\r
238         if ( !g_stdio_uart_init_done )\r
239         {\r
240             /******************************************************************************\r
241             * Baud value:\r
242             * This value is calculated using the following equation:\r
243             *      BAUD_VALUE = (CLOCK / (16 * BAUD_RATE)) - 1\r
244             *****************************************************************************/\r
245             UART_init( &g_stdio_uart, MSCC_STDIO_UART_BASE_ADDR, ((SYS_CLK_FREQ/(16 * MSCC_STDIO_BAUD_VALUE))-1), (DATA_8_BITS | NO_PARITY));\r
246             g_stdio_uart_init_done = 1;\r
247         }\r
248 \r
249     for (jj = 0; jj < len; jj++)\r
250     {\r
251         UART_send(&g_stdio_uart, current + jj, 1);\r
252         if (current[jj] == '\n')\r
253         {\r
254             UART_send(&g_stdio_uart, (const uint8_t *)"\r", 1);\r
255         }\r
256     }\r
257     return len;\r
258   }\r
259 #endif\r
260 \r
261   return stub(EBADF);\r
262 }\r
263 \r
264 #ifdef __cplusplus\r
265 }\r
266 #endif\r