-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsyscalls_newlib.S
More file actions
134 lines (115 loc) · 2.44 KB
/
syscalls_newlib.S
File metadata and controls
134 lines (115 loc) · 2.44 KB
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
# syscall stubs
.section .text
.globl _write
.globl _read
.globl _exit
.globl _sbrk
.globl _open
.globl _openat
.globl _close
.globl _fstat
.globl _isatty
.globl _lseek
.globl _kill
.globl _getpid
.globl umask
.globl _mkdirat
.globl _mkdir
.globl _unlinkat
.globl _unlink
.globl _rmdir
.align 2
# ssize_t _write(int fd, const char *buf, size_t count)
_write:
li a7, 64 # syscall ID for write
ecall
ret
# ssize_t _read(int fd, char *buf, size_t count)
_read:
li a7, 63 # syscall ID for read
ecall
ret
# void _exit(int code)
_exit:
li a7, 93 # syscall ID for exit
ecall
# unreachable
1:
j 1b
# void *_sbrk(int incr)
_sbrk:
# a0 = increment
li a7, 214 # syscall ID for sbrk (Newlib expects this)
ecall
ret
# int _open(const char *pathname, int flags, ...)
_open:
mv a3, a2 # mode
mv a2, a1 # flags
mv a1, a0 # pathname
li a0, -100 # AT_FDCWD
li a7, 1024 # syscall ID for openat
ecall
ret
_openat: # syscall ID for openat
li a7, 1024
ecall
ret
_close:
li a7, 57 # syscall ID for close
ecall
ret
# int fstat(int fd, struct stat *buf)
_fstat:
li a7, 80 # syscall ID for fstat
ecall
ret
_isatty:
li a7, 89 # syscall ID for isatty
ecall
ret
_lseek:
li a7, 62 # syscall ID for lseek
ecall
ret
_kill:
li a7, 129 # syscall ID for kill
ecall
ret
_getpid:
li a7, 172 # syscall ID for getpid
ecall
ret
umask:
li a7, 60 # syscall number for umask
ecall
ret
_unlinkat:
li a7, 35 # syscall ID for unlinkat
ecall
ret
_mkdirat:
li a7, 34 # syscall ID for mkdirat
ecall
ret
_mkdir:
mv a2, a1 # a2 = mode
mv a1, a0 # a1 = pathname
li a0, -100 # a0 = AT_FDCWD
li a7, 34 # syscall ID for mkdirat
ecall
ret
_unlink:
li a2, 0 # flags=0 for unlink
mv a1, a0 # pathname
li a0, -100 # AT_FDCWD
li a7, 35 # _unlinkat
ecall
ret
_rmdir:
li a2, 0x200 # flags=AT_REMOVEDIR for rmdir
mv a1, a0 # pathname
li a0, -100 # AT_FDCWD
li a7, 35 # unlinkat
ecall
ret