coreboot/util/romcc/tests/simple_test38.c
<<
>>
Prefs
   1struct 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_debug_char(unsigned char byte) { console_tx_char(byte); }
 395static void print_debug_hex8(unsigned char value) { console_tx_hex8(value); }
 396static void print_debug_hex16(unsigned short value){ console_tx_hex16(value); }
 397static void print_debug_hex32(unsigned int value) { console_tx_hex32(value); }
 398static void print_debug(const char *str) { console_tx_string(str); }
 399
 400static 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
 421static void main(void)
 422{
 423        goto_test();
 424        _exit(0);
 425}
 426
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.