Since some people disapprove of white space cleanups mixed in regular commits
[coreboot.git] / util / romcc / tests / simple_test39.c
1 struct syscall_result {
2         long val;
3         int errno;
4 };
5
6 static 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
19 static 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
29 static 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
40 static 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
52 static 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
64 static 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
76 static 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
280 typedef long ssize_t;
281 typedef 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
288 static 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
295 static void _exit(int status)
296 {
297         struct syscall_result res;
298         res = syscall1(NR_exit, status);
299 }
300
301 static 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
340 static void console_tx_byte(unsigned char ch)
341 {
342         write(STDOUT_FILENO, addr_of_char(ch), 1);
343 }
344
345 static 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
355 static void console_tx_char(unsigned char byte)
356 {
357         console_tx_byte(byte);
358 }
359
360 static void console_tx_hex8(unsigned char value)
361 {
362         console_tx_nibble((value >> 4U) & 0x0fU);
363         console_tx_nibble(value & 0x0fU);
364 }
365
366 static 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
374 static 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
386 static 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
394 static void print_debug_char(unsigned char byte) { console_tx_char(byte); }
395 static void print_debug_hex8(unsigned char value) { console_tx_hex8(value); }
396 static void print_debug_hex16(unsigned short value){ console_tx_hex16(value); }
397 static void print_debug_hex32(unsigned int value) { console_tx_hex32(value); }
398 static void print_debug(const char *str) { console_tx_string(str); }
399
400 static void goto_test(void)
401 {
402         int i;
403         print_debug("goto_test\n");
404
405         i = 0;
406         goto bottom;
407         {
408         top:
409                 print_debug("i = ");
410                 print_debug_hex8(i);
411                 print_debug("\n");
412
413                 i = i + 1;
414         }
415  bottom:
416         if (i < 10) {
417                 goto top;
418         }
419 }
420
421 struct socket_desc {
422         short up;
423         short down;
424         short across;
425 };
426
427 static void main(void)
428 {
429         static const struct socket_desc cpu_socketsA[] = {
430                 {  .up = 2,  .down = -1, .across = 1 }, /* Node 0 */
431                 {  .up = 3,  .down = -1, .across = 0 }, /* Node 1 */
432                 {  .up = -1, .down =  0, .across = 3 }, /* Node 2 */
433                 {  .up = -1, .down =  1, .across = 2 }  /* Node 3 */
434         };
435         static const struct socket_desc cpu_socketsB[4] = {
436                 {  2,  -1, 1 }, /* Node 0 */
437                 {  3,  -1, 0 }, /* Node 1 */
438                 {  -1,  0, 3 }, /* Node 2 */
439                 {  -1,  1, 2 }  /* Node 3 */
440         };
441         int i;
442         print_debug("cpu_socketA\n");
443         for(i = 0; i < sizeof(cpu_socketsA)/sizeof(cpu_socketsA[0]); i++) {
444                 print_debug(".up=");
445                 print_debug_hex16(cpu_socketsA[i].up);
446                 print_debug(" .down=");
447                 print_debug_hex16(cpu_socketsA[i].down);
448                 print_debug(" .across=");
449                 print_debug_hex16(cpu_socketsA[i].across);
450                 print_debug("\n");
451         }
452         print_debug("\ncpu_socketB\n");
453         for(i = 0; i < sizeof(cpu_socketsB)/sizeof(cpu_socketsB[0]); i++) {
454                 print_debug(".up=");
455                 print_debug_hex16(cpu_socketsB[i].up);
456                 print_debug(" .down=");
457                 print_debug_hex16(cpu_socketsB[i].down);
458                 print_debug(" .across=");
459                 print_debug_hex16(cpu_socketsB[i].across);
460                 print_debug("\n");
461         }
462         _exit(0);
463 }