blob: 4b0ee36133f194b8063ef510489adaa457784459 [file] [log] [blame]
Eric Biederman34cadde2003-07-12 01:40:54 +00001struct syscall_result {
2 long val;
3 int errno;
4};
5
6static struct syscall_result syscall_return(long result)
7{
8 struct syscall_result res;
9 if (((unsigned long)result) >= ((unsigned long)-125)) {
10 res.errno = - result;
11 res.val = -1;
12 } else {
13 res.errno = 0;
14 res.val = result;
15 }
16 return res;
17}
18
19static struct syscall_result syscall0(unsigned long nr)
20{
21 long res;
22 asm volatile(
23 "int $0x80"
24 : "=a" (res)
25 : "a" (nr));
26 return syscall_return(res);
27}
28
29static struct syscall_result syscall1(unsigned long nr, unsigned long arg1)
30{
31 long res;
32 asm volatile(
33 "int $0x80"
34 : "=a" (res)
35 : "a" (nr), "b" (arg1));
36 return syscall_return(res);
37
38}
39
40static struct syscall_result syscall2(unsigned long nr, unsigned long arg1, unsigned long arg2)
41{
42 long res;
43 asm volatile(
44 "int $0x80"
45 : "=a" (res)
46 : "a" (nr), "b" (arg1), "c" (arg2));
47 return syscall_return(res);
48
49}
50
51
52static struct syscall_result syscall3(unsigned long nr, unsigned long arg1, unsigned long arg2,
53 unsigned long arg3)
54{
55 long res;
56 asm volatile(
57 "int $0x80"
58 : "=a" (res)
59 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3));
60 return syscall_return(res);
61
62}
63
64static struct syscall_result syscall4(unsigned long nr, unsigned long arg1, unsigned long arg2,
65 unsigned long arg3, unsigned long arg4)
66{
67 long res;
68 asm volatile(
69 "int $0x80"
70 : "=a" (res)
71 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4));
72 return syscall_return(res);
73
74}
75
76static struct syscall_result syscall5(unsigned long nr, unsigned long arg1, unsigned long arg2,
77 unsigned long arg3, unsigned long arg4, unsigned long arg5)
78{
79 long res;
80 asm volatile(
81 "int $0x80"
82 : "=a" (res)
83 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3),
84 "S" (arg4), "D" (arg5));
85 return syscall_return(res);
86
87}
88
89#define NR_exit 1
90#define NR_fork 2
91#define NR_read 3
92#define NR_write 4
93#define NR_open 5
94#define NR_close 6
95#define NR_waitpid 7
96#define NR_creat 8
97#define NR_link 9
98#define NR_unlink 10
99#define NR_execve 11
100#define NR_chdir 12
101#define NR_time 13
102#define NR_mknod 14
103#define NR_chmod 15
104#define NR_lchown 16
105#define NR_break 17
106#define NR_oldstat 18
107#define NR_lseek 19
108#define NR_getpid 20
109#define NR_mount 21
110#define NR_umount 22
111#define NR_setuid 23
112#define NR_getuid 24
113#define NR_stime 25
114#define NR_ptrace 26
115#define NR_alarm 27
116#define NR_oldfstat 28
117#define NR_pause 29
118#define NR_utime 30
119#define NR_stty 31
120#define NR_gtty 32
121#define NR_access 33
122#define NR_nice 34
123#define NR_ftime 35
124#define NR_sync 36
125#define NR_kill 37
126#define NR_rename 38
127#define NR_mkdir 39
128#define NR_rmdir 40
129#define NR_dup 41
130#define NR_pipe 42
131#define NR_times 43
132#define NR_prof 44
133#define NR_brk 45
134#define NR_setgid 46
135#define NR_getgid 47
136#define NR_signal 48
137#define NR_geteuid 49
138#define NR_getegid 50
139#define NR_acct 51
140#define NR_umount2 52
141#define NR_lock 53
142#define NR_ioctl 54
143#define NR_fcntl 55
144#define NR_mpx 56
145#define NR_setpgid 57
146#define NR_ulimit 58
147#define NR_oldolduname 59
148#define NR_umask 60
149#define NR_chroot 61
150#define NR_ustat 62
151#define NR_dup2 63
152#define NR_getppid 64
153#define NR_getpgrp 65
154#define NR_setsid 66
155#define NR_sigaction 67
156#define NR_sgetmask 68
157#define NR_ssetmask 69
158#define NR_setreuid 70
159#define NR_setregid 71
160#define NR_sigsuspend 72
161#define NR_sigpending 73
162#define NR_sethostname 74
163#define NR_setrlimit 75
164#define NR_getrlimit 76
165#define NR_getrusage 77
166#define NR_gettimeofday 78
167#define NR_settimeofday 79
168#define NR_getgroups 80
169#define NR_setgroups 81
170#define NR_select 82
171#define NR_symlink 83
172#define NR_oldlstat 84
173#define NR_readlink 85
174#define NR_uselib 86
175#define NR_swapon 87
176#define NR_reboot 88
177#define NR_readdir 89
178#define NR_mmap 90
179#define NR_munmap 91
180#define NR_truncate 92
181#define NR_ftruncate 93
182#define NR_fchmod 94
183#define NR_fchown 95
184#define NR_getpriority 96
185#define NR_setpriority 97
186#define NR_profil 98
187#define NR_statfs 99
188#define NR_fstatfs 100
189#define NR_ioperm 101
190#define NR_socketcall 102
191#define NR_syslog 103
192#define NR_setitimer 104
193#define NR_getitimer 105
194#define NR_stat 106
195#define NR_lstat 107
196#define NR_fstat 108
197#define NR_olduname 109
198#define NR_iopl 110
199#define NR_vhangup 111
200#define NR_idle 112
201#define NR_vm86old 113
202#define NR_wait4 114
203#define NR_swapoff 115
204#define NR_sysinfo 116
205#define NR_ipc 117
206#define NR_fsync 118
207#define NR_sigreturn 119
208#define NR_clone 120
209#define NR_setdomainname 121
210#define NR_uname 122
211#define NR_modify_ldt 123
212#define NR_adjtimex 124
213#define NR_mprotect 125
214#define NR_sigprocmask 126
215#define NR_create_module 127
216#define NR_init_module 128
217#define NR_delete_module 129
218#define NR_get_kernel_syms 130
219#define NR_quotactl 131
220#define NR_getpgid 132
221#define NR_fchdir 133
222#define NR_bdflush 134
223#define NR_sysfs 135
224#define NR_personality 136
225#define NR_afs_syscall 137 /* Syscall for Andrew File System */
226#define NR_setfsuid 138
227#define NR_setfsgid 139
228#define NR__llseek 140
229#define NR_getdents 141
230#define NR__newselect 142
231#define NR_flock 143
232#define NR_msync 144
233#define NR_readv 145
234#define NR_writev 146
235#define NR_getsid 147
236#define NR_fdatasync 148
237#define NR__sysctl 149
238#define NR_mlock 150
239#define NR_munlock 151
240#define NR_mlockall 152
241#define NR_munlockall 153
242#define NR_sched_setparam 154
243#define NR_sched_getparam 155
244#define NR_sched_setscheduler 156
245#define NR_sched_getscheduler 157
246#define NR_sched_yield 158
247#define NR_sched_get_priority_max 159
248#define NR_sched_get_priority_min 160
249#define NR_sched_rr_get_interval 161
250#define NR_nanosleep 162
251#define NR_mremap 163
252#define NR_setresuid 164
253#define NR_getresuid 165
254#define NR_vm86 166
255#define NR_query_module 167
256#define NR_poll 168
257#define NR_nfsservctl 169
258#define NR_setresgid 170
259#define NR_getresgid 171
260#define NR_prctl 172
261#define NR_rt_sigreturn 173
262#define NR_rt_sigaction 174
263#define NR_rt_sigprocmask 175
264#define NR_rt_sigpending 176
265#define NR_rt_sigtimedwait 177
266#define NR_rt_sigqueueinfo 178
267#define NR_rt_sigsuspend 179
268#define NR_pread 180
269#define NR_pwrite 181
270#define NR_chown 182
271#define NR_getcwd 183
272#define NR_capget 184
273#define NR_capset 185
274#define NR_sigaltstack 186
275#define NR_sendfile 187
276#define NR_getpmsg 188 /* some people actually want streams */
277#define NR_putpmsg 189 /* some people actually want streams */
278#define NR_vfork 190
279
280typedef long ssize_t;
281typedef unsigned long size_t;
282
283/* Standard file descriptors */
284#define STDIN_FILENO 0 /* Standard input */
285#define STDOUT_FILENO 1 /* Standard output */
286#define STDERR_FILENO 2 /* Standard error output */
287
288static ssize_t write(int fd, const void *buf, size_t count)
289{
290 struct syscall_result res;
291 res = syscall3(NR_write, fd, (unsigned long)buf, count);
292 return res.val;
293}
294
295static void _exit(int status)
296{
297 struct syscall_result res;
298 res = syscall1(NR_exit, status);
299}
300
301static const char *addr_of_char(unsigned char ch)
302{
303 static const char byte[] = {
304 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
305 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
306 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
307 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
308 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
309 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
310 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
311 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
312 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
313 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
314 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
315 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
316 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
317 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
318 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
319 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
320 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
321 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
322 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
323 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
324 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
325 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
326 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
327 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
328 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
329 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
330 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
331 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
332 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
333 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
334 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
335 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
336 };
337 return byte + ch;
338}
339
340static void console_tx_byte(unsigned char ch)
341{
342 write(STDOUT_FILENO, addr_of_char(ch), 1);
343}
344
345static void console_tx_nibble(unsigned nibble)
346{
347 unsigned char digit;
348 digit = nibble + '0';
349 if (digit > '9') {
350 digit += 39;
351 }
352 console_tx_byte(digit);
353}
354
355static void console_tx_char(unsigned char byte)
356{
357 console_tx_byte(byte);
358}
359
360static void console_tx_hex8(unsigned char value)
361{
362 console_tx_nibble((value >> 4U) & 0x0fU);
363 console_tx_nibble(value & 0x0fU);
364}
365
366static void console_tx_hex16(unsigned short value)
367{
368 console_tx_nibble((value >> 12U) & 0x0FU);
369 console_tx_nibble((value >> 8U) & 0x0FU);
370 console_tx_nibble((value >> 4U) & 0x0FU);
371 console_tx_nibble(value & 0x0FU);
372}
373
374static void console_tx_hex32(unsigned short value)
375{
376 console_tx_nibble((value >> 28U) & 0x0FU);
377 console_tx_nibble((value >> 24U) & 0x0FU);
378 console_tx_nibble((value >> 20U) & 0x0FU);
379 console_tx_nibble((value >> 16U) & 0x0FU);
380 console_tx_nibble((value >> 12U) & 0x0FU);
381 console_tx_nibble((value >> 8U) & 0x0FU);
382 console_tx_nibble((value >> 4U) & 0x0FU);
383 console_tx_nibble(value & 0x0FU);
384}
385
386static void console_tx_string(const char *str)
387{
388 unsigned char ch;
389 while((ch = *str++) != '\0') {
390 console_tx_byte(ch);
391 }
392}
393
394static void print_emerg_char(unsigned char byte) { console_tx_char(byte); }
395static void print_emerg_hex8(unsigned char value) { console_tx_hex8(value); }
396static void print_emerg_hex16(unsigned short value){ console_tx_hex16(value); }
397static void print_emerg_hex32(unsigned int value) { console_tx_hex32(value); }
398static void print_emerg(const char *str) { console_tx_string(str); }
399
400static void print_debug_char(unsigned char byte) { console_tx_char(byte); }
401static void print_debug_hex8(unsigned char value) { console_tx_hex8(value); }
402static void print_debug_hex16(unsigned short value){ console_tx_hex16(value); }
403static void print_debug_hex32(unsigned int value) { console_tx_hex32(value); }
404static void print_debug(const char *str) { console_tx_string(str); }
405
406
407static void main(void)
408{
409 static const int value[] = { 1 };
410 const char *str;
411 if (value[1]) {
412 print_debug("A\r\n");
413 str = "Unbuffered\r\n";
414 } else {
415 print_debug("B\r\n");
416 str = "Registered\r\n";
417 }
418 print_debug(str);
419 _exit(0);
420}