-
Notifications
You must be signed in to change notification settings - Fork 6
/
newlib_stubs.c
144 lines (116 loc) · 1.9 KB
/
newlib_stubs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Read for more info: http://sourceware.org/newlib/libc.html#Stubs
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/unistd.h>
#include <misc.h>
#include <core_cm3.h>
#undef errno
extern int errno;
char *__env[1] = { 0 };
char **environ = __env;
int _write(int file, char *ptr, int len);
void _exit(int status)
{
_write(STDERR_FILENO, "exit", 4);
do {} while (1);
}
int _close(int file)
{
return -1;
}
int _execve(char *name, char **argv, char **env)
{
errno = ENOMEM;
return -1;
}
int _fork(void)
{
errno = EAGAIN;
return -1;
}
int _fstat(int file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
int _getpid(void)
{
return 1;
}
int _isatty(int file)
{
switch (file)
{
case STDOUT_FILENO:
case STDERR_FILENO:
case STDIN_FILENO:
return 1;
default:
{
errno = EBADF;
return 0;
}
}
}
int _kill(int pid, int sig)
{
errno = EINVAL;
return (-1);
}
int _link(char *old, char *new)
{
errno = EMLINK;
return -1;
}
int _lseek(int fildes, int offset, int whence)
{
return -1;
}
caddr_t _sbrk(int incr)
{
extern char _ebss; // Defined by the linker
static char *heap_end;
char *prev_heap_end;
if (heap_end == 0)
heap_end = &_ebss;
prev_heap_end = heap_end;
char * stack = (char*) __get_MSP();
if (heap_end + incr > stack)
{
_write(STDERR_FILENO, "Heap and stack collision\n", 25);
errno = ENOMEM;
return (caddr_t) -1;
}
heap_end += incr;
return (caddr_t) prev_heap_end;
}
int _read(int file, char *ptr, int len)
{
errno = EBADF;
return -1;
}
int _stat(const char *filepath, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
clock_t _times(struct tms *buf)
{
return -1;
}
int _unlink(char *name)
{
errno = ENOENT;
return -1;
}
int _wait(int *status)
{
errno = ECHILD;
return -1;
}
int _write(int file, char *ptr, int len)
{
errno = EBADF;
return -1;
}