summaryrefslogtreecommitdiff
path: root/documentation/kernel-interfaces/syscalls.txt
blob: de0045176f44067b1a0758f1a0ae1a9077a48308 (plain) (blame)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
rax, rdi, rsi, rdx are in/out paramters.
rbx, rbp, rsp, r12-r15 are preserved.
rcx, rflags, r8-r11 are clobbered.

interrupts (including the timer!) are disabled during system calls.

a "mibisecond" is a 1024th of a second

stream result:
   0 = success
   1 = bad handle
   2 = io error
   3 = out of bounds
   4 = does not exist
   5 = not a regular file
   6 = not an executable
   7 = not writable
   8 = not seekable
   9 = socket id already used
  10 = socket id not in use
  11 = socket listener closed
  12 = other end closed
  13 = already exists
  14 = not sized
  15 = not readable

encode color:
  rax in: 0
  edi in: r + g * 256 + b * 65536
  eax out: encoded color

get framebuffer:
  rax in: 1
  rax out: pointer to framebuffer
  rdi out: width + height * 2 ** 32
  esi out: pitch
  framebuffer is always 32 bpp. use the encode color syscall
  to encode colors. pitch is in dwords, not in bytes.

open file:
  rax in: 2
  rdi in: pointer to file path
  rsi in: file path length
  rdx in:
    bit 0: allow creation
    bit 1: only allow creation
  rax out: stream result
  rdi out: stream handle (if rax = success)

end this thread:
  rax in: 3
  edi in: exit code (signed, only used if this was last thread)

get new pages:
  rax in: 4
  rdi in: number of pages to allocate
  rax out: start of first page
  the allocated pages are next to each other, writable, and not executable.

get input packet:
  rax in: 5
  al out:
    bit 7: was mouse packet
    if bit 7:
      bit 0: left mouse button down
      bit 1: right mouse button down
      bit 2: middle mouse button down
  if bit 7:
    di out: mouse x change (signed)
    si out: mouse y change (signed)
  else:
    edi out: key packet

create private socket:
  rax in: 6
  rax out: end 1 stream handle
  rdi out: end 2 stream handle

create socket listener:
  rax in: 7
  rdi in: pointer to id string
  rsi in: id string length
  rax out: stream result
  rdi out: listener handle (if rax = 0)

stop socket listener:
  rax in: 8
  rdi in: listener handle

accept socket connection:
  rax in: 9
  rdi in: listener handle
  rax out: stream result
  rdi out: stream handle

connect to socket:
  rax in: 10
  rdi in: pointer to id string
  rsi in: id string length
  rax out: stream result
  rdi out: stream handle (if rax = 0)

close stream:
  rax in: 11
  rdi in: stream handle

seek stream:
  returns "not seekable" for sockets
  rax in: 12
  rdi in: stream handle
  sil in:
    0 = relative to beginning
    1 = relative to end
    2 = relative to current position
  rdx in: offset (signed)
  rax out: stream result

read from stream:
  rax in: 13
  rdi in: stream handle
  rsi in: count
  rdx in: pointer to buffer
  rax out: stream result

write to stream:
  rax in: 14
  rdi in: stream handle
  rsi in: count
  rdx in: pointer to buffer
  rax out: stream result

get stream length:
  returns "not sized" for sockets
  rax in: 15
  rdi in: stream handle
  rax out: stream result
  rdi out: stream length (if rax = success)

start process:
  rax in: 16
  rdi in: pointer to process start info struct
  rax out: stream result
  rdi out: process handle (if rax = success)
  process start info struct:
    qword: file path length
    qword: pointer to file path
    qword: count of environment variables
    qword: pointer to array of environment variable structs
    qword: count of gifted stream ends
    qword: pointer to array of gifted stream structs
  environment variable struct:
    qword: name length
    qword: pointer to name
    qword: value length
    qword: pointer to value
  gifted stream struct:
    qword: stream handle here
    qword: new stream handle in child
      new handle must be < 65536
  any gifted streams must not have threads waiting to read from our end.
  any environment variables in the current process whose names do not begin
  with an underscore are also set in the child process. the environment
  variables in the process start info override any with the same name.

end this process:
  rax in: 17
  edi in: exit code (signed)

set stream length:
  returns "not sized" for sockets
  rax in: 18
  rdi in: stream handle
  rsi in: new length
  rax out: stream result

get other end process handle:
  returns "other end closed" for files
  rax in: 19
  rdi in: stream handle
  rax out: stream result
  rdi out: process handle (if rax = success)

start thread:
  rax in: 20
  rdi in: entry point
  rsi in: argument
  at entry, rsp is set to the top of a new stack, rdi is set
  to the argument, and the other registers are undefined.

clear socket read queue:
  rax in: 21
  rdi in: stream handle
  rax out: number of bytes cleared (0 on bad handle or not a socket)

get environment variable length:
  rax in: 22
  rdi in: pointer to variable name
  rsi in: variable name length
  rax out: variable value length, or -1 if unset

get environment variable value:
  rax in: 23
  rdi in: pointer to variable name
  rsi in: variable name length
  rdx in: pointer to buffer for variable value

set thread name:
  rax in: 24
  rdi in: pointer to thread name
  rsi in: thread name length

sleep:
  rax in: 25
  rdi in: "mibiseconds" to sleep for

get time:
  rax in: 26
  rax out: "mibiseconds" since january 1st 2000