-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnewlib_stubs.c
134 lines (116 loc) · 3.1 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
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/unistd.h>
#include "serial.h"
// #define DEBUG_STUBS
#undef errno
extern int errno;
char *__env[1] = { 0 };
char **environ = __env;
void _exit(int status) { while (1); }
int _close(int file) { return -1; }
int _execve(char *name, char **argv, char **env) { errno = ENOMEM; return -1; }
int _fork() { errno = EAGAIN; return -1; }
int _fstat(int file, struct stat *st) { st->st_mode = S_IFCHR; return 0; }
int _getpid() { return 1; }
int _kill(int pid, int sig) { errno = EINVAL; return (-1); }
int _link(char *old, char *new) { errno = EMLINK; return -1; }
int _lseek(int file, int ptr, int dir) { return 0; }
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 _isatty(int file)
{
switch (file)
{
case STDOUT_FILENO:
case STDERR_FILENO:
case STDIN_FILENO:
return 1;
default:
errno = EBADF;
return 0;
}
}
// These two "spaces" are defined at the bottom of the linker script lpc824.ld
extern unsigned int _StackTop; // Top of stack memory.
extern unsigned int _HeapStart; // Bottom of heap, for malloc and such.
#define STACKSIZE 0x1000
caddr_t _sbrk(int incr)
{
char * _heap_start=(char *) &_HeapStart; // Defined by the linker via linker script
char * _stack_end=(char *)((char *) &_StackTop - (char *) (STACKSIZE));
static char * heap_end=0;
char *prev_heap_end;
#ifdef DEBUG_STUBS
printString("Inside _sbrk()");
#endif
if (heap_end == 0)
{
#ifdef DEBUG_STUBS
printString("Initializing heap");
PRINTVAR(_heap_start);
PRINTVAR(_stack_end);
PRINTVAR(&_vStackTop);
PRINTVAR(&_pvHeapStart);
#endif
heap_end = _heap_start;
}
prev_heap_end = heap_end;
if (heap_end + incr > _stack_end)
{
#ifdef DEBUG_STUBS
printString("Heap and stack collision\n");
#endif
errno = ENOMEM;
return (caddr_t) -1;
}
heap_end += incr;
return (caddr_t) prev_heap_end;
}
int _read(int file, char *ptr, int len)
{
int n;
int num = 0;
volatile char c;
#ifdef DEBUG_STUBS
printString("Inside _read()");
#endif
switch (file)
{
case STDIN_FILENO:
for (n = 0; n < len; n++)
{
c = egetc(); // Get char from uart. This function is in serial.c
//if(c==0x0d) c=0x0a;
*ptr++ = c;
num++;
if (c==0x0a) return num; // Otherwise gets(), fgets(), scanf(), won't work
}
break;
default:
errno = EBADF;
return -1;
}
return num;
}
int _write(int file, char *ptr, int len)
{
int n;
#ifdef DEBUG_STUBS
printString("Inside _write()");
#endif
switch (file)
{
case STDOUT_FILENO:
case STDERR_FILENO:
for (n = 0; n < len; n++) eputc(*ptr++); // Put char in uart. This function is in serial.c
break;
default:
errno = EBADF;
return -1;
}
return len;
}