| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE.md file. | |
| 4 | |
| 5 // Support file for GNU libc. Most of this is noops or always | |
| 6 // returning an error. The read and write functions can be hooked into | |
| 7 // through weak functions. `gettimeofday` is implemented in terms of cmsis_os | |
| 8 // osKernelSysTick. | |
| 9 | |
| 10 #include <sys/types.h> | |
| 11 #include <sys/stat.h> | |
| 12 #include <sys/fcntl.h> | |
| 13 #include <stdio.h> | |
| 14 #include <string.h> | |
| 15 #include <time.h> | |
| 16 #include <sys/time.h> | |
| 17 #include <sys/times.h> | |
| 18 #include <errno.h> | |
| 19 #include <sys/wait.h> | |
| 20 | |
| 21 #include <cmsis_os.h> | |
| 22 | |
| 23 #define MAX_STACK_SIZE 0x2000 | |
| 24 | |
| 25 extern int Write(int file, char *ptr, int len); | |
| 26 | |
| 27 void* _sbrk(int incr) { | |
| 28 // We don't use the newlib C-heap implementation (which use _sbrk to | |
| 29 // get system memory). The cmpctmalloc C-heap implementation we use | |
| 30 // does not use _sbrk (uses the page allocator) to get system memory. | |
| 31 // So we don't expect any calls to _sbrk at the moment. | |
| 32 for (;;) {} | |
| 33 } | |
| 34 | |
| 35 int _gettimeofday (struct timeval * tp, struct timezone * tzp) { | |
| 36 uint64_t microseconds = | |
| 37 ((uint64_t)osKernelSysTick()) * osKernelSysTickFrequency; | |
| 38 tp->tv_sec = microseconds / 1000000; | |
| 39 tp->tv_usec = microseconds % 1000000; | |
| 40 if (tzp) { | |
| 41 tzp->tz_minuteswest = 0; | |
| 42 tzp->tz_dsttime = 0; | |
| 43 } | |
| 44 return 0; | |
| 45 } | |
| 46 | |
| 47 int _getpid(void) { | |
| 48 return 1; | |
| 49 } | |
| 50 | |
| 51 int _kill(int pid, int sig) { | |
| 52 errno = EINVAL; | |
| 53 return -1; | |
| 54 } | |
| 55 | |
| 56 void _exit (int status) { | |
| 57 _kill(status, -1); | |
| 58 while (1) {} | |
| 59 } | |
| 60 | |
| 61 int _write(int file, char *ptr, int len) { | |
| 62 return Write(file, ptr, len); | |
| 63 } | |
| 64 | |
| 65 int _close(int file) { | |
| 66 return -1; | |
| 67 } | |
| 68 | |
| 69 int _fstat(int file, struct stat *st) { | |
| 70 st->st_mode = S_IFCHR; | |
| 71 return 0; | |
| 72 } | |
| 73 | |
| 74 int _isatty(int file) { | |
| 75 return 1; | |
| 76 } | |
| 77 | |
| 78 int _lseek(int file, int ptr, int dir) { | |
| 79 return 0; | |
| 80 } | |
| 81 | |
| 82 int _read(int file, char *ptr, int len) { | |
| 83 // Nothing to read anywhere. | |
| 84 errno = EINVAL; | |
| 85 return -1; | |
| 86 } | |
| 87 | |
| 88 int _open(char *path, int flags, ...) { | |
| 89 return -1; | |
| 90 } | |
| 91 | |
| 92 int _wait(int *status) { | |
| 93 errno = ECHILD; | |
| 94 return -1; | |
| 95 } | |
| 96 | |
| 97 int _unlink(char *name) { | |
| 98 errno = ENOENT; | |
| 99 return -1; | |
| 100 } | |
| 101 | |
| 102 int _times(struct tms *buf) { | |
| 103 return -1; | |
| 104 } | |
| 105 | |
| 106 int _stat(char *file, struct stat *st) { | |
| 107 st->st_mode = S_IFCHR; | |
| 108 return 0; | |
| 109 } | |
| 110 | |
| 111 int _link(char *old, char *new) { | |
| 112 errno = EMLINK; | |
| 113 return -1; | |
| 114 } | |
| 115 | |
| 116 int _fork(void) { | |
| 117 errno = EAGAIN; | |
| 118 return -1; | |
| 119 } | |
| 120 | |
| 121 int _execve(char *name, char **argv, char **env) { | |
| 122 errno = ENOMEM; | |
| 123 return -1; | |
| 124 } | |
| OLD | NEW |