Loading...
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 | /* * include/asm-xtensa/platform-iss/simcall.h * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2001 Tensilica Inc. * Copyright (C) 2017 Cadence Design Systems Inc. */ #ifndef _XTENSA_PLATFORM_ISS_SIMCALL_H #define _XTENSA_PLATFORM_ISS_SIMCALL_H /* * System call like services offered by the simulator host. */ #define SYS_nop 0 /* unused */ #define SYS_exit 1 /*x*/ #define SYS_fork 2 #define SYS_read 3 /*x*/ #define SYS_write 4 /*x*/ #define SYS_open 5 /*x*/ #define SYS_close 6 /*x*/ #define SYS_rename 7 /*x 38 - waitpid */ #define SYS_creat 8 /*x*/ #define SYS_link 9 /*x (not implemented on WIN32) */ #define SYS_unlink 10 /*x*/ #define SYS_execv 11 /* n/a - execve */ #define SYS_execve 12 /* 11 - chdir */ #define SYS_pipe 13 /* 42 - time */ #define SYS_stat 14 /* 106 - mknod */ #define SYS_chmod 15 #define SYS_chown 16 /* 202 - lchown */ #define SYS_utime 17 /* 30 - break */ #define SYS_wait 18 /* n/a - oldstat */ #define SYS_lseek 19 /*x*/ #define SYS_getpid 20 #define SYS_isatty 21 /* n/a - mount */ #define SYS_fstat 22 /* 108 - oldumount */ #define SYS_time 23 /* 13 - setuid */ #define SYS_gettimeofday 24 /*x 78 - getuid (not implemented on WIN32) */ #define SYS_times 25 /*X 43 - stime (Xtensa-specific implementation) */ #define SYS_socket 26 #define SYS_sendto 27 #define SYS_recvfrom 28 #define SYS_select_one 29 /* not compitible select, one file descriptor at the time */ #define SYS_bind 30 #define SYS_ioctl 31 #define SYS_iss_argc 1000 /* returns value of argc */ #define SYS_iss_argv_size 1001 /* bytes needed for argv & arg strings */ #define SYS_iss_set_argv 1002 /* saves argv & arg strings at given addr */ /* * SYS_select_one specifiers */ #define XTISS_SELECT_ONE_READ 1 #define XTISS_SELECT_ONE_WRITE 2 #define XTISS_SELECT_ONE_EXCEPT 3 static int errno; static inline int __simc(int a, int b, int c, int d) { register int a1 asm("a2") = a; register int b1 asm("a3") = b; register int c1 asm("a4") = c; register int d1 asm("a5") = d; __asm__ __volatile__ ( "simcall\n" : "+r"(a1), "+r"(b1) : "r"(c1), "r"(d1) : "memory"); errno = b1; return a1; } static inline int simc_exit(int exit_code) { return __simc(SYS_exit, exit_code, 0, 0); } static inline int simc_open(const char *file, int flags, int mode) { return __simc(SYS_open, (int) file, flags, mode); } static inline int simc_close(int fd) { return __simc(SYS_close, fd, 0, 0); } static inline int simc_ioctl(int fd, int request, void *arg) { return __simc(SYS_ioctl, fd, request, (int) arg); } static inline int simc_read(int fd, void *buf, size_t count) { return __simc(SYS_read, fd, (int) buf, count); } static inline int simc_write(int fd, const void *buf, size_t count) { return __simc(SYS_write, fd, (int) buf, count); } static inline int simc_poll(int fd) { long timeval[2] = { 0, 0 }; return __simc(SYS_select_one, fd, XTISS_SELECT_ONE_READ, (int)&timeval); } static inline int simc_lseek(int fd, uint32_t off, int whence) { return __simc(SYS_lseek, fd, off, whence); } static inline int simc_argc(void) { return __simc(SYS_iss_argc, 0, 0, 0); } static inline int simc_argv_size(void) { return __simc(SYS_iss_argv_size, 0, 0, 0); } static inline void simc_argv(void *buf) { __simc(SYS_iss_set_argv, (int)buf, 0, 0); } #endif /* _XTENSA_PLATFORM_ISS_SIMCALL_H */ |