diff options
author | RajithaY <rajithax.yerrumsetty@intel.com> | 2017-04-25 03:31:15 -0700 |
---|---|---|
committer | Rajitha Yerrumchetty <rajithax.yerrumsetty@intel.com> | 2017-05-22 06:48:08 +0000 |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/linux-user | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/linux-user')
145 files changed, 0 insertions, 51571 deletions
diff --git a/qemu/linux-user/Makefile.objs b/qemu/linux-user/Makefile.objs deleted file mode 100644 index fd5021788..000000000 --- a/qemu/linux-user/Makefile.objs +++ /dev/null @@ -1,7 +0,0 @@ -obj-y = main.o syscall.o strace.o mmap.o signal.o \ - elfload.o linuxload.o uaccess.o uname.o - -obj-$(TARGET_HAS_BFLT) += flatload.o -obj-$(TARGET_I386) += vm86.o -obj-$(TARGET_ARM) += arm/nwfpe/ -obj-$(TARGET_M68K) += m68k-sim.o diff --git a/qemu/linux-user/aarch64/syscall_nr.h b/qemu/linux-user/aarch64/syscall_nr.h deleted file mode 100644 index 59511d855..000000000 --- a/qemu/linux-user/aarch64/syscall_nr.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_io_setup 0 -#define TARGET_NR_io_destroy 1 -#define TARGET_NR_io_submit 2 -#define TARGET_NR_io_cancel 3 -#define TARGET_NR_io_getevents 4 -#define TARGET_NR_setxattr 5 -#define TARGET_NR_lsetxattr 6 -#define TARGET_NR_fsetxattr 7 -#define TARGET_NR_getxattr 8 -#define TARGET_NR_lgetxattr 9 -#define TARGET_NR_fgetxattr 10 -#define TARGET_NR_listxattr 11 -#define TARGET_NR_llistxattr 12 -#define TARGET_NR_flistxattr 13 -#define TARGET_NR_removexattr 14 -#define TARGET_NR_lremovexattr 15 -#define TARGET_NR_fremovexattr 16 -#define TARGET_NR_getcwd 17 -#define TARGET_NR_lookup_dcookie 18 -#define TARGET_NR_eventfd2 19 -#define TARGET_NR_epoll_create1 20 -#define TARGET_NR_epoll_ctl 21 -#define TARGET_NR_epoll_pwait 22 -#define TARGET_NR_dup 23 -#define TARGET_NR_dup3 24 -#define TARGET_NR_fcntl 25 -#define TARGET_NR_inotify_init1 26 -#define TARGET_NR_inotify_add_watch 27 -#define TARGET_NR_inotify_rm_watch 28 -#define TARGET_NR_ioctl 29 -#define TARGET_NR_ioprio_set 30 -#define TARGET_NR_ioprio_get 31 -#define TARGET_NR_flock 32 -#define TARGET_NR_mknodat 33 -#define TARGET_NR_mkdirat 34 -#define TARGET_NR_unlinkat 35 -#define TARGET_NR_symlinkat 36 -#define TARGET_NR_linkat 37 -#define TARGET_NR_renameat 38 -#define TARGET_NR_umount2 39 -#define TARGET_NR_mount 40 -#define TARGET_NR_pivot_root 41 -#define TARGET_NR_nfsservctl 42 -#define TARGET_NR_statfs 43 -#define TARGET_NR_fstatfs 44 -#define TARGET_NR_truncate 45 -#define TARGET_NR_ftruncate 46 -#define TARGET_NR_fallocate 47 -#define TARGET_NR_faccessat 48 -#define TARGET_NR_chdir 49 -#define TARGET_NR_fchdir 50 -#define TARGET_NR_chroot 51 -#define TARGET_NR_fchmod 52 -#define TARGET_NR_fchmodat 53 -#define TARGET_NR_fchownat 54 -#define TARGET_NR_fchown 55 -#define TARGET_NR_openat 56 -#define TARGET_NR_close 57 -#define TARGET_NR_vhangup 58 -#define TARGET_NR_pipe2 59 -#define TARGET_NR_quotactl 60 -#define TARGET_NR_getdents64 61 -#define TARGET_NR_lseek 62 -#define TARGET_NR_read 63 -#define TARGET_NR_write 64 -#define TARGET_NR_readv 65 -#define TARGET_NR_writev 66 -#define TARGET_NR_pread64 67 -#define TARGET_NR_pwrite64 68 -#define TARGET_NR_preadv 69 -#define TARGET_NR_pwritev 70 -#define TARGET_NR_sendfile 71 -#define TARGET_NR_pselect6 72 -#define TARGET_NR_ppoll 73 -#define TARGET_NR_signalfd4 74 -#define TARGET_NR_vmsplice 75 -#define TARGET_NR_splice 76 -#define TARGET_NR_tee 77 -#define TARGET_NR_readlinkat 78 -#define TARGET_NR_fstatat64 79 -#define TARGET_NR_fstat 80 -#define TARGET_NR_sync 81 -#define TARGET_NR_fsync 82 -#define TARGET_NR_fdatasync 83 -#define TARGET_NR_sync_file_range2 84 -/* #define TARGET_NR_sync_file_range 84 */ -#define TARGET_NR_timerfd_create 85 -#define TARGET_NR_timerfd_settime 86 -#define TARGET_NR_timerfd_gettime 87 -#define TARGET_NR_utimensat 88 -#define TARGET_NR_acct 89 -#define TARGET_NR_capget 90 -#define TARGET_NR_capset 91 -#define TARGET_NR_personality 92 -#define TARGET_NR_exit 93 -#define TARGET_NR_exit_group 94 -#define TARGET_NR_waitid 95 -#define TARGET_NR_set_tid_address 96 -#define TARGET_NR_unshare 97 -#define TARGET_NR_futex 98 -#define TARGET_NR_set_robust_list 99 -#define TARGET_NR_get_robust_list 100 -#define TARGET_NR_nanosleep 101 -#define TARGET_NR_getitimer 102 -#define TARGET_NR_setitimer 103 -#define TARGET_NR_kexec_load 104 -#define TARGET_NR_init_module 105 -#define TARGET_NR_delete_module 106 -#define TARGET_NR_timer_create 107 -#define TARGET_NR_timer_gettime 108 -#define TARGET_NR_timer_getoverrun 109 -#define TARGET_NR_timer_settime 110 -#define TARGET_NR_timer_delete 111 -#define TARGET_NR_clock_settime 112 -#define TARGET_NR_clock_gettime 113 -#define TARGET_NR_clock_getres 114 -#define TARGET_NR_clock_nanosleep 115 -#define TARGET_NR_syslog 116 -#define TARGET_NR_ptrace 117 -#define TARGET_NR_sched_setparam 118 -#define TARGET_NR_sched_setscheduler 119 -#define TARGET_NR_sched_getscheduler 120 -#define TARGET_NR_sched_getparam 121 -#define TARGET_NR_sched_setaffinity 122 -#define TARGET_NR_sched_getaffinity 123 -#define TARGET_NR_sched_yield 124 -#define TARGET_NR_sched_get_priority_max 125 -#define TARGET_NR_sched_get_priority_min 126 -#define TARGET_NR_sched_rr_get_interval 127 -#define TARGET_NR_restart_syscall 128 -#define TARGET_NR_kill 129 -#define TARGET_NR_tkill 130 -#define TARGET_NR_tgkill 131 -#define TARGET_NR_sigaltstack 132 -#define TARGET_NR_rt_sigsuspend 133 -#define TARGET_NR_rt_sigaction 134 -#define TARGET_NR_rt_sigprocmask 135 -#define TARGET_NR_rt_sigpending 136 -#define TARGET_NR_rt_sigtimedwait 137 -#define TARGET_NR_rt_sigqueueinfo 138 -#define TARGET_NR_rt_sigreturn 139 -#define TARGET_NR_setpriority 140 -#define TARGET_NR_getpriority 141 -#define TARGET_NR_reboot 142 -#define TARGET_NR_setregid 143 -#define TARGET_NR_setgid 144 -#define TARGET_NR_setreuid 145 -#define TARGET_NR_setuid 146 -#define TARGET_NR_setresuid 147 -#define TARGET_NR_getresuid 148 -#define TARGET_NR_setresgid 149 -#define TARGET_NR_getresgid 150 -#define TARGET_NR_setfsuid 151 -#define TARGET_NR_setfsgid 152 -#define TARGET_NR_times 153 -#define TARGET_NR_setpgid 154 -#define TARGET_NR_getpgid 155 -#define TARGET_NR_getsid 156 -#define TARGET_NR_setsid 157 -#define TARGET_NR_getgroups 158 -#define TARGET_NR_setgroups 159 -#define TARGET_NR_uname 160 -#define TARGET_NR_sethostname 161 -#define TARGET_NR_setdomainname 162 -#define TARGET_NR_getrlimit 163 -#define TARGET_NR_setrlimit 164 -#define TARGET_NR_getrusage 165 -#define TARGET_NR_umask 166 -#define TARGET_NR_prctl 167 -#define TARGET_NR_getcpu 168 -#define TARGET_NR_gettimeofday 169 -#define TARGET_NR_settimeofday 170 -#define TARGET_NR_adjtimex 171 -#define TARGET_NR_getpid 172 -#define TARGET_NR_getppid 173 -#define TARGET_NR_getuid 174 -#define TARGET_NR_geteuid 175 -#define TARGET_NR_getgid 176 -#define TARGET_NR_getegid 177 -#define TARGET_NR_gettid 178 -#define TARGET_NR_sysinfo 179 -#define TARGET_NR_mq_open 180 -#define TARGET_NR_mq_unlink 181 -#define TARGET_NR_mq_timedsend 182 -#define TARGET_NR_mq_timedreceive 183 -#define TARGET_NR_mq_notify 184 -#define TARGET_NR_mq_getsetattr 185 -#define TARGET_NR_msgget 186 -#define TARGET_NR_msgctl 187 -#define TARGET_NR_msgrcv 188 -#define TARGET_NR_msgsnd 189 -#define TARGET_NR_semget 190 -#define TARGET_NR_semctl 191 -#define TARGET_NR_semtimedop 192 -#define TARGET_NR_semop 193 -#define TARGET_NR_shmget 194 -#define TARGET_NR_shmctl 195 -#define TARGET_NR_shmat 196 -#define TARGET_NR_shmdt 197 -#define TARGET_NR_socket 198 -#define TARGET_NR_socketpair 199 -#define TARGET_NR_bind 200 -#define TARGET_NR_listen 201 -#define TARGET_NR_accept 202 -#define TARGET_NR_connect 203 -#define TARGET_NR_getsockname 204 -#define TARGET_NR_getpeername 205 -#define TARGET_NR_sendto 206 -#define TARGET_NR_recvfrom 207 -#define TARGET_NR_setsockopt 208 -#define TARGET_NR_getsockopt 209 -#define TARGET_NR_shutdown 210 -#define TARGET_NR_sendmsg 211 -#define TARGET_NR_recvmsg 212 -#define TARGET_NR_readahead 213 -#define TARGET_NR_brk 214 -#define TARGET_NR_munmap 215 -#define TARGET_NR_mremap 216 -#define TARGET_NR_add_key 217 -#define TARGET_NR_request_key 218 -#define TARGET_NR_keyctl 219 -#define TARGET_NR_clone 220 -#define TARGET_NR_execve 221 -#define TARGET_NR_mmap 222 -#define TARGET_NR_fadvise64 223 -#define TARGET_NR_swapon 224 -#define TARGET_NR_swapoff 225 -#define TARGET_NR_mprotect 226 -#define TARGET_NR_msync 227 -#define TARGET_NR_mlock 228 -#define TARGET_NR_munlock 229 -#define TARGET_NR_mlockall 230 -#define TARGET_NR_munlockall 231 -#define TARGET_NR_mincore 232 -#define TARGET_NR_madvise 233 -#define TARGET_NR_remap_file_pages 234 -#define TARGET_NR_mbind 235 -#define TARGET_NR_get_mempolicy 236 -#define TARGET_NR_set_mempolicy 237 -#define TARGET_NR_migrate_pages 238 -#define TARGET_NR_move_pages 239 -#define TARGET_NR_rt_tgsigqueueinfo 240 -#define TARGET_NR_perf_event_open 241 -#define TARGET_NR_accept4 242 -#define TARGET_NR_recvmmsg 243 -#define TARGET_NR_arch_specific_syscall 244 -#define TARGET_NR_wait4 260 -#define TARGET_NR_prlimit64 261 -#define TARGET_NR_fanotify_init 262 -#define TARGET_NR_fanotify_mark 263 -#define TARGET_NR_name_to_handle_at 264 -#define TARGET_NR_open_by_handle_at 265 -#define TARGET_NR_clock_adjtime 266 -#define TARGET_NR_syncfs 267 -#define TARGET_NR_setns 268 -#define TARGET_NR_sendmmsg 269 -#define TARGET_NR_process_vm_readv 270 -#define TARGET_NR_process_vm_writev 271 -#define TARGET_NR_kcmp 272 -#define TARGET_NR_finit_module 273 -#define TARGET_NR_sched_setattr 274 -#define TARGET_NR_sched_getattr 275 -#define TARGET_NR_renameat2 276 -#define TARGET_NR_seccomp 277 -#define TARGET_NR_getrandom 278 -#define TARGET_NR_memfd_create 279 -#define TARGET_NR_bpf 280 -#define TARGET_NR_execveat 281 -#define TARGET_NR_userfaultfd 282 -#define TARGET_NR_membarrier 283 -#define TARGET_NR_mlock2 284 -#define TARGET_NR_copy_file_range 285 - diff --git a/qemu/linux-user/aarch64/target_cpu.h b/qemu/linux-user/aarch64/target_cpu.h deleted file mode 100644 index b5593dc5a..000000000 --- a/qemu/linux-user/aarch64/target_cpu.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ARM AArch64 specific CPU ABI and functions for linux-user - * - * Copyright (c) 2013 Alexander Graf <agraf@suse.de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp) -{ - if (newsp) { - env->xregs[31] = newsp; - } - env->xregs[0] = 0; -} - -static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls) -{ - /* Note that AArch64 Linux keeps the TLS pointer in TPIDR; this is - * different from AArch32 Linux, which uses TPIDRRO. - */ - env->cp15.tpidr_el[0] = newtls; -} - -#endif diff --git a/qemu/linux-user/aarch64/target_signal.h b/qemu/linux-user/aarch64/target_signal.h deleted file mode 100644 index e8c677de1..000000000 --- a/qemu/linux-user/aarch64/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_int ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUARMState *state) -{ - return state->xregs[31]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/aarch64/target_structs.h b/qemu/linux-user/aarch64/target_structs.h deleted file mode 100644 index 21c1f2c07..000000000 --- a/qemu/linux-user/aarch64/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * ARM AArch64 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/aarch64/target_syscall.h b/qemu/linux-user/aarch64/target_syscall.h deleted file mode 100644 index f45801804..000000000 --- a/qemu/linux-user/aarch64/target_syscall.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -struct target_pt_regs { - uint64_t regs[31]; - uint64_t sp; - uint64_t pc; - uint64_t pstate; -}; - -#define UNAME_MACHINE "aarch64" -#define UNAME_MINIMUM_RELEASE "3.8.0" -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/aarch64/termbits.h b/qemu/linux-user/aarch64/termbits.h deleted file mode 100644 index b64ba974c..000000000 --- a/qemu/linux-user/aarch64/termbits.h +++ /dev/null @@ -1,220 +0,0 @@ -/* from asm/termbits.h */ -/* NOTE: exactly the same as i386 */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T', 0x30, unsigned int) - /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T', 0x31, int) - /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C - /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D - /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/alpha/syscall_nr.h b/qemu/linux-user/alpha/syscall_nr.h deleted file mode 100644 index 00e14bb6b..000000000 --- a/qemu/linux-user/alpha/syscall_nr.h +++ /dev/null @@ -1,452 +0,0 @@ -#define TARGET_NR_osf_syscall 0 /* not implemented */ -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_osf_old_open 5 /* not implemented */ -#define TARGET_NR_close 6 -#define TARGET_NR_osf_wait4 7 -#define TARGET_NR_osf_old_creat 8 /* not implemented */ -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_osf_execve 11 /* not implemented */ -#define TARGET_NR_chdir 12 -#define TARGET_NR_fchdir 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_chown 16 -#define TARGET_NR_brk 17 -#define TARGET_NR_osf_getfsstat 18 /* not implemented */ -#define TARGET_NR_lseek 19 -#define TARGET_NR_getxpid 20 -#define TARGET_NR_osf_mount 21 -#define TARGET_NR_umount2 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getxuid 24 -#define TARGET_NR_exec_with_loader 25 /* not implemented */ -#define TARGET_NR_ptrace 26 -#define TARGET_NR_osf_nrecvmsg 27 /* not implemented */ -#define TARGET_NR_osf_nsendmsg 28 /* not implemented */ -#define TARGET_NR_osf_nrecvfrom 29 /* not implemented */ -#define TARGET_NR_osf_naccept 30 /* not implemented */ -#define TARGET_NR_osf_ngetpeername 31 /* not implemented */ -#define TARGET_NR_osf_ngetsockname 32 /* not implemented */ -#define TARGET_NR_access 33 -#define TARGET_NR_osf_chflags 34 /* not implemented */ -#define TARGET_NR_osf_fchflags 35 /* not implemented */ -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_osf_old_stat 38 /* not implemented */ -#define TARGET_NR_setpgid 39 -#define TARGET_NR_osf_old_lstat 40 /* not implemented */ -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_osf_set_program_attributes 43 -#define TARGET_NR_osf_profil 44 /* not implemented */ -#define TARGET_NR_open 45 -#define TARGET_NR_osf_old_sigaction 46 /* not implemented */ -#define TARGET_NR_getxgid 47 -#define TARGET_NR_sigprocmask 48 -#define TARGET_NR_osf_getlogin 49 /* not implemented */ -#define TARGET_NR_osf_setlogin 50 /* not implemented */ -#define TARGET_NR_acct 51 -#define TARGET_NR_sigpending 52 - -#define TARGET_NR_ioctl 54 -#define TARGET_NR_osf_reboot 55 /* not implemented */ -#define TARGET_NR_osf_revoke 56 /* not implemented */ -#define TARGET_NR_symlink 57 -#define TARGET_NR_readlink 58 -#define TARGET_NR_execve 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_osf_old_fstat 62 /* not implemented */ -#define TARGET_NR_getpgrp 63 -#define TARGET_NR_getpagesize 64 -#define TARGET_NR_osf_mremap 65 /* not implemented */ -#define TARGET_NR_vfork 66 -#define TARGET_NR_stat 67 -#define TARGET_NR_lstat 68 -#define TARGET_NR_osf_sbrk 69 /* not implemented */ -#define TARGET_NR_osf_sstk 70 /* not implemented */ -#define TARGET_NR_mmap 71 /* OSF/1 mmap is superset of Linux */ -#define TARGET_NR_osf_old_vadvise 72 /* not implemented */ -#define TARGET_NR_munmap 73 -#define TARGET_NR_mprotect 74 -#define TARGET_NR_madvise 75 -#define TARGET_NR_vhangup 76 -#define TARGET_NR_osf_kmodcall 77 /* not implemented */ -#define TARGET_NR_osf_mincore 78 /* not implemented */ -#define TARGET_NR_getgroups 79 -#define TARGET_NR_setgroups 80 -#define TARGET_NR_osf_old_getpgrp 81 /* not implemented */ -#define TARGET_NR_setpgrp 82 /* BSD alias for setpgid */ -#define TARGET_NR_osf_setitimer 83 -#define TARGET_NR_osf_old_wait 84 /* not implemented */ -#define TARGET_NR_osf_table 85 /* not implemented */ -#define TARGET_NR_osf_getitimer 86 -#define TARGET_NR_gethostname 87 -#define TARGET_NR_sethostname 88 -#define TARGET_NR_getdtablesize 89 -#define TARGET_NR_dup2 90 -#define TARGET_NR_fstat 91 -#define TARGET_NR_fcntl 92 -#define TARGET_NR_osf_select 93 -#define TARGET_NR_poll 94 -#define TARGET_NR_fsync 95 -#define TARGET_NR_setpriority 96 -#define TARGET_NR_socket 97 -#define TARGET_NR_connect 98 -#define TARGET_NR_accept 99 -#define TARGET_NR_getpriority 100 -#define TARGET_NR_send 101 -#define TARGET_NR_recv 102 -#define TARGET_NR_sigreturn 103 -#define TARGET_NR_bind 104 -#define TARGET_NR_setsockopt 105 -#define TARGET_NR_listen 106 -#define TARGET_NR_osf_plock 107 /* not implemented */ -#define TARGET_NR_osf_old_sigvec 108 /* not implemented */ -#define TARGET_NR_osf_old_sigblock 109 /* not implemented */ -#define TARGET_NR_osf_old_sigsetmask 110 /* not implemented */ -#define TARGET_NR_sigsuspend 111 -#define TARGET_NR_osf_sigstack 112 -#define TARGET_NR_recvmsg 113 -#define TARGET_NR_sendmsg 114 -#define TARGET_NR_osf_old_vtrace 115 /* not implemented */ -#define TARGET_NR_osf_gettimeofday 116 -#define TARGET_NR_osf_getrusage 117 -#define TARGET_NR_getsockopt 118 - -#define TARGET_NR_readv 120 -#define TARGET_NR_writev 121 -#define TARGET_NR_osf_settimeofday 122 -#define TARGET_NR_fchown 123 -#define TARGET_NR_fchmod 124 -#define TARGET_NR_recvfrom 125 -#define TARGET_NR_setreuid 126 -#define TARGET_NR_setregid 127 -#define TARGET_NR_rename 128 -#define TARGET_NR_truncate 129 -#define TARGET_NR_ftruncate 130 -#define TARGET_NR_flock 131 -#define TARGET_NR_setgid 132 -#define TARGET_NR_sendto 133 -#define TARGET_NR_shutdown 134 -#define TARGET_NR_socketpair 135 -#define TARGET_NR_mkdir 136 -#define TARGET_NR_rmdir 137 -#define TARGET_NR_osf_utimes 138 -#define TARGET_NR_osf_old_sigreturn 139 /* not implemented */ -#define TARGET_NR_osf_adjtime 140 /* not implemented */ -#define TARGET_NR_getpeername 141 -#define TARGET_NR_osf_gethostid 142 /* not implemented */ -#define TARGET_NR_osf_sethostid 143 /* not implemented */ -#define TARGET_NR_getrlimit 144 -#define TARGET_NR_setrlimit 145 -#define TARGET_NR_osf_old_killpg 146 /* not implemented */ -#define TARGET_NR_setsid 147 -#define TARGET_NR_quotactl 148 -#define TARGET_NR_osf_oldquota 149 /* not implemented */ -#define TARGET_NR_getsockname 150 - -#define TARGET_NR_osf_pid_block 153 /* not implemented */ -#define TARGET_NR_osf_pid_unblock 154 /* not implemented */ - -#define TARGET_NR_sigaction 156 -#define TARGET_NR_osf_sigwaitprim 157 /* not implemented */ -#define TARGET_NR_osf_nfssvc 158 /* not implemented */ -#define TARGET_NR_osf_getdirentries 159 -#define TARGET_NR_osf_statfs 160 -#define TARGET_NR_osf_fstatfs 161 - -#define TARGET_NR_osf_asynch_daemon 163 /* not implemented */ -#define TARGET_NR_osf_getfh 164 /* not implemented */ -#define TARGET_NR_osf_getdomainname 165 -#define TARGET_NR_setdomainname 166 - -#define TARGET_NR_osf_exportfs 169 /* not implemented */ - -#define TARGET_NR_osf_alt_plock 181 /* not implemented */ - -#define TARGET_NR_osf_getmnt 184 /* not implemented */ - -#define TARGET_NR_osf_alt_sigpending 187 /* not implemented */ -#define TARGET_NR_osf_alt_setsid 188 /* not implemented */ - -#define TARGET_NR_osf_swapon 199 -#define TARGET_NR_msgctl 200 -#define TARGET_NR_msgget 201 -#define TARGET_NR_msgrcv 202 -#define TARGET_NR_msgsnd 203 -#define TARGET_NR_semctl 204 -#define TARGET_NR_semget 205 -#define TARGET_NR_semop 206 -#define TARGET_NR_osf_utsname 207 -#define TARGET_NR_lchown 208 -#define TARGET_NR_osf_shmat 209 -/* this has the usual shmat semantics so give it the name syscall.c expects - * so that our support for it is enabled. - */ -#define TARGET_NR_shmat TARGET_NR_osf_shmat -#define TARGET_NR_shmctl 210 -#define TARGET_NR_shmdt 211 -#define TARGET_NR_shmget 212 -#define TARGET_NR_osf_mvalid 213 /* not implemented */ -#define TARGET_NR_osf_getaddressconf 214 /* not implemented */ -#define TARGET_NR_osf_msleep 215 /* not implemented */ -#define TARGET_NR_osf_mwakeup 216 /* not implemented */ -#define TARGET_NR_msync 217 -#define TARGET_NR_osf_signal 218 /* not implemented */ -#define TARGET_NR_osf_utc_gettime 219 /* not implemented */ -#define TARGET_NR_osf_utc_adjtime 220 /* not implemented */ - -#define TARGET_NR_osf_security 222 /* not implemented */ -#define TARGET_NR_osf_kloadcall 223 /* not implemented */ - -#define TARGET_NR_getpgid 233 -#define TARGET_NR_getsid 234 -#define TARGET_NR_sigaltstack 235 -#define TARGET_NR_osf_waitid 236 /* not implemented */ -#define TARGET_NR_osf_priocntlset 237 /* not implemented */ -#define TARGET_NR_osf_sigsendset 238 /* not implemented */ -#define TARGET_NR_osf_set_speculative 239 /* not implemented */ -#define TARGET_NR_osf_msfs_syscall 240 /* not implemented */ -#define TARGET_NR_osf_sysinfo 241 -#define TARGET_NR_osf_uadmin 242 /* not implemented */ -#define TARGET_NR_osf_fuser 243 /* not implemented */ -#define TARGET_NR_osf_proplist_syscall 244 -#define TARGET_NR_osf_ntp_adjtime 245 /* not implemented */ -#define TARGET_NR_osf_ntp_gettime 246 /* not implemented */ -#define TARGET_NR_osf_pathconf 247 /* not implemented */ -#define TARGET_NR_osf_fpathconf 248 /* not implemented */ - -#define TARGET_NR_osf_uswitch 250 /* not implemented */ -#define TARGET_NR_osf_usleep_thread 251 -#define TARGET_NR_osf_audcntl 252 /* not implemented */ -#define TARGET_NR_osf_audgen 253 /* not implemented */ -#define TARGET_NR_sysfs 254 -#define TARGET_NR_osf_subsys_info 255 /* not implemented */ -#define TARGET_NR_osf_getsysinfo 256 -#define TARGET_NR_osf_setsysinfo 257 -#define TARGET_NR_osf_afs_syscall 258 /* not implemented */ -#define TARGET_NR_osf_swapctl 259 /* not implemented */ -#define TARGET_NR_osf_memcntl 260 /* not implemented */ -#define TARGET_NR_osf_fdatasync 261 /* not implemented */ - - -/* - * Linux-specific system calls begin at 300 - */ -#define TARGET_NR_bdflush 300 -#define TARGET_NR_sethae 301 -#define TARGET_NR_mount 302 -#define TARGET_NR_old_adjtimex 303 -#define TARGET_NR_swapoff 304 -#define TARGET_NR_getdents 305 -#define TARGET_NR_create_module 306 -#define TARGET_NR_init_module 307 -#define TARGET_NR_delete_module 308 -#define TARGET_NR_get_kernel_syms 309 -#define TARGET_NR_syslog 310 -#define TARGET_NR_reboot 311 -#define TARGET_NR_clone 312 -#define TARGET_NR_uselib 313 -#define TARGET_NR_mlock 314 -#define TARGET_NR_munlock 315 -#define TARGET_NR_mlockall 316 -#define TARGET_NR_munlockall 317 -#define TARGET_NR_sysinfo 318 -#define TARGET_NR__sysctl 319 -/* 320 was sys_idle. */ -#define TARGET_NR_umount 321 -#define TARGET_NR_swapon 322 -#define TARGET_NR_times 323 -#define TARGET_NR_personality 324 -#define TARGET_NR_setfsuid 325 -#define TARGET_NR_setfsgid 326 -#define TARGET_NR_ustat 327 -#define TARGET_NR_statfs 328 -#define TARGET_NR_fstatfs 329 -#define TARGET_NR_sched_setparam 330 -#define TARGET_NR_sched_getparam 331 -#define TARGET_NR_sched_setscheduler 332 -#define TARGET_NR_sched_getscheduler 333 -#define TARGET_NR_sched_yield 334 -#define TARGET_NR_sched_get_priority_max 335 -#define TARGET_NR_sched_get_priority_min 336 -#define TARGET_NR_sched_rr_get_interval 337 -#define TARGET_NR_afs_syscall 338 -#define TARGET_NR_uname 339 -#define TARGET_NR_nanosleep 340 -#define TARGET_NR_mremap 341 -#define TARGET_NR_nfsservctl 342 -#define TARGET_NR_setresuid 343 -#define TARGET_NR_getresuid 344 -#define TARGET_NR_pciconfig_read 345 -#define TARGET_NR_pciconfig_write 346 -#define TARGET_NR_query_module 347 -#define TARGET_NR_prctl 348 -#define TARGET_NR_pread64 349 -#define TARGET_NR_pwrite64 350 -#define TARGET_NR_rt_sigreturn 351 -#define TARGET_NR_rt_sigaction 352 -#define TARGET_NR_rt_sigprocmask 353 -#define TARGET_NR_rt_sigpending 354 -#define TARGET_NR_rt_sigtimedwait 355 -#define TARGET_NR_rt_sigqueueinfo 356 -#define TARGET_NR_rt_sigsuspend 357 -#define TARGET_NR_select 358 -#define TARGET_NR_gettimeofday 359 -#define TARGET_NR_settimeofday 360 -#define TARGET_NR_getitimer 361 -#define TARGET_NR_setitimer 362 -#define TARGET_NR_utimes 363 -#define TARGET_NR_getrusage 364 -#define TARGET_NR_wait4 365 -#define TARGET_NR_adjtimex 366 -#define TARGET_NR_getcwd 367 -#define TARGET_NR_capget 368 -#define TARGET_NR_capset 369 -#define TARGET_NR_sendfile 370 -#define TARGET_NR_setresgid 371 -#define TARGET_NR_getresgid 372 -#define TARGET_NR_dipc 373 -#define TARGET_NR_pivot_root 374 -#define TARGET_NR_mincore 375 -#define TARGET_NR_pciconfig_iobase 376 -#define TARGET_NR_getdents64 377 -#define TARGET_NR_gettid 378 -#define TARGET_NR_readahead 379 -/* 380 is unused */ -#define TARGET_NR_tkill 381 -#define TARGET_NR_setxattr 382 -#define TARGET_NR_lsetxattr 383 -#define TARGET_NR_fsetxattr 384 -#define TARGET_NR_getxattr 385 -#define TARGET_NR_lgetxattr 386 -#define TARGET_NR_fgetxattr 387 -#define TARGET_NR_listxattr 388 -#define TARGET_NR_llistxattr 389 -#define TARGET_NR_flistxattr 390 -#define TARGET_NR_removexattr 391 -#define TARGET_NR_lremovexattr 392 -#define TARGET_NR_fremovexattr 393 -#define TARGET_NR_futex 394 -#define TARGET_NR_sched_setaffinity 395 -#define TARGET_NR_sched_getaffinity 396 -#define TARGET_NR_tuxcall 397 -#define TARGET_NR_io_setup 398 -#define TARGET_NR_io_destroy 399 -#define TARGET_NR_io_getevents 400 -#define TARGET_NR_io_submit 401 -#define TARGET_NR_io_cancel 402 -#define TARGET_NR_exit_group 405 -#define TARGET_NR_lookup_dcookie 406 -#define TARGET_NR_sys_epoll_create 407 -#define TARGET_NR_sys_epoll_ctl 408 -#define TARGET_NR_sys_epoll_wait 409 -#define TARGET_NR_remap_file_pages 410 -#define TARGET_NR_set_tid_address 411 -#define TARGET_NR_restart_syscall 412 -#define TARGET_NR_fadvise64 413 -#define TARGET_NR_timer_create 414 -#define TARGET_NR_timer_settime 415 -#define TARGET_NR_timer_gettime 416 -#define TARGET_NR_timer_getoverrun 417 -#define TARGET_NR_timer_delete 418 -#define TARGET_NR_clock_settime 419 -#define TARGET_NR_clock_gettime 420 -#define TARGET_NR_clock_getres 421 -#define TARGET_NR_clock_nanosleep 422 -#define TARGET_NR_semtimedop 423 -#define TARGET_NR_tgkill 424 -#define TARGET_NR_stat64 425 -#define TARGET_NR_lstat64 426 -#define TARGET_NR_fstat64 427 -#define TARGET_NR_vserver 428 -#define TARGET_NR_mbind 429 -#define TARGET_NR_get_mempolicy 430 -#define TARGET_NR_set_mempolicy 431 -#define TARGET_NR_mq_open 432 -#define TARGET_NR_mq_unlink 433 -#define TARGET_NR_mq_timedsend 434 -#define TARGET_NR_mq_timedreceive 435 -#define TARGET_NR_mq_notify 436 -#define TARGET_NR_mq_getsetattr 437 -#define TARGET_NR_waitid 438 -#define TARGET_NR_add_key 439 -#define TARGET_NR_request_key 440 -#define TARGET_NR_keyctl 441 -#define TARGET_NR_ioprio_set 442 -#define TARGET_NR_ioprio_get 443 -#define TARGET_NR_inotify_init 444 -#define TARGET_NR_inotify_add_watch 445 -#define TARGET_NR_inotify_rm_watch 446 -#define TARGET_NR_fdatasync 447 -#define TARGET_NR_kexec_load 448 -#define TARGET_NR_migrate_pages 449 -#define TARGET_NR_openat 450 -#define TARGET_NR_mkdirat 451 -#define TARGET_NR_mknodat 452 -#define TARGET_NR_fchownat 453 -#define TARGET_NR_futimesat 454 -#define TARGET_NR_fstatat64 455 -#define TARGET_NR_unlinkat 456 -#define TARGET_NR_renameat 457 -#define TARGET_NR_linkat 458 -#define TARGET_NR_symlinkat 459 -#define TARGET_NR_readlinkat 460 -#define TARGET_NR_fchmodat 461 -#define TARGET_NR_faccessat 462 -#define TARGET_NR_pselect6 463 -#define TARGET_NR_ppoll 464 -#define TARGET_NR_unshare 465 -#define TARGET_NR_set_robust_list 466 -#define TARGET_NR_get_robust_list 467 -#define TARGET_NR_splice 468 -#define TARGET_NR_sync_file_range 469 -#define TARGET_NR_tee 470 -#define TARGET_NR_vmsplice 471 -#define TARGET_NR_move_pages 472 -#define TARGET_NR_getcpu 473 -#define TARGET_NR_epoll_pwait 474 -#define TARGET_NR_utimensat 475 -#define TARGET_NR_signalfd 476 -#define TARGET_NR_timerfd 477 -#define TARGET_NR_eventfd 478 -#define TARGET_NR_recvmmsg 479 -#define TARGET_NR_fallocate 480 -#define TARGET_NR_timerfd_create 481 -#define TARGET_NR_timerfd_settime 482 -#define TARGET_NR_timerfd_gettime 483 -#define TARGET_NR_signalfd4 484 -#define TARGET_NR_eventfd2 485 -#define TARGET_NR_epoll_create1 486 -#define TARGET_NR_dup3 487 -#define TARGET_NR_pipe2 488 -#define TARGET_NR_inotify_init1 489 -#define TARGET_NR_preadv 490 -#define TARGET_NR_pwritev 491 -#define TARGET_NR_rt_tgsigqueueinfo 492 -#define TARGET_NR_perf_event_open 493 -#define TARGET_NR_fanotify_init 494 -#define TARGET_NR_fanotify_mark 495 -#define TARGET_NR_prlimit64 496 -#define TARGET_NR_name_to_handle_at 497 -#define TARGET_NR_open_by_handle_at 498 -#define TARGET_NR_clock_adjtime 499 -#define TARGET_NR_syncfs 500 -#define TARGET_NR_setns 501 -#define TARGET_NR_accept4 502 -#define TARGET_NR_sendmmsg 503 -#define TARGET_NR_process_vm_readv 504 -#define TARGET_NR_process_vm_writev 505 -#define TARGET_NR_kcmp 506 -#define TARGET_NR_finit_module 507 -#define TARGET_NR_sched_setattr 508 -#define TARGET_NR_sched_getattr 509 -#define TARGET_NR_renameat2 510 -#define TARGET_NR_getrandom 511 -#define TARGET_NR_memfd_create 512 -#define TARGET_NR_execveat 513 diff --git a/qemu/linux-user/alpha/target_cpu.h b/qemu/linux-user/alpha/target_cpu.h deleted file mode 100644 index 42562452b..000000000 --- a/qemu/linux-user/alpha/target_cpu.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Alpha specific CPU ABI and functions for linux-user - * - * Copyright (c) 2007 Jocelyn Mayer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUAlphaState *env, target_ulong newsp) -{ - if (newsp) { - env->ir[IR_SP] = newsp; - } - env->ir[IR_V0] = 0; - env->ir[IR_A3] = 0; -} - -static inline void cpu_set_tls(CPUAlphaState *env, target_ulong newtls) -{ - env->unique = newtls; -} - -#endif diff --git a/qemu/linux-user/alpha/target_signal.h b/qemu/linux-user/alpha/target_signal.h deleted file mode 100644 index d3822da60..000000000 --- a/qemu/linux-user/alpha/target_signal.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - int32_t ss_flags; - int32_t dummy; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_SIGSTKSZ 16384 - -static inline abi_ulong get_sp_from_cpustate(CPUAlphaState *state) -{ - return state->ir[IR_SP]; -} - -/* From <asm/gentrap.h>. */ -#define TARGET_GEN_INTOVF -1 /* integer overflow */ -#define TARGET_GEN_INTDIV -2 /* integer division by zero */ -#define TARGET_GEN_FLTOVF -3 /* fp overflow */ -#define TARGET_GEN_FLTDIV -4 /* fp division by zero */ -#define TARGET_GEN_FLTUND -5 /* fp underflow */ -#define TARGET_GEN_FLTINV -6 /* invalid fp operand */ -#define TARGET_GEN_FLTINE -7 /* inexact fp operand */ -#define TARGET_GEN_DECOVF -8 /* decimal overflow (for COBOL??) */ -#define TARGET_GEN_DECDIV -9 /* decimal division by zero */ -#define TARGET_GEN_DECINV -10 /* invalid decimal operand */ -#define TARGET_GEN_ROPRAND -11 /* reserved operand */ -#define TARGET_GEN_ASSERTERR -12 /* assertion error */ -#define TARGET_GEN_NULPTRERR -13 /* null pointer error */ -#define TARGET_GEN_STKOVF -14 /* stack overflow */ -#define TARGET_GEN_STRLENERR -15 /* string length error */ -#define TARGET_GEN_SUBSTRERR -16 /* substring error */ -#define TARGET_GEN_RANGERR -17 /* range error */ -#define TARGET_GEN_SUBRNG -18 -#define TARGET_GEN_SUBRNG1 -19 -#define TARGET_GEN_SUBRNG2 -20 -#define TARGET_GEN_SUBRNG3 -21 -#define TARGET_GEN_SUBRNG4 -22 -#define TARGET_GEN_SUBRNG5 -23 -#define TARGET_GEN_SUBRNG6 -24 -#define TARGET_GEN_SUBRNG7 -25 - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/alpha/target_structs.h b/qemu/linux-user/alpha/target_structs.h deleted file mode 100644 index 50e7708ff..000000000 --- a/qemu/linux-user/alpha/target_structs.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Alpha specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_uint mode; /* Read/write permission. */ - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad1; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ - abi_ulong shm_dtime; /* time of last shmdt() */ - abi_ulong shm_ctime; /* time of last change by shmctl() */ - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused1; - abi_ulong __unused2; -}; - -#endif diff --git a/qemu/linux-user/alpha/target_syscall.h b/qemu/linux-user/alpha/target_syscall.h deleted file mode 100644 index 3db4b16f6..000000000 --- a/qemu/linux-user/alpha/target_syscall.h +++ /dev/null @@ -1,262 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* default linux values for the selectors */ -#define __USER_DS (1) - -struct target_pt_regs { - abi_ulong r0; - abi_ulong r1; - abi_ulong r2; - abi_ulong r3; - abi_ulong r4; - abi_ulong r5; - abi_ulong r6; - abi_ulong r7; - abi_ulong r8; - abi_ulong r19; - abi_ulong r20; - abi_ulong r21; - abi_ulong r22; - abi_ulong r23; - abi_ulong r24; - abi_ulong r25; - abi_ulong r26; - abi_ulong r27; - abi_ulong r28; - abi_ulong hae; -/* JRP - These are the values provided to a0-a2 by PALcode */ - abi_ulong trap_a0; - abi_ulong trap_a1; - abi_ulong trap_a2; -/* These are saved by PAL-code: */ - abi_ulong ps; - abi_ulong pc; - abi_ulong gp; - abi_ulong r16; - abi_ulong r17; - abi_ulong r18; -/* Those is needed by qemu to temporary store the user stack pointer */ - abi_ulong usp; - abi_ulong unique; -}; - -#define UNAME_MACHINE "alpha" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#undef TARGET_EDEADLK -#define TARGET_EDEADLK 11 -#undef TARGET_EAGAIN -#define TARGET_EAGAIN 35 -#undef TARGET_EINPROGRESS -#define TARGET_EINPROGRESS 36 -#undef TARGET_EALREADY -#define TARGET_EALREADY 37 -#undef TARGET_ENOTSOCK -#define TARGET_ENOTSOCK 38 -#undef TARGET_EDESTADDRREQ -#define TARGET_EDESTADDRREQ 39 -#undef TARGET_EMSGSIZE -#define TARGET_EMSGSIZE 40 -#undef TARGET_EPROTOTYPE -#define TARGET_EPROTOTYPE 41 -#undef TARGET_ENOPROTOOPT -#define TARGET_ENOPROTOOPT 42 -#undef TARGET_EPROTONOSUPPORT -#define TARGET_EPROTONOSUPPORT 43 -#undef TARGET_ESOCKTNOSUPPORT -#define TARGET_ESOCKTNOSUPPORT 44 -#undef TARGET_EOPNOTSUPP -#define TARGET_EOPNOTSUPP 45 -#undef TARGET_EPFNOSUPPORT -#define TARGET_EPFNOSUPPORT 46 -#undef TARGET_EAFNOSUPPORT -#define TARGET_EAFNOSUPPORT 47 -#undef TARGET_EADDRINUSE -#define TARGET_EADDRINUSE 48 -#undef TARGET_EADDRNOTAVAIL -#define TARGET_EADDRNOTAVAIL 49 -#undef TARGET_ENETDOWN -#define TARGET_ENETDOWN 50 -#undef TARGET_ENETUNREACH -#define TARGET_ENETUNREACH 51 -#undef TARGET_ENETRESET -#define TARGET_ENETRESET 52 -#undef TARGET_ECONNABORTED -#define TARGET_ECONNABORTED 53 -#undef TARGET_ECONNRESET -#define TARGET_ECONNRESET 54 -#undef TARGET_ENOBUFS -#define TARGET_ENOBUFS 55 -#undef TARGET_EISCONN -#define TARGET_EISCONN 56 -#undef TARGET_ENOTCONN -#define TARGET_ENOTCONN 57 -#undef TARGET_ESHUTDOWN -#define TARGET_ESHUTDOWN 58 -#undef TARGET_ETOOMANYREFS -#define TARGET_ETOOMANYREFS 59 -#undef TARGET_ETIMEDOUT -#define TARGET_ETIMEDOUT 60 -#undef TARGET_ECONNREFUSED -#define TARGET_ECONNREFUSED 61 -#undef TARGET_ELOOP -#define TARGET_ELOOP 62 -#undef TARGET_ENAMETOOLONG -#define TARGET_ENAMETOOLONG 63 -#undef TARGET_EHOSTDOWN -#define TARGET_EHOSTDOWN 64 -#undef TARGET_EHOSTUNREACH -#define TARGET_EHOSTUNREACH 65 -#undef TARGET_ENOTEMPTY -#define TARGET_ENOTEMPTY 66 -// Unused 67 -#undef TARGET_EUSERS -#define TARGET_EUSERS 68 -#undef TARGET_EDQUOT -#define TARGET_EDQUOT 69 -#undef TARGET_ESTALE -#define TARGET_ESTALE 70 -#undef TARGET_EREMOTE -#define TARGET_EREMOTE 71 -// Unused 72-76 -#undef TARGET_ENOLCK -#define TARGET_ENOLCK 77 -#undef TARGET_ENOSYS -#define TARGET_ENOSYS 78 -// Unused 79 -#undef TARGET_ENOMSG -#define TARGET_ENOMSG 80 -#undef TARGET_EIDRM -#define TARGET_EIDRM 81 -#undef TARGET_ENOSR -#define TARGET_ENOSR 82 -#undef TARGET_ETIME -#define TARGET_ETIME 83 -#undef TARGET_EBADMSG -#define TARGET_EBADMSG 84 -#undef TARGET_EPROTO -#define TARGET_EPROTO 85 -#undef TARGET_ENODATA -#define TARGET_ENODATA 86 -#undef TARGET_ENOSTR -#define TARGET_ENOSTR 87 -#undef TARGET_ECHRNG -#define TARGET_ECHRNG 88 -#undef TARGET_EL2NSYNC -#define TARGET_EL2NSYNC 89 -#undef TARGET_EL3HLT -#define TARGET_EL3HLT 90 -#undef TARGET_EL3RST -#define TARGET_EL3RST 91 -#undef TARGET_ENOPKG -#define TARGET_ENOPKG 92 -#undef TARGET_ELNRNG -#define TARGET_ELNRNG 93 -#undef TARGET_EUNATCH -#define TARGET_EUNATCH 94 -#undef TARGET_ENOCSI -#define TARGET_ENOCSI 95 -#undef TARGET_EL2HLT -#define TARGET_EL2HLT 96 -#undef TARGET_EBADE -#define TARGET_EBADE 97 -#undef TARGET_EBADR -#define TARGET_EBADR 98 -#undef TARGET_EXFULL -#define TARGET_EXFULL 99 -#undef TARGET_ENOANO -#define TARGET_ENOANO 100 -#undef TARGET_EBADRQC -#define TARGET_EBADRQC 101 -#undef TARGET_EBADSLT -#define TARGET_EBADSLT 102 -// Unused 103 -#undef TARGET_EBFONT -#define TARGET_EBFONT 104 -#undef TARGET_ENONET -#define TARGET_ENONET 105 -#undef TARGET_ENOLINK -#define TARGET_ENOLINK 106 -#undef TARGET_EADV -#define TARGET_EADV 107 -#undef TARGET_ESRMNT -#define TARGET_ESRMNT 108 -#undef TARGET_ECOMM -#define TARGET_ECOMM 109 -#undef TARGET_EMULTIHOP -#define TARGET_EMULTIHOP 110 -#undef TARGET_EDOTDOT -#define TARGET_EDOTDOT 111 -#undef TARGET_EOVERFLOW -#define TARGET_EOVERFLOW 112 -#undef TARGET_ENOTUNIQ -#define TARGET_ENOTUNIQ 113 -#undef TARGET_EBADFD -#define TARGET_EBADFD 114 -#undef TARGET_EREMCHG -#define TARGET_EREMCHG 115 -#undef TARGET_EILSEQ -#define TARGET_EILSEQ 116 - -// Same as default 117-121 - -#undef TARGET_ELIBACC -#define TARGET_ELIBACC 122 -#undef TARGET_ELIBBAD -#define TARGET_ELIBBAD 123 -#undef TARGET_ELIBSCN -#define TARGET_ELIBSCN 124 -#undef TARGET_ELIBMAX -#define TARGET_ELIBMAX 125 -#undef TARGET_ELIBEXEC -#define TARGET_ELIBEXEC 126 -#undef TARGET_ERESTART -#define TARGET_ERESTART 127 -#undef TARGET_ESTRPIPE -#define TARGET_ESTRPIPE 128 -#undef TARGET_ENOMEDIUM -#define TARGET_ENOMEDIUM 129 -#undef TARGET_EMEDIUMTYPE -#define TARGET_EMEDIUMTYPE 130 -#undef TARGET_ECANCELED -#define TARGET_ECANCELED 131 -#undef TARGET_ENOKEY -#define TARGET_ENOKEY 132 -#undef TARGET_EKEYEXPIRED -#define TARGET_EKEYEXPIRED 133 -#undef TARGET_EKEYREVOKED -#define TARGET_EKEYREVOKED 134 -#undef TARGET_EKEYREJECTED -#define TARGET_EKEYREJECTED 135 -#undef TARGET_EOWNERDEAD -#define TARGET_EOWNERDEAD 136 -#undef TARGET_ENOTRECOVERABLE -#define TARGET_ENOTRECOVERABLE 137 -#undef TARGET_ERFKILL -#define TARGET_ERFKILL 138 - -// For sys_osf_getsysinfo -#define TARGET_GSI_UACPROC 8 -#define TARGET_GSI_IEEE_FP_CONTROL 45 -#define TARGET_GSI_IEEE_STATE_AT_SIGNAL 46 -#define TARGET_GSI_PROC_TYPE 60 -#define TARGET_GSI_GET_HWRPB 101 - -// For sys_ofs_setsysinfo -#define TARGET_SSI_NVPAIRS 1 -#define TARGET_SSI_IEEE_FP_CONTROL 14 -#define TARGET_SSI_IEEE_STATE_AT_SIGNAL 15 -#define TARGET_SSI_IEEE_IGNORE_STATE_AT_SIGNAL 16 -#define TARGET_SSI_IEEE_RAISE_EXCEPTION 1001 - -#define TARGET_SSIN_UACPROC 6 - -#define TARGET_UAC_NOPRINT 1 -#define TARGET_UAC_NOFIX 2 -#define TARGET_UAC_SIGBUS 4 -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_MLOCKALL_MCL_CURRENT 0x2000 -#define TARGET_MLOCKALL_MCL_FUTURE 0x4000 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/alpha/termbits.h b/qemu/linux-user/alpha/termbits.h deleted file mode 100644 index 6406b6a79..000000000 --- a/qemu/linux-user/alpha/termbits.h +++ /dev/null @@ -1,264 +0,0 @@ -typedef unsigned char target_cc_t; -typedef unsigned int target_speed_t; -typedef unsigned int target_tcflag_t; - -#define TARGET_NCCS 19 -struct target_termios { - target_tcflag_t c_iflag; /* input mode flags */ - target_tcflag_t c_oflag; /* output mode flags */ - target_tcflag_t c_cflag; /* control mode flags */ - target_tcflag_t c_lflag; /* local mode flags */ - target_cc_t c_cc[TARGET_NCCS]; /* control characters */ - target_cc_t c_line; /* line discipline (== c_cc[19]) */ - target_speed_t c_ispeed; /* input speed */ - target_speed_t c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define TARGET_VEOF 0 -#define TARGET_VEOL 1 -#define TARGET_VEOL2 2 -#define TARGET_VERASE 3 -#define TARGET_VWERASE 4 -#define TARGET_VKILL 5 -#define TARGET_VREPRINT 6 -#define TARGET_VSWTC 7 -#define TARGET_VINTR 8 -#define TARGET_VQUIT 9 -#define TARGET_VSUSP 10 -#define TARGET_VSTART 12 -#define TARGET_VSTOP 13 -#define TARGET_VLNEXT 14 -#define TARGET_VDISCARD 15 -#define TARGET_VMIN 16 -#define TARGET_VTIME 17 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IXON 0001000 -#define TARGET_IXOFF 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IUCLC 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_ONLCR 0000002 -#define TARGET_OLCUC 0000004 - -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 - -#define TARGET_OFILL 00000100 -#define TARGET_OFDEL 00000200 -#define TARGET_NLDLY 00001400 -#define TARGET_NL0 00000000 -#define TARGET_NL1 00000400 -#define TARGET_NL2 00001000 -#define TARGET_NL3 00001400 -#define TARGET_TABDLY 00006000 -#define TARGET_TAB0 00000000 -#define TARGET_TAB1 00002000 -#define TARGET_TAB2 00004000 -#define TARGET_TAB3 00006000 -#define TARGET_CRDLY 00030000 -#define TARGET_CR0 00000000 -#define TARGET_CR1 00010000 -#define TARGET_CR2 00020000 -#define TARGET_CR3 00030000 -#define TARGET_FFDLY 00040000 -#define TARGET_FF0 00000000 -#define TARGET_FF1 00040000 -#define TARGET_BSDLY 00100000 -#define TARGET_BS0 00000000 -#define TARGET_BS1 00100000 -#define TARGET_VTDLY 00200000 -#define TARGET_VT0 00000000 -#define TARGET_VT1 00200000 -#define TARGET_XTABS 01000000 /* Hmm.. Linux/i386 considers this part of TABDLY.. */ - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0000037 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CBAUDEX 0000000 -#define TARGET_B57600 00020 -#define TARGET_B115200 00021 -#define TARGET_B230400 00022 -#define TARGET_B460800 00023 -#define TARGET_B500000 00024 -#define TARGET_B576000 00025 -#define TARGET_B921600 00026 -#define TARGET_B1000000 00027 -#define TARGET_B1152000 00030 -#define TARGET_B1500000 00031 -#define TARGET_B2000000 00032 -#define TARGET_B2500000 00033 -#define TARGET_B3000000 00034 -#define TARGET_B3500000 00035 -#define TARGET_B4000000 00036 - -#define TARGET_CSIZE 00001400 -#define TARGET_CS5 00000000 -#define TARGET_CS6 00000400 -#define TARGET_CS7 00001000 -#define TARGET_CS8 00001400 - -#define TARGET_CSTOPB 00002000 -#define TARGET_CREAD 00004000 -#define TARGET_PARENB 00010000 -#define TARGET_PARODD 00020000 -#define TARGET_HUPCL 00040000 - -#define TARGET_CLOCAL 00100000 -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0x00000080 -#define TARGET_ICANON 0x00000100 -#define TARGET_XCASE 0x00004000 -#define TARGET_ECHO 0x00000008 -#define TARGET_ECHOE 0x00000002 -#define TARGET_ECHOK 0x00000004 -#define TARGET_ECHONL 0x00000010 -#define TARGET_NOFLSH 0x80000000 -#define TARGET_TOSTOP 0x00400000 -#define TARGET_ECHOCTL 0x00000040 -#define TARGET_ECHOPRT 0x00000020 -#define TARGET_ECHOKE 0x00000001 -#define TARGET_FLUSHO 0x00800000 -#define TARGET_PENDIN 0x20000000 -#define TARGET_IEXTEN 0x00000400 - -#define TARGET_FIOCLEX TARGET_IO('f', 1) -#define TARGET_FIONCLEX TARGET_IO('f', 2) -#define TARGET_FIOASYNC TARGET_IOW('f', 125, int) -#define TARGET_FIONBIO TARGET_IOW('f', 126, int) -#define TARGET_FIONREAD TARGET_IOR('f', 127, int) -#define TARGET_TIOCINQ FIONREAD -#define TARGET_FIOQSIZE TARGET_IOR('f', 128, loff_t) - -#define TARGET_TIOCGETP TARGET_IOR('t', 8, struct target_sgttyb) -#define TARGET_TIOCSETP TARGET_IOW('t', 9, struct target_sgttyb) -#define TARGET_TIOCSETN TARGET_IOW('t', 10, struct target_sgttyb) /* TIOCSETP wo flush */ - -#define TARGET_TIOCSETC TARGET_IOW('t', 17, struct target_tchars) -#define TARGET_TIOCGETC TARGET_IOR('t', 18, struct target_tchars) -#define TARGET_TCGETS TARGET_IOR('t', 19, struct target_termios) -#define TARGET_TCSETS TARGET_IOW('t', 20, struct target_termios) -#define TARGET_TCSETSW TARGET_IOW('t', 21, struct target_termios) -#define TARGET_TCSETSF TARGET_IOW('t', 22, struct target_termios) - -#define TARGET_TCGETA TARGET_IOR('t', 23, struct target_termio) -#define TARGET_TCSETA TARGET_IOW('t', 24, struct target_termio) -#define TARGET_TCSETAW TARGET_IOW('t', 25, struct target_termio) -#define TARGET_TCSETAF TARGET_IOW('t', 28, struct target_termio) - -#define TARGET_TCSBRK TARGET_IO('t', 29) -#define TARGET_TCXONC TARGET_IO('t', 30) -#define TARGET_TCFLSH TARGET_IO('t', 31) - -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct target_winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct target_winsize) -#define TARGET_TIOCSTART TARGET_IO('t', 110) /* start output, like ^Q */ -#define TARGET_TIOCSTOP TARGET_IO('t', 111) /* stop output, like ^S */ -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) /* output queue size */ - -#define TARGET_TIOCGLTC TARGET_IOR('t', 116, struct target_ltchars) -#define TARGET_TIOCSLTC TARGET_IOW('t', 117, struct target_ltchars) -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E - -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -# define TARGET_TIOCM_LE 0x001 -# define TARGET_TIOCM_DTR 0x002 -# define TARGET_TIOCM_RTS 0x004 -# define TARGET_TIOCM_ST 0x008 -# define TARGET_TIOCM_SR 0x010 -# define TARGET_TIOCM_CTS 0x020 -# define TARGET_TIOCM_CAR 0x040 -# define TARGET_TIOCM_RNG 0x080 -# define TARGET_TIOCM_DSR 0x100 -# define TARGET_TIOCM_CD TIOCM_CAR -# define TARGET_TIOCM_RI TIOCM_RNG -# define TARGET_TIOCM_OUT1 0x2000 -# define TARGET_TIOCM_OUT2 0x4000 -# define TARGET_TIOCM_LOOP 0x8000 - -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -# define TARGET_TIOCPKT_DATA 0 -# define TARGET_TIOCPKT_FLUSHREAD 1 -# define TARGET_TIOCPKT_FLUSHWRITE 2 -# define TARGET_TIOCPKT_STOP 4 -# define TARGET_TIOCPKT_START 8 -# define TARGET_TIOCPKT_NOSTOP 16 -# define TARGET_TIOCPKT_DOSTOP 32 - - -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ - /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ -# define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ diff --git a/qemu/linux-user/arm/nwfpe/Makefile.objs b/qemu/linux-user/arm/nwfpe/Makefile.objs deleted file mode 100644 index 51b0c32c2..000000000 --- a/qemu/linux-user/arm/nwfpe/Makefile.objs +++ /dev/null @@ -1,2 +0,0 @@ -obj-y = fpa11.o fpa11_cpdo.o fpa11_cpdt.o fpa11_cprt.o fpopcode.o -obj-y += single_cpdo.o double_cpdo.o extended_cpdo.o diff --git a/qemu/linux-user/arm/nwfpe/double_cpdo.c b/qemu/linux-user/arm/nwfpe/double_cpdo.c deleted file mode 100644 index 1cef38085..000000000 --- a/qemu/linux-user/arm/nwfpe/double_cpdo.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" - -float64 float64_exp(float64 Fm); -float64 float64_ln(float64 Fm); -float64 float64_sin(float64 rFm); -float64 float64_cos(float64 rFm); -float64 float64_arcsin(float64 rFm); -float64 float64_arctan(float64 rFm); -float64 float64_log(float64 rFm); -float64 float64_tan(float64 rFm); -float64 float64_arccos(float64 rFm); -float64 float64_pow(float64 rFn,float64 rFm); -float64 float64_pol(float64 rFn,float64 rFm); - -unsigned int DoubleCPDO(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - float64 rFm, rFn = float64_zero; - unsigned int Fd, Fm, Fn, nRc = 1; - - //printk("DoubleCPDO(0x%08x)\n",opcode); - - Fm = getFm(opcode); - if (CONSTANT_FM(opcode)) - { - rFm = getDoubleConstant(Fm); - } - else - { - switch (fpa11->fType[Fm]) - { - case typeSingle: - rFm = float32_to_float64(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - rFm = fpa11->fpreg[Fm].fDouble; - break; - - case typeExtended: - // !! patb - //printk("not implemented! why not?\n"); - //!! ScottB - // should never get here, if extended involved - // then other operand should be promoted then - // ExtendedCPDO called. - break; - - default: return 0; - } - } - - if (!MONADIC_INSTRUCTION(opcode)) - { - Fn = getFn(opcode); - switch (fpa11->fType[Fn]) - { - case typeSingle: - rFn = float32_to_float64(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - rFn = fpa11->fpreg[Fn].fDouble; - break; - - default: return 0; - } - } - - Fd = getFd(opcode); - /* !! this switch isn't optimized; better (opcode & MASK_ARITHMETIC_OPCODE)>>24, sort of */ - switch (opcode & MASK_ARITHMETIC_OPCODE) - { - /* dyadic opcodes */ - case ADF_CODE: - fpa11->fpreg[Fd].fDouble = float64_add(rFn,rFm, &fpa11->fp_status); - break; - - case MUF_CODE: - case FML_CODE: - fpa11->fpreg[Fd].fDouble = float64_mul(rFn,rFm, &fpa11->fp_status); - break; - - case SUF_CODE: - fpa11->fpreg[Fd].fDouble = float64_sub(rFn,rFm, &fpa11->fp_status); - break; - - case RSF_CODE: - fpa11->fpreg[Fd].fDouble = float64_sub(rFm,rFn, &fpa11->fp_status); - break; - - case DVF_CODE: - case FDV_CODE: - fpa11->fpreg[Fd].fDouble = float64_div(rFn,rFm, &fpa11->fp_status); - break; - - case RDF_CODE: - case FRD_CODE: - fpa11->fpreg[Fd].fDouble = float64_div(rFm,rFn, &fpa11->fp_status); - break; - -#if 0 - case POW_CODE: - fpa11->fpreg[Fd].fDouble = float64_pow(rFn,rFm); - break; - - case RPW_CODE: - fpa11->fpreg[Fd].fDouble = float64_pow(rFm,rFn); - break; -#endif - - case RMF_CODE: - fpa11->fpreg[Fd].fDouble = float64_rem(rFn,rFm, &fpa11->fp_status); - break; - -#if 0 - case POL_CODE: - fpa11->fpreg[Fd].fDouble = float64_pol(rFn,rFm); - break; -#endif - - /* monadic opcodes */ - case MVF_CODE: - fpa11->fpreg[Fd].fDouble = rFm; - break; - - case MNF_CODE: - { - unsigned int *p = (unsigned int*)&rFm; -#ifdef HOST_WORDS_BIGENDIAN - p[0] ^= 0x80000000; -#else - p[1] ^= 0x80000000; -#endif - fpa11->fpreg[Fd].fDouble = rFm; - } - break; - - case ABS_CODE: - { - unsigned int *p = (unsigned int*)&rFm; -#ifdef HOST_WORDS_BIGENDIAN - p[0] &= 0x7fffffff; -#else - p[1] &= 0x7fffffff; -#endif - fpa11->fpreg[Fd].fDouble = rFm; - } - break; - - case RND_CODE: - case URD_CODE: - fpa11->fpreg[Fd].fDouble = float64_round_to_int(rFm, &fpa11->fp_status); - break; - - case SQT_CODE: - fpa11->fpreg[Fd].fDouble = float64_sqrt(rFm, &fpa11->fp_status); - break; - -#if 0 - case LOG_CODE: - fpa11->fpreg[Fd].fDouble = float64_log(rFm); - break; - - case LGN_CODE: - fpa11->fpreg[Fd].fDouble = float64_ln(rFm); - break; - - case EXP_CODE: - fpa11->fpreg[Fd].fDouble = float64_exp(rFm); - break; - - case SIN_CODE: - fpa11->fpreg[Fd].fDouble = float64_sin(rFm); - break; - - case COS_CODE: - fpa11->fpreg[Fd].fDouble = float64_cos(rFm); - break; - - case TAN_CODE: - fpa11->fpreg[Fd].fDouble = float64_tan(rFm); - break; - - case ASN_CODE: - fpa11->fpreg[Fd].fDouble = float64_arcsin(rFm); - break; - - case ACS_CODE: - fpa11->fpreg[Fd].fDouble = float64_arccos(rFm); - break; - - case ATN_CODE: - fpa11->fpreg[Fd].fDouble = float64_arctan(rFm); - break; -#endif - - case NRM_CODE: - break; - - default: - { - nRc = 0; - } - } - - if (0 != nRc) fpa11->fType[Fd] = typeDouble; - return nRc; -} - -#if 0 -float64 float64_exp(float64 rFm) -{ - return rFm; -//series -} - -float64 float64_ln(float64 rFm) -{ - return rFm; -//series -} - -float64 float64_sin(float64 rFm) -{ - return rFm; -//series -} - -float64 float64_cos(float64 rFm) -{ - return rFm; - //series -} - -#if 0 -float64 float64_arcsin(float64 rFm) -{ -//series -} - -float64 float64_arctan(float64 rFm) -{ - //series -} -#endif - -float64 float64_log(float64 rFm) -{ - return float64_div(float64_ln(rFm),getDoubleConstant(7)); -} - -float64 float64_tan(float64 rFm) -{ - return float64_div(float64_sin(rFm),float64_cos(rFm)); -} - -float64 float64_arccos(float64 rFm) -{ -return rFm; - //return float64_sub(halfPi,float64_arcsin(rFm)); -} - -float64 float64_pow(float64 rFn,float64 rFm) -{ - return float64_exp(float64_mul(rFm,float64_ln(rFn))); -} - -float64 float64_pol(float64 rFn,float64 rFm) -{ - return float64_arctan(float64_div(rFn,rFm)); -} -#endif diff --git a/qemu/linux-user/arm/nwfpe/extended_cpdo.c b/qemu/linux-user/arm/nwfpe/extended_cpdo.c deleted file mode 100644 index 1c8a41229..000000000 --- a/qemu/linux-user/arm/nwfpe/extended_cpdo.c +++ /dev/null @@ -1,273 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" - -floatx80 floatx80_exp(floatx80 Fm); -floatx80 floatx80_ln(floatx80 Fm); -floatx80 floatx80_sin(floatx80 rFm); -floatx80 floatx80_cos(floatx80 rFm); -floatx80 floatx80_arcsin(floatx80 rFm); -floatx80 floatx80_arctan(floatx80 rFm); -floatx80 floatx80_log(floatx80 rFm); -floatx80 floatx80_tan(floatx80 rFm); -floatx80 floatx80_arccos(floatx80 rFm); -floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm); -floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm); - -unsigned int ExtendedCPDO(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - floatx80 rFm, rFn; - unsigned int Fd, Fm, Fn, nRc = 1; - - //printk("ExtendedCPDO(0x%08x)\n",opcode); - - Fm = getFm(opcode); - if (CONSTANT_FM(opcode)) - { - rFm = getExtendedConstant(Fm); - } - else - { - switch (fpa11->fType[Fm]) - { - case typeSingle: - rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status); - break; - - case typeExtended: - rFm = fpa11->fpreg[Fm].fExtended; - break; - - default: return 0; - } - } - - if (!MONADIC_INSTRUCTION(opcode)) - { - Fn = getFn(opcode); - switch (fpa11->fType[Fn]) - { - case typeSingle: - rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); - break; - - case typeExtended: - rFn = fpa11->fpreg[Fn].fExtended; - break; - - default: return 0; - } - } - - Fd = getFd(opcode); - switch (opcode & MASK_ARITHMETIC_OPCODE) - { - /* dyadic opcodes */ - case ADF_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_add(rFn,rFm, &fpa11->fp_status); - break; - - case MUF_CODE: - case FML_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_mul(rFn,rFm, &fpa11->fp_status); - break; - - case SUF_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_sub(rFn,rFm, &fpa11->fp_status); - break; - - case RSF_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_sub(rFm,rFn, &fpa11->fp_status); - break; - - case DVF_CODE: - case FDV_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_div(rFn,rFm, &fpa11->fp_status); - break; - - case RDF_CODE: - case FRD_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_div(rFm,rFn, &fpa11->fp_status); - break; - -#if 0 - case POW_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_pow(rFn,rFm); - break; - - case RPW_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_pow(rFm,rFn); - break; -#endif - - case RMF_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_rem(rFn,rFm, &fpa11->fp_status); - break; - -#if 0 - case POL_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_pol(rFn,rFm); - break; -#endif - - /* monadic opcodes */ - case MVF_CODE: - fpa11->fpreg[Fd].fExtended = rFm; - break; - - case MNF_CODE: - rFm.high ^= 0x8000; - fpa11->fpreg[Fd].fExtended = rFm; - break; - - case ABS_CODE: - rFm.high &= 0x7fff; - fpa11->fpreg[Fd].fExtended = rFm; - break; - - case RND_CODE: - case URD_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_round_to_int(rFm, &fpa11->fp_status); - break; - - case SQT_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_sqrt(rFm, &fpa11->fp_status); - break; - -#if 0 - case LOG_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_log(rFm); - break; - - case LGN_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_ln(rFm); - break; - - case EXP_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_exp(rFm); - break; - - case SIN_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_sin(rFm); - break; - - case COS_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_cos(rFm); - break; - - case TAN_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_tan(rFm); - break; - - case ASN_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_arcsin(rFm); - break; - - case ACS_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_arccos(rFm); - break; - - case ATN_CODE: - fpa11->fpreg[Fd].fExtended = floatx80_arctan(rFm); - break; -#endif - - case NRM_CODE: - break; - - default: - { - nRc = 0; - } - } - - if (0 != nRc) fpa11->fType[Fd] = typeExtended; - return nRc; -} - -#if 0 -floatx80 floatx80_exp(floatx80 Fm) -{ -//series -} - -floatx80 floatx80_ln(floatx80 Fm) -{ -//series -} - -floatx80 floatx80_sin(floatx80 rFm) -{ -//series -} - -floatx80 floatx80_cos(floatx80 rFm) -{ -//series -} - -floatx80 floatx80_arcsin(floatx80 rFm) -{ -//series -} - -floatx80 floatx80_arctan(floatx80 rFm) -{ - //series -} - -floatx80 floatx80_log(floatx80 rFm) -{ - return floatx80_div(floatx80_ln(rFm),getExtendedConstant(7)); -} - -floatx80 floatx80_tan(floatx80 rFm) -{ - return floatx80_div(floatx80_sin(rFm),floatx80_cos(rFm)); -} - -floatx80 floatx80_arccos(floatx80 rFm) -{ - //return floatx80_sub(halfPi,floatx80_arcsin(rFm)); -} - -floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm) -{ - return floatx80_exp(floatx80_mul(rFm,floatx80_ln(rFn))); -} - -floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm) -{ - return floatx80_arctan(floatx80_div(rFn,rFm)); -} -#endif diff --git a/qemu/linux-user/arm/nwfpe/fpa11.c b/qemu/linux-user/arm/nwfpe/fpa11.c deleted file mode 100644 index 441e3b1cf..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" - -#include "fpopcode.h" - -//#include "fpmodule.h" -//#include "fpmodule.inl" - -//#include <asm/system.h> - - -FPA11* qemufpa = NULL; -CPUARMState* user_registers; - -/* Reset the FPA11 chip. Called to initialize and reset the emulator. */ -void resetFPA11(void) -{ - int i; - FPA11 *fpa11 = GET_FPA11(); - - /* initialize the register type array */ - for (i=0;i<=7;i++) - { - fpa11->fType[i] = typeNone; - } - - /* FPSR: set system id to FP_EMULATOR, set AC, clear all other bits */ - fpa11->fpsr = FP_EMULATOR | BIT_AC; - - /* FPCR: set SB, AB and DA bits, clear all others */ -#ifdef MAINTAIN_FPCR - fpa11->fpcr = MASK_RESET; -#endif -} - -void SetRoundingMode(const unsigned int opcode) -{ - int rounding_mode; - FPA11 *fpa11 = GET_FPA11(); - -#ifdef MAINTAIN_FPCR - fpa11->fpcr &= ~MASK_ROUNDING_MODE; -#endif - switch (opcode & MASK_ROUNDING_MODE) - { - default: - case ROUND_TO_NEAREST: - rounding_mode = float_round_nearest_even; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_TO_NEAREST; -#endif - break; - - case ROUND_TO_PLUS_INFINITY: - rounding_mode = float_round_up; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_TO_PLUS_INFINITY; -#endif - break; - - case ROUND_TO_MINUS_INFINITY: - rounding_mode = float_round_down; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_TO_MINUS_INFINITY; -#endif - break; - - case ROUND_TO_ZERO: - rounding_mode = float_round_to_zero; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_TO_ZERO; -#endif - break; - } - set_float_rounding_mode(rounding_mode, &fpa11->fp_status); -} - -void SetRoundingPrecision(const unsigned int opcode) -{ - int rounding_precision; - FPA11 *fpa11 = GET_FPA11(); -#ifdef MAINTAIN_FPCR - fpa11->fpcr &= ~MASK_ROUNDING_PRECISION; -#endif - switch (opcode & MASK_ROUNDING_PRECISION) - { - case ROUND_SINGLE: - rounding_precision = 32; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_SINGLE; -#endif - break; - - case ROUND_DOUBLE: - rounding_precision = 64; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_DOUBLE; -#endif - break; - - case ROUND_EXTENDED: - rounding_precision = 80; -#ifdef MAINTAIN_FPCR - fpa11->fpcr |= ROUND_EXTENDED; -#endif - break; - - default: rounding_precision = 80; - } - set_floatx80_rounding_precision(rounding_precision, &fpa11->fp_status); -} - -/* Emulate the instruction in the opcode. */ -/* ??? This is not thread safe. */ -unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs) -{ - unsigned int nRc = 0; -// unsigned long flags; - FPA11 *fpa11; -// save_flags(flags); sti(); - - qemufpa=qfpa; - user_registers=qregs; - -#if 0 - fprintf(stderr,"emulating FP insn 0x%08x, PC=0x%08x\n", - opcode, qregs[ARM_REG_PC]); -#endif - fpa11 = GET_FPA11(); - - if (fpa11->initflag == 0) /* good place for __builtin_expect */ - { - resetFPA11(); - SetRoundingMode(ROUND_TO_NEAREST); - SetRoundingPrecision(ROUND_EXTENDED); - fpa11->initflag = 1; - } - - set_float_exception_flags(0, &fpa11->fp_status); - - if (TEST_OPCODE(opcode,MASK_CPRT)) - { - //fprintf(stderr,"emulating CPRT\n"); - /* Emulate conversion opcodes. */ - /* Emulate register transfer opcodes. */ - /* Emulate comparison opcodes. */ - nRc = EmulateCPRT(opcode); - } - else if (TEST_OPCODE(opcode,MASK_CPDO)) - { - //fprintf(stderr,"emulating CPDO\n"); - /* Emulate monadic arithmetic opcodes. */ - /* Emulate dyadic arithmetic opcodes. */ - nRc = EmulateCPDO(opcode); - } - else if (TEST_OPCODE(opcode,MASK_CPDT)) - { - //fprintf(stderr,"emulating CPDT\n"); - /* Emulate load/store opcodes. */ - /* Emulate load/store multiple opcodes. */ - nRc = EmulateCPDT(opcode); - } - else - { - /* Invalid instruction detected. Return FALSE. */ - nRc = 0; - } - -// restore_flags(flags); - if(nRc == 1 && get_float_exception_flags(&fpa11->fp_status)) - { - //printf("fef 0x%x\n",float_exception_flags); - nRc = -get_float_exception_flags(&fpa11->fp_status); - } - - //printf("returning %d\n",nRc); - return(nRc); -} - -#if 0 -unsigned int EmulateAll1(unsigned int opcode) -{ - switch ((opcode >> 24) & 0xf) - { - case 0xc: - case 0xd: - if ((opcode >> 20) & 0x1) - { - switch ((opcode >> 8) & 0xf) - { - case 0x1: return PerformLDF(opcode); break; - case 0x2: return PerformLFM(opcode); break; - default: return 0; - } - } - else - { - switch ((opcode >> 8) & 0xf) - { - case 0x1: return PerformSTF(opcode); break; - case 0x2: return PerformSFM(opcode); break; - default: return 0; - } - } - break; - - case 0xe: - if (opcode & 0x10) - return EmulateCPDO(opcode); - else - return EmulateCPRT(opcode); - break; - - default: return 0; - } -} -#endif diff --git a/qemu/linux-user/arm/nwfpe/fpa11.h b/qemu/linux-user/arm/nwfpe/fpa11.h deleted file mode 100644 index 0b072843d..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.com, 1998-1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FPA11_H__ -#define __FPA11_H__ - - -#include <cpu.h> - -#define GET_FPA11() (qemufpa) - -/* - * The processes registers are always at the very top of the 8K - * stack+task struct. Use the same method as 'current' uses to - * reach them. - */ -extern CPUARMState *user_registers; - -#define GET_USERREG() (user_registers) - -/* Need task_struct */ -//#include <linux/sched.h> - -/* includes */ -#include "fpsr.h" /* FP control and status register definitions */ -#include "fpu/softfloat.h" - -#define typeNone 0x00 -#define typeSingle 0x01 -#define typeDouble 0x02 -#define typeExtended 0x03 - -/* - * This must be no more and no less than 12 bytes. - */ -typedef union tagFPREG { - floatx80 fExtended; - float64 fDouble; - float32 fSingle; -} FPREG; - -/* - * FPA11 device model. - * - * This structure is exported to user space. Do not re-order. - * Only add new stuff to the end, and do not change the size of - * any element. Elements of this structure are used by user - * space, and must match struct user_fp in include/asm-arm/user.h. - * We include the byte offsets below for documentation purposes. - * - * The size of this structure and FPREG are checked by fpmodule.c - * on initialisation. If the rules have been broken, NWFPE will - * not initialise. - */ -typedef struct tagFPA11 { -/* 0 */ FPREG fpreg[8]; /* 8 floating point registers */ -/* 96 */ FPSR fpsr; /* floating point status register */ -/* 100 */ FPCR fpcr; /* floating point control register */ -/* 104 */ unsigned char fType[8]; /* type of floating point value held in - floating point registers. One of none - single, double or extended. */ -/* 112 */ int initflag; /* this is special. The kernel guarantees - to set it to 0 when a thread is launched, - so we can use it to detect whether this - instance of the emulator needs to be - initialised. */ - float_status fp_status; /* QEMU float emulator status */ -} FPA11; - -extern FPA11* qemufpa; - -void resetFPA11(void); -void SetRoundingMode(const unsigned int); -void SetRoundingPrecision(const unsigned int); - -static inline unsigned int readRegister(unsigned int reg) -{ - return (user_registers->regs[(reg)]); -} - -static inline void writeRegister(unsigned int x, unsigned int y) -{ -#if 0 - printf("writing %d to r%d\n",y,x); -#endif - user_registers->regs[(x)]=(y); -} - -static inline void writeConditionCodes(unsigned int x) -{ - cpsr_write(user_registers, x, CPSR_NZCV, CPSRWriteByInstr); -} - -#define ARM_REG_PC 15 - -unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs); - -unsigned int EmulateCPDO(const unsigned int); -unsigned int EmulateCPDT(const unsigned int); -unsigned int EmulateCPRT(const unsigned int); - -unsigned int SingleCPDO(const unsigned int opcode); -unsigned int DoubleCPDO(const unsigned int opcode); -unsigned int ExtendedCPDO(const unsigned int opcode); - - -/* included only for get_user/put_user macros */ -#include "qemu.h" - -#endif diff --git a/qemu/linux-user/arm/nwfpe/fpa11.inl b/qemu/linux-user/arm/nwfpe/fpa11.inl deleted file mode 100644 index 6c6f380d4..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11.inl +++ /dev/null @@ -1,50 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "fpa11.h" - -/* Read and write floating point status register */ -static inline unsigned int readFPSR(void) -{ - FPA11 *fpa11 = GET_FPA11(); - return(fpa11->fpsr); -} - -static inline void writeFPSR(FPSR reg) -{ - FPA11 *fpa11 = GET_FPA11(); - /* the sysid byte in the status register is readonly */ - fpa11->fpsr = (fpa11->fpsr & MASK_SYSID) | (reg & ~MASK_SYSID); -} - -/* Read and write floating point control register */ -static inline FPCR readFPCR(void) -{ - FPA11 *fpa11 = GET_FPA11(); - /* clear SB, AB and DA bits before returning FPCR */ - return(fpa11->fpcr & ~MASK_RFC); -} - -static inline void writeFPCR(FPCR reg) -{ - FPA11 *fpa11 = GET_FPA11(); - fpa11->fpcr &= ~MASK_WFC; /* clear SB, AB and DA bits */ - fpa11->fpcr |= (reg & MASK_WFC); /* write SB, AB and DA bits */ -} diff --git a/qemu/linux-user/arm/nwfpe/fpa11_cpdo.c b/qemu/linux-user/arm/nwfpe/fpa11_cpdo.c deleted file mode 100644 index 94ac98aef..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11_cpdo.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpopcode.h" - -unsigned int EmulateCPDO(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int Fd, nType, nDest, nRc = 1; - - //printk("EmulateCPDO(0x%08x)\n",opcode); - - /* Get the destination size. If not valid let Linux perform - an invalid instruction trap. */ - nDest = getDestinationSize(opcode); - if (typeNone == nDest) return 0; - - SetRoundingMode(opcode); - - /* Compare the size of the operands in Fn and Fm. - Choose the largest size and perform operations in that size, - in order to make use of all the precision of the operands. - If Fm is a constant, we just grab a constant of a size - matching the size of the operand in Fn. */ - if (MONADIC_INSTRUCTION(opcode)) - nType = nDest; - else - nType = fpa11->fType[getFn(opcode)]; - - if (!CONSTANT_FM(opcode)) - { - register unsigned int Fm = getFm(opcode); - if (nType < fpa11->fType[Fm]) - { - nType = fpa11->fType[Fm]; - } - } - - switch (nType) - { - case typeSingle : nRc = SingleCPDO(opcode); break; - case typeDouble : nRc = DoubleCPDO(opcode); break; - case typeExtended : nRc = ExtendedCPDO(opcode); break; - default : nRc = 0; - } - - /* If the operation succeeded, check to see if the result in the - destination register is the correct size. If not force it - to be. */ - Fd = getFd(opcode); - nType = fpa11->fType[Fd]; - if ((0 != nRc) && (nDest != nType)) - { - switch (nDest) - { - case typeSingle: - { - if (typeDouble == nType) - fpa11->fpreg[Fd].fSingle = - float64_to_float32(fpa11->fpreg[Fd].fDouble, &fpa11->fp_status); - else - fpa11->fpreg[Fd].fSingle = - floatx80_to_float32(fpa11->fpreg[Fd].fExtended, &fpa11->fp_status); - } - break; - - case typeDouble: - { - if (typeSingle == nType) - fpa11->fpreg[Fd].fDouble = - float32_to_float64(fpa11->fpreg[Fd].fSingle, &fpa11->fp_status); - else - fpa11->fpreg[Fd].fDouble = - floatx80_to_float64(fpa11->fpreg[Fd].fExtended, &fpa11->fp_status); - } - break; - - case typeExtended: - { - if (typeSingle == nType) - fpa11->fpreg[Fd].fExtended = - float32_to_floatx80(fpa11->fpreg[Fd].fSingle, &fpa11->fp_status); - else - fpa11->fpreg[Fd].fExtended = - float64_to_floatx80(fpa11->fpreg[Fd].fDouble, &fpa11->fp_status); - } - break; - } - - fpa11->fType[Fd] = nDest; - } - - return nRc; -} diff --git a/qemu/linux-user/arm/nwfpe/fpa11_cpdt.c b/qemu/linux-user/arm/nwfpe/fpa11_cpdt.c deleted file mode 100644 index c32b0c2fa..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11_cpdt.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.com, 1998-1999 - (c) Philip Blundell, 1998 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" -//#include "fpmodule.h" -//#include "fpmodule.inl" - -//#include <asm/uaccess.h> - -static inline -void loadSingle(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - fpa11->fType[Fn] = typeSingle; - /* FIXME - handle failure of get_user() */ - get_user_u32(float32_val(fpa11->fpreg[Fn].fSingle), addr); -} - -static inline -void loadDouble(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int *p; - p = (unsigned int*)&fpa11->fpreg[Fn].fDouble; - fpa11->fType[Fn] = typeDouble; -#ifdef HOST_WORDS_BIGENDIAN - /* FIXME - handle failure of get_user() */ - get_user_u32(p[0], addr); /* sign & exponent */ - get_user_u32(p[1], addr + 4); -#else - /* FIXME - handle failure of get_user() */ - get_user_u32(p[0], addr + 4); - get_user_u32(p[1], addr); /* sign & exponent */ -#endif -} - -static inline -void loadExtended(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int *p; - p = (unsigned int*)&fpa11->fpreg[Fn].fExtended; - fpa11->fType[Fn] = typeExtended; - /* FIXME - handle failure of get_user() */ - get_user_u32(p[0], addr); /* sign & exponent */ - get_user_u32(p[1], addr + 8); /* ls bits */ - get_user_u32(p[2], addr + 4); /* ms bits */ -} - -static inline -void loadMultiple(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - register unsigned int *p; - unsigned long x; - - p = (unsigned int*)&(fpa11->fpreg[Fn]); - /* FIXME - handle failure of get_user() */ - get_user_u32(x, addr); - fpa11->fType[Fn] = (x >> 14) & 0x00000003; - - switch (fpa11->fType[Fn]) - { - case typeSingle: - case typeDouble: - { - /* FIXME - handle failure of get_user() */ - get_user_u32(p[0], addr + 8); /* Single */ - get_user_u32(p[1], addr + 4); /* double msw */ - p[2] = 0; /* empty */ - } - break; - - case typeExtended: - { - /* FIXME - handle failure of get_user() */ - get_user_u32(p[1], addr + 8); - get_user_u32(p[2], addr + 4); /* msw */ - p[0] = (x & 0x80003fff); - } - break; - } -} - -static inline -void storeSingle(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - float32 val; - register unsigned int *p = (unsigned int*)&val; - - switch (fpa11->fType[Fn]) - { - case typeDouble: - val = float64_to_float32(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); - break; - - case typeExtended: - val = floatx80_to_float32(fpa11->fpreg[Fn].fExtended, &fpa11->fp_status); - break; - - default: val = fpa11->fpreg[Fn].fSingle; - } - - /* FIXME - handle put_user() failures */ - put_user_u32(p[0], addr); -} - -static inline -void storeDouble(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - float64 val; - register unsigned int *p = (unsigned int*)&val; - - switch (fpa11->fType[Fn]) - { - case typeSingle: - val = float32_to_float64(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); - break; - - case typeExtended: - val = floatx80_to_float64(fpa11->fpreg[Fn].fExtended, &fpa11->fp_status); - break; - - default: val = fpa11->fpreg[Fn].fDouble; - } - /* FIXME - handle put_user() failures */ -#ifdef HOST_WORDS_BIGENDIAN - put_user_u32(p[0], addr); /* msw */ - put_user_u32(p[1], addr + 4); /* lsw */ -#else - put_user_u32(p[1], addr); /* msw */ - put_user_u32(p[0], addr + 4); /* lsw */ -#endif -} - -static inline -void storeExtended(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - floatx80 val; - register unsigned int *p = (unsigned int*)&val; - - switch (fpa11->fType[Fn]) - { - case typeSingle: - val = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - val = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); - break; - - default: val = fpa11->fpreg[Fn].fExtended; - } - - /* FIXME - handle put_user() failures */ - put_user_u32(p[0], addr); /* sign & exp */ - put_user_u32(p[1], addr + 8); - put_user_u32(p[2], addr + 4); /* msw */ -} - -static inline -void storeMultiple(const unsigned int Fn, target_ulong addr) -{ - FPA11 *fpa11 = GET_FPA11(); - register unsigned int nType, *p; - - p = (unsigned int*)&(fpa11->fpreg[Fn]); - nType = fpa11->fType[Fn]; - - switch (nType) - { - case typeSingle: - case typeDouble: - { - put_user_u32(p[0], addr + 8); /* single */ - put_user_u32(p[1], addr + 4); /* double msw */ - put_user_u32(nType << 14, addr); - } - break; - - case typeExtended: - { - put_user_u32(p[2], addr + 4); /* msw */ - put_user_u32(p[1], addr + 8); - put_user_u32((p[0] & 0x80003fff) | (nType << 14), addr); - } - break; - } -} - -static unsigned int PerformLDF(const unsigned int opcode) -{ - target_ulong pBase, pAddress, pFinal; - unsigned int nRc = 1, - write_back = WRITE_BACK(opcode); - - //printk("PerformLDF(0x%08x), Fd = 0x%08x\n",opcode,getFd(opcode)); - - pBase = readRegister(getRn(opcode)); - if (ARM_REG_PC == getRn(opcode)) - { - pBase += 8; - write_back = 0; - } - - pFinal = pBase; - if (BIT_UP_SET(opcode)) - pFinal += getOffset(opcode) * 4; - else - pFinal -= getOffset(opcode) * 4; - - if (PREINDEXED(opcode)) pAddress = pFinal; else pAddress = pBase; - - switch (opcode & MASK_TRANSFER_LENGTH) - { - case TRANSFER_SINGLE : loadSingle(getFd(opcode),pAddress); break; - case TRANSFER_DOUBLE : loadDouble(getFd(opcode),pAddress); break; - case TRANSFER_EXTENDED: loadExtended(getFd(opcode),pAddress); break; - default: nRc = 0; - } - - if (write_back) writeRegister(getRn(opcode),(unsigned int)pFinal); - return nRc; -} - -static unsigned int PerformSTF(const unsigned int opcode) -{ - target_ulong pBase, pAddress, pFinal; - unsigned int nRc = 1, - write_back = WRITE_BACK(opcode); - - //printk("PerformSTF(0x%08x), Fd = 0x%08x\n",opcode,getFd(opcode)); - SetRoundingMode(ROUND_TO_NEAREST); - - pBase = readRegister(getRn(opcode)); - if (ARM_REG_PC == getRn(opcode)) - { - pBase += 8; - write_back = 0; - } - - pFinal = pBase; - if (BIT_UP_SET(opcode)) - pFinal += getOffset(opcode) * 4; - else - pFinal -= getOffset(opcode) * 4; - - if (PREINDEXED(opcode)) pAddress = pFinal; else pAddress = pBase; - - switch (opcode & MASK_TRANSFER_LENGTH) - { - case TRANSFER_SINGLE : storeSingle(getFd(opcode),pAddress); break; - case TRANSFER_DOUBLE : storeDouble(getFd(opcode),pAddress); break; - case TRANSFER_EXTENDED: storeExtended(getFd(opcode),pAddress); break; - default: nRc = 0; - } - - if (write_back) writeRegister(getRn(opcode),(unsigned int)pFinal); - return nRc; -} - -static unsigned int PerformLFM(const unsigned int opcode) -{ - unsigned int i, Fd, - write_back = WRITE_BACK(opcode); - target_ulong pBase, pAddress, pFinal; - - pBase = readRegister(getRn(opcode)); - if (ARM_REG_PC == getRn(opcode)) - { - pBase += 8; - write_back = 0; - } - - pFinal = pBase; - if (BIT_UP_SET(opcode)) - pFinal += getOffset(opcode) * 4; - else - pFinal -= getOffset(opcode) * 4; - - if (PREINDEXED(opcode)) pAddress = pFinal; else pAddress = pBase; - - Fd = getFd(opcode); - for (i=getRegisterCount(opcode);i>0;i--) - { - loadMultiple(Fd,pAddress); - pAddress += 12; Fd++; - if (Fd == 8) Fd = 0; - } - - if (write_back) writeRegister(getRn(opcode),(unsigned int)pFinal); - return 1; -} - -static unsigned int PerformSFM(const unsigned int opcode) -{ - unsigned int i, Fd, - write_back = WRITE_BACK(opcode); - target_ulong pBase, pAddress, pFinal; - - pBase = readRegister(getRn(opcode)); - if (ARM_REG_PC == getRn(opcode)) - { - pBase += 8; - write_back = 0; - } - - pFinal = pBase; - if (BIT_UP_SET(opcode)) - pFinal += getOffset(opcode) * 4; - else - pFinal -= getOffset(opcode) * 4; - - if (PREINDEXED(opcode)) pAddress = pFinal; else pAddress = pBase; - - Fd = getFd(opcode); - for (i=getRegisterCount(opcode);i>0;i--) - { - storeMultiple(Fd,pAddress); - pAddress += 12; Fd++; - if (Fd == 8) Fd = 0; - } - - if (write_back) writeRegister(getRn(opcode),(unsigned int)pFinal); - return 1; -} - -#if 1 -unsigned int EmulateCPDT(const unsigned int opcode) -{ - unsigned int nRc = 0; - - //printk("EmulateCPDT(0x%08x)\n",opcode); - - if (LDF_OP(opcode)) - { - nRc = PerformLDF(opcode); - } - else if (LFM_OP(opcode)) - { - nRc = PerformLFM(opcode); - } - else if (STF_OP(opcode)) - { - nRc = PerformSTF(opcode); - } - else if (SFM_OP(opcode)) - { - nRc = PerformSFM(opcode); - } - else - { - nRc = 0; - } - - return nRc; -} -#endif diff --git a/qemu/linux-user/arm/nwfpe/fpa11_cprt.c b/qemu/linux-user/arm/nwfpe/fpa11_cprt.c deleted file mode 100644 index 04dc2ebb0..000000000 --- a/qemu/linux-user/arm/nwfpe/fpa11_cprt.c +++ /dev/null @@ -1,284 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - (c) Philip Blundell, 1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" -#include "fpa11.inl" -//#include "fpmodule.h" -//#include "fpmodule.inl" - -unsigned int PerformFLT(const unsigned int opcode); -unsigned int PerformFIX(const unsigned int opcode); - -static unsigned int -PerformComparison(const unsigned int opcode); - -unsigned int EmulateCPRT(const unsigned int opcode) -{ - unsigned int nRc = 1; - - //printk("EmulateCPRT(0x%08x)\n",opcode); - - if (opcode & 0x800000) - { - /* This is some variant of a comparison (PerformComparison will - sort out which one). Since most of the other CPRT - instructions are oddball cases of some sort or other it makes - sense to pull this out into a fast path. */ - return PerformComparison(opcode); - } - - /* Hint to GCC that we'd like a jump table rather than a load of CMPs */ - switch ((opcode & 0x700000) >> 20) - { - case FLT_CODE >> 20: nRc = PerformFLT(opcode); break; - case FIX_CODE >> 20: nRc = PerformFIX(opcode); break; - - case WFS_CODE >> 20: writeFPSR(readRegister(getRd(opcode))); break; - case RFS_CODE >> 20: writeRegister(getRd(opcode),readFPSR()); break; - -#if 0 /* We currently have no use for the FPCR, so there's no point - in emulating it. */ - case WFC_CODE >> 20: writeFPCR(readRegister(getRd(opcode))); - case RFC_CODE >> 20: writeRegister(getRd(opcode),readFPCR()); break; -#endif - - default: nRc = 0; - } - - return nRc; -} - -unsigned int PerformFLT(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - - unsigned int nRc = 1; - SetRoundingMode(opcode); - - switch (opcode & MASK_ROUNDING_PRECISION) - { - case ROUND_SINGLE: - { - fpa11->fType[getFn(opcode)] = typeSingle; - fpa11->fpreg[getFn(opcode)].fSingle = - int32_to_float32(readRegister(getRd(opcode)), &fpa11->fp_status); - } - break; - - case ROUND_DOUBLE: - { - fpa11->fType[getFn(opcode)] = typeDouble; - fpa11->fpreg[getFn(opcode)].fDouble = - int32_to_float64(readRegister(getRd(opcode)), &fpa11->fp_status); - } - break; - - case ROUND_EXTENDED: - { - fpa11->fType[getFn(opcode)] = typeExtended; - fpa11->fpreg[getFn(opcode)].fExtended = - int32_to_floatx80(readRegister(getRd(opcode)), &fpa11->fp_status); - } - break; - - default: nRc = 0; - } - - return nRc; -} - -unsigned int PerformFIX(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int nRc = 1; - unsigned int Fn = getFm(opcode); - - SetRoundingMode(opcode); - - switch (fpa11->fType[Fn]) - { - case typeSingle: - { - writeRegister(getRd(opcode), - float32_to_int32(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status)); - } - break; - - case typeDouble: - { - //printf("F%d is 0x%" PRIx64 "\n",Fn,fpa11->fpreg[Fn].fDouble); - writeRegister(getRd(opcode), - float64_to_int32(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status)); - } - break; - - case typeExtended: - { - writeRegister(getRd(opcode), - floatx80_to_int32(fpa11->fpreg[Fn].fExtended, &fpa11->fp_status)); - } - break; - - default: nRc = 0; - } - - return nRc; -} - - -static __inline unsigned int -PerformComparisonOperation(floatx80 Fn, floatx80 Fm) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int flags = 0; - - /* test for less than condition */ - if (floatx80_lt(Fn,Fm, &fpa11->fp_status)) - { - flags |= CC_NEGATIVE; - } - - /* test for equal condition */ - if (floatx80_eq_quiet(Fn,Fm, &fpa11->fp_status)) - { - flags |= CC_ZERO; - } - - /* test for greater than or equal condition */ - if (floatx80_lt(Fm,Fn, &fpa11->fp_status)) - { - flags |= CC_CARRY; - } - - writeConditionCodes(flags); - return 1; -} - -/* This instruction sets the flags N, Z, C, V in the FPSR. */ - -static unsigned int PerformComparison(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - unsigned int Fn, Fm; - floatx80 rFn, rFm; - int e_flag = opcode & 0x400000; /* 1 if CxFE */ - int n_flag = opcode & 0x200000; /* 1 if CNxx */ - unsigned int flags = 0; - - //printk("PerformComparison(0x%08x)\n",opcode); - - Fn = getFn(opcode); - Fm = getFm(opcode); - - /* Check for unordered condition and convert all operands to 80-bit - format. - ?? Might be some mileage in avoiding this conversion if possible. - Eg, if both operands are 32-bit, detect this and do a 32-bit - comparison (cheaper than an 80-bit one). */ - switch (fpa11->fType[Fn]) - { - case typeSingle: - //printk("single.\n"); - if (float32_is_any_nan(fpa11->fpreg[Fn].fSingle)) - goto unordered; - rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - //printk("double.\n"); - if (float64_is_any_nan(fpa11->fpreg[Fn].fDouble)) - goto unordered; - rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); - break; - - case typeExtended: - //printk("extended.\n"); - if (floatx80_is_any_nan(fpa11->fpreg[Fn].fExtended)) - goto unordered; - rFn = fpa11->fpreg[Fn].fExtended; - break; - - default: return 0; - } - - if (CONSTANT_FM(opcode)) - { - //printk("Fm is a constant: #%d.\n",Fm); - rFm = getExtendedConstant(Fm); - if (floatx80_is_any_nan(rFm)) - goto unordered; - } - else - { - //printk("Fm = r%d which contains a ",Fm); - switch (fpa11->fType[Fm]) - { - case typeSingle: - //printk("single.\n"); - if (float32_is_any_nan(fpa11->fpreg[Fm].fSingle)) - goto unordered; - rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status); - break; - - case typeDouble: - //printk("double.\n"); - if (float64_is_any_nan(fpa11->fpreg[Fm].fDouble)) - goto unordered; - rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status); - break; - - case typeExtended: - //printk("extended.\n"); - if (floatx80_is_any_nan(fpa11->fpreg[Fm].fExtended)) - goto unordered; - rFm = fpa11->fpreg[Fm].fExtended; - break; - - default: return 0; - } - } - - if (n_flag) - { - rFm.high ^= 0x8000; - } - - return PerformComparisonOperation(rFn,rFm); - - unordered: - /* ?? The FPA data sheet is pretty vague about this, in particular - about whether the non-E comparisons can ever raise exceptions. - This implementation is based on a combination of what it says in - the data sheet, observation of how the Acorn emulator actually - behaves (and how programs expect it to) and guesswork. */ - flags |= CC_OVERFLOW; - flags &= ~(CC_ZERO | CC_NEGATIVE); - - if (BIT_AC & readFPSR()) flags |= CC_CARRY; - - if (e_flag) float_raise(float_flag_invalid, &fpa11->fp_status); - - writeConditionCodes(flags); - return 1; -} diff --git a/qemu/linux-user/arm/nwfpe/fpopcode.c b/qemu/linux-user/arm/nwfpe/fpopcode.c deleted file mode 100644 index 6784256d2..000000000 --- a/qemu/linux-user/arm/nwfpe/fpopcode.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" -#include "fpsr.h" -//#include "fpmodule.h" -//#include "fpmodule.inl" - -const floatx80 floatx80Constant[] = { - { 0x0000000000000000ULL, 0x0000}, /* extended 0.0 */ - { 0x8000000000000000ULL, 0x3fff}, /* extended 1.0 */ - { 0x8000000000000000ULL, 0x4000}, /* extended 2.0 */ - { 0xc000000000000000ULL, 0x4000}, /* extended 3.0 */ - { 0x8000000000000000ULL, 0x4001}, /* extended 4.0 */ - { 0xa000000000000000ULL, 0x4001}, /* extended 5.0 */ - { 0x8000000000000000ULL, 0x3ffe}, /* extended 0.5 */ - { 0xa000000000000000ULL, 0x4002} /* extended 10.0 */ -}; - -const float64 float64Constant[] = { - const_float64(0x0000000000000000ULL), /* double 0.0 */ - const_float64(0x3ff0000000000000ULL), /* double 1.0 */ - const_float64(0x4000000000000000ULL), /* double 2.0 */ - const_float64(0x4008000000000000ULL), /* double 3.0 */ - const_float64(0x4010000000000000ULL), /* double 4.0 */ - const_float64(0x4014000000000000ULL), /* double 5.0 */ - const_float64(0x3fe0000000000000ULL), /* double 0.5 */ - const_float64(0x4024000000000000ULL) /* double 10.0 */ -}; - -const float32 float32Constant[] = { - const_float32(0x00000000), /* single 0.0 */ - const_float32(0x3f800000), /* single 1.0 */ - const_float32(0x40000000), /* single 2.0 */ - const_float32(0x40400000), /* single 3.0 */ - const_float32(0x40800000), /* single 4.0 */ - const_float32(0x40a00000), /* single 5.0 */ - const_float32(0x3f000000), /* single 0.5 */ - const_float32(0x41200000) /* single 10.0 */ -}; - -unsigned int getRegisterCount(const unsigned int opcode) -{ - unsigned int nRc; - - switch (opcode & MASK_REGISTER_COUNT) - { - case 0x00000000: nRc = 4; break; - case 0x00008000: nRc = 1; break; - case 0x00400000: nRc = 2; break; - case 0x00408000: nRc = 3; break; - default: nRc = 0; - } - - return(nRc); -} - -unsigned int getDestinationSize(const unsigned int opcode) -{ - unsigned int nRc; - - switch (opcode & MASK_DESTINATION_SIZE) - { - case 0x00000000: nRc = typeSingle; break; - case 0x00000080: nRc = typeDouble; break; - case 0x00080000: nRc = typeExtended; break; - default: nRc = typeNone; - } - - return(nRc); -} diff --git a/qemu/linux-user/arm/nwfpe/fpopcode.h b/qemu/linux-user/arm/nwfpe/fpopcode.h deleted file mode 100644 index 1b1137f3c..000000000 --- a/qemu/linux-user/arm/nwfpe/fpopcode.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FPOPCODE_H__ -#define __FPOPCODE_H__ - -/* -ARM Floating Point Instruction Classes -| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -|c o n d|1 1 0 P|U|u|W|L| Rn |v| Fd |0|0|0|1| o f f s e t | CPDT -|c o n d|1 1 0 P|U|w|W|L| Rn |x| Fd |0|0|0|1| o f f s e t | CPDT -| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -|c o n d|1 1 1 0|a|b|c|d|e| Fn |j| Fd |0|0|0|1|f|g|h|0|i| Fm | CPDO -|c o n d|1 1 1 0|a|b|c|L|e| Fn | Rd |0|0|0|1|f|g|h|1|i| Fm | CPRT -|c o n d|1 1 1 0|a|b|c|1|e| Fn |1|1|1|1|0|0|0|1|f|g|h|1|i| Fm | comparisons -| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - -CPDT data transfer instructions - LDF, STF, LFM, SFM - -CPDO dyadic arithmetic instructions - ADF, MUF, SUF, RSF, DVF, RDF, - POW, RPW, RMF, FML, FDV, FRD, POL - -CPDO monadic arithmetic instructions - MVF, MNF, ABS, RND, SQT, LOG, LGN, EXP, - SIN, COS, TAN, ASN, ACS, ATN, URD, NRM - -CPRT joint arithmetic/data transfer instructions - FIX (arithmetic followed by load/store) - FLT (load/store followed by arithmetic) - CMF, CNF CMFE, CNFE (comparisons) - WFS, RFS (write/read floating point status register) - WFC, RFC (write/read floating point control register) - -cond condition codes -P pre/post index bit: 0 = postindex, 1 = preindex -U up/down bit: 0 = stack grows down, 1 = stack grows up -W write back bit: 1 = update base register (Rn) -L load/store bit: 0 = store, 1 = load -Rn base register -Rd destination/source register -Fd floating point destination register -Fn floating point source register -Fm floating point source register or floating point constant - -uv transfer length (TABLE 1) -wx register count (TABLE 2) -abcd arithmetic opcode (TABLES 3 & 4) -ef destination size (rounding precision) (TABLE 5) -gh rounding mode (TABLE 6) -j dyadic/monadic bit: 0 = dyadic, 1 = monadic -i constant bit: 1 = constant (TABLE 6) -*/ - -/* -TABLE 1 -+-------------------------+---+---+---------+---------+ -| Precision | u | v | FPSR.EP | length | -+-------------------------+---+---+---------+---------+ -| Single | 0 | 0 | x | 1 words | -| Double | 1 | 1 | x | 2 words | -| Extended | 1 | 1 | x | 3 words | -| Packed decimal | 1 | 1 | 0 | 3 words | -| Expanded packed decimal | 1 | 1 | 1 | 4 words | -+-------------------------+---+---+---------+---------+ -Note: x = don't care -*/ - -/* -TABLE 2 -+---+---+---------------------------------+ -| w | x | Number of registers to transfer | -+---+---+---------------------------------+ -| 0 | 1 | 1 | -| 1 | 0 | 2 | -| 1 | 1 | 3 | -| 0 | 0 | 4 | -+---+---+---------------------------------+ -*/ - -/* -TABLE 3: Dyadic Floating Point Opcodes -+---+---+---+---+----------+-----------------------+-----------------------+ -| a | b | c | d | Mnemonic | Description | Operation | -+---+---+---+---+----------+-----------------------+-----------------------+ -| 0 | 0 | 0 | 0 | ADF | Add | Fd := Fn + Fm | -| 0 | 0 | 0 | 1 | MUF | Multiply | Fd := Fn * Fm | -| 0 | 0 | 1 | 0 | SUF | Subtract | Fd := Fn - Fm | -| 0 | 0 | 1 | 1 | RSF | Reverse subtract | Fd := Fm - Fn | -| 0 | 1 | 0 | 0 | DVF | Divide | Fd := Fn / Fm | -| 0 | 1 | 0 | 1 | RDF | Reverse divide | Fd := Fm / Fn | -| 0 | 1 | 1 | 0 | POW | Power | Fd := Fn ^ Fm | -| 0 | 1 | 1 | 1 | RPW | Reverse power | Fd := Fm ^ Fn | -| 1 | 0 | 0 | 0 | RMF | Remainder | Fd := IEEE rem(Fn/Fm) | -| 1 | 0 | 0 | 1 | FML | Fast Multiply | Fd := Fn * Fm | -| 1 | 0 | 1 | 0 | FDV | Fast Divide | Fd := Fn / Fm | -| 1 | 0 | 1 | 1 | FRD | Fast reverse divide | Fd := Fm / Fn | -| 1 | 1 | 0 | 0 | POL | Polar angle (ArcTan2) | Fd := arctan2(Fn,Fm) | -| 1 | 1 | 0 | 1 | | undefined instruction | trap | -| 1 | 1 | 1 | 0 | | undefined instruction | trap | -| 1 | 1 | 1 | 1 | | undefined instruction | trap | -+---+---+---+---+----------+-----------------------+-----------------------+ -Note: POW, RPW, POL are deprecated, and are available for backwards - compatibility only. -*/ - -/* -TABLE 4: Monadic Floating Point Opcodes -+---+---+---+---+----------+-----------------------+-----------------------+ -| a | b | c | d | Mnemonic | Description | Operation | -+---+---+---+---+----------+-----------------------+-----------------------+ -| 0 | 0 | 0 | 0 | MVF | Move | Fd := Fm | -| 0 | 0 | 0 | 1 | MNF | Move negated | Fd := - Fm | -| 0 | 0 | 1 | 0 | ABS | Absolute value | Fd := abs(Fm) | -| 0 | 0 | 1 | 1 | RND | Round to integer | Fd := int(Fm) | -| 0 | 1 | 0 | 0 | SQT | Square root | Fd := sqrt(Fm) | -| 0 | 1 | 0 | 1 | LOG | Log base 10 | Fd := log10(Fm) | -| 0 | 1 | 1 | 0 | LGN | Log base e | Fd := ln(Fm) | -| 0 | 1 | 1 | 1 | EXP | Exponent | Fd := e ^ Fm | -| 1 | 0 | 0 | 0 | SIN | Sine | Fd := sin(Fm) | -| 1 | 0 | 0 | 1 | COS | Cosine | Fd := cos(Fm) | -| 1 | 0 | 1 | 0 | TAN | Tangent | Fd := tan(Fm) | -| 1 | 0 | 1 | 1 | ASN | Arc Sine | Fd := arcsin(Fm) | -| 1 | 1 | 0 | 0 | ACS | Arc Cosine | Fd := arccos(Fm) | -| 1 | 1 | 0 | 1 | ATN | Arc Tangent | Fd := arctan(Fm) | -| 1 | 1 | 1 | 0 | URD | Unnormalized round | Fd := int(Fm) | -| 1 | 1 | 1 | 1 | NRM | Normalize | Fd := norm(Fm) | -+---+---+---+---+----------+-----------------------+-----------------------+ -Note: LOG, LGN, EXP, SIN, COS, TAN, ASN, ACS, ATN are deprecated, and are - available for backwards compatibility only. -*/ - -/* -TABLE 5 -+-------------------------+---+---+ -| Rounding Precision | e | f | -+-------------------------+---+---+ -| IEEE Single precision | 0 | 0 | -| IEEE Double precision | 0 | 1 | -| IEEE Extended precision | 1 | 0 | -| undefined (trap) | 1 | 1 | -+-------------------------+---+---+ -*/ - -/* -TABLE 5 -+---------------------------------+---+---+ -| Rounding Mode | g | h | -+---------------------------------+---+---+ -| Round to nearest (default) | 0 | 0 | -| Round toward plus infinity | 0 | 1 | -| Round toward negative infinity | 1 | 0 | -| Round toward zero | 1 | 1 | -+---------------------------------+---+---+ -*/ - -/* -=== -=== Definitions for load and store instructions -=== -*/ - -/* bit masks */ -#define BIT_PREINDEX 0x01000000 -#define BIT_UP 0x00800000 -#define BIT_WRITE_BACK 0x00200000 -#define BIT_LOAD 0x00100000 - -/* masks for load/store */ -#define MASK_CPDT 0x0c000000 /* data processing opcode */ -#define MASK_OFFSET 0x000000ff -#define MASK_TRANSFER_LENGTH 0x00408000 -#define MASK_REGISTER_COUNT MASK_TRANSFER_LENGTH -#define MASK_COPROCESSOR 0x00000f00 - -/* Tests for transfer length */ -#define TRANSFER_SINGLE 0x00000000 -#define TRANSFER_DOUBLE 0x00008000 -#define TRANSFER_EXTENDED 0x00400000 -#define TRANSFER_PACKED MASK_TRANSFER_LENGTH - -/* Get the coprocessor number from the opcode. */ -#define getCoprocessorNumber(opcode) ((opcode & MASK_COPROCESSOR) >> 8) - -/* Get the offset from the opcode. */ -#define getOffset(opcode) (opcode & MASK_OFFSET) - -/* Tests for specific data transfer load/store opcodes. */ -#define TEST_OPCODE(opcode,mask) (((opcode) & (mask)) == (mask)) - -#define LOAD_OP(opcode) TEST_OPCODE((opcode),MASK_CPDT | BIT_LOAD) -#define STORE_OP(opcode) ((opcode & (MASK_CPDT | BIT_LOAD)) == MASK_CPDT) - -#define LDF_OP(opcode) (LOAD_OP(opcode) && (getCoprocessorNumber(opcode) == 1)) -#define LFM_OP(opcode) (LOAD_OP(opcode) && (getCoprocessorNumber(opcode) == 2)) -#define STF_OP(opcode) (STORE_OP(opcode) && (getCoprocessorNumber(opcode) == 1)) -#define SFM_OP(opcode) (STORE_OP(opcode) && (getCoprocessorNumber(opcode) == 2)) - -#define PREINDEXED(opcode) ((opcode & BIT_PREINDEX) != 0) -#define POSTINDEXED(opcode) ((opcode & BIT_PREINDEX) == 0) -#define BIT_UP_SET(opcode) ((opcode & BIT_UP) != 0) -#define BIT_UP_CLEAR(opcode) ((opcode & BIT_DOWN) == 0) -#define WRITE_BACK(opcode) ((opcode & BIT_WRITE_BACK) != 0) -#define LOAD(opcode) ((opcode & BIT_LOAD) != 0) -#define STORE(opcode) ((opcode & BIT_LOAD) == 0) - -/* -=== -=== Definitions for arithmetic instructions -=== -*/ -/* bit masks */ -#define BIT_MONADIC 0x00008000 -#define BIT_CONSTANT 0x00000008 - -#define CONSTANT_FM(opcode) ((opcode & BIT_CONSTANT) != 0) -#define MONADIC_INSTRUCTION(opcode) ((opcode & BIT_MONADIC) != 0) - -/* instruction identification masks */ -#define MASK_CPDO 0x0e000000 /* arithmetic opcode */ -#define MASK_ARITHMETIC_OPCODE 0x00f08000 -#define MASK_DESTINATION_SIZE 0x00080080 - -/* dyadic arithmetic opcodes. */ -#define ADF_CODE 0x00000000 -#define MUF_CODE 0x00100000 -#define SUF_CODE 0x00200000 -#define RSF_CODE 0x00300000 -#define DVF_CODE 0x00400000 -#define RDF_CODE 0x00500000 -#define POW_CODE 0x00600000 -#define RPW_CODE 0x00700000 -#define RMF_CODE 0x00800000 -#define FML_CODE 0x00900000 -#define FDV_CODE 0x00a00000 -#define FRD_CODE 0x00b00000 -#define POL_CODE 0x00c00000 -/* 0x00d00000 is an invalid dyadic arithmetic opcode */ -/* 0x00e00000 is an invalid dyadic arithmetic opcode */ -/* 0x00f00000 is an invalid dyadic arithmetic opcode */ - -/* monadic arithmetic opcodes. */ -#define MVF_CODE 0x00008000 -#define MNF_CODE 0x00108000 -#define ABS_CODE 0x00208000 -#define RND_CODE 0x00308000 -#define SQT_CODE 0x00408000 -#define LOG_CODE 0x00508000 -#define LGN_CODE 0x00608000 -#define EXP_CODE 0x00708000 -#define SIN_CODE 0x00808000 -#define COS_CODE 0x00908000 -#define TAN_CODE 0x00a08000 -#define ASN_CODE 0x00b08000 -#define ACS_CODE 0x00c08000 -#define ATN_CODE 0x00d08000 -#define URD_CODE 0x00e08000 -#define NRM_CODE 0x00f08000 - -/* -=== -=== Definitions for register transfer and comparison instructions -=== -*/ - -#define MASK_CPRT 0x0e000010 /* register transfer opcode */ -#define MASK_CPRT_CODE 0x00f00000 -#define FLT_CODE 0x00000000 -#define FIX_CODE 0x00100000 -#define WFS_CODE 0x00200000 -#define RFS_CODE 0x00300000 -#define WFC_CODE 0x00400000 -#define RFC_CODE 0x00500000 -#define CMF_CODE 0x00900000 -#define CNF_CODE 0x00b00000 -#define CMFE_CODE 0x00d00000 -#define CNFE_CODE 0x00f00000 - -/* -=== -=== Common definitions -=== -*/ - -/* register masks */ -#define MASK_Rd 0x0000f000 -#define MASK_Rn 0x000f0000 -#define MASK_Fd 0x00007000 -#define MASK_Fm 0x00000007 -#define MASK_Fn 0x00070000 - -/* condition code masks */ -#define CC_MASK 0xf0000000 -#define CC_NEGATIVE 0x80000000 -#define CC_ZERO 0x40000000 -#define CC_CARRY 0x20000000 -#define CC_OVERFLOW 0x10000000 -#define CC_EQ 0x00000000 -#define CC_NE 0x10000000 -#define CC_CS 0x20000000 -#define CC_HS CC_CS -#define CC_CC 0x30000000 -#define CC_LO CC_CC -#define CC_MI 0x40000000 -#define CC_PL 0x50000000 -#define CC_VS 0x60000000 -#define CC_VC 0x70000000 -#define CC_HI 0x80000000 -#define CC_LS 0x90000000 -#define CC_GE 0xa0000000 -#define CC_LT 0xb0000000 -#define CC_GT 0xc0000000 -#define CC_LE 0xd0000000 -#define CC_AL 0xe0000000 -#define CC_NV 0xf0000000 - -/* rounding masks/values */ -#define MASK_ROUNDING_MODE 0x00000060 -#define ROUND_TO_NEAREST 0x00000000 -#define ROUND_TO_PLUS_INFINITY 0x00000020 -#define ROUND_TO_MINUS_INFINITY 0x00000040 -#define ROUND_TO_ZERO 0x00000060 - -#define MASK_ROUNDING_PRECISION 0x00080080 -#define ROUND_SINGLE 0x00000000 -#define ROUND_DOUBLE 0x00000080 -#define ROUND_EXTENDED 0x00080000 - -/* Get the condition code from the opcode. */ -#define getCondition(opcode) (opcode >> 28) - -/* Get the source register from the opcode. */ -#define getRn(opcode) ((opcode & MASK_Rn) >> 16) - -/* Get the destination floating point register from the opcode. */ -#define getFd(opcode) ((opcode & MASK_Fd) >> 12) - -/* Get the first source floating point register from the opcode. */ -#define getFn(opcode) ((opcode & MASK_Fn) >> 16) - -/* Get the second source floating point register from the opcode. */ -#define getFm(opcode) (opcode & MASK_Fm) - -/* Get the destination register from the opcode. */ -#define getRd(opcode) ((opcode & MASK_Rd) >> 12) - -/* Get the rounding mode from the opcode. */ -#define getRoundingMode(opcode) ((opcode & MASK_ROUNDING_MODE) >> 5) - -extern const floatx80 floatx80Constant[]; -extern const float64 float64Constant[]; -extern const float32 float32Constant[]; - -static inline floatx80 getExtendedConstant(const unsigned int nIndex) -{ - return floatx80Constant[nIndex]; -} - -static inline float64 getDoubleConstant(const unsigned int nIndex) -{ - return float64Constant[nIndex]; -} - -static inline float32 getSingleConstant(const unsigned int nIndex) -{ - return float32Constant[nIndex]; -} - -unsigned int getRegisterCount(const unsigned int opcode); -unsigned int getDestinationSize(const unsigned int opcode); - -#endif diff --git a/qemu/linux-user/arm/nwfpe/fpsr.h b/qemu/linux-user/arm/nwfpe/fpsr.h deleted file mode 100644 index 859dcd589..000000000 --- a/qemu/linux-user/arm/nwfpe/fpsr.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.com, 1998-1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FPSR_H__ -#define __FPSR_H__ - -/* -The FPSR is a 32 bit register consisting of 4 parts, each exactly -one byte. - - SYSTEM ID - EXCEPTION TRAP ENABLE BYTE - SYSTEM CONTROL BYTE - CUMULATIVE EXCEPTION FLAGS BYTE - -The FPCR is a 32 bit register consisting of bit flags. -*/ - -/* SYSTEM ID ------------- -Note: the system id byte is read only */ - -typedef unsigned int FPSR; /* type for floating point status register */ -typedef unsigned int FPCR; /* type for floating point control register */ - -#define MASK_SYSID 0xff000000 -#define BIT_HARDWARE 0x80000000 -#define FP_EMULATOR 0x01000000 /* System ID for emulator */ -#define FP_ACCELERATOR 0x81000000 /* System ID for FPA11 */ - -/* EXCEPTION TRAP ENABLE BYTE ------------------------------ */ - -#define MASK_TRAP_ENABLE 0x00ff0000 -#define MASK_TRAP_ENABLE_STRICT 0x001f0000 -#define BIT_IXE 0x00100000 /* inexact exception enable */ -#define BIT_UFE 0x00080000 /* underflow exception enable */ -#define BIT_OFE 0x00040000 /* overflow exception enable */ -#define BIT_DZE 0x00020000 /* divide by zero exception enable */ -#define BIT_IOE 0x00010000 /* invalid operation exception enable */ - -/* SYSTEM CONTROL BYTE ----------------------- */ - -#define MASK_SYSTEM_CONTROL 0x0000ff00 -#define MASK_TRAP_STRICT 0x00001f00 - -#define BIT_AC 0x00001000 /* use alternative C-flag definition - for compares */ -#define BIT_EP 0x00000800 /* use expanded packed decimal format */ -#define BIT_SO 0x00000400 /* select synchronous operation of FPA */ -#define BIT_NE 0x00000200 /* NaN exception bit */ -#define BIT_ND 0x00000100 /* no denormalized numbers bit */ - -/* CUMULATIVE EXCEPTION FLAGS BYTE ----------------------------------- */ - -#define MASK_EXCEPTION_FLAGS 0x000000ff -#define MASK_EXCEPTION_FLAGS_STRICT 0x0000001f - -#define BIT_IXC 0x00000010 /* inexact exception flag */ -#define BIT_UFC 0x00000008 /* underflow exception flag */ -#define BIT_OFC 0x00000004 /* overfloat exception flag */ -#define BIT_DZC 0x00000002 /* divide by zero exception flag */ -#define BIT_IOC 0x00000001 /* invalid operation exception flag */ - -/* Floating Point Control Register -----------------------------------*/ - -#define BIT_RU 0x80000000 /* rounded up bit */ -#define BIT_IE 0x10000000 /* inexact bit */ -#define BIT_MO 0x08000000 /* mantissa overflow bit */ -#define BIT_EO 0x04000000 /* exponent overflow bit */ -#define BIT_SB 0x00000800 /* store bounce */ -#define BIT_AB 0x00000400 /* arithmetic bounce */ -#define BIT_RE 0x00000200 /* rounding exception */ -#define BIT_DA 0x00000100 /* disable FPA */ - -#define MASK_OP 0x00f08010 /* AU operation code */ -#define MASK_PR 0x00080080 /* AU precision */ -#define MASK_S1 0x00070000 /* AU source register 1 */ -#define MASK_S2 0x00000007 /* AU source register 2 */ -#define MASK_DS 0x00007000 /* AU destination register */ -#define MASK_RM 0x00000060 /* AU rounding mode */ -#define MASK_ALU 0x9cfff2ff /* only ALU can write these bits */ -#define MASK_RESET 0x00000d00 /* bits set on reset, all others cleared */ -#define MASK_WFC MASK_RESET -#define MASK_RFC ~MASK_RESET - -#endif diff --git a/qemu/linux-user/arm/nwfpe/single_cpdo.c b/qemu/linux-user/arm/nwfpe/single_cpdo.c deleted file mode 100644 index 21e177bae..000000000 --- a/qemu/linux-user/arm/nwfpe/single_cpdo.c +++ /dev/null @@ -1,253 +0,0 @@ -/* - NetWinder Floating Point Emulator - (c) Rebel.COM, 1998,1999 - - Direct questions, comments to Scott Bambrough <scottb@netwinder.org> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "qemu/osdep.h" -#include "fpa11.h" -#include "fpu/softfloat.h" -#include "fpopcode.h" - -float32 float32_exp(float32 Fm); -float32 float32_ln(float32 Fm); -float32 float32_sin(float32 rFm); -float32 float32_cos(float32 rFm); -float32 float32_arcsin(float32 rFm); -float32 float32_arctan(float32 rFm); -float32 float32_log(float32 rFm); -float32 float32_tan(float32 rFm); -float32 float32_arccos(float32 rFm); -float32 float32_pow(float32 rFn,float32 rFm); -float32 float32_pol(float32 rFn,float32 rFm); - -unsigned int SingleCPDO(const unsigned int opcode) -{ - FPA11 *fpa11 = GET_FPA11(); - float32 rFm, rFn = float32_zero; - unsigned int Fd, Fm, Fn, nRc = 1; - - Fm = getFm(opcode); - if (CONSTANT_FM(opcode)) - { - rFm = getSingleConstant(Fm); - } - else - { - switch (fpa11->fType[Fm]) - { - case typeSingle: - rFm = fpa11->fpreg[Fm].fSingle; - break; - - default: return 0; - } - } - - if (!MONADIC_INSTRUCTION(opcode)) - { - Fn = getFn(opcode); - switch (fpa11->fType[Fn]) - { - case typeSingle: - rFn = fpa11->fpreg[Fn].fSingle; - break; - - default: return 0; - } - } - - Fd = getFd(opcode); - switch (opcode & MASK_ARITHMETIC_OPCODE) - { - /* dyadic opcodes */ - case ADF_CODE: - fpa11->fpreg[Fd].fSingle = float32_add(rFn,rFm, &fpa11->fp_status); - break; - - case MUF_CODE: - case FML_CODE: - fpa11->fpreg[Fd].fSingle = float32_mul(rFn,rFm, &fpa11->fp_status); - break; - - case SUF_CODE: - fpa11->fpreg[Fd].fSingle = float32_sub(rFn,rFm, &fpa11->fp_status); - break; - - case RSF_CODE: - fpa11->fpreg[Fd].fSingle = float32_sub(rFm,rFn, &fpa11->fp_status); - break; - - case DVF_CODE: - case FDV_CODE: - fpa11->fpreg[Fd].fSingle = float32_div(rFn,rFm, &fpa11->fp_status); - break; - - case RDF_CODE: - case FRD_CODE: - fpa11->fpreg[Fd].fSingle = float32_div(rFm,rFn, &fpa11->fp_status); - break; - -#if 0 - case POW_CODE: - fpa11->fpreg[Fd].fSingle = float32_pow(rFn,rFm); - break; - - case RPW_CODE: - fpa11->fpreg[Fd].fSingle = float32_pow(rFm,rFn); - break; -#endif - - case RMF_CODE: - fpa11->fpreg[Fd].fSingle = float32_rem(rFn,rFm, &fpa11->fp_status); - break; - -#if 0 - case POL_CODE: - fpa11->fpreg[Fd].fSingle = float32_pol(rFn,rFm); - break; -#endif - - /* monadic opcodes */ - case MVF_CODE: - fpa11->fpreg[Fd].fSingle = rFm; - break; - - case MNF_CODE: - fpa11->fpreg[Fd].fSingle = float32_chs(rFm); - break; - - case ABS_CODE: - fpa11->fpreg[Fd].fSingle = float32_abs(rFm); - break; - - case RND_CODE: - case URD_CODE: - fpa11->fpreg[Fd].fSingle = float32_round_to_int(rFm, &fpa11->fp_status); - break; - - case SQT_CODE: - fpa11->fpreg[Fd].fSingle = float32_sqrt(rFm, &fpa11->fp_status); - break; - -#if 0 - case LOG_CODE: - fpa11->fpreg[Fd].fSingle = float32_log(rFm); - break; - - case LGN_CODE: - fpa11->fpreg[Fd].fSingle = float32_ln(rFm); - break; - - case EXP_CODE: - fpa11->fpreg[Fd].fSingle = float32_exp(rFm); - break; - - case SIN_CODE: - fpa11->fpreg[Fd].fSingle = float32_sin(rFm); - break; - - case COS_CODE: - fpa11->fpreg[Fd].fSingle = float32_cos(rFm); - break; - - case TAN_CODE: - fpa11->fpreg[Fd].fSingle = float32_tan(rFm); - break; - - case ASN_CODE: - fpa11->fpreg[Fd].fSingle = float32_arcsin(rFm); - break; - - case ACS_CODE: - fpa11->fpreg[Fd].fSingle = float32_arccos(rFm); - break; - - case ATN_CODE: - fpa11->fpreg[Fd].fSingle = float32_arctan(rFm); - break; -#endif - - case NRM_CODE: - break; - - default: - { - nRc = 0; - } - } - - if (0 != nRc) fpa11->fType[Fd] = typeSingle; - return nRc; -} - -#if 0 -float32 float32_exp(float32 Fm) -{ -//series -} - -float32 float32_ln(float32 Fm) -{ -//series -} - -float32 float32_sin(float32 rFm) -{ -//series -} - -float32 float32_cos(float32 rFm) -{ -//series -} - -float32 float32_arcsin(float32 rFm) -{ -//series -} - -float32 float32_arctan(float32 rFm) -{ - //series -} - -float32 float32_arccos(float32 rFm) -{ - //return float32_sub(halfPi,float32_arcsin(rFm)); -} - -float32 float32_log(float32 rFm) -{ - return float32_div(float32_ln(rFm),getSingleConstant(7)); -} - -float32 float32_tan(float32 rFm) -{ - return float32_div(float32_sin(rFm),float32_cos(rFm)); -} - -float32 float32_pow(float32 rFn,float32 rFm) -{ - return float32_exp(float32_mul(rFm,float32_ln(rFn))); -} - -float32 float32_pol(float32 rFn,float32 rFm) -{ - return float32_arctan(float32_div(rFn,rFm)); -} -#endif diff --git a/qemu/linux-user/arm/syscall_nr.h b/qemu/linux-user/arm/syscall_nr.h deleted file mode 100644 index cc9089ccd..000000000 --- a/qemu/linux-user/arm/syscall_nr.h +++ /dev/null @@ -1,398 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_restart_syscall ( 0) -#define TARGET_NR_exit ( 1) -#define TARGET_NR_fork ( 2) -#define TARGET_NR_read ( 3) -#define TARGET_NR_write ( 4) -#define TARGET_NR_open ( 5) -#define TARGET_NR_close ( 6) -#define TARGET_NR_waitpid ( 7) /* removed */ -#define TARGET_NR_creat ( 8) -#define TARGET_NR_link ( 9) -#define TARGET_NR_unlink ( 10) -#define TARGET_NR_execve ( 11) -#define TARGET_NR_chdir ( 12) -#define TARGET_NR_time ( 13) -#define TARGET_NR_mknod ( 14) -#define TARGET_NR_chmod ( 15) -#define TARGET_NR_lchown ( 16) -#define TARGET_NR_break ( 17) /* removed */ - /* 18 was sys_stat */ -#define TARGET_NR_lseek ( 19) -#define TARGET_NR_getpid ( 20) -#define TARGET_NR_mount ( 21) -#define TARGET_NR_umount ( 22) -#define TARGET_NR_setuid ( 23) -#define TARGET_NR_getuid ( 24) -#define TARGET_NR_stime ( 25) -#define TARGET_NR_ptrace ( 26) -#define TARGET_NR_alarm ( 27) - -#define TARGET_NR_pause ( 29) -#define TARGET_NR_utime ( 30) -#define TARGET_NR_stty ( 31) /* removed */ -#define TARGET_NR_gtty ( 32) /* removed */ -#define TARGET_NR_access ( 33) -#define TARGET_NR_nice ( 34) -#define TARGET_NR_ftime ( 35) /* removed */ -#define TARGET_NR_sync ( 36) -#define TARGET_NR_kill ( 37) -#define TARGET_NR_rename ( 38) -#define TARGET_NR_mkdir ( 39) -#define TARGET_NR_rmdir ( 40) -#define TARGET_NR_dup ( 41) -#define TARGET_NR_pipe ( 42) -#define TARGET_NR_times ( 43) -#define TARGET_NR_prof ( 44) /* removed */ -#define TARGET_NR_brk ( 45) -#define TARGET_NR_setgid ( 46) -#define TARGET_NR_getgid ( 47) -#define TARGET_NR_signal ( 48) /* removed */ -#define TARGET_NR_geteuid ( 49) -#define TARGET_NR_getegid ( 50) -#define TARGET_NR_acct ( 51) -#define TARGET_NR_umount2 ( 52) -#define TARGET_NR_lock ( 53) /* removed */ -#define TARGET_NR_ioctl ( 54) -#define TARGET_NR_fcntl ( 55) -#define TARGET_NR_mpx ( 56) /* removed */ -#define TARGET_NR_setpgid ( 57) -#define TARGET_NR_ulimit ( 58) /* removed */ - /* 59 was sys_olduname */ -#define TARGET_NR_umask ( 60) -#define TARGET_NR_chroot ( 61) -#define TARGET_NR_ustat ( 62) -#define TARGET_NR_dup2 ( 63) -#define TARGET_NR_getppid ( 64) -#define TARGET_NR_getpgrp ( 65) -#define TARGET_NR_setsid ( 66) -#define TARGET_NR_sigaction ( 67) -#define TARGET_NR_sgetmask ( 68) /* removed */ -#define TARGET_NR_ssetmask ( 69) /* removed */ -#define TARGET_NR_setreuid ( 70) -#define TARGET_NR_setregid ( 71) -#define TARGET_NR_sigsuspend ( 72) -#define TARGET_NR_sigpending ( 73) -#define TARGET_NR_sethostname ( 74) -#define TARGET_NR_setrlimit ( 75) -#define TARGET_NR_getrlimit ( 76) /* Back compat 2GB limited rlimit */ -#define TARGET_NR_getrusage ( 77) -#define TARGET_NR_gettimeofday ( 78) -#define TARGET_NR_settimeofday ( 79) -#define TARGET_NR_getgroups ( 80) -#define TARGET_NR_setgroups ( 81) -#define TARGET_NR_select ( 82) -#define TARGET_NR_symlink ( 83) - /* 84 was sys_lstat */ -#define TARGET_NR_readlink ( 85) -#define TARGET_NR_uselib ( 86) -#define TARGET_NR_swapon ( 87) -#define TARGET_NR_reboot ( 88) -#define TARGET_NR_readdir ( 89) -#define TARGET_NR_mmap ( 90) -#define TARGET_NR_munmap ( 91) -#define TARGET_NR_truncate ( 92) -#define TARGET_NR_ftruncate ( 93) -#define TARGET_NR_fchmod ( 94) -#define TARGET_NR_fchown ( 95) -#define TARGET_NR_getpriority ( 96) -#define TARGET_NR_setpriority ( 97) -#define TARGET_NR_profil ( 98) /* removed */ -#define TARGET_NR_statfs ( 99) -#define TARGET_NR_fstatfs (100) -#define TARGET_NR_ioperm (101) -#define TARGET_NR_socketcall (102) -#define TARGET_NR_syslog (103) -#define TARGET_NR_setitimer (104) -#define TARGET_NR_getitimer (105) -#define TARGET_NR_stat (106) -#define TARGET_NR_lstat (107) -#define TARGET_NR_fstat (108) - /* 109 was sys_uname */ - /* 110 was sys_iopl */ -#define TARGET_NR_vhangup (111) -#define TARGET_NR_idle (112) -#define TARGET_NR_syscall (113) /* syscall to call a syscall! */ -#define TARGET_NR_wait4 (114) -#define TARGET_NR_swapoff (115) -#define TARGET_NR_sysinfo (116) -#define TARGET_NR_ipc (117) -#define TARGET_NR_fsync (118) -#define TARGET_NR_sigreturn (119) -#define TARGET_NR_clone (120) -#define TARGET_NR_setdomainname (121) -#define TARGET_NR_uname (122) -#define TARGET_NR_modify_ldt (123) -#define TARGET_NR_adjtimex (124) -#define TARGET_NR_mprotect (125) -#define TARGET_NR_sigprocmask (126) -#define TARGET_NR_create_module (127) /* removed */ -#define TARGET_NR_init_module (128) -#define TARGET_NR_delete_module (129) -#define TARGET_NR_get_kernel_syms (130) /* removed */ -#define TARGET_NR_quotactl (131) -#define TARGET_NR_getpgid (132) -#define TARGET_NR_fchdir (133) -#define TARGET_NR_bdflush (134) -#define TARGET_NR_sysfs (135) -#define TARGET_NR_personality (136) -#define TARGET_NR_afs_syscall (137) /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid (138) -#define TARGET_NR_setfsgid (139) -#define TARGET_NR__llseek (140) -#define TARGET_NR_getdents (141) -#define TARGET_NR__newselect (142) -#define TARGET_NR_flock (143) -#define TARGET_NR_msync (144) -#define TARGET_NR_readv (145) -#define TARGET_NR_writev (146) -#define TARGET_NR_getsid (147) -#define TARGET_NR_fdatasync (148) -#define TARGET_NR__sysctl (149) -#define TARGET_NR_mlock (150) -#define TARGET_NR_munlock (151) -#define TARGET_NR_mlockall (152) -#define TARGET_NR_munlockall (153) -#define TARGET_NR_sched_setparam (154) -#define TARGET_NR_sched_getparam (155) -#define TARGET_NR_sched_setscheduler (156) -#define TARGET_NR_sched_getscheduler (157) -#define TARGET_NR_sched_yield (158) -#define TARGET_NR_sched_get_priority_max (159) -#define TARGET_NR_sched_get_priority_min (160) -#define TARGET_NR_sched_rr_get_interval (161) -#define TARGET_NR_nanosleep (162) -#define TARGET_NR_mremap (163) -#define TARGET_NR_setresuid (164) -#define TARGET_NR_getresuid (165) -#define TARGET_NR_vm86 (166) /* removed */ -#define TARGET_NR_query_module (167) /* removed */ -#define TARGET_NR_poll (168) -#define TARGET_NR_nfsservctl (169) -#define TARGET_NR_setresgid (170) -#define TARGET_NR_getresgid (171) -#define TARGET_NR_prctl (172) -#define TARGET_NR_rt_sigreturn (173) -#define TARGET_NR_rt_sigaction (174) -#define TARGET_NR_rt_sigprocmask (175) -#define TARGET_NR_rt_sigpending (176) -#define TARGET_NR_rt_sigtimedwait (177) -#define TARGET_NR_rt_sigqueueinfo (178) -#define TARGET_NR_rt_sigsuspend (179) -#define TARGET_NR_pread64 (180) -#define TARGET_NR_pwrite64 (181) -#define TARGET_NR_chown (182) -#define TARGET_NR_getcwd (183) -#define TARGET_NR_capget (184) -#define TARGET_NR_capset (185) -#define TARGET_NR_sigaltstack (186) -#define TARGET_NR_sendfile (187) - /* 188 reserved */ - /* 189 reserved */ -#define TARGET_NR_vfork (190) -#define TARGET_NR_ugetrlimit (191) /* SuS compliant getrlimit */ -#define TARGET_NR_mmap2 (192) -#define TARGET_NR_truncate64 (193) -#define TARGET_NR_ftruncate64 (194) -#define TARGET_NR_stat64 (195) -#define TARGET_NR_lstat64 (196) -#define TARGET_NR_fstat64 (197) -#define TARGET_NR_lchown32 (198) -#define TARGET_NR_getuid32 (199) -#define TARGET_NR_getgid32 (200) -#define TARGET_NR_geteuid32 (201) -#define TARGET_NR_getegid32 (202) -#define TARGET_NR_setreuid32 (203) -#define TARGET_NR_setregid32 (204) -#define TARGET_NR_getgroups32 (205) -#define TARGET_NR_setgroups32 (206) -#define TARGET_NR_fchown32 (207) -#define TARGET_NR_setresuid32 (208) -#define TARGET_NR_getresuid32 (209) -#define TARGET_NR_setresgid32 (210) -#define TARGET_NR_getresgid32 (211) -#define TARGET_NR_chown32 (212) -#define TARGET_NR_setuid32 (213) -#define TARGET_NR_setgid32 (214) -#define TARGET_NR_setfsuid32 (215) -#define TARGET_NR_setfsgid32 (216) -#define TARGET_NR_getdents64 (217) -#define TARGET_NR_pivot_root (218) -#define TARGET_NR_mincore (219) -#define TARGET_NR_madvise (220) -#define TARGET_NR_fcntl64 (221) - /* 222 for tux */ - /* 223 is unused */ -#define TARGET_NR_gettid (224) -#define TARGET_NR_readahead (225) -#define TARGET_NR_setxattr (226) -#define TARGET_NR_lsetxattr (227) -#define TARGET_NR_fsetxattr (228) -#define TARGET_NR_getxattr (229) -#define TARGET_NR_lgetxattr (230) -#define TARGET_NR_fgetxattr (231) -#define TARGET_NR_listxattr (232) -#define TARGET_NR_llistxattr (233) -#define TARGET_NR_flistxattr (234) -#define TARGET_NR_removexattr (235) -#define TARGET_NR_lremovexattr (236) -#define TARGET_NR_fremovexattr (237) -#define TARGET_NR_tkill (238) -#define TARGET_NR_sendfile64 (239) -#define TARGET_NR_futex (240) -#define TARGET_NR_sched_setaffinity (241) -#define TARGET_NR_sched_getaffinity (242) -#define TARGET_NR_io_setup (243) -#define TARGET_NR_io_destroy (244) -#define TARGET_NR_io_getevents (245) -#define TARGET_NR_io_submit (246) -#define TARGET_NR_io_cancel (247) -#define TARGET_NR_exit_group (248) -#define TARGET_NR_lookup_dcookie (249) -#define TARGET_NR_epoll_create (250) -#define TARGET_NR_epoll_ctl (251) -#define TARGET_NR_epoll_wait (252) -#define TARGET_NR_remap_file_pages (253) - /* 254 for set_thread_area */ - /* 255 for get_thread_area */ - /* 256 for set_tid_address */ -#define TARGET_NR_set_tid_address 256 -#define TARGET_NR_timer_create 257 -#define TARGET_NR_timer_settime 258 -#define TARGET_NR_timer_gettime 259 -#define TARGET_NR_timer_getoverrun 260 -#define TARGET_NR_timer_delete 261 -#define TARGET_NR_clock_settime 262 -#define TARGET_NR_clock_gettime 263 -#define TARGET_NR_clock_getres 264 -#define TARGET_NR_clock_nanosleep 265 -#define TARGET_NR_statfs64 266 -#define TARGET_NR_fstatfs64 267 -#define TARGET_NR_tgkill 268 -#define TARGET_NR_utimes 269 -#define TARGET_NR_arm_fadvise64_64 270 -#define TARGET_NR_pciconfig_iobase 271 -#define TARGET_NR_pciconfig_read 272 -#define TARGET_NR_pciconfig_write 273 -#define TARGET_NR_mq_open 274 -#define TARGET_NR_mq_unlink 275 -#define TARGET_NR_mq_timedsend 276 -#define TARGET_NR_mq_timedreceive 277 -#define TARGET_NR_mq_notify 278 -#define TARGET_NR_mq_getsetattr 279 -#define TARGET_NR_waitid 280 -#define TARGET_NR_socket 281 -#define TARGET_NR_bind 282 -#define TARGET_NR_connect 283 -#define TARGET_NR_listen 284 -#define TARGET_NR_accept 285 -#define TARGET_NR_getsockname 286 -#define TARGET_NR_getpeername 287 -#define TARGET_NR_socketpair 288 -#define TARGET_NR_send 289 -#define TARGET_NR_sendto 290 -#define TARGET_NR_recv 291 -#define TARGET_NR_recvfrom 292 -#define TARGET_NR_shutdown 293 -#define TARGET_NR_setsockopt 294 -#define TARGET_NR_getsockopt 295 -#define TARGET_NR_sendmsg 296 -#define TARGET_NR_recvmsg 297 -#define TARGET_NR_semop 298 -#define TARGET_NR_semget 299 -#define TARGET_NR_semctl 300 -#define TARGET_NR_msgsnd 301 -#define TARGET_NR_msgrcv 302 -#define TARGET_NR_msgget 303 -#define TARGET_NR_msgctl 304 -#define TARGET_NR_shmat 305 -#define TARGET_NR_shmdt 306 -#define TARGET_NR_shmget 307 -#define TARGET_NR_shmctl 308 -#define TARGET_NR_add_key 309 -#define TARGET_NR_request_key 310 -#define TARGET_NR_keyctl 311 -#define TARGET_NR_semtimedop 312 -#define TARGET_NR_vserver 313 -#define TARGET_NR_ioprio_set 314 -#define TARGET_NR_ioprio_get 315 -#define TARGET_NR_inotify_init 316 -#define TARGET_NR_inotify_add_watch 317 -#define TARGET_NR_inotify_rm_watch 318 -#define TARGET_NR_mbind 319 -#define TARGET_NR_get_mempolicy 320 -#define TARGET_NR_set_mempolicy 321 -#define TARGET_NR_openat (322) -#define TARGET_NR_mkdirat (323) -#define TARGET_NR_mknodat (324) -#define TARGET_NR_fchownat (325) -#define TARGET_NR_futimesat (326) -#define TARGET_NR_fstatat64 (327) -#define TARGET_NR_unlinkat (328) -#define TARGET_NR_renameat (329) -#define TARGET_NR_linkat (330) -#define TARGET_NR_symlinkat (331) -#define TARGET_NR_readlinkat (332) -#define TARGET_NR_fchmodat (333) -#define TARGET_NR_faccessat (334) -#define TARGET_NR_pselect6 (335) -#define TARGET_NR_ppoll (336) -#define TARGET_NR_unshare (337) -#define TARGET_NR_set_robust_list (338) -#define TARGET_NR_get_robust_list (339) -#define TARGET_NR_splice (340) -#define TARGET_NR_arm_sync_file_range (341) -#define TARGET_NR_sync_file_range2 TARGET_NR_arm_sync_file_range -#define TARGET_NR_tee (342) -#define TARGET_NR_vmsplice (343) -#define TARGET_NR_move_pages (344) -#define TARGET_NR_getcpu (345) -#define TARGET_NR_epoll_pwait (346) -#define TARGET_NR_kexec_load (347) -#define TARGET_NR_utimensat (348) -#define TARGET_NR_signalfd (349) -#define TARGET_NR_timerfd_create (350) -#define TARGET_NR_eventfd (351) -#define TARGET_NR_fallocate (352) -#define TARGET_NR_timerfd_settime (353) -#define TARGET_NR_timerfd_gettime (354) -#define TARGET_NR_signalfd4 (355) -#define TARGET_NR_eventfd2 (356) -#define TARGET_NR_epoll_create1 (357) -#define TARGET_NR_dup3 (358) -#define TARGET_NR_pipe2 (359) -#define TARGET_NR_inotify_init1 (360) -#define TARGET_NR_preadv (361) -#define TARGET_NR_pwritev (362) -#define TARGET_NR_rt_tgsigqueueinfo (363) -#define TARGET_NR_perf_event_open (364) -#define TARGET_NR_recvmmsg (365) -#define TARGET_NR_accept4 (366) -#define TARGET_NR_fanotify_init (367) -#define TARGET_NR_fanotify_mark (368) -#define TARGET_NR_prlimit64 (369) -#define TARGET_NR_name_to_handle_at (370) -#define TARGET_NR_open_by_handle_at (371) -#define TARGET_NR_clock_adjtime (372) -#define TARGET_NR_syncfs (373) -#define TARGET_NR_sendmmsg (374) -#define TARGET_NR_setns (375) -#define TARGET_NR_process_vm_readv (376) -#define TARGET_NR_process_vm_writev (377) -#define TARGET_NR_kcmp (378) -#define TARGET_NR_finit_module (379) - -#define TARGET_NR_sched_setattr (380) -#define TARGET_NR_sched_getattr (381) -#define TARGET_NR_renameat2 (382) -#define TARGET_NR_seccomp (383) -#define TARGET_NR_getrandom (384) -#define TARGET_NR_memfd_create (385) -#define TARGET_NR_bpf (386) -#define TARGET_NR_execveat (387) -#define TARGET_NR_userfaultfd (388) -#define TARGET_NR_membarrier (389) -#define TARGET_NR_mlock2 (390) diff --git a/qemu/linux-user/arm/target_cpu.h b/qemu/linux-user/arm/target_cpu.h deleted file mode 100644 index 6832262e3..000000000 --- a/qemu/linux-user/arm/target_cpu.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ARM specific CPU ABI and functions for linux-user - * - * Copyright (c) 2003 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp) -{ - if (newsp) { - env->regs[13] = newsp; - } - env->regs[0] = 0; -} - -static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls) -{ - if (access_secure_reg(env)) { - env->cp15.tpidruro_s = newtls; - } else { - env->cp15.tpidrro_el[0] = newtls; - } -} - -static inline target_ulong cpu_get_tls(CPUARMState *env) -{ - if (access_secure_reg(env)) { - return env->cp15.tpidruro_s; - } else { - return env->cp15.tpidrro_el[0]; - } -} - -#endif diff --git a/qemu/linux-user/arm/target_signal.h b/qemu/linux-user/arm/target_signal.h deleted file mode 100644 index 2b3281312..000000000 --- a/qemu/linux-user/arm/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUARMState *state) -{ - return state->regs[13]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/arm/target_structs.h b/qemu/linux-user/arm/target_structs.h deleted file mode 100644 index f3c85d4e1..000000000 --- a/qemu/linux-user/arm/target_structs.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ARM specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ - abi_ulong __unused1; - abi_ulong shm_dtime; /* time of last shmdt() */ - abi_ulong __unused2; - abi_ulong shm_ctime; /* time of last change by shmctl() */ - abi_ulong __unused3; - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/arm/target_syscall.h b/qemu/linux-user/arm/target_syscall.h deleted file mode 100644 index ea863db0b..000000000 --- a/qemu/linux-user/arm/target_syscall.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* this struct defines the way the registers are stored on the - stack during a system call. */ - -struct target_pt_regs { - abi_long uregs[18]; -}; - -#define ARM_cpsr uregs[16] -#define ARM_pc uregs[15] -#define ARM_lr uregs[14] -#define ARM_sp uregs[13] -#define ARM_ip uregs[12] -#define ARM_fp uregs[11] -#define ARM_r10 uregs[10] -#define ARM_r9 uregs[9] -#define ARM_r8 uregs[8] -#define ARM_r7 uregs[7] -#define ARM_r6 uregs[6] -#define ARM_r5 uregs[5] -#define ARM_r4 uregs[4] -#define ARM_r3 uregs[3] -#define ARM_r2 uregs[2] -#define ARM_r1 uregs[1] -#define ARM_r0 uregs[0] -#define ARM_ORIG_r0 uregs[17] - -#define ARM_SYSCALL_BASE 0x900000 -#define ARM_THUMB_SYSCALL 0 - -#define ARM_NR_BASE 0xf0000 -#define ARM_NR_breakpoint (ARM_NR_BASE + 1) -#define ARM_NR_cacheflush (ARM_NR_BASE + 2) -#define ARM_NR_set_tls (ARM_NR_BASE + 5) - -#define ARM_NR_semihosting 0x123456 -#define ARM_NR_thumb_semihosting 0xAB - -#if defined(TARGET_WORDS_BIGENDIAN) -#define UNAME_MACHINE "armv5teb" -#else -#define UNAME_MACHINE "armv5tel" -#endif -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/arm/termbits.h b/qemu/linux-user/arm/termbits.h deleted file mode 100644 index 7772df175..000000000 --- a/qemu/linux-user/arm/termbits.h +++ /dev/null @@ -1,216 +0,0 @@ -/* from asm/termbits.h */ -/* NOTE: exactly the same as i386 */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/cris/syscall_nr.h b/qemu/linux-user/cris/syscall_nr.h deleted file mode 100644 index 44f0b645b..000000000 --- a/qemu/linux-user/cris/syscall_nr.h +++ /dev/null @@ -1,362 +0,0 @@ -/* - * This file contains the system call numbers, and stub macros for libc. - */ - -#define TARGET_NR_restart_syscall 0 -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lchown 16 -#define TARGET_NR_break 17 -#define TARGET_NR_oldstat 18 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_oldfstat 28 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 -#define TARGET_NR_oldolduname 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 -#define TARGET_NR_oldlstat 84 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_olduname 109 -#define TARGET_NR_iopl 110 -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_vm86 113 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_modify_ldt 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 - -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_chown 182 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 -#define TARGET_NR_getpmsg 188 /* some people actually want streams */ -#define TARGET_NR_putpmsg 189 /* some people actually want streams */ -#define TARGET_NR_vfork 190 -#define TARGET_NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_lchown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_chown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_pivot_root 217 -#define TARGET_NR_mincore 218 -#define TARGET_NR_madvise 219 -#define TARGET_NR_getdents64 220 -#define TARGET_NR_fcntl64 221 -/* 223 is unused */ -#define TARGET_NR_gettid 224 -#define TARGET_NR_readahead 225 -#define TARGET_NR_setxattr 226 -#define TARGET_NR_lsetxattr 227 -#define TARGET_NR_fsetxattr 228 -#define TARGET_NR_getxattr 229 -#define TARGET_NR_lgetxattr 230 -#define TARGET_NR_fgetxattr 231 -#define TARGET_NR_listxattr 232 -#define TARGET_NR_llistxattr 233 -#define TARGET_NR_flistxattr 234 -#define TARGET_NR_removexattr 235 -#define TARGET_NR_lremovexattr 236 -#define TARGET_NR_fremovexattr 237 -#define TARGET_NR_tkill 238 -#define TARGET_NR_sendfile64 239 -#define TARGET_NR_futex 240 -#define TARGET_NR_sched_setaffinity 241 -#define TARGET_NR_sched_getaffinity 242 -#define TARGET_NR_set_thread_area 243 -#define TARGET_NR_get_thread_area 244 -#define TARGET_NR_io_setup 245 -#define TARGET_NR_io_destroy 246 -#define TARGET_NR_io_getevents 247 -#define TARGET_NR_io_submit 248 -#define TARGET_NR_io_cancel 249 -#define TARGET_NR_fadvise64 250 -#define TARGET_NR_exit_group 252 -#define TARGET_NR_lookup_dcookie 253 -#define TARGET_NR_epoll_create 254 -#define TARGET_NR_epoll_ctl 255 -#define TARGET_NR_epoll_wait 256 -#define TARGET_NR_remap_file_pages 257 -#define TARGET_NR_set_tid_address 258 -#define TARGET_NR_timer_create 259 -#define TARGET_NR_timer_settime (TARGET_NR_timer_create+1) -#define TARGET_NR_timer_gettime (TARGET_NR_timer_create+2) -#define TARGET_NR_timer_getoverrun (TARGET_NR_timer_create+3) -#define TARGET_NR_timer_delete (TARGET_NR_timer_create+4) -#define TARGET_NR_clock_settime (TARGET_NR_timer_create+5) -#define TARGET_NR_clock_gettime (TARGET_NR_timer_create+6) -#define TARGET_NR_clock_getres (TARGET_NR_timer_create+7) -#define TARGET_NR_clock_nanosleep (TARGET_NR_timer_create+8) -#define TARGET_NR_statfs64 268 -#define TARGET_NR_fstatfs64 269 -#define TARGET_NR_tgkill 270 -#define TARGET_NR_utimes 271 -#define TARGET_NR_fadvise64_64 272 -#define TARGET_NR_vserver 273 -#define TARGET_NR_mbind 274 -#define TARGET_NR_get_mempolicy 275 -#define TARGET_NR_set_mempolicy 276 -#define TARGET_NR_mq_open 277 -#define TARGET_NR_mq_unlink (TARGET_NR_mq_open+1) -#define TARGET_NR_mq_timedsend (TARGET_NR_mq_open+2) -#define TARGET_NR_mq_timedreceive (TARGET_NR_mq_open+3) -#define TARGET_NR_mq_notify (TARGET_NR_mq_open+4) -#define TARGET_NR_mq_getsetattr (TARGET_NR_mq_open+5) -#define TARGET_NR_kexec_load 283 -#define TARGET_NR_waitid 284 -/* #define TARGET_NR_sys_setaltroot 285 */ -#define TARGET_NR_add_key 286 -#define TARGET_NR_request_key 287 -#define TARGET_NR_keyctl 288 -#define TARGET_NR_ioprio_set 289 -#define TARGET_NR_ioprio_get 290 -#define TARGET_NR_inotify_init 291 -#define TARGET_NR_inotify_add_watch 292 -#define TARGET_NR_inotify_rm_watch 293 -#define TARGET_NR_migrate_pages 294 -#define TARGET_NR_openat 295 -#define TARGET_NR_mkdirat 296 -#define TARGET_NR_mknodat 297 -#define TARGET_NR_fchownat 298 -#define TARGET_NR_futimesat 299 -#define TARGET_NR_fstatat64 300 -#define TARGET_NR_unlinkat 301 -#define TARGET_NR_renameat 302 -#define TARGET_NR_linkat 303 -#define TARGET_NR_symlinkat 304 -#define TARGET_NR_readlinkat 305 -#define TARGET_NR_fchmodat 306 -#define TARGET_NR_faccessat 307 -#define TARGET_NR_pselect6 308 -#define TARGET_NR_ppoll 309 -#define TARGET_NR_unshare 310 -#define TARGET_NR_set_robust_list 311 -#define TARGET_NR_get_robust_list 312 -#define TARGET_NR_splice 313 -#define TARGET_NR_sync_file_range 314 -#define TARGET_NR_tee 315 -#define TARGET_NR_vmsplice 316 -#define TARGET_NR_move_pages 317 -#define TARGET_NR_getcpu 318 -#define TARGET_NR_epoll_pwait 319 -#define TARGET_NR_utimensat 320 -#define TARGET_NR_signalfd 321 -#define TARGET_NR_timerfd_create 322 -#define TARGET_NR_eventfd 323 -#define TARGET_NR_fallocate 324 -#define TARGET_NR_timerfd_settime 325 -#define TARGET_NR_timerfd_gettime 326 -#define TARGET_NR_signalfd4 327 -#define TARGET_NR_eventfd2 328 -#define TARGET_NR_epoll_create1 329 -#define TARGET_NR_dup3 330 -#define TARGET_NR_pipe2 331 -#define TARGET_NR_inotify_init1 332 -#define TARGET_NR_preadv 333 -#define TARGET_NR_pwritev 334 -#define TARGET_NR_setns 335 -#define TARGET_NR_name_to_handle_at 336 -#define TARGET_NR_open_by_handle_at 337 -#define TARGET_NR_rt_tgsigqueueinfo 338 -#define TARGET_NR_perf_event_open 339 -#define TARGET_NR_recvmmsg 340 -#define TARGET_NR_accept4 341 -#define TARGET_NR_fanotify_init 342 -#define TARGET_NR_fanotify_mark 343 -#define TARGET_NR_prlimit64 344 -#define TARGET_NR_clock_adjtime 345 -#define TARGET_NR_syncfs 346 -#define TARGET_NR_sendmmsg 347 -#define TARGET_NR_process_vm_readv 348 -#define TARGET_NR_process_vm_writev 349 -#define TARGET_NR_kcmp 350 -#define TARGET_NR_finit_module 351 -#define TARGET_NR_sched_setattr 352 -#define TARGET_NR_sched_getattr 353 -#define TARGET_NR_renameat2 354 -#define TARGET_NR_seccomp 355 -#define TARGET_NR_getrandom 356 -#define TARGET_NR_memfd_create 357 -#define TARGET_NR_bpf 358 -#define TARGET_NR_execveat 359 diff --git a/qemu/linux-user/cris/target_cpu.h b/qemu/linux-user/cris/target_cpu.h deleted file mode 100644 index 4d787e5ff..000000000 --- a/qemu/linux-user/cris/target_cpu.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * CRIS specific CPU ABI and functions for linux-user - * - * Copyright (c) 2007 AXIS Communications AB - * Written by Edgar E. Iglesias - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUCRISState *env, target_ulong newsp) -{ - if (newsp) { - env->regs[14] = newsp; - } - env->regs[10] = 0; -} - -static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls) -{ - env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls; -} - -#endif diff --git a/qemu/linux-user/cris/target_signal.h b/qemu/linux-user/cris/target_signal.h deleted file mode 100644 index 5611840f8..000000000 --- a/qemu/linux-user/cris/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_ulong ss_size; - abi_long ss_flags; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUCRISState *state) -{ - return state->regs[14]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/cris/target_structs.h b/qemu/linux-user/cris/target_structs.h deleted file mode 100644 index e4a1ffb3c..000000000 --- a/qemu/linux-user/cris/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * CRIS specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/cris/target_syscall.h b/qemu/linux-user/cris/target_syscall.h deleted file mode 100644 index 2957b0d6a..000000000 --- a/qemu/linux-user/cris/target_syscall.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef CRIS_SYSCALL_H -#define CRIS_SYSCALL_H 1 - -#define UNAME_MACHINE "cris" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -/* pt_regs not only specifices the format in the user-struct during - * ptrace but is also the frame format used in the kernel prologue/epilogues - * themselves - */ - -struct target_pt_regs { - unsigned long orig_r10; - /* pushed by movem r13, [sp] in SAVE_ALL. */ - unsigned long r0; - unsigned long r1; - unsigned long r2; - unsigned long r3; - unsigned long r4; - unsigned long r5; - unsigned long r6; - unsigned long r7; - unsigned long r8; - unsigned long r9; - unsigned long r10; - unsigned long r11; - unsigned long r12; - unsigned long r13; - unsigned long acr; - unsigned long srs; - unsigned long mof; - unsigned long spc; - unsigned long ccs; - unsigned long srp; - unsigned long erp; /* This is actually the debugged process' PC */ - /* For debugging purposes; saved only when needed. */ - unsigned long exs; - unsigned long eda; -}; - -#define TARGET_CLONE_BACKWARDS2 -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif diff --git a/qemu/linux-user/cris/termbits.h b/qemu/linux-user/cris/termbits.h deleted file mode 100644 index fc82ca084..000000000 --- a/qemu/linux-user/cris/termbits.h +++ /dev/null @@ -1,213 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/elfload.c b/qemu/linux-user/elfload.c deleted file mode 100644 index e47caff7a..000000000 --- a/qemu/linux-user/elfload.c +++ /dev/null @@ -1,3115 +0,0 @@ -/* This is the Linux kernel elf-loading code, ported into user space */ -#include "qemu/osdep.h" -#include <sys/param.h> - -#include <sys/mman.h> -#include <sys/resource.h> - -#include "qemu.h" -#include "disas/disas.h" -#include "qemu/path.h" - -#ifdef _ARCH_PPC64 -#undef ARCH_DLINFO -#undef ELF_PLATFORM -#undef ELF_HWCAP -#undef ELF_HWCAP2 -#undef ELF_CLASS -#undef ELF_DATA -#undef ELF_ARCH -#endif - -#define ELF_OSABI ELFOSABI_SYSV - -/* from personality.h */ - -/* - * Flags for bug emulation. - * - * These occupy the top three bytes. - */ -enum { - ADDR_NO_RANDOMIZE = 0x0040000, /* disable randomization of VA space */ - FDPIC_FUNCPTRS = 0x0080000, /* userspace function ptrs point to - descriptors (signal handling) */ - MMAP_PAGE_ZERO = 0x0100000, - ADDR_COMPAT_LAYOUT = 0x0200000, - READ_IMPLIES_EXEC = 0x0400000, - ADDR_LIMIT_32BIT = 0x0800000, - SHORT_INODE = 0x1000000, - WHOLE_SECONDS = 0x2000000, - STICKY_TIMEOUTS = 0x4000000, - ADDR_LIMIT_3GB = 0x8000000, -}; - -/* - * Personality types. - * - * These go in the low byte. Avoid using the top bit, it will - * conflict with error returns. - */ -enum { - PER_LINUX = 0x0000, - PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT, - PER_LINUX_FDPIC = 0x0000 | FDPIC_FUNCPTRS, - PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, - PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE, - PER_SCOSVR3 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE, - PER_OSR5 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS, - PER_WYSEV386 = 0x0004 | STICKY_TIMEOUTS | SHORT_INODE, - PER_ISCR4 = 0x0005 | STICKY_TIMEOUTS, - PER_BSD = 0x0006, - PER_SUNOS = 0x0006 | STICKY_TIMEOUTS, - PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE, - PER_LINUX32 = 0x0008, - PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB, - PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */ - PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */ - PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */ - PER_RISCOS = 0x000c, - PER_SOLARIS = 0x000d | STICKY_TIMEOUTS, - PER_UW7 = 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO, - PER_OSF4 = 0x000f, /* OSF/1 v4 */ - PER_HPUX = 0x0010, - PER_MASK = 0x00ff, -}; - -/* - * Return the base personality without flags. - */ -#define personality(pers) (pers & PER_MASK) - -/* this flag is uneffective under linux too, should be deleted */ -#ifndef MAP_DENYWRITE -#define MAP_DENYWRITE 0 -#endif - -/* should probably go in elf.h */ -#ifndef ELIBBAD -#define ELIBBAD 80 -#endif - -#ifdef TARGET_WORDS_BIGENDIAN -#define ELF_DATA ELFDATA2MSB -#else -#define ELF_DATA ELFDATA2LSB -#endif - -#ifdef TARGET_ABI_MIPSN32 -typedef abi_ullong target_elf_greg_t; -#define tswapreg(ptr) tswap64(ptr) -#else -typedef abi_ulong target_elf_greg_t; -#define tswapreg(ptr) tswapal(ptr) -#endif - -#ifdef USE_UID16 -typedef abi_ushort target_uid_t; -typedef abi_ushort target_gid_t; -#else -typedef abi_uint target_uid_t; -typedef abi_uint target_gid_t; -#endif -typedef abi_int target_pid_t; - -#ifdef TARGET_I386 - -#define ELF_PLATFORM get_elf_platform() - -static const char *get_elf_platform(void) -{ - static char elf_platform[] = "i386"; - int family = object_property_get_int(OBJECT(thread_cpu), "family", NULL); - if (family > 6) - family = 6; - if (family >= 3) - elf_platform[1] = '0' + family; - return elf_platform; -} - -#define ELF_HWCAP get_elf_hwcap() - -static uint32_t get_elf_hwcap(void) -{ - X86CPU *cpu = X86_CPU(thread_cpu); - - return cpu->env.features[FEAT_1_EDX]; -} - -#ifdef TARGET_X86_64 -#define ELF_START_MMAP 0x2aaaaab000ULL - -#define ELF_CLASS ELFCLASS64 -#define ELF_ARCH EM_X86_64 - -static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop) -{ - regs->rax = 0; - regs->rsp = infop->start_stack; - regs->rip = infop->entry; -} - -#define ELF_NREG 27 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -/* - * Note that ELF_NREG should be 29 as there should be place for - * TRAPNO and ERR "registers" as well but linux doesn't dump - * those. - * - * See linux kernel: arch/x86/include/asm/elf.h - */ -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env) -{ - (*regs)[0] = env->regs[15]; - (*regs)[1] = env->regs[14]; - (*regs)[2] = env->regs[13]; - (*regs)[3] = env->regs[12]; - (*regs)[4] = env->regs[R_EBP]; - (*regs)[5] = env->regs[R_EBX]; - (*regs)[6] = env->regs[11]; - (*regs)[7] = env->regs[10]; - (*regs)[8] = env->regs[9]; - (*regs)[9] = env->regs[8]; - (*regs)[10] = env->regs[R_EAX]; - (*regs)[11] = env->regs[R_ECX]; - (*regs)[12] = env->regs[R_EDX]; - (*regs)[13] = env->regs[R_ESI]; - (*regs)[14] = env->regs[R_EDI]; - (*regs)[15] = env->regs[R_EAX]; /* XXX */ - (*regs)[16] = env->eip; - (*regs)[17] = env->segs[R_CS].selector & 0xffff; - (*regs)[18] = env->eflags; - (*regs)[19] = env->regs[R_ESP]; - (*regs)[20] = env->segs[R_SS].selector & 0xffff; - (*regs)[21] = env->segs[R_FS].selector & 0xffff; - (*regs)[22] = env->segs[R_GS].selector & 0xffff; - (*regs)[23] = env->segs[R_DS].selector & 0xffff; - (*regs)[24] = env->segs[R_ES].selector & 0xffff; - (*regs)[25] = env->segs[R_FS].selector & 0xffff; - (*regs)[26] = env->segs[R_GS].selector & 0xffff; -} - -#else - -#define ELF_START_MMAP 0x80000000 - -/* - * This is used to ensure we don't load something for the wrong architecture. - */ -#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) ) - -/* - * These are used to set parameters in the core dumps. - */ -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_386 - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->esp = infop->start_stack; - regs->eip = infop->entry; - - /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program - starts %edx contains a pointer to a function which might be - registered using `atexit'. This provides a mean for the - dynamic linker to call DT_FINI functions for shared libraries - that have been loaded before the code runs. - - A value of 0 tells we have no such handler. */ - regs->edx = 0; -} - -#define ELF_NREG 17 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -/* - * Note that ELF_NREG should be 19 as there should be place for - * TRAPNO and ERR "registers" as well but linux doesn't dump - * those. - * - * See linux kernel: arch/x86/include/asm/elf.h - */ -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env) -{ - (*regs)[0] = env->regs[R_EBX]; - (*regs)[1] = env->regs[R_ECX]; - (*regs)[2] = env->regs[R_EDX]; - (*regs)[3] = env->regs[R_ESI]; - (*regs)[4] = env->regs[R_EDI]; - (*regs)[5] = env->regs[R_EBP]; - (*regs)[6] = env->regs[R_EAX]; - (*regs)[7] = env->segs[R_DS].selector & 0xffff; - (*regs)[8] = env->segs[R_ES].selector & 0xffff; - (*regs)[9] = env->segs[R_FS].selector & 0xffff; - (*regs)[10] = env->segs[R_GS].selector & 0xffff; - (*regs)[11] = env->regs[R_EAX]; /* XXX */ - (*regs)[12] = env->eip; - (*regs)[13] = env->segs[R_CS].selector & 0xffff; - (*regs)[14] = env->eflags; - (*regs)[15] = env->regs[R_ESP]; - (*regs)[16] = env->segs[R_SS].selector & 0xffff; -} -#endif - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -#endif - -#ifdef TARGET_ARM - -#ifndef TARGET_AARCH64 -/* 32 bit ARM definitions */ - -#define ELF_START_MMAP 0x80000000 - -#define ELF_ARCH EM_ARM -#define ELF_CLASS ELFCLASS32 - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - abi_long stack = infop->start_stack; - memset(regs, 0, sizeof(*regs)); - - regs->ARM_cpsr = 0x10; - if (infop->entry & 1) - regs->ARM_cpsr |= CPSR_T; - regs->ARM_pc = infop->entry & 0xfffffffe; - regs->ARM_sp = infop->start_stack; - /* FIXME - what to for failure of get_user()? */ - get_user_ual(regs->ARM_r2, stack + 8); /* envp */ - get_user_ual(regs->ARM_r1, stack + 4); /* envp */ - /* XXX: it seems that r0 is zeroed after ! */ - regs->ARM_r0 = 0; - /* For uClinux PIC binaries. */ - /* XXX: Linux does this only on ARM with no MMU (do we care ?) */ - regs->ARM_r10 = infop->start_data; -} - -#define ELF_NREG 18 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUARMState *env) -{ - (*regs)[0] = tswapreg(env->regs[0]); - (*regs)[1] = tswapreg(env->regs[1]); - (*regs)[2] = tswapreg(env->regs[2]); - (*regs)[3] = tswapreg(env->regs[3]); - (*regs)[4] = tswapreg(env->regs[4]); - (*regs)[5] = tswapreg(env->regs[5]); - (*regs)[6] = tswapreg(env->regs[6]); - (*regs)[7] = tswapreg(env->regs[7]); - (*regs)[8] = tswapreg(env->regs[8]); - (*regs)[9] = tswapreg(env->regs[9]); - (*regs)[10] = tswapreg(env->regs[10]); - (*regs)[11] = tswapreg(env->regs[11]); - (*regs)[12] = tswapreg(env->regs[12]); - (*regs)[13] = tswapreg(env->regs[13]); - (*regs)[14] = tswapreg(env->regs[14]); - (*regs)[15] = tswapreg(env->regs[15]); - - (*regs)[16] = tswapreg(cpsr_read((CPUARMState *)env)); - (*regs)[17] = tswapreg(env->regs[0]); /* XXX */ -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -enum -{ - ARM_HWCAP_ARM_SWP = 1 << 0, - ARM_HWCAP_ARM_HALF = 1 << 1, - ARM_HWCAP_ARM_THUMB = 1 << 2, - ARM_HWCAP_ARM_26BIT = 1 << 3, - ARM_HWCAP_ARM_FAST_MULT = 1 << 4, - ARM_HWCAP_ARM_FPA = 1 << 5, - ARM_HWCAP_ARM_VFP = 1 << 6, - ARM_HWCAP_ARM_EDSP = 1 << 7, - ARM_HWCAP_ARM_JAVA = 1 << 8, - ARM_HWCAP_ARM_IWMMXT = 1 << 9, - ARM_HWCAP_ARM_CRUNCH = 1 << 10, - ARM_HWCAP_ARM_THUMBEE = 1 << 11, - ARM_HWCAP_ARM_NEON = 1 << 12, - ARM_HWCAP_ARM_VFPv3 = 1 << 13, - ARM_HWCAP_ARM_VFPv3D16 = 1 << 14, - ARM_HWCAP_ARM_TLS = 1 << 15, - ARM_HWCAP_ARM_VFPv4 = 1 << 16, - ARM_HWCAP_ARM_IDIVA = 1 << 17, - ARM_HWCAP_ARM_IDIVT = 1 << 18, - ARM_HWCAP_ARM_VFPD32 = 1 << 19, - ARM_HWCAP_ARM_LPAE = 1 << 20, - ARM_HWCAP_ARM_EVTSTRM = 1 << 21, -}; - -enum { - ARM_HWCAP2_ARM_AES = 1 << 0, - ARM_HWCAP2_ARM_PMULL = 1 << 1, - ARM_HWCAP2_ARM_SHA1 = 1 << 2, - ARM_HWCAP2_ARM_SHA2 = 1 << 3, - ARM_HWCAP2_ARM_CRC32 = 1 << 4, -}; - -/* The commpage only exists for 32 bit kernels */ - -#define TARGET_HAS_VALIDATE_GUEST_SPACE -/* Return 1 if the proposed guest space is suitable for the guest. - * Return 0 if the proposed guest space isn't suitable, but another - * address space should be tried. - * Return -1 if there is no way the proposed guest space can be - * valid regardless of the base. - * The guest code may leave a page mapped and populate it if the - * address is suitable. - */ -static int validate_guest_space(unsigned long guest_base, - unsigned long guest_size) -{ - unsigned long real_start, test_page_addr; - - /* We need to check that we can force a fault on access to the - * commpage at 0xffff0fxx - */ - test_page_addr = guest_base + (0xffff0f00 & qemu_host_page_mask); - - /* If the commpage lies within the already allocated guest space, - * then there is no way we can allocate it. - */ - if (test_page_addr >= guest_base - && test_page_addr <= (guest_base + guest_size)) { - return -1; - } - - /* Note it needs to be writeable to let us initialise it */ - real_start = (unsigned long) - mmap((void *)test_page_addr, qemu_host_page_size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - /* If we can't map it then try another address */ - if (real_start == -1ul) { - return 0; - } - - if (real_start != test_page_addr) { - /* OS didn't put the page where we asked - unmap and reject */ - munmap((void *)real_start, qemu_host_page_size); - return 0; - } - - /* Leave the page mapped - * Populate it (mmap should have left it all 0'd) - */ - - /* Kernel helper versions */ - __put_user(5, (uint32_t *)g2h(0xffff0ffcul)); - - /* Now it's populated make it RO */ - if (mprotect((void *)test_page_addr, qemu_host_page_size, PROT_READ)) { - perror("Protecting guest commpage"); - exit(-1); - } - - return 1; /* All good */ -} - -#define ELF_HWCAP get_elf_hwcap() -#define ELF_HWCAP2 get_elf_hwcap2() - -static uint32_t get_elf_hwcap(void) -{ - ARMCPU *cpu = ARM_CPU(thread_cpu); - uint32_t hwcaps = 0; - - hwcaps |= ARM_HWCAP_ARM_SWP; - hwcaps |= ARM_HWCAP_ARM_HALF; - hwcaps |= ARM_HWCAP_ARM_THUMB; - hwcaps |= ARM_HWCAP_ARM_FAST_MULT; - - /* probe for the extra features */ -#define GET_FEATURE(feat, hwcap) \ - do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0) - /* EDSP is in v5TE and above, but all our v5 CPUs are v5TE */ - GET_FEATURE(ARM_FEATURE_V5, ARM_HWCAP_ARM_EDSP); - GET_FEATURE(ARM_FEATURE_VFP, ARM_HWCAP_ARM_VFP); - GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT); - GET_FEATURE(ARM_FEATURE_THUMB2EE, ARM_HWCAP_ARM_THUMBEE); - GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON); - GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPv3); - GET_FEATURE(ARM_FEATURE_V6K, ARM_HWCAP_ARM_TLS); - GET_FEATURE(ARM_FEATURE_VFP4, ARM_HWCAP_ARM_VFPv4); - GET_FEATURE(ARM_FEATURE_ARM_DIV, ARM_HWCAP_ARM_IDIVA); - GET_FEATURE(ARM_FEATURE_THUMB_DIV, ARM_HWCAP_ARM_IDIVT); - /* All QEMU's VFPv3 CPUs have 32 registers, see VFP_DREG in translate.c. - * Note that the ARM_HWCAP_ARM_VFPv3D16 bit is always the inverse of - * ARM_HWCAP_ARM_VFPD32 (and so always clear for QEMU); it is unrelated - * to our VFP_FP16 feature bit. - */ - GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPD32); - GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE); - - return hwcaps; -} - -static uint32_t get_elf_hwcap2(void) -{ - ARMCPU *cpu = ARM_CPU(thread_cpu); - uint32_t hwcaps = 0; - - GET_FEATURE(ARM_FEATURE_V8_AES, ARM_HWCAP2_ARM_AES); - GET_FEATURE(ARM_FEATURE_V8_PMULL, ARM_HWCAP2_ARM_PMULL); - GET_FEATURE(ARM_FEATURE_V8_SHA1, ARM_HWCAP2_ARM_SHA1); - GET_FEATURE(ARM_FEATURE_V8_SHA256, ARM_HWCAP2_ARM_SHA2); - GET_FEATURE(ARM_FEATURE_CRC, ARM_HWCAP2_ARM_CRC32); - return hwcaps; -} - -#undef GET_FEATURE - -#else -/* 64 bit ARM definitions */ -#define ELF_START_MMAP 0x80000000 - -#define ELF_ARCH EM_AARCH64 -#define ELF_CLASS ELFCLASS64 -#define ELF_PLATFORM "aarch64" - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - abi_long stack = infop->start_stack; - memset(regs, 0, sizeof(*regs)); - - regs->pc = infop->entry & ~0x3ULL; - regs->sp = stack; -} - -#define ELF_NREG 34 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, - const CPUARMState *env) -{ - int i; - - for (i = 0; i < 32; i++) { - (*regs)[i] = tswapreg(env->xregs[i]); - } - (*regs)[32] = tswapreg(env->pc); - (*regs)[33] = tswapreg(pstate_read((CPUARMState *)env)); -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -enum { - ARM_HWCAP_A64_FP = 1 << 0, - ARM_HWCAP_A64_ASIMD = 1 << 1, - ARM_HWCAP_A64_EVTSTRM = 1 << 2, - ARM_HWCAP_A64_AES = 1 << 3, - ARM_HWCAP_A64_PMULL = 1 << 4, - ARM_HWCAP_A64_SHA1 = 1 << 5, - ARM_HWCAP_A64_SHA2 = 1 << 6, - ARM_HWCAP_A64_CRC32 = 1 << 7, -}; - -#define ELF_HWCAP get_elf_hwcap() - -static uint32_t get_elf_hwcap(void) -{ - ARMCPU *cpu = ARM_CPU(thread_cpu); - uint32_t hwcaps = 0; - - hwcaps |= ARM_HWCAP_A64_FP; - hwcaps |= ARM_HWCAP_A64_ASIMD; - - /* probe for the extra features */ -#define GET_FEATURE(feat, hwcap) \ - do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0) - GET_FEATURE(ARM_FEATURE_V8_AES, ARM_HWCAP_A64_AES); - GET_FEATURE(ARM_FEATURE_V8_PMULL, ARM_HWCAP_A64_PMULL); - GET_FEATURE(ARM_FEATURE_V8_SHA1, ARM_HWCAP_A64_SHA1); - GET_FEATURE(ARM_FEATURE_V8_SHA256, ARM_HWCAP_A64_SHA2); - GET_FEATURE(ARM_FEATURE_CRC, ARM_HWCAP_A64_CRC32); -#undef GET_FEATURE - - return hwcaps; -} - -#endif /* not TARGET_AARCH64 */ -#endif /* TARGET_ARM */ - -#ifdef TARGET_UNICORE32 - -#define ELF_START_MMAP 0x80000000 - -#define ELF_CLASS ELFCLASS32 -#define ELF_DATA ELFDATA2LSB -#define ELF_ARCH EM_UNICORE32 - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - abi_long stack = infop->start_stack; - memset(regs, 0, sizeof(*regs)); - regs->UC32_REG_asr = 0x10; - regs->UC32_REG_pc = infop->entry & 0xfffffffe; - regs->UC32_REG_sp = infop->start_stack; - /* FIXME - what to for failure of get_user()? */ - get_user_ual(regs->UC32_REG_02, stack + 8); /* envp */ - get_user_ual(regs->UC32_REG_01, stack + 4); /* envp */ - /* XXX: it seems that r0 is zeroed after ! */ - regs->UC32_REG_00 = 0; -} - -#define ELF_NREG 34 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUUniCore32State *env) -{ - (*regs)[0] = env->regs[0]; - (*regs)[1] = env->regs[1]; - (*regs)[2] = env->regs[2]; - (*regs)[3] = env->regs[3]; - (*regs)[4] = env->regs[4]; - (*regs)[5] = env->regs[5]; - (*regs)[6] = env->regs[6]; - (*regs)[7] = env->regs[7]; - (*regs)[8] = env->regs[8]; - (*regs)[9] = env->regs[9]; - (*regs)[10] = env->regs[10]; - (*regs)[11] = env->regs[11]; - (*regs)[12] = env->regs[12]; - (*regs)[13] = env->regs[13]; - (*regs)[14] = env->regs[14]; - (*regs)[15] = env->regs[15]; - (*regs)[16] = env->regs[16]; - (*regs)[17] = env->regs[17]; - (*regs)[18] = env->regs[18]; - (*regs)[19] = env->regs[19]; - (*regs)[20] = env->regs[20]; - (*regs)[21] = env->regs[21]; - (*regs)[22] = env->regs[22]; - (*regs)[23] = env->regs[23]; - (*regs)[24] = env->regs[24]; - (*regs)[25] = env->regs[25]; - (*regs)[26] = env->regs[26]; - (*regs)[27] = env->regs[27]; - (*regs)[28] = env->regs[28]; - (*regs)[29] = env->regs[29]; - (*regs)[30] = env->regs[30]; - (*regs)[31] = env->regs[31]; - - (*regs)[32] = cpu_asr_read((CPUUniCore32State *)env); - (*regs)[33] = env->regs[0]; /* XXX */ -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -#define ELF_HWCAP (UC32_HWCAP_CMOV | UC32_HWCAP_UCF64) - -#endif - -#ifdef TARGET_SPARC -#ifdef TARGET_SPARC64 - -#define ELF_START_MMAP 0x80000000 -#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \ - | HWCAP_SPARC_MULDIV | HWCAP_SPARC_V9) -#ifndef TARGET_ABI32 -#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS ) -#else -#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC ) -#endif - -#define ELF_CLASS ELFCLASS64 -#define ELF_ARCH EM_SPARCV9 - -#define STACK_BIAS 2047 - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ -#ifndef TARGET_ABI32 - regs->tstate = 0; -#endif - regs->pc = infop->entry; - regs->npc = regs->pc + 4; - regs->y = 0; -#ifdef TARGET_ABI32 - regs->u_regs[14] = infop->start_stack - 16 * 4; -#else - if (personality(infop->personality) == PER_LINUX32) - regs->u_regs[14] = infop->start_stack - 16 * 4; - else - regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS; -#endif -} - -#else -#define ELF_START_MMAP 0x80000000 -#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \ - | HWCAP_SPARC_MULDIV) - -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_SPARC - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->psr = 0; - regs->pc = infop->entry; - regs->npc = regs->pc + 4; - regs->y = 0; - regs->u_regs[14] = infop->start_stack - 16 * 4; -} - -#endif -#endif - -#ifdef TARGET_PPC - -#define ELF_MACHINE PPC_ELF_MACHINE -#define ELF_START_MMAP 0x80000000 - -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) - -#define elf_check_arch(x) ( (x) == EM_PPC64 ) - -#define ELF_CLASS ELFCLASS64 - -#else - -#define ELF_CLASS ELFCLASS32 - -#endif - -#define ELF_ARCH EM_PPC - -/* Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP). - See arch/powerpc/include/asm/cputable.h. */ -enum { - QEMU_PPC_FEATURE_32 = 0x80000000, - QEMU_PPC_FEATURE_64 = 0x40000000, - QEMU_PPC_FEATURE_601_INSTR = 0x20000000, - QEMU_PPC_FEATURE_HAS_ALTIVEC = 0x10000000, - QEMU_PPC_FEATURE_HAS_FPU = 0x08000000, - QEMU_PPC_FEATURE_HAS_MMU = 0x04000000, - QEMU_PPC_FEATURE_HAS_4xxMAC = 0x02000000, - QEMU_PPC_FEATURE_UNIFIED_CACHE = 0x01000000, - QEMU_PPC_FEATURE_HAS_SPE = 0x00800000, - QEMU_PPC_FEATURE_HAS_EFP_SINGLE = 0x00400000, - QEMU_PPC_FEATURE_HAS_EFP_DOUBLE = 0x00200000, - QEMU_PPC_FEATURE_NO_TB = 0x00100000, - QEMU_PPC_FEATURE_POWER4 = 0x00080000, - QEMU_PPC_FEATURE_POWER5 = 0x00040000, - QEMU_PPC_FEATURE_POWER5_PLUS = 0x00020000, - QEMU_PPC_FEATURE_CELL = 0x00010000, - QEMU_PPC_FEATURE_BOOKE = 0x00008000, - QEMU_PPC_FEATURE_SMT = 0x00004000, - QEMU_PPC_FEATURE_ICACHE_SNOOP = 0x00002000, - QEMU_PPC_FEATURE_ARCH_2_05 = 0x00001000, - QEMU_PPC_FEATURE_PA6T = 0x00000800, - QEMU_PPC_FEATURE_HAS_DFP = 0x00000400, - QEMU_PPC_FEATURE_POWER6_EXT = 0x00000200, - QEMU_PPC_FEATURE_ARCH_2_06 = 0x00000100, - QEMU_PPC_FEATURE_HAS_VSX = 0x00000080, - QEMU_PPC_FEATURE_PSERIES_PERFMON_COMPAT = 0x00000040, - - QEMU_PPC_FEATURE_TRUE_LE = 0x00000002, - QEMU_PPC_FEATURE_PPC_LE = 0x00000001, - - /* Feature definitions in AT_HWCAP2. */ - QEMU_PPC_FEATURE2_ARCH_2_07 = 0x80000000, /* ISA 2.07 */ - QEMU_PPC_FEATURE2_HAS_HTM = 0x40000000, /* Hardware Transactional Memory */ - QEMU_PPC_FEATURE2_HAS_DSCR = 0x20000000, /* Data Stream Control Register */ - QEMU_PPC_FEATURE2_HAS_EBB = 0x10000000, /* Event Base Branching */ - QEMU_PPC_FEATURE2_HAS_ISEL = 0x08000000, /* Integer Select */ - QEMU_PPC_FEATURE2_HAS_TAR = 0x04000000, /* Target Address Register */ -}; - -#define ELF_HWCAP get_elf_hwcap() - -static uint32_t get_elf_hwcap(void) -{ - PowerPCCPU *cpu = POWERPC_CPU(thread_cpu); - uint32_t features = 0; - - /* We don't have to be terribly complete here; the high points are - Altivec/FP/SPE support. Anything else is just a bonus. */ -#define GET_FEATURE(flag, feature) \ - do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) -#define GET_FEATURE2(flag, feature) \ - do { if (cpu->env.insns_flags2 & flag) { features |= feature; } } while (0) - GET_FEATURE(PPC_64B, QEMU_PPC_FEATURE_64); - GET_FEATURE(PPC_FLOAT, QEMU_PPC_FEATURE_HAS_FPU); - GET_FEATURE(PPC_ALTIVEC, QEMU_PPC_FEATURE_HAS_ALTIVEC); - GET_FEATURE(PPC_SPE, QEMU_PPC_FEATURE_HAS_SPE); - GET_FEATURE(PPC_SPE_SINGLE, QEMU_PPC_FEATURE_HAS_EFP_SINGLE); - GET_FEATURE(PPC_SPE_DOUBLE, QEMU_PPC_FEATURE_HAS_EFP_DOUBLE); - GET_FEATURE(PPC_BOOKE, QEMU_PPC_FEATURE_BOOKE); - GET_FEATURE(PPC_405_MAC, QEMU_PPC_FEATURE_HAS_4xxMAC); - GET_FEATURE2(PPC2_DFP, QEMU_PPC_FEATURE_HAS_DFP); - GET_FEATURE2(PPC2_VSX, QEMU_PPC_FEATURE_HAS_VSX); - GET_FEATURE2((PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | PPC2_ATOMIC_ISA206 | - PPC2_FP_CVT_ISA206 | PPC2_FP_TST_ISA206), - QEMU_PPC_FEATURE_ARCH_2_06); -#undef GET_FEATURE -#undef GET_FEATURE2 - - return features; -} - -#define ELF_HWCAP2 get_elf_hwcap2() - -static uint32_t get_elf_hwcap2(void) -{ - PowerPCCPU *cpu = POWERPC_CPU(thread_cpu); - uint32_t features = 0; - -#define GET_FEATURE(flag, feature) \ - do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) -#define GET_FEATURE2(flag, feature) \ - do { if (cpu->env.insns_flags2 & flag) { features |= feature; } } while (0) - - GET_FEATURE(PPC_ISEL, QEMU_PPC_FEATURE2_HAS_ISEL); - GET_FEATURE2(PPC2_BCTAR_ISA207, QEMU_PPC_FEATURE2_HAS_TAR); - GET_FEATURE2((PPC2_BCTAR_ISA207 | PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 | - PPC2_ISA207S), QEMU_PPC_FEATURE2_ARCH_2_07); - -#undef GET_FEATURE -#undef GET_FEATURE2 - - return features; -} - -/* - * The requirements here are: - * - keep the final alignment of sp (sp & 0xf) - * - make sure the 32-bit value at the first 16 byte aligned position of - * AUXV is greater than 16 for glibc compatibility. - * AT_IGNOREPPC is used for that. - * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC, - * even if DLINFO_ARCH_ITEMS goes to zero or is undefined. - */ -#define DLINFO_ARCH_ITEMS 5 -#define ARCH_DLINFO \ - do { \ - PowerPCCPU *cpu = POWERPC_CPU(thread_cpu); \ - NEW_AUX_ENT(AT_DCACHEBSIZE, cpu->env.dcache_line_size); \ - NEW_AUX_ENT(AT_ICACHEBSIZE, cpu->env.icache_line_size); \ - NEW_AUX_ENT(AT_UCACHEBSIZE, 0); \ - /* \ - * Now handle glibc compatibility. \ - */ \ - NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ - NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ - } while (0) - -static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop) -{ - _regs->gpr[1] = infop->start_stack; -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) - if (get_ppc64_abi(infop) < 2) { - uint64_t val; - get_user_u64(val, infop->entry + 8); - _regs->gpr[2] = val + infop->load_bias; - get_user_u64(val, infop->entry); - infop->entry = val + infop->load_bias; - } else { - _regs->gpr[12] = infop->entry; /* r12 set to global entry address */ - } -#endif - _regs->nip = infop->entry; -} - -/* See linux kernel: arch/powerpc/include/asm/elf.h. */ -#define ELF_NREG 48 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *env) -{ - int i; - target_ulong ccr = 0; - - for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { - (*regs)[i] = tswapreg(env->gpr[i]); - } - - (*regs)[32] = tswapreg(env->nip); - (*regs)[33] = tswapreg(env->msr); - (*regs)[35] = tswapreg(env->ctr); - (*regs)[36] = tswapreg(env->lr); - (*regs)[37] = tswapreg(env->xer); - - for (i = 0; i < ARRAY_SIZE(env->crf); i++) { - ccr |= env->crf[i] << (32 - ((i + 1) * 4)); - } - (*regs)[38] = tswapreg(ccr); -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -#endif - -#ifdef TARGET_MIPS - -#define ELF_START_MMAP 0x80000000 - -#ifdef TARGET_MIPS64 -#define ELF_CLASS ELFCLASS64 -#else -#define ELF_CLASS ELFCLASS32 -#endif -#define ELF_ARCH EM_MIPS - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->cp0_status = 2 << CP0St_KSU; - regs->cp0_epc = infop->entry; - regs->regs[29] = infop->start_stack; -} - -/* See linux kernel: arch/mips/include/asm/elf.h. */ -#define ELF_NREG 45 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -/* See linux kernel: arch/mips/include/asm/reg.h. */ -enum { -#ifdef TARGET_MIPS64 - TARGET_EF_R0 = 0, -#else - TARGET_EF_R0 = 6, -#endif - TARGET_EF_R26 = TARGET_EF_R0 + 26, - TARGET_EF_R27 = TARGET_EF_R0 + 27, - TARGET_EF_LO = TARGET_EF_R0 + 32, - TARGET_EF_HI = TARGET_EF_R0 + 33, - TARGET_EF_CP0_EPC = TARGET_EF_R0 + 34, - TARGET_EF_CP0_BADVADDR = TARGET_EF_R0 + 35, - TARGET_EF_CP0_STATUS = TARGET_EF_R0 + 36, - TARGET_EF_CP0_CAUSE = TARGET_EF_R0 + 37 -}; - -/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs. */ -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMIPSState *env) -{ - int i; - - for (i = 0; i < TARGET_EF_R0; i++) { - (*regs)[i] = 0; - } - (*regs)[TARGET_EF_R0] = 0; - - for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) { - (*regs)[TARGET_EF_R0 + i] = tswapreg(env->active_tc.gpr[i]); - } - - (*regs)[TARGET_EF_R26] = 0; - (*regs)[TARGET_EF_R27] = 0; - (*regs)[TARGET_EF_LO] = tswapreg(env->active_tc.LO[0]); - (*regs)[TARGET_EF_HI] = tswapreg(env->active_tc.HI[0]); - (*regs)[TARGET_EF_CP0_EPC] = tswapreg(env->active_tc.PC); - (*regs)[TARGET_EF_CP0_BADVADDR] = tswapreg(env->CP0_BadVAddr); - (*regs)[TARGET_EF_CP0_STATUS] = tswapreg(env->CP0_Status); - (*regs)[TARGET_EF_CP0_CAUSE] = tswapreg(env->CP0_Cause); -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -#endif /* TARGET_MIPS */ - -#ifdef TARGET_MICROBLAZE - -#define ELF_START_MMAP 0x80000000 - -#define elf_check_arch(x) ( (x) == EM_MICROBLAZE || (x) == EM_MICROBLAZE_OLD) - -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_MICROBLAZE - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->pc = infop->entry; - regs->r1 = infop->start_stack; - -} - -#define ELF_EXEC_PAGESIZE 4096 - -#define USE_ELF_CORE_DUMP -#define ELF_NREG 38 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs. */ -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMBState *env) -{ - int i, pos = 0; - - for (i = 0; i < 32; i++) { - (*regs)[pos++] = tswapreg(env->regs[i]); - } - - for (i = 0; i < 6; i++) { - (*regs)[pos++] = tswapreg(env->sregs[i]); - } -} - -#endif /* TARGET_MICROBLAZE */ - -#ifdef TARGET_OPENRISC - -#define ELF_START_MMAP 0x08000000 - -#define ELF_ARCH EM_OPENRISC -#define ELF_CLASS ELFCLASS32 -#define ELF_DATA ELFDATA2MSB - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->pc = infop->entry; - regs->gpr[1] = infop->start_stack; -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 8192 - -/* See linux kernel arch/openrisc/include/asm/elf.h. */ -#define ELF_NREG 34 /* gprs and pc, sr */ -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, - const CPUOpenRISCState *env) -{ - int i; - - for (i = 0; i < 32; i++) { - (*regs)[i] = tswapreg(env->gpr[i]); - } - - (*regs)[32] = tswapreg(env->pc); - (*regs)[33] = tswapreg(env->sr); -} -#define ELF_HWCAP 0 -#define ELF_PLATFORM NULL - -#endif /* TARGET_OPENRISC */ - -#ifdef TARGET_SH4 - -#define ELF_START_MMAP 0x80000000 - -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_SH - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - /* Check other registers XXXXX */ - regs->pc = infop->entry; - regs->regs[15] = infop->start_stack; -} - -/* See linux kernel: arch/sh/include/asm/elf.h. */ -#define ELF_NREG 23 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -/* See linux kernel: arch/sh/include/asm/ptrace.h. */ -enum { - TARGET_REG_PC = 16, - TARGET_REG_PR = 17, - TARGET_REG_SR = 18, - TARGET_REG_GBR = 19, - TARGET_REG_MACH = 20, - TARGET_REG_MACL = 21, - TARGET_REG_SYSCALL = 22 -}; - -static inline void elf_core_copy_regs(target_elf_gregset_t *regs, - const CPUSH4State *env) -{ - int i; - - for (i = 0; i < 16; i++) { - (*regs[i]) = tswapreg(env->gregs[i]); - } - - (*regs)[TARGET_REG_PC] = tswapreg(env->pc); - (*regs)[TARGET_REG_PR] = tswapreg(env->pr); - (*regs)[TARGET_REG_SR] = tswapreg(env->sr); - (*regs)[TARGET_REG_GBR] = tswapreg(env->gbr); - (*regs)[TARGET_REG_MACH] = tswapreg(env->mach); - (*regs)[TARGET_REG_MACL] = tswapreg(env->macl); - (*regs)[TARGET_REG_SYSCALL] = 0; /* FIXME */ -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 4096 - -enum { - SH_CPU_HAS_FPU = 0x0001, /* Hardware FPU support */ - SH_CPU_HAS_P2_FLUSH_BUG = 0x0002, /* Need to flush the cache in P2 area */ - SH_CPU_HAS_MMU_PAGE_ASSOC = 0x0004, /* SH3: TLB way selection bit support */ - SH_CPU_HAS_DSP = 0x0008, /* SH-DSP: DSP support */ - SH_CPU_HAS_PERF_COUNTER = 0x0010, /* Hardware performance counters */ - SH_CPU_HAS_PTEA = 0x0020, /* PTEA register */ - SH_CPU_HAS_LLSC = 0x0040, /* movli.l/movco.l */ - SH_CPU_HAS_L2_CACHE = 0x0080, /* Secondary cache / URAM */ - SH_CPU_HAS_OP32 = 0x0100, /* 32-bit instruction support */ - SH_CPU_HAS_PTEAEX = 0x0200, /* PTE ASID Extension support */ -}; - -#define ELF_HWCAP get_elf_hwcap() - -static uint32_t get_elf_hwcap(void) -{ - SuperHCPU *cpu = SUPERH_CPU(thread_cpu); - uint32_t hwcap = 0; - - hwcap |= SH_CPU_HAS_FPU; - - if (cpu->env.features & SH_FEATURE_SH4A) { - hwcap |= SH_CPU_HAS_LLSC; - } - - return hwcap; -} - -#endif - -#ifdef TARGET_CRIS - -#define ELF_START_MMAP 0x80000000 - -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_CRIS - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->erp = infop->entry; -} - -#define ELF_EXEC_PAGESIZE 8192 - -#endif - -#ifdef TARGET_M68K - -#define ELF_START_MMAP 0x80000000 - -#define ELF_CLASS ELFCLASS32 -#define ELF_ARCH EM_68K - -/* ??? Does this need to do anything? - #define ELF_PLAT_INIT(_r) */ - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->usp = infop->start_stack; - regs->sr = 0; - regs->pc = infop->entry; -} - -/* See linux kernel: arch/m68k/include/asm/elf.h. */ -#define ELF_NREG 20 -typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; - -static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUM68KState *env) -{ - (*regs)[0] = tswapreg(env->dregs[1]); - (*regs)[1] = tswapreg(env->dregs[2]); - (*regs)[2] = tswapreg(env->dregs[3]); - (*regs)[3] = tswapreg(env->dregs[4]); - (*regs)[4] = tswapreg(env->dregs[5]); - (*regs)[5] = tswapreg(env->dregs[6]); - (*regs)[6] = tswapreg(env->dregs[7]); - (*regs)[7] = tswapreg(env->aregs[0]); - (*regs)[8] = tswapreg(env->aregs[1]); - (*regs)[9] = tswapreg(env->aregs[2]); - (*regs)[10] = tswapreg(env->aregs[3]); - (*regs)[11] = tswapreg(env->aregs[4]); - (*regs)[12] = tswapreg(env->aregs[5]); - (*regs)[13] = tswapreg(env->aregs[6]); - (*regs)[14] = tswapreg(env->dregs[0]); - (*regs)[15] = tswapreg(env->aregs[7]); - (*regs)[16] = tswapreg(env->dregs[0]); /* FIXME: orig_d0 */ - (*regs)[17] = tswapreg(env->sr); - (*regs)[18] = tswapreg(env->pc); - (*regs)[19] = 0; /* FIXME: regs->format | regs->vector */ -} - -#define USE_ELF_CORE_DUMP -#define ELF_EXEC_PAGESIZE 8192 - -#endif - -#ifdef TARGET_ALPHA - -#define ELF_START_MMAP (0x30000000000ULL) - -#define ELF_CLASS ELFCLASS64 -#define ELF_ARCH EM_ALPHA - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->pc = infop->entry; - regs->ps = 8; - regs->usp = infop->start_stack; -} - -#define ELF_EXEC_PAGESIZE 8192 - -#endif /* TARGET_ALPHA */ - -#ifdef TARGET_S390X - -#define ELF_START_MMAP (0x20000000000ULL) - -#define ELF_CLASS ELFCLASS64 -#define ELF_DATA ELFDATA2MSB -#define ELF_ARCH EM_S390 - -static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop) -{ - regs->psw.addr = infop->entry; - regs->psw.mask = PSW_MASK_64 | PSW_MASK_32; - regs->gprs[15] = infop->start_stack; -} - -#endif /* TARGET_S390X */ - -#ifdef TARGET_TILEGX - -/* 42 bits real used address, a half for user mode */ -#define ELF_START_MMAP (0x00000020000000000ULL) - -#define elf_check_arch(x) ((x) == EM_TILEGX) - -#define ELF_CLASS ELFCLASS64 -#define ELF_DATA ELFDATA2LSB -#define ELF_ARCH EM_TILEGX - -static inline void init_thread(struct target_pt_regs *regs, - struct image_info *infop) -{ - regs->pc = infop->entry; - regs->sp = infop->start_stack; - -} - -#define ELF_EXEC_PAGESIZE 65536 /* TILE-Gx page size is 64KB */ - -#endif /* TARGET_TILEGX */ - -#ifndef ELF_PLATFORM -#define ELF_PLATFORM (NULL) -#endif - -#ifndef ELF_MACHINE -#define ELF_MACHINE ELF_ARCH -#endif - -#ifndef elf_check_arch -#define elf_check_arch(x) ((x) == ELF_ARCH) -#endif - -#ifndef ELF_HWCAP -#define ELF_HWCAP 0 -#endif - -#ifdef TARGET_ABI32 -#undef ELF_CLASS -#define ELF_CLASS ELFCLASS32 -#undef bswaptls -#define bswaptls(ptr) bswap32s(ptr) -#endif - -#include "elf.h" - -struct exec -{ - unsigned int a_info; /* Use macros N_MAGIC, etc for access */ - unsigned int a_text; /* length of text, in bytes */ - unsigned int a_data; /* length of data, in bytes */ - unsigned int a_bss; /* length of uninitialized data area, in bytes */ - unsigned int a_syms; /* length of symbol table data in file, in bytes */ - unsigned int a_entry; /* start address */ - unsigned int a_trsize; /* length of relocation info for text, in bytes */ - unsigned int a_drsize; /* length of relocation info for data, in bytes */ -}; - - -#define N_MAGIC(exec) ((exec).a_info & 0xffff) -#define OMAGIC 0407 -#define NMAGIC 0410 -#define ZMAGIC 0413 -#define QMAGIC 0314 - -/* Necessary parameters */ -#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE -#define TARGET_ELF_PAGESTART(_v) ((_v) & \ - ~(abi_ulong)(TARGET_ELF_EXEC_PAGESIZE-1)) -#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1)) - -#define DLINFO_ITEMS 14 - -static inline void memcpy_fromfs(void * to, const void * from, unsigned long n) -{ - memcpy(to, from, n); -} - -#ifdef BSWAP_NEEDED -static void bswap_ehdr(struct elfhdr *ehdr) -{ - bswap16s(&ehdr->e_type); /* Object file type */ - bswap16s(&ehdr->e_machine); /* Architecture */ - bswap32s(&ehdr->e_version); /* Object file version */ - bswaptls(&ehdr->e_entry); /* Entry point virtual address */ - bswaptls(&ehdr->e_phoff); /* Program header table file offset */ - bswaptls(&ehdr->e_shoff); /* Section header table file offset */ - bswap32s(&ehdr->e_flags); /* Processor-specific flags */ - bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */ - bswap16s(&ehdr->e_phentsize); /* Program header table entry size */ - bswap16s(&ehdr->e_phnum); /* Program header table entry count */ - bswap16s(&ehdr->e_shentsize); /* Section header table entry size */ - bswap16s(&ehdr->e_shnum); /* Section header table entry count */ - bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ -} - -static void bswap_phdr(struct elf_phdr *phdr, int phnum) -{ - int i; - for (i = 0; i < phnum; ++i, ++phdr) { - bswap32s(&phdr->p_type); /* Segment type */ - bswap32s(&phdr->p_flags); /* Segment flags */ - bswaptls(&phdr->p_offset); /* Segment file offset */ - bswaptls(&phdr->p_vaddr); /* Segment virtual address */ - bswaptls(&phdr->p_paddr); /* Segment physical address */ - bswaptls(&phdr->p_filesz); /* Segment size in file */ - bswaptls(&phdr->p_memsz); /* Segment size in memory */ - bswaptls(&phdr->p_align); /* Segment alignment */ - } -} - -static void bswap_shdr(struct elf_shdr *shdr, int shnum) -{ - int i; - for (i = 0; i < shnum; ++i, ++shdr) { - bswap32s(&shdr->sh_name); - bswap32s(&shdr->sh_type); - bswaptls(&shdr->sh_flags); - bswaptls(&shdr->sh_addr); - bswaptls(&shdr->sh_offset); - bswaptls(&shdr->sh_size); - bswap32s(&shdr->sh_link); - bswap32s(&shdr->sh_info); - bswaptls(&shdr->sh_addralign); - bswaptls(&shdr->sh_entsize); - } -} - -static void bswap_sym(struct elf_sym *sym) -{ - bswap32s(&sym->st_name); - bswaptls(&sym->st_value); - bswaptls(&sym->st_size); - bswap16s(&sym->st_shndx); -} -#else -static inline void bswap_ehdr(struct elfhdr *ehdr) { } -static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { } -static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { } -static inline void bswap_sym(struct elf_sym *sym) { } -#endif - -#ifdef USE_ELF_CORE_DUMP -static int elf_core_dump(int, const CPUArchState *); -#endif /* USE_ELF_CORE_DUMP */ -static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias); - -/* Verify the portions of EHDR within E_IDENT for the target. - This can be performed before bswapping the entire header. */ -static bool elf_check_ident(struct elfhdr *ehdr) -{ - return (ehdr->e_ident[EI_MAG0] == ELFMAG0 - && ehdr->e_ident[EI_MAG1] == ELFMAG1 - && ehdr->e_ident[EI_MAG2] == ELFMAG2 - && ehdr->e_ident[EI_MAG3] == ELFMAG3 - && ehdr->e_ident[EI_CLASS] == ELF_CLASS - && ehdr->e_ident[EI_DATA] == ELF_DATA - && ehdr->e_ident[EI_VERSION] == EV_CURRENT); -} - -/* Verify the portions of EHDR outside of E_IDENT for the target. - This has to wait until after bswapping the header. */ -static bool elf_check_ehdr(struct elfhdr *ehdr) -{ - return (elf_check_arch(ehdr->e_machine) - && ehdr->e_ehsize == sizeof(struct elfhdr) - && ehdr->e_phentsize == sizeof(struct elf_phdr) - && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)); -} - -/* - * 'copy_elf_strings()' copies argument/envelope strings from user - * memory to free pages in kernel mem. These are in a format ready - * to be put directly into the top of new user memory. - * - */ -static abi_ulong copy_elf_strings(int argc, char **argv, char *scratch, - abi_ulong p, abi_ulong stack_limit) -{ - char *tmp; - int len, offset; - abi_ulong top = p; - - if (!p) { - return 0; /* bullet-proofing */ - } - - offset = ((p - 1) % TARGET_PAGE_SIZE) + 1; - - while (argc-- > 0) { - tmp = argv[argc]; - if (!tmp) { - fprintf(stderr, "VFS: argc is wrong"); - exit(-1); - } - len = strlen(tmp) + 1; - tmp += len; - - if (len > (p - stack_limit)) { - return 0; - } - while (len) { - int bytes_to_copy = (len > offset) ? offset : len; - tmp -= bytes_to_copy; - p -= bytes_to_copy; - offset -= bytes_to_copy; - len -= bytes_to_copy; - - memcpy_fromfs(scratch + offset, tmp, bytes_to_copy); - - if (offset == 0) { - memcpy_to_target(p, scratch, top - p); - top = p; - offset = TARGET_PAGE_SIZE; - } - } - } - if (offset) { - memcpy_to_target(p, scratch + offset, top - p); - } - - return p; -} - -/* Older linux kernels provide up to MAX_ARG_PAGES (default: 32) of - * argument/environment space. Newer kernels (>2.6.33) allow more, - * dependent on stack size, but guarantee at least 32 pages for - * backwards compatibility. - */ -#define STACK_LOWER_LIMIT (32 * TARGET_PAGE_SIZE) - -static abi_ulong setup_arg_pages(struct linux_binprm *bprm, - struct image_info *info) -{ - abi_ulong size, error, guard; - - size = guest_stack_size; - if (size < STACK_LOWER_LIMIT) { - size = STACK_LOWER_LIMIT; - } - guard = TARGET_PAGE_SIZE; - if (guard < qemu_real_host_page_size) { - guard = qemu_real_host_page_size; - } - - error = target_mmap(0, size + guard, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (error == -1) { - perror("mmap stack"); - exit(-1); - } - - /* We reserve one extra page at the top of the stack as guard. */ - target_mprotect(error, guard, PROT_NONE); - - info->stack_limit = error + guard; - - return info->stack_limit + size - sizeof(void *); -} - -/* Map and zero the bss. We need to explicitly zero any fractional pages - after the data section (i.e. bss). */ -static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot) -{ - uintptr_t host_start, host_map_start, host_end; - - last_bss = TARGET_PAGE_ALIGN(last_bss); - - /* ??? There is confusion between qemu_real_host_page_size and - qemu_host_page_size here and elsewhere in target_mmap, which - may lead to the end of the data section mapping from the file - not being mapped. At least there was an explicit test and - comment for that here, suggesting that "the file size must - be known". The comment probably pre-dates the introduction - of the fstat system call in target_mmap which does in fact - find out the size. What isn't clear is if the workaround - here is still actually needed. For now, continue with it, - but merge it with the "normal" mmap that would allocate the bss. */ - - host_start = (uintptr_t) g2h(elf_bss); - host_end = (uintptr_t) g2h(last_bss); - host_map_start = REAL_HOST_PAGE_ALIGN(host_start); - - if (host_map_start < host_end) { - void *p = mmap((void *)host_map_start, host_end - host_map_start, - prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED) { - perror("cannot mmap brk"); - exit(-1); - } - } - - /* Ensure that the bss page(s) are valid */ - if ((page_get_flags(last_bss-1) & prot) != prot) { - page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss, prot | PAGE_VALID); - } - - if (host_start < host_map_start) { - memset((void *)host_start, 0, host_map_start - host_start); - } -} - -#ifdef CONFIG_USE_FDPIC -static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp) -{ - uint16_t n; - struct elf32_fdpic_loadseg *loadsegs = info->loadsegs; - - /* elf32_fdpic_loadseg */ - n = info->nsegs; - while (n--) { - sp -= 12; - put_user_u32(loadsegs[n].addr, sp+0); - put_user_u32(loadsegs[n].p_vaddr, sp+4); - put_user_u32(loadsegs[n].p_memsz, sp+8); - } - - /* elf32_fdpic_loadmap */ - sp -= 4; - put_user_u16(0, sp+0); /* version */ - put_user_u16(info->nsegs, sp+2); /* nsegs */ - - info->personality = PER_LINUX_FDPIC; - info->loadmap_addr = sp; - - return sp; -} -#endif - -static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, - struct elfhdr *exec, - struct image_info *info, - struct image_info *interp_info) -{ - abi_ulong sp; - abi_ulong sp_auxv; - int size; - int i; - abi_ulong u_rand_bytes; - uint8_t k_rand_bytes[16]; - abi_ulong u_platform; - const char *k_platform; - const int n = sizeof(elf_addr_t); - - sp = p; - -#ifdef CONFIG_USE_FDPIC - /* Needs to be before we load the env/argc/... */ - if (elf_is_fdpic(exec)) { - /* Need 4 byte alignment for these structs */ - sp &= ~3; - sp = loader_build_fdpic_loadmap(info, sp); - info->other_info = interp_info; - if (interp_info) { - interp_info->other_info = info; - sp = loader_build_fdpic_loadmap(interp_info, sp); - } - } -#endif - - u_platform = 0; - k_platform = ELF_PLATFORM; - if (k_platform) { - size_t len = strlen(k_platform) + 1; - sp -= (len + n - 1) & ~(n - 1); - u_platform = sp; - /* FIXME - check return value of memcpy_to_target() for failure */ - memcpy_to_target(sp, k_platform, len); - } - - /* - * Generate 16 random bytes for userspace PRNG seeding (not - * cryptically secure but it's not the aim of QEMU). - */ - for (i = 0; i < 16; i++) { - k_rand_bytes[i] = rand(); - } - sp -= 16; - u_rand_bytes = sp; - /* FIXME - check return value of memcpy_to_target() for failure */ - memcpy_to_target(sp, k_rand_bytes, 16); - - /* - * Force 16 byte _final_ alignment here for generality. - */ - sp = sp &~ (abi_ulong)15; - size = (DLINFO_ITEMS + 1) * 2; - if (k_platform) - size += 2; -#ifdef DLINFO_ARCH_ITEMS - size += DLINFO_ARCH_ITEMS * 2; -#endif -#ifdef ELF_HWCAP2 - size += 2; -#endif - size += envc + argc + 2; - size += 1; /* argc itself */ - size *= n; - if (size & 15) - sp -= 16 - (size & 15); - - /* This is correct because Linux defines - * elf_addr_t as Elf32_Off / Elf64_Off - */ -#define NEW_AUX_ENT(id, val) do { \ - sp -= n; put_user_ual(val, sp); \ - sp -= n; put_user_ual(id, sp); \ - } while(0) - - sp_auxv = sp; - NEW_AUX_ENT (AT_NULL, 0); - - /* There must be exactly DLINFO_ITEMS entries here. */ - NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff)); - NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr))); - NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum)); - NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(MAX(TARGET_PAGE_SIZE, getpagesize()))); - NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0)); - NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0); - NEW_AUX_ENT(AT_ENTRY, info->entry); - NEW_AUX_ENT(AT_UID, (abi_ulong) getuid()); - NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid()); - NEW_AUX_ENT(AT_GID, (abi_ulong) getgid()); - NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid()); - NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP); - NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK)); - NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes); - -#ifdef ELF_HWCAP2 - NEW_AUX_ENT(AT_HWCAP2, (abi_ulong) ELF_HWCAP2); -#endif - - if (k_platform) - NEW_AUX_ENT(AT_PLATFORM, u_platform); -#ifdef ARCH_DLINFO - /* - * ARCH_DLINFO must come last so platform specific code can enforce - * special alignment requirements on the AUXV if necessary (eg. PPC). - */ - ARCH_DLINFO; -#endif -#undef NEW_AUX_ENT - - info->saved_auxv = sp; - info->auxv_len = sp_auxv - sp; - - sp = loader_build_argptr(envc, argc, sp, p, 0); - /* Check the right amount of stack was allocated for auxvec, envp & argv. */ - assert(sp_auxv - sp == size); - return sp; -} - -#ifndef TARGET_HAS_VALIDATE_GUEST_SPACE -/* If the guest doesn't have a validation function just agree */ -static int validate_guest_space(unsigned long guest_base, - unsigned long guest_size) -{ - return 1; -} -#endif - -unsigned long init_guest_space(unsigned long host_start, - unsigned long host_size, - unsigned long guest_start, - bool fixed) -{ - unsigned long current_start, real_start; - int flags; - - assert(host_start || host_size); - - /* If just a starting address is given, then just verify that - * address. */ - if (host_start && !host_size) { - if (validate_guest_space(host_start, host_size) == 1) { - return host_start; - } else { - return (unsigned long)-1; - } - } - - /* Setup the initial flags and start address. */ - current_start = host_start & qemu_host_page_mask; - flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE; - if (fixed) { - flags |= MAP_FIXED; - } - - /* Otherwise, a non-zero size region of memory needs to be mapped - * and validated. */ - while (1) { - unsigned long real_size = host_size; - - /* Do not use mmap_find_vma here because that is limited to the - * guest address space. We are going to make the - * guest address space fit whatever we're given. - */ - real_start = (unsigned long) - mmap((void *)current_start, host_size, PROT_NONE, flags, -1, 0); - if (real_start == (unsigned long)-1) { - return (unsigned long)-1; - } - - /* Ensure the address is properly aligned. */ - if (real_start & ~qemu_host_page_mask) { - munmap((void *)real_start, host_size); - real_size = host_size + qemu_host_page_size; - real_start = (unsigned long) - mmap((void *)real_start, real_size, PROT_NONE, flags, -1, 0); - if (real_start == (unsigned long)-1) { - return (unsigned long)-1; - } - real_start = HOST_PAGE_ALIGN(real_start); - } - - /* Check to see if the address is valid. */ - if (!host_start || real_start == current_start) { - int valid = validate_guest_space(real_start - guest_start, - real_size); - if (valid == 1) { - break; - } else if (valid == -1) { - return (unsigned long)-1; - } - /* valid == 0, so try again. */ - } - - /* That address didn't work. Unmap and try a different one. - * The address the host picked because is typically right at - * the top of the host address space and leaves the guest with - * no usable address space. Resort to a linear search. We - * already compensated for mmap_min_addr, so this should not - * happen often. Probably means we got unlucky and host - * address space randomization put a shared library somewhere - * inconvenient. - */ - munmap((void *)real_start, host_size); - current_start += qemu_host_page_size; - if (host_start == current_start) { - /* Theoretically possible if host doesn't have any suitably - * aligned areas. Normally the first mmap will fail. - */ - return (unsigned long)-1; - } - } - - qemu_log_mask(CPU_LOG_PAGE, "Reserved 0x%lx bytes of guest address space\n", host_size); - - return real_start; -} - -static void probe_guest_base(const char *image_name, - abi_ulong loaddr, abi_ulong hiaddr) -{ - /* Probe for a suitable guest base address, if the user has not set - * it explicitly, and set guest_base appropriately. - * In case of error we will print a suitable message and exit. - */ - const char *errmsg; - if (!have_guest_base && !reserved_va) { - unsigned long host_start, real_start, host_size; - - /* Round addresses to page boundaries. */ - loaddr &= qemu_host_page_mask; - hiaddr = HOST_PAGE_ALIGN(hiaddr); - - if (loaddr < mmap_min_addr) { - host_start = HOST_PAGE_ALIGN(mmap_min_addr); - } else { - host_start = loaddr; - if (host_start != loaddr) { - errmsg = "Address overflow loading ELF binary"; - goto exit_errmsg; - } - } - host_size = hiaddr - loaddr; - - /* Setup the initial guest memory space with ranges gleaned from - * the ELF image that is being loaded. - */ - real_start = init_guest_space(host_start, host_size, loaddr, false); - if (real_start == (unsigned long)-1) { - errmsg = "Unable to find space for application"; - goto exit_errmsg; - } - guest_base = real_start - loaddr; - - qemu_log_mask(CPU_LOG_PAGE, "Relocating guest address space from 0x" - TARGET_ABI_FMT_lx " to 0x%lx\n", - loaddr, real_start); - } - return; - -exit_errmsg: - fprintf(stderr, "%s: %s\n", image_name, errmsg); - exit(-1); -} - - -/* Load an ELF image into the address space. - - IMAGE_NAME is the filename of the image, to use in error messages. - IMAGE_FD is the open file descriptor for the image. - - BPRM_BUF is a copy of the beginning of the file; this of course - contains the elf file header at offset 0. It is assumed that this - buffer is sufficiently aligned to present no problems to the host - in accessing data at aligned offsets within the buffer. - - On return: INFO values will be filled in, as necessary or available. */ - -static void load_elf_image(const char *image_name, int image_fd, - struct image_info *info, char **pinterp_name, - char bprm_buf[BPRM_BUF_SIZE]) -{ - struct elfhdr *ehdr = (struct elfhdr *)bprm_buf; - struct elf_phdr *phdr; - abi_ulong load_addr, load_bias, loaddr, hiaddr, error; - int i, retval; - const char *errmsg; - - /* First of all, some simple consistency checks */ - errmsg = "Invalid ELF image for this architecture"; - if (!elf_check_ident(ehdr)) { - goto exit_errmsg; - } - bswap_ehdr(ehdr); - if (!elf_check_ehdr(ehdr)) { - goto exit_errmsg; - } - - i = ehdr->e_phnum * sizeof(struct elf_phdr); - if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) { - phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff); - } else { - phdr = (struct elf_phdr *) alloca(i); - retval = pread(image_fd, phdr, i, ehdr->e_phoff); - if (retval != i) { - goto exit_read; - } - } - bswap_phdr(phdr, ehdr->e_phnum); - -#ifdef CONFIG_USE_FDPIC - info->nsegs = 0; - info->pt_dynamic_addr = 0; -#endif - - /* Find the maximum size of the image and allocate an appropriate - amount of memory to handle that. */ - loaddr = -1, hiaddr = 0; - for (i = 0; i < ehdr->e_phnum; ++i) { - if (phdr[i].p_type == PT_LOAD) { - abi_ulong a = phdr[i].p_vaddr - phdr[i].p_offset; - if (a < loaddr) { - loaddr = a; - } - a = phdr[i].p_vaddr + phdr[i].p_memsz; - if (a > hiaddr) { - hiaddr = a; - } -#ifdef CONFIG_USE_FDPIC - ++info->nsegs; -#endif - } - } - - load_addr = loaddr; - if (ehdr->e_type == ET_DYN) { - /* The image indicates that it can be loaded anywhere. Find a - location that can hold the memory space required. If the - image is pre-linked, LOADDR will be non-zero. Since we do - not supply MAP_FIXED here we'll use that address if and - only if it remains available. */ - load_addr = target_mmap(loaddr, hiaddr - loaddr, PROT_NONE, - MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, - -1, 0); - if (load_addr == -1) { - goto exit_perror; - } - } else if (pinterp_name != NULL) { - /* This is the main executable. Make sure that the low - address does not conflict with MMAP_MIN_ADDR or the - QEMU application itself. */ - probe_guest_base(image_name, loaddr, hiaddr); - } - load_bias = load_addr - loaddr; - -#ifdef CONFIG_USE_FDPIC - { - struct elf32_fdpic_loadseg *loadsegs = info->loadsegs = - g_malloc(sizeof(*loadsegs) * info->nsegs); - - for (i = 0; i < ehdr->e_phnum; ++i) { - switch (phdr[i].p_type) { - case PT_DYNAMIC: - info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias; - break; - case PT_LOAD: - loadsegs->addr = phdr[i].p_vaddr + load_bias; - loadsegs->p_vaddr = phdr[i].p_vaddr; - loadsegs->p_memsz = phdr[i].p_memsz; - ++loadsegs; - break; - } - } - } -#endif - - info->load_bias = load_bias; - info->load_addr = load_addr; - info->entry = ehdr->e_entry + load_bias; - info->start_code = -1; - info->end_code = 0; - info->start_data = -1; - info->end_data = 0; - info->brk = 0; - info->elf_flags = ehdr->e_flags; - - for (i = 0; i < ehdr->e_phnum; i++) { - struct elf_phdr *eppnt = phdr + i; - if (eppnt->p_type == PT_LOAD) { - abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em; - int elf_prot = 0; - - if (eppnt->p_flags & PF_R) elf_prot = PROT_READ; - if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE; - if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC; - - vaddr = load_bias + eppnt->p_vaddr; - vaddr_po = TARGET_ELF_PAGEOFFSET(vaddr); - vaddr_ps = TARGET_ELF_PAGESTART(vaddr); - - error = target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po, - elf_prot, MAP_PRIVATE | MAP_FIXED, - image_fd, eppnt->p_offset - vaddr_po); - if (error == -1) { - goto exit_perror; - } - - vaddr_ef = vaddr + eppnt->p_filesz; - vaddr_em = vaddr + eppnt->p_memsz; - - /* If the load segment requests extra zeros (e.g. bss), map it. */ - if (vaddr_ef < vaddr_em) { - zero_bss(vaddr_ef, vaddr_em, elf_prot); - } - - /* Find the full program boundaries. */ - if (elf_prot & PROT_EXEC) { - if (vaddr < info->start_code) { - info->start_code = vaddr; - } - if (vaddr_ef > info->end_code) { - info->end_code = vaddr_ef; - } - } - if (elf_prot & PROT_WRITE) { - if (vaddr < info->start_data) { - info->start_data = vaddr; - } - if (vaddr_ef > info->end_data) { - info->end_data = vaddr_ef; - } - if (vaddr_em > info->brk) { - info->brk = vaddr_em; - } - } - } else if (eppnt->p_type == PT_INTERP && pinterp_name) { - char *interp_name; - - if (*pinterp_name) { - errmsg = "Multiple PT_INTERP entries"; - goto exit_errmsg; - } - interp_name = malloc(eppnt->p_filesz); - if (!interp_name) { - goto exit_perror; - } - - if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) { - memcpy(interp_name, bprm_buf + eppnt->p_offset, - eppnt->p_filesz); - } else { - retval = pread(image_fd, interp_name, eppnt->p_filesz, - eppnt->p_offset); - if (retval != eppnt->p_filesz) { - goto exit_perror; - } - } - if (interp_name[eppnt->p_filesz - 1] != 0) { - errmsg = "Invalid PT_INTERP entry"; - goto exit_errmsg; - } - *pinterp_name = interp_name; - } - } - - if (info->end_data == 0) { - info->start_data = info->end_code; - info->end_data = info->end_code; - info->brk = info->end_code; - } - - if (qemu_log_enabled()) { - load_symbols(ehdr, image_fd, load_bias); - } - - close(image_fd); - return; - - exit_read: - if (retval >= 0) { - errmsg = "Incomplete read of file header"; - goto exit_errmsg; - } - exit_perror: - errmsg = strerror(errno); - exit_errmsg: - fprintf(stderr, "%s: %s\n", image_name, errmsg); - exit(-1); -} - -static void load_elf_interp(const char *filename, struct image_info *info, - char bprm_buf[BPRM_BUF_SIZE]) -{ - int fd, retval; - - fd = open(path(filename), O_RDONLY); - if (fd < 0) { - goto exit_perror; - } - - retval = read(fd, bprm_buf, BPRM_BUF_SIZE); - if (retval < 0) { - goto exit_perror; - } - if (retval < BPRM_BUF_SIZE) { - memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval); - } - - load_elf_image(filename, fd, info, NULL, bprm_buf); - return; - - exit_perror: - fprintf(stderr, "%s: %s\n", filename, strerror(errno)); - exit(-1); -} - -static int symfind(const void *s0, const void *s1) -{ - target_ulong addr = *(target_ulong *)s0; - struct elf_sym *sym = (struct elf_sym *)s1; - int result = 0; - if (addr < sym->st_value) { - result = -1; - } else if (addr >= sym->st_value + sym->st_size) { - result = 1; - } - return result; -} - -static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr) -{ -#if ELF_CLASS == ELFCLASS32 - struct elf_sym *syms = s->disas_symtab.elf32; -#else - struct elf_sym *syms = s->disas_symtab.elf64; -#endif - - // binary search - struct elf_sym *sym; - - sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind); - if (sym != NULL) { - return s->disas_strtab + sym->st_name; - } - - return ""; -} - -/* FIXME: This should use elf_ops.h */ -static int symcmp(const void *s0, const void *s1) -{ - struct elf_sym *sym0 = (struct elf_sym *)s0; - struct elf_sym *sym1 = (struct elf_sym *)s1; - return (sym0->st_value < sym1->st_value) - ? -1 - : ((sym0->st_value > sym1->st_value) ? 1 : 0); -} - -/* Best attempt to load symbols from this ELF object. */ -static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias) -{ - int i, shnum, nsyms, sym_idx = 0, str_idx = 0; - struct elf_shdr *shdr; - char *strings = NULL; - struct syminfo *s = NULL; - struct elf_sym *new_syms, *syms = NULL; - - shnum = hdr->e_shnum; - i = shnum * sizeof(struct elf_shdr); - shdr = (struct elf_shdr *)alloca(i); - if (pread(fd, shdr, i, hdr->e_shoff) != i) { - return; - } - - bswap_shdr(shdr, shnum); - for (i = 0; i < shnum; ++i) { - if (shdr[i].sh_type == SHT_SYMTAB) { - sym_idx = i; - str_idx = shdr[i].sh_link; - goto found; - } - } - - /* There will be no symbol table if the file was stripped. */ - return; - - found: - /* Now know where the strtab and symtab are. Snarf them. */ - s = malloc(sizeof(*s)); - if (!s) { - goto give_up; - } - - i = shdr[str_idx].sh_size; - s->disas_strtab = strings = malloc(i); - if (!strings || pread(fd, strings, i, shdr[str_idx].sh_offset) != i) { - goto give_up; - } - - i = shdr[sym_idx].sh_size; - syms = malloc(i); - if (!syms || pread(fd, syms, i, shdr[sym_idx].sh_offset) != i) { - goto give_up; - } - - nsyms = i / sizeof(struct elf_sym); - for (i = 0; i < nsyms; ) { - bswap_sym(syms + i); - /* Throw away entries which we do not need. */ - if (syms[i].st_shndx == SHN_UNDEF - || syms[i].st_shndx >= SHN_LORESERVE - || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) { - if (i < --nsyms) { - syms[i] = syms[nsyms]; - } - } else { -#if defined(TARGET_ARM) || defined (TARGET_MIPS) - /* The bottom address bit marks a Thumb or MIPS16 symbol. */ - syms[i].st_value &= ~(target_ulong)1; -#endif - syms[i].st_value += load_bias; - i++; - } - } - - /* No "useful" symbol. */ - if (nsyms == 0) { - goto give_up; - } - - /* Attempt to free the storage associated with the local symbols - that we threw away. Whether or not this has any effect on the - memory allocation depends on the malloc implementation and how - many symbols we managed to discard. */ - new_syms = realloc(syms, nsyms * sizeof(*syms)); - if (new_syms == NULL) { - goto give_up; - } - syms = new_syms; - - qsort(syms, nsyms, sizeof(*syms), symcmp); - - s->disas_num_syms = nsyms; -#if ELF_CLASS == ELFCLASS32 - s->disas_symtab.elf32 = syms; -#else - s->disas_symtab.elf64 = syms; -#endif - s->lookup_symbol = lookup_symbolxx; - s->next = syminfos; - syminfos = s; - - return; - -give_up: - free(s); - free(strings); - free(syms); -} - -int load_elf_binary(struct linux_binprm *bprm, struct image_info *info) -{ - struct image_info interp_info; - struct elfhdr elf_ex; - char *elf_interpreter = NULL; - char *scratch; - - info->start_mmap = (abi_ulong)ELF_START_MMAP; - - load_elf_image(bprm->filename, bprm->fd, info, - &elf_interpreter, bprm->buf); - - /* ??? We need a copy of the elf header for passing to create_elf_tables. - If we do nothing, we'll have overwritten this when we re-use bprm->buf - when we load the interpreter. */ - elf_ex = *(struct elfhdr *)bprm->buf; - - /* Do this so that we can load the interpreter, if need be. We will - change some of these later */ - bprm->p = setup_arg_pages(bprm, info); - - scratch = g_new0(char, TARGET_PAGE_SIZE); - bprm->p = copy_elf_strings(1, &bprm->filename, scratch, - bprm->p, info->stack_limit); - bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch, - bprm->p, info->stack_limit); - bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch, - bprm->p, info->stack_limit); - g_free(scratch); - - if (!bprm->p) { - fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG)); - exit(-1); - } - - if (elf_interpreter) { - load_elf_interp(elf_interpreter, &interp_info, bprm->buf); - - /* If the program interpreter is one of these two, then assume - an iBCS2 image. Otherwise assume a native linux image. */ - - if (strcmp(elf_interpreter, "/usr/lib/libc.so.1") == 0 - || strcmp(elf_interpreter, "/usr/lib/ld.so.1") == 0) { - info->personality = PER_SVR4; - - /* Why this, you ask??? Well SVr4 maps page 0 as read-only, - and some applications "depend" upon this behavior. Since - we do not have the power to recompile these, we emulate - the SVr4 behavior. Sigh. */ - target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC, - MAP_FIXED | MAP_PRIVATE, -1, 0); - } - } - - bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex, - info, (elf_interpreter ? &interp_info : NULL)); - info->start_stack = bprm->p; - - /* If we have an interpreter, set that as the program's entry point. - Copy the load_bias as well, to help PPC64 interpret the entry - point as a function descriptor. Do this after creating elf tables - so that we copy the original program entry point into the AUXV. */ - if (elf_interpreter) { - info->load_bias = interp_info.load_bias; - info->entry = interp_info.entry; - free(elf_interpreter); - } - -#ifdef USE_ELF_CORE_DUMP - bprm->core_dump = &elf_core_dump; -#endif - - return 0; -} - -#ifdef USE_ELF_CORE_DUMP -/* - * Definitions to generate Intel SVR4-like core files. - * These mostly have the same names as the SVR4 types with "target_elf_" - * tacked on the front to prevent clashes with linux definitions, - * and the typedef forms have been avoided. This is mostly like - * the SVR4 structure, but more Linuxy, with things that Linux does - * not support and which gdb doesn't really use excluded. - * - * Fields we don't dump (their contents is zero) in linux-user qemu - * are marked with XXX. - * - * Core dump code is copied from linux kernel (fs/binfmt_elf.c). - * - * Porting ELF coredump for target is (quite) simple process. First you - * define USE_ELF_CORE_DUMP in target ELF code (where init_thread() for - * the target resides): - * - * #define USE_ELF_CORE_DUMP - * - * Next you define type of register set used for dumping. ELF specification - * says that it needs to be array of elf_greg_t that has size of ELF_NREG. - * - * typedef <target_regtype> target_elf_greg_t; - * #define ELF_NREG <number of registers> - * typedef taret_elf_greg_t target_elf_gregset_t[ELF_NREG]; - * - * Last step is to implement target specific function that copies registers - * from given cpu into just specified register set. Prototype is: - * - * static void elf_core_copy_regs(taret_elf_gregset_t *regs, - * const CPUArchState *env); - * - * Parameters: - * regs - copy register values into here (allocated and zeroed by caller) - * env - copy registers from here - * - * Example for ARM target is provided in this file. - */ - -/* An ELF note in memory */ -struct memelfnote { - const char *name; - size_t namesz; - size_t namesz_rounded; - int type; - size_t datasz; - size_t datasz_rounded; - void *data; - size_t notesz; -}; - -struct target_elf_siginfo { - abi_int si_signo; /* signal number */ - abi_int si_code; /* extra code */ - abi_int si_errno; /* errno */ -}; - -struct target_elf_prstatus { - struct target_elf_siginfo pr_info; /* Info associated with signal */ - abi_short pr_cursig; /* Current signal */ - abi_ulong pr_sigpend; /* XXX */ - abi_ulong pr_sighold; /* XXX */ - target_pid_t pr_pid; - target_pid_t pr_ppid; - target_pid_t pr_pgrp; - target_pid_t pr_sid; - struct target_timeval pr_utime; /* XXX User time */ - struct target_timeval pr_stime; /* XXX System time */ - struct target_timeval pr_cutime; /* XXX Cumulative user time */ - struct target_timeval pr_cstime; /* XXX Cumulative system time */ - target_elf_gregset_t pr_reg; /* GP registers */ - abi_int pr_fpvalid; /* XXX */ -}; - -#define ELF_PRARGSZ (80) /* Number of chars for args */ - -struct target_elf_prpsinfo { - char pr_state; /* numeric process state */ - char pr_sname; /* char for pr_state */ - char pr_zomb; /* zombie */ - char pr_nice; /* nice val */ - abi_ulong pr_flag; /* flags */ - target_uid_t pr_uid; - target_gid_t pr_gid; - target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid; - /* Lots missing */ - char pr_fname[16]; /* filename of executable */ - char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */ -}; - -/* Here is the structure in which status of each thread is captured. */ -struct elf_thread_status { - QTAILQ_ENTRY(elf_thread_status) ets_link; - struct target_elf_prstatus prstatus; /* NT_PRSTATUS */ -#if 0 - elf_fpregset_t fpu; /* NT_PRFPREG */ - struct task_struct *thread; - elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */ -#endif - struct memelfnote notes[1]; - int num_notes; -}; - -struct elf_note_info { - struct memelfnote *notes; - struct target_elf_prstatus *prstatus; /* NT_PRSTATUS */ - struct target_elf_prpsinfo *psinfo; /* NT_PRPSINFO */ - - QTAILQ_HEAD(thread_list_head, elf_thread_status) thread_list; -#if 0 - /* - * Current version of ELF coredump doesn't support - * dumping fp regs etc. - */ - elf_fpregset_t *fpu; - elf_fpxregset_t *xfpu; - int thread_status_size; -#endif - int notes_size; - int numnote; -}; - -struct vm_area_struct { - target_ulong vma_start; /* start vaddr of memory region */ - target_ulong vma_end; /* end vaddr of memory region */ - abi_ulong vma_flags; /* protection etc. flags for the region */ - QTAILQ_ENTRY(vm_area_struct) vma_link; -}; - -struct mm_struct { - QTAILQ_HEAD(, vm_area_struct) mm_mmap; - int mm_count; /* number of mappings */ -}; - -static struct mm_struct *vma_init(void); -static void vma_delete(struct mm_struct *); -static int vma_add_mapping(struct mm_struct *, target_ulong, - target_ulong, abi_ulong); -static int vma_get_mapping_count(const struct mm_struct *); -static struct vm_area_struct *vma_first(const struct mm_struct *); -static struct vm_area_struct *vma_next(struct vm_area_struct *); -static abi_ulong vma_dump_size(const struct vm_area_struct *); -static int vma_walker(void *priv, target_ulong start, target_ulong end, - unsigned long flags); - -static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t); -static void fill_note(struct memelfnote *, const char *, int, - unsigned int, void *); -static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int); -static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *); -static void fill_auxv_note(struct memelfnote *, const TaskState *); -static void fill_elf_note_phdr(struct elf_phdr *, int, off_t); -static size_t note_size(const struct memelfnote *); -static void free_note_info(struct elf_note_info *); -static int fill_note_info(struct elf_note_info *, long, const CPUArchState *); -static void fill_thread_info(struct elf_note_info *, const CPUArchState *); -static int core_dump_filename(const TaskState *, char *, size_t); - -static int dump_write(int, const void *, size_t); -static int write_note(struct memelfnote *, int); -static int write_note_info(struct elf_note_info *, int); - -#ifdef BSWAP_NEEDED -static void bswap_prstatus(struct target_elf_prstatus *prstatus) -{ - prstatus->pr_info.si_signo = tswap32(prstatus->pr_info.si_signo); - prstatus->pr_info.si_code = tswap32(prstatus->pr_info.si_code); - prstatus->pr_info.si_errno = tswap32(prstatus->pr_info.si_errno); - prstatus->pr_cursig = tswap16(prstatus->pr_cursig); - prstatus->pr_sigpend = tswapal(prstatus->pr_sigpend); - prstatus->pr_sighold = tswapal(prstatus->pr_sighold); - prstatus->pr_pid = tswap32(prstatus->pr_pid); - prstatus->pr_ppid = tswap32(prstatus->pr_ppid); - prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp); - prstatus->pr_sid = tswap32(prstatus->pr_sid); - /* cpu times are not filled, so we skip them */ - /* regs should be in correct format already */ - prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid); -} - -static void bswap_psinfo(struct target_elf_prpsinfo *psinfo) -{ - psinfo->pr_flag = tswapal(psinfo->pr_flag); - psinfo->pr_uid = tswap16(psinfo->pr_uid); - psinfo->pr_gid = tswap16(psinfo->pr_gid); - psinfo->pr_pid = tswap32(psinfo->pr_pid); - psinfo->pr_ppid = tswap32(psinfo->pr_ppid); - psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp); - psinfo->pr_sid = tswap32(psinfo->pr_sid); -} - -static void bswap_note(struct elf_note *en) -{ - bswap32s(&en->n_namesz); - bswap32s(&en->n_descsz); - bswap32s(&en->n_type); -} -#else -static inline void bswap_prstatus(struct target_elf_prstatus *p) { } -static inline void bswap_psinfo(struct target_elf_prpsinfo *p) {} -static inline void bswap_note(struct elf_note *en) { } -#endif /* BSWAP_NEEDED */ - -/* - * Minimal support for linux memory regions. These are needed - * when we are finding out what memory exactly belongs to - * emulated process. No locks needed here, as long as - * thread that received the signal is stopped. - */ - -static struct mm_struct *vma_init(void) -{ - struct mm_struct *mm; - - if ((mm = g_malloc(sizeof (*mm))) == NULL) - return (NULL); - - mm->mm_count = 0; - QTAILQ_INIT(&mm->mm_mmap); - - return (mm); -} - -static void vma_delete(struct mm_struct *mm) -{ - struct vm_area_struct *vma; - - while ((vma = vma_first(mm)) != NULL) { - QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link); - g_free(vma); - } - g_free(mm); -} - -static int vma_add_mapping(struct mm_struct *mm, target_ulong start, - target_ulong end, abi_ulong flags) -{ - struct vm_area_struct *vma; - - if ((vma = g_malloc0(sizeof (*vma))) == NULL) - return (-1); - - vma->vma_start = start; - vma->vma_end = end; - vma->vma_flags = flags; - - QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link); - mm->mm_count++; - - return (0); -} - -static struct vm_area_struct *vma_first(const struct mm_struct *mm) -{ - return (QTAILQ_FIRST(&mm->mm_mmap)); -} - -static struct vm_area_struct *vma_next(struct vm_area_struct *vma) -{ - return (QTAILQ_NEXT(vma, vma_link)); -} - -static int vma_get_mapping_count(const struct mm_struct *mm) -{ - return (mm->mm_count); -} - -/* - * Calculate file (dump) size of given memory region. - */ -static abi_ulong vma_dump_size(const struct vm_area_struct *vma) -{ - /* if we cannot even read the first page, skip it */ - if (!access_ok(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE)) - return (0); - - /* - * Usually we don't dump executable pages as they contain - * non-writable code that debugger can read directly from - * target library etc. However, thread stacks are marked - * also executable so we read in first page of given region - * and check whether it contains elf header. If there is - * no elf header, we dump it. - */ - if (vma->vma_flags & PROT_EXEC) { - char page[TARGET_PAGE_SIZE]; - - copy_from_user(page, vma->vma_start, sizeof (page)); - if ((page[EI_MAG0] == ELFMAG0) && - (page[EI_MAG1] == ELFMAG1) && - (page[EI_MAG2] == ELFMAG2) && - (page[EI_MAG3] == ELFMAG3)) { - /* - * Mappings are possibly from ELF binary. Don't dump - * them. - */ - return (0); - } - } - - return (vma->vma_end - vma->vma_start); -} - -static int vma_walker(void *priv, target_ulong start, target_ulong end, - unsigned long flags) -{ - struct mm_struct *mm = (struct mm_struct *)priv; - - vma_add_mapping(mm, start, end, flags); - return (0); -} - -static void fill_note(struct memelfnote *note, const char *name, int type, - unsigned int sz, void *data) -{ - unsigned int namesz; - - namesz = strlen(name) + 1; - note->name = name; - note->namesz = namesz; - note->namesz_rounded = roundup(namesz, sizeof (int32_t)); - note->type = type; - note->datasz = sz; - note->datasz_rounded = roundup(sz, sizeof (int32_t)); - - note->data = data; - - /* - * We calculate rounded up note size here as specified by - * ELF document. - */ - note->notesz = sizeof (struct elf_note) + - note->namesz_rounded + note->datasz_rounded; -} - -static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine, - uint32_t flags) -{ - (void) memset(elf, 0, sizeof(*elf)); - - (void) memcpy(elf->e_ident, ELFMAG, SELFMAG); - elf->e_ident[EI_CLASS] = ELF_CLASS; - elf->e_ident[EI_DATA] = ELF_DATA; - elf->e_ident[EI_VERSION] = EV_CURRENT; - elf->e_ident[EI_OSABI] = ELF_OSABI; - - elf->e_type = ET_CORE; - elf->e_machine = machine; - elf->e_version = EV_CURRENT; - elf->e_phoff = sizeof(struct elfhdr); - elf->e_flags = flags; - elf->e_ehsize = sizeof(struct elfhdr); - elf->e_phentsize = sizeof(struct elf_phdr); - elf->e_phnum = segs; - - bswap_ehdr(elf); -} - -static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset) -{ - phdr->p_type = PT_NOTE; - phdr->p_offset = offset; - phdr->p_vaddr = 0; - phdr->p_paddr = 0; - phdr->p_filesz = sz; - phdr->p_memsz = 0; - phdr->p_flags = 0; - phdr->p_align = 0; - - bswap_phdr(phdr, 1); -} - -static size_t note_size(const struct memelfnote *note) -{ - return (note->notesz); -} - -static void fill_prstatus(struct target_elf_prstatus *prstatus, - const TaskState *ts, int signr) -{ - (void) memset(prstatus, 0, sizeof (*prstatus)); - prstatus->pr_info.si_signo = prstatus->pr_cursig = signr; - prstatus->pr_pid = ts->ts_tid; - prstatus->pr_ppid = getppid(); - prstatus->pr_pgrp = getpgrp(); - prstatus->pr_sid = getsid(0); - - bswap_prstatus(prstatus); -} - -static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts) -{ - char *base_filename; - unsigned int i, len; - - (void) memset(psinfo, 0, sizeof (*psinfo)); - - len = ts->info->arg_end - ts->info->arg_start; - if (len >= ELF_PRARGSZ) - len = ELF_PRARGSZ - 1; - if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len)) - return -EFAULT; - for (i = 0; i < len; i++) - if (psinfo->pr_psargs[i] == 0) - psinfo->pr_psargs[i] = ' '; - psinfo->pr_psargs[len] = 0; - - psinfo->pr_pid = getpid(); - psinfo->pr_ppid = getppid(); - psinfo->pr_pgrp = getpgrp(); - psinfo->pr_sid = getsid(0); - psinfo->pr_uid = getuid(); - psinfo->pr_gid = getgid(); - - base_filename = g_path_get_basename(ts->bprm->filename); - /* - * Using strncpy here is fine: at max-length, - * this field is not NUL-terminated. - */ - (void) strncpy(psinfo->pr_fname, base_filename, - sizeof(psinfo->pr_fname)); - - g_free(base_filename); - bswap_psinfo(psinfo); - return (0); -} - -static void fill_auxv_note(struct memelfnote *note, const TaskState *ts) -{ - elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv; - elf_addr_t orig_auxv = auxv; - void *ptr; - int len = ts->info->auxv_len; - - /* - * Auxiliary vector is stored in target process stack. It contains - * {type, value} pairs that we need to dump into note. This is not - * strictly necessary but we do it here for sake of completeness. - */ - - /* read in whole auxv vector and copy it to memelfnote */ - ptr = lock_user(VERIFY_READ, orig_auxv, len, 0); - if (ptr != NULL) { - fill_note(note, "CORE", NT_AUXV, len, ptr); - unlock_user(ptr, auxv, len); - } -} - -/* - * Constructs name of coredump file. We have following convention - * for the name: - * qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core - * - * Returns 0 in case of success, -1 otherwise (errno is set). - */ -static int core_dump_filename(const TaskState *ts, char *buf, - size_t bufsize) -{ - char timestamp[64]; - char *filename = NULL; - char *base_filename = NULL; - struct timeval tv; - struct tm tm; - - assert(bufsize >= PATH_MAX); - - if (gettimeofday(&tv, NULL) < 0) { - (void) fprintf(stderr, "unable to get current timestamp: %s", - strerror(errno)); - return (-1); - } - - filename = strdup(ts->bprm->filename); - base_filename = strdup(basename(filename)); - (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S", - localtime_r(&tv.tv_sec, &tm)); - (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core", - base_filename, timestamp, (int)getpid()); - free(base_filename); - free(filename); - - return (0); -} - -static int dump_write(int fd, const void *ptr, size_t size) -{ - const char *bufp = (const char *)ptr; - ssize_t bytes_written, bytes_left; - struct rlimit dumpsize; - off_t pos; - - bytes_written = 0; - getrlimit(RLIMIT_CORE, &dumpsize); - if ((pos = lseek(fd, 0, SEEK_CUR))==-1) { - if (errno == ESPIPE) { /* not a seekable stream */ - bytes_left = size; - } else { - return pos; - } - } else { - if (dumpsize.rlim_cur <= pos) { - return -1; - } else if (dumpsize.rlim_cur == RLIM_INFINITY) { - bytes_left = size; - } else { - size_t limit_left=dumpsize.rlim_cur - pos; - bytes_left = limit_left >= size ? size : limit_left ; - } - } - - /* - * In normal conditions, single write(2) should do but - * in case of socket etc. this mechanism is more portable. - */ - do { - bytes_written = write(fd, bufp, bytes_left); - if (bytes_written < 0) { - if (errno == EINTR) - continue; - return (-1); - } else if (bytes_written == 0) { /* eof */ - return (-1); - } - bufp += bytes_written; - bytes_left -= bytes_written; - } while (bytes_left > 0); - - return (0); -} - -static int write_note(struct memelfnote *men, int fd) -{ - struct elf_note en; - - en.n_namesz = men->namesz; - en.n_type = men->type; - en.n_descsz = men->datasz; - - bswap_note(&en); - - if (dump_write(fd, &en, sizeof(en)) != 0) - return (-1); - if (dump_write(fd, men->name, men->namesz_rounded) != 0) - return (-1); - if (dump_write(fd, men->data, men->datasz_rounded) != 0) - return (-1); - - return (0); -} - -static void fill_thread_info(struct elf_note_info *info, const CPUArchState *env) -{ - CPUState *cpu = ENV_GET_CPU((CPUArchState *)env); - TaskState *ts = (TaskState *)cpu->opaque; - struct elf_thread_status *ets; - - ets = g_malloc0(sizeof (*ets)); - ets->num_notes = 1; /* only prstatus is dumped */ - fill_prstatus(&ets->prstatus, ts, 0); - elf_core_copy_regs(&ets->prstatus.pr_reg, env); - fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus), - &ets->prstatus); - - QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link); - - info->notes_size += note_size(&ets->notes[0]); -} - -static void init_note_info(struct elf_note_info *info) -{ - /* Initialize the elf_note_info structure so that it is at - * least safe to call free_note_info() on it. Must be - * called before calling fill_note_info(). - */ - memset(info, 0, sizeof (*info)); - QTAILQ_INIT(&info->thread_list); -} - -static int fill_note_info(struct elf_note_info *info, - long signr, const CPUArchState *env) -{ -#define NUMNOTES 3 - CPUState *cpu = ENV_GET_CPU((CPUArchState *)env); - TaskState *ts = (TaskState *)cpu->opaque; - int i; - - info->notes = g_new0(struct memelfnote, NUMNOTES); - if (info->notes == NULL) - return (-ENOMEM); - info->prstatus = g_malloc0(sizeof (*info->prstatus)); - if (info->prstatus == NULL) - return (-ENOMEM); - info->psinfo = g_malloc0(sizeof (*info->psinfo)); - if (info->prstatus == NULL) - return (-ENOMEM); - - /* - * First fill in status (and registers) of current thread - * including process info & aux vector. - */ - fill_prstatus(info->prstatus, ts, signr); - elf_core_copy_regs(&info->prstatus->pr_reg, env); - fill_note(&info->notes[0], "CORE", NT_PRSTATUS, - sizeof (*info->prstatus), info->prstatus); - fill_psinfo(info->psinfo, ts); - fill_note(&info->notes[1], "CORE", NT_PRPSINFO, - sizeof (*info->psinfo), info->psinfo); - fill_auxv_note(&info->notes[2], ts); - info->numnote = 3; - - info->notes_size = 0; - for (i = 0; i < info->numnote; i++) - info->notes_size += note_size(&info->notes[i]); - - /* read and fill status of all threads */ - cpu_list_lock(); - CPU_FOREACH(cpu) { - if (cpu == thread_cpu) { - continue; - } - fill_thread_info(info, (CPUArchState *)cpu->env_ptr); - } - cpu_list_unlock(); - - return (0); -} - -static void free_note_info(struct elf_note_info *info) -{ - struct elf_thread_status *ets; - - while (!QTAILQ_EMPTY(&info->thread_list)) { - ets = QTAILQ_FIRST(&info->thread_list); - QTAILQ_REMOVE(&info->thread_list, ets, ets_link); - g_free(ets); - } - - g_free(info->prstatus); - g_free(info->psinfo); - g_free(info->notes); -} - -static int write_note_info(struct elf_note_info *info, int fd) -{ - struct elf_thread_status *ets; - int i, error = 0; - - /* write prstatus, psinfo and auxv for current thread */ - for (i = 0; i < info->numnote; i++) - if ((error = write_note(&info->notes[i], fd)) != 0) - return (error); - - /* write prstatus for each thread */ - QTAILQ_FOREACH(ets, &info->thread_list, ets_link) { - if ((error = write_note(&ets->notes[0], fd)) != 0) - return (error); - } - - return (0); -} - -/* - * Write out ELF coredump. - * - * See documentation of ELF object file format in: - * http://www.caldera.com/developers/devspecs/gabi41.pdf - * - * Coredump format in linux is following: - * - * 0 +----------------------+ \ - * | ELF header | ET_CORE | - * +----------------------+ | - * | ELF program headers | |--- headers - * | - NOTE section | | - * | - PT_LOAD sections | | - * +----------------------+ / - * | NOTEs: | - * | - NT_PRSTATUS | - * | - NT_PRSINFO | - * | - NT_AUXV | - * +----------------------+ <-- aligned to target page - * | Process memory dump | - * : : - * . . - * : : - * | | - * +----------------------+ - * - * NT_PRSTATUS -> struct elf_prstatus (per thread) - * NT_PRSINFO -> struct elf_prpsinfo - * NT_AUXV is array of { type, value } pairs (see fill_auxv_note()). - * - * Format follows System V format as close as possible. Current - * version limitations are as follows: - * - no floating point registers are dumped - * - * Function returns 0 in case of success, negative errno otherwise. - * - * TODO: make this work also during runtime: it should be - * possible to force coredump from running process and then - * continue processing. For example qemu could set up SIGUSR2 - * handler (provided that target process haven't registered - * handler for that) that does the dump when signal is received. - */ -static int elf_core_dump(int signr, const CPUArchState *env) -{ - const CPUState *cpu = ENV_GET_CPU((CPUArchState *)env); - const TaskState *ts = (const TaskState *)cpu->opaque; - struct vm_area_struct *vma = NULL; - char corefile[PATH_MAX]; - struct elf_note_info info; - struct elfhdr elf; - struct elf_phdr phdr; - struct rlimit dumpsize; - struct mm_struct *mm = NULL; - off_t offset = 0, data_offset = 0; - int segs = 0; - int fd = -1; - - init_note_info(&info); - - errno = 0; - getrlimit(RLIMIT_CORE, &dumpsize); - if (dumpsize.rlim_cur == 0) - return 0; - - if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0) - return (-errno); - - if ((fd = open(corefile, O_WRONLY | O_CREAT, - S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0) - return (-errno); - - /* - * Walk through target process memory mappings and - * set up structure containing this information. After - * this point vma_xxx functions can be used. - */ - if ((mm = vma_init()) == NULL) - goto out; - - walk_memory_regions(mm, vma_walker); - segs = vma_get_mapping_count(mm); - - /* - * Construct valid coredump ELF header. We also - * add one more segment for notes. - */ - fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0); - if (dump_write(fd, &elf, sizeof (elf)) != 0) - goto out; - - /* fill in the in-memory version of notes */ - if (fill_note_info(&info, signr, env) < 0) - goto out; - - offset += sizeof (elf); /* elf header */ - offset += (segs + 1) * sizeof (struct elf_phdr); /* program headers */ - - /* write out notes program header */ - fill_elf_note_phdr(&phdr, info.notes_size, offset); - - offset += info.notes_size; - if (dump_write(fd, &phdr, sizeof (phdr)) != 0) - goto out; - - /* - * ELF specification wants data to start at page boundary so - * we align it here. - */ - data_offset = offset = roundup(offset, ELF_EXEC_PAGESIZE); - - /* - * Write program headers for memory regions mapped in - * the target process. - */ - for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) { - (void) memset(&phdr, 0, sizeof (phdr)); - - phdr.p_type = PT_LOAD; - phdr.p_offset = offset; - phdr.p_vaddr = vma->vma_start; - phdr.p_paddr = 0; - phdr.p_filesz = vma_dump_size(vma); - offset += phdr.p_filesz; - phdr.p_memsz = vma->vma_end - vma->vma_start; - phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0; - if (vma->vma_flags & PROT_WRITE) - phdr.p_flags |= PF_W; - if (vma->vma_flags & PROT_EXEC) - phdr.p_flags |= PF_X; - phdr.p_align = ELF_EXEC_PAGESIZE; - - bswap_phdr(&phdr, 1); - dump_write(fd, &phdr, sizeof (phdr)); - } - - /* - * Next we write notes just after program headers. No - * alignment needed here. - */ - if (write_note_info(&info, fd) < 0) - goto out; - - /* align data to page boundary */ - if (lseek(fd, data_offset, SEEK_SET) != data_offset) - goto out; - - /* - * Finally we can dump process memory into corefile as well. - */ - for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) { - abi_ulong addr; - abi_ulong end; - - end = vma->vma_start + vma_dump_size(vma); - - for (addr = vma->vma_start; addr < end; - addr += TARGET_PAGE_SIZE) { - char page[TARGET_PAGE_SIZE]; - int error; - - /* - * Read in page from target process memory and - * write it to coredump file. - */ - error = copy_from_user(page, addr, sizeof (page)); - if (error != 0) { - (void) fprintf(stderr, "unable to dump " TARGET_ABI_FMT_lx "\n", - addr); - errno = -error; - goto out; - } - if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0) - goto out; - } - } - - out: - free_note_info(&info); - if (mm != NULL) - vma_delete(mm); - (void) close(fd); - - if (errno != 0) - return (-errno); - return (0); -} -#endif /* USE_ELF_CORE_DUMP */ - -void do_init_thread(struct target_pt_regs *regs, struct image_info *infop) -{ - init_thread(regs, infop); -} diff --git a/qemu/linux-user/errno_defs.h b/qemu/linux-user/errno_defs.h deleted file mode 100644 index 8a1cf76cd..000000000 --- a/qemu/linux-user/errno_defs.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Target definitions of errnos. These may be overridden by an - * architecture specific header if needed. - * - * Taken from asm-generic/errno-base.h and asm-generic/errno.h - */ -#define TARGET_EPERM 1 /* Operation not permitted */ -#define TARGET_ENOENT 2 /* No such file or directory */ -#define TARGET_ESRCH 3 /* No such process */ -#define TARGET_EINTR 4 /* Interrupted system call */ -#define TARGET_EIO 5 /* I/O error */ -#define TARGET_ENXIO 6 /* No such device or address */ -#define TARGET_E2BIG 7 /* Argument list too long */ -#define TARGET_ENOEXEC 8 /* TARGET_Exec format error */ -#define TARGET_EBADF 9 /* Bad file number */ -#define TARGET_ECHILD 10 /* No child processes */ -#define TARGET_EAGAIN 11 /* Try again */ -#define TARGET_ENOMEM 12 /* Out of memory */ -#define TARGET_EACCES 13 /* Permission denied */ -#define TARGET_EFAULT 14 /* Bad address */ -#define TARGET_ENOTBLK 15 /* Block device required */ -#define TARGET_EBUSY 16 /* Device or resource busy */ -#define TARGET_EEXIST 17 /* File exists */ -#define TARGET_EXDEV 18 /* Cross-device link */ -#define TARGET_ENODEV 19 /* No such device */ -#define TARGET_ENOTDIR 20 /* Not a directory */ -#define TARGET_EISDIR 21 /* Is a directory */ -#define TARGET_EINVAL 22 /* Invalid argument */ -#define TARGET_ENFILE 23 /* File table overflow */ -#define TARGET_EMFILE 24 /* Too many open files */ -#define TARGET_ENOTTY 25 /* Not a typewriter */ -#define TARGET_ETXTBSY 26 /* Text file busy */ -#define TARGET_EFBIG 27 /* File too large */ -#define TARGET_ENOSPC 28 /* No space left on device */ -#define TARGET_ESPIPE 29 /* Illegal seek */ -#define TARGET_EROFS 30 /* Read-only file system */ -#define TARGET_EMLINK 31 /* Too many links */ -#define TARGET_EPIPE 32 /* Broken pipe */ -#define TARGET_EDOM 33 /* Math argument out of domain of func */ -#define TARGET_ERANGE 34 /* Math result not representable */ - -#define TARGET_EDEADLK 35 /* Resource deadlock would occur */ -#define TARGET_ENAMETOOLONG 36 /* File name too long */ -#define TARGET_ENOLCK 37 /* No record locks available */ -#define TARGET_ENOSYS 38 /* Function not implemented */ -#define TARGET_ENOTEMPTY 39 /* Directory not empty */ -#define TARGET_ELOOP 40 /* Too many symbolic links encountered */ - -#define TARGET_ENOMSG 42 /* No message of desired type */ -#define TARGET_EIDRM 43 /* Identifier removed */ -#define TARGET_ECHRNG 44 /* Channel number out of range */ -#define TARGET_EL2NSYNC 45 /* Level 2 not synchronized */ -#define TARGET_EL3HLT 46 /* Level 3 halted */ -#define TARGET_EL3RST 47 /* Level 3 reset */ -#define TARGET_ELNRNG 48 /* Link number out of range */ -#define TARGET_EUNATCH 49 /* Protocol driver not attached */ -#define TARGET_ENOCSI 50 /* No CSI structure available */ -#define TARGET_EL2HLT 51 /* Level 2 halted */ -#define TARGET_EBADE 52 /* Invalid exchange */ -#define TARGET_EBADR 53 /* Invalid request descriptor */ -#define TARGET_EXFULL 54 /* TARGET_Exchange full */ -#define TARGET_ENOANO 55 /* No anode */ -#define TARGET_EBADRQC 56 /* Invalid request code */ -#define TARGET_EBADSLT 57 /* Invalid slot */ - -#define TARGET_EBFONT 59 /* Bad font file format */ -#define TARGET_ENOSTR 60 /* Device not a stream */ -#define TARGET_ENODATA 61 /* No data available */ -#define TARGET_ETIME 62 /* Timer expired */ -#define TARGET_ENOSR 63 /* Out of streams resources */ -#define TARGET_ENONET 64 /* Machine is not on the network */ -#define TARGET_ENOPKG 65 /* Package not installed */ -#define TARGET_EREMOTE 66 /* Object is remote */ -#define TARGET_ENOLINK 67 /* Link has been severed */ -#define TARGET_EADV 68 /* Advertise error */ -#define TARGET_ESRMNT 69 /* Srmount error */ -#define TARGET_ECOMM 70 /* Communication error on send */ -#define TARGET_EPROTO 71 /* Protocol error */ -#define TARGET_EMULTIHOP 72 /* Multihop attempted */ -#define TARGET_EDOTDOT 73 /* RFS specific error */ -#define TARGET_EBADMSG 74 /* Not a data message */ -#define TARGET_EOVERFLOW 75 /* Value too large for defined data type */ -#define TARGET_ENOTUNIQ 76 /* Name not unique on network */ -#define TARGET_EBADFD 77 /* File descriptor in bad state */ -#define TARGET_EREMCHG 78 /* Remote address changed */ -#define TARGET_ELIBACC 79 /* Can not access a needed shared library */ -#define TARGET_ELIBBAD 80 /* Accessing a corrupted shared library */ -#define TARGET_ELIBSCN 81 /* .lib section in a.out corrupted */ -#define TARGET_ELIBMAX 82 /* Attempting to link in too many shared libraries */ -#define TARGET_ELIBEXEC 83 /* Cannot exec a shared library directly */ -#define TARGET_EILSEQ 84 /* Illegal byte sequence */ -#define TARGET_ERESTART 85 /* Interrupted system call should be restarted */ -#define TARGET_ESTRPIPE 86 /* Streams pipe error */ -#define TARGET_EUSERS 87 /* Too many users */ -#define TARGET_ENOTSOCK 88 /* Socket operation on non-socket */ -#define TARGET_EDESTADDRREQ 89 /* Destination address required */ -#define TARGET_EMSGSIZE 90 /* Message too long */ -#define TARGET_EPROTOTYPE 91 /* Protocol wrong type for socket */ -#define TARGET_ENOPROTOOPT 92 /* Protocol not available */ -#define TARGET_EPROTONOSUPPORT 93 /* Protocol not supported */ -#define TARGET_ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define TARGET_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define TARGET_EPFNOSUPPORT 96 /* Protocol family not supported */ -#define TARGET_EAFNOSUPPORT 97 /* Address family not supported by protocol */ -#define TARGET_EADDRINUSE 98 /* Address already in use */ -#define TARGET_EADDRNOTAVAIL 99 /* Cannot assign requested address */ -#define TARGET_ENETDOWN 100 /* Network is down */ -#define TARGET_ENETUNREACH 101 /* Network is unreachable */ -#define TARGET_ENETRESET 102 /* Network dropped connection because of reset */ -#define TARGET_ECONNABORTED 103 /* Software caused connection abort */ -#define TARGET_ECONNRESET 104 /* Connection reset by peer */ -#define TARGET_ENOBUFS 105 /* No buffer space available */ -#define TARGET_EISCONN 106 /* Transport endpoint is already connected */ -#define TARGET_ENOTCONN 107 /* Transport endpoint is not connected */ -#define TARGET_ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ -#define TARGET_ETOOMANYREFS 109 /* Too many references: cannot splice */ -#define TARGET_ETIMEDOUT 110 /* Connection timed out */ -#define TARGET_ECONNREFUSED 111 /* Connection refused */ -#define TARGET_EHOSTDOWN 112 /* Host is down */ -#define TARGET_EHOSTUNREACH 113 /* No route to host */ -#define TARGET_EALREADY 114 /* Operation already in progress */ -#define TARGET_EINPROGRESS 115 /* Operation now in progress */ -#define TARGET_ESTALE 116 /* Stale NFS file handle */ -#define TARGET_EUCLEAN 117 /* Structure needs cleaning */ -#define TARGET_ENOTNAM 118 /* Not a XENIX named type file */ -#define TARGET_ENAVAIL 119 /* No XENIX semaphores available */ -#define TARGET_EISNAM 120 /* Is a named type file */ -#define TARGET_EREMOTEIO 121 /* Remote I/O error */ -#define TARGET_EDQUOT 122 /* Quota exceeded */ - -#define TARGET_ENOMEDIUM 123 /* No medium found */ -#define TARGET_EMEDIUMTYPE 124 /* Wrong medium type */ -#define TARGET_ECANCELED 125 /* Operation Canceled */ -#define TARGET_ENOKEY 126 /* Required key not available */ -#define TARGET_EKEYEXPIRED 127 /* Key has expired */ -#define TARGET_EKEYREVOKED 128 /* Key has been revoked */ -#define TARGET_EKEYREJECTED 129 /* Key was rejected by service */ - -/* for robust mutexes */ -#define TARGET_EOWNERDEAD 130 /* Owner died */ -#define TARGET_ENOTRECOVERABLE 131 /* State not recoverable */ diff --git a/qemu/linux-user/flat.h b/qemu/linux-user/flat.h deleted file mode 100644 index 6f2d0c4b2..000000000 --- a/qemu/linux-user/flat.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2002-2003 David McCullough <davidm@snapgear.com> - * Copyright (C) 1998 Kenneth Albanowski <kjahds@kjahds.com> - * The Silver Hammer Group, Ltd. - * - * This file provides the definitions and structures needed to - * support uClinux flat-format executables. - */ - -#define FLAT_VERSION 0x00000004L - -#ifdef CONFIG_BINFMT_SHARED_FLAT -#define MAX_SHARED_LIBS (4) -#else -#define MAX_SHARED_LIBS (1) -#endif - -/* - * To make everything easier to port and manage cross platform - * development, all fields are in network byte order. - */ - -struct flat_hdr { - char magic[4]; - abi_ulong rev; /* version (as above) */ - abi_ulong entry; /* Offset of first executable instruction - with text segment from beginning of file */ - abi_ulong data_start; /* Offset of data segment from beginning of - file */ - abi_ulong data_end; /* Offset of end of data segment - from beginning of file */ - abi_ulong bss_end; /* Offset of end of bss segment from beginning - of file */ - - /* (It is assumed that data_end through bss_end forms the bss segment.) */ - - abi_ulong stack_size; /* Size of stack, in bytes */ - abi_ulong reloc_start; /* Offset of relocation records from - beginning of file */ - abi_ulong reloc_count; /* Number of relocation records */ - abi_ulong flags; - abi_ulong build_date; /* When the program/library was built */ - abi_ulong filler[5]; /* Reservered, set to zero */ -}; - -#define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ -#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */ -#define FLAT_FLAG_GZIP 0x0004 /* all but the header is compressed */ -#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */ -#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */ - - -/* - * While it would be nice to keep this header clean, users of older - * tools still need this support in the kernel. So this section is - * purely for compatibility with old tool chains. - * - * DO NOT make changes or enhancements to the old format please, just work - * with the format above, except to fix bugs with old format support. - */ - -#define OLD_FLAT_VERSION 0x00000002L -#define OLD_FLAT_RELOC_TYPE_TEXT 0 -#define OLD_FLAT_RELOC_TYPE_DATA 1 -#define OLD_FLAT_RELOC_TYPE_BSS 2 - -# define OLD_FLAT_FLAG_RAM 0x1 /* load program entirely into RAM */ diff --git a/qemu/linux-user/flatload.c b/qemu/linux-user/flatload.c deleted file mode 100644 index f9139c399..000000000 --- a/qemu/linux-user/flatload.c +++ /dev/null @@ -1,808 +0,0 @@ -/****************************************************************************/ -/* - * QEMU bFLT binary loader. Based on linux/fs/binfmt_flat.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - * - * Copyright (C) 2006 CodeSourcery. - * Copyright (C) 2000-2003 David McCullough <davidm@snapgear.com> - * Copyright (C) 2002 Greg Ungerer <gerg@snapgear.com> - * Copyright (C) 2002 SnapGear, by Paul Dale <pauli@snapgear.com> - * Copyright (C) 2000, 2001 Lineo, by David McCullough <davidm@lineo.com> - * based heavily on: - * - * linux/fs/binfmt_aout.c: - * Copyright (C) 1991, 1992, 1996 Linus Torvalds - * linux/fs/binfmt_flat.c for 2.0 kernel - * Copyright (C) 1998 Kenneth Albanowski <kjahds@kjahds.com> - * JAN/99 -- coded full program relocation (gerg@snapgear.com) - */ - -/* ??? ZFLAT and shared library support is currently disabled. */ - -/****************************************************************************/ - -#include "qemu/osdep.h" -#include <sys/mman.h> - -#include "qemu.h" -#include "flat.h" -#include <target_flat.h> - -//#define DEBUG - -#ifdef DEBUG -#define DBG_FLT(...) printf(__VA_ARGS__) -#else -#define DBG_FLT(...) -#endif - -#define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ -#define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ - -struct lib_info { - abi_ulong start_code; /* Start of text segment */ - abi_ulong start_data; /* Start of data segment */ - abi_ulong end_data; /* Start of bss section */ - abi_ulong start_brk; /* End of data segment */ - abi_ulong text_len; /* Length of text segment */ - abi_ulong entry; /* Start address for this module */ - abi_ulong build_date; /* When this one was compiled */ - short loaded; /* Has this library been loaded? */ -}; - -#ifdef CONFIG_BINFMT_SHARED_FLAT -static int load_flat_shared_library(int id, struct lib_info *p); -#endif - -struct linux_binprm; - -/****************************************************************************/ -/* - * create_flat_tables() parses the env- and arg-strings in new user - * memory and creates the pointer tables from them, and puts their - * addresses on the "stack", returning the new stack pointer value. - */ - -/* Push a block of strings onto the guest stack. */ -static abi_ulong copy_strings(abi_ulong p, int n, char **s) -{ - int len; - - while (n-- > 0) { - len = strlen(s[n]) + 1; - p -= len; - memcpy_to_target(p, s[n], len); - } - - return p; -} - -static int target_pread(int fd, abi_ulong ptr, abi_ulong len, - abi_ulong offset) -{ - void *buf; - int ret; - - buf = lock_user(VERIFY_WRITE, ptr, len, 0); - ret = pread(fd, buf, len, offset); - unlock_user(buf, ptr, len); - return ret; -} -/****************************************************************************/ - -#ifdef CONFIG_BINFMT_ZFLAT - -#include <linux/zlib.h> - -#define LBUFSIZE 4000 - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ -#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ -#define RESERVED 0xC0 /* bit 6,7: reserved */ - -static int decompress_exec( - struct linux_binprm *bprm, - unsigned long offset, - char *dst, - long len, - int fd) -{ - unsigned char *buf; - z_stream strm; - loff_t fpos; - int ret, retval; - - DBG_FLT("decompress_exec(offset=%x,buf=%x,len=%x)\n",(int)offset, (int)dst, (int)len); - - memset(&strm, 0, sizeof(strm)); - strm.workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); - if (strm.workspace == NULL) { - DBG_FLT("binfmt_flat: no memory for decompress workspace\n"); - return -ENOMEM; - } - buf = kmalloc(LBUFSIZE, GFP_KERNEL); - if (buf == NULL) { - DBG_FLT("binfmt_flat: no memory for read buffer\n"); - retval = -ENOMEM; - goto out_free; - } - - /* Read in first chunk of data and parse gzip header. */ - fpos = offset; - ret = bprm->file->f_op->read(bprm->file, buf, LBUFSIZE, &fpos); - - strm.next_in = buf; - strm.avail_in = ret; - strm.total_in = 0; - - retval = -ENOEXEC; - - /* Check minimum size -- gzip header */ - if (ret < 10) { - DBG_FLT("binfmt_flat: file too small?\n"); - goto out_free_buf; - } - - /* Check gzip magic number */ - if ((buf[0] != 037) || ((buf[1] != 0213) && (buf[1] != 0236))) { - DBG_FLT("binfmt_flat: unknown compression magic?\n"); - goto out_free_buf; - } - - /* Check gzip method */ - if (buf[2] != 8) { - DBG_FLT("binfmt_flat: unknown compression method?\n"); - goto out_free_buf; - } - /* Check gzip flags */ - if ((buf[3] & ENCRYPTED) || (buf[3] & CONTINUATION) || - (buf[3] & RESERVED)) { - DBG_FLT("binfmt_flat: unknown flags?\n"); - goto out_free_buf; - } - - ret = 10; - if (buf[3] & EXTRA_FIELD) { - ret += 2 + buf[10] + (buf[11] << 8); - if (unlikely(LBUFSIZE == ret)) { - DBG_FLT("binfmt_flat: buffer overflow (EXTRA)?\n"); - goto out_free_buf; - } - } - if (buf[3] & ORIG_NAME) { - for (; ret < LBUFSIZE && (buf[ret] != 0); ret++) - ; - if (unlikely(LBUFSIZE == ret)) { - DBG_FLT("binfmt_flat: buffer overflow (ORIG_NAME)?\n"); - goto out_free_buf; - } - } - if (buf[3] & COMMENT) { - for (; ret < LBUFSIZE && (buf[ret] != 0); ret++) - ; - if (unlikely(LBUFSIZE == ret)) { - DBG_FLT("binfmt_flat: buffer overflow (COMMENT)?\n"); - goto out_free_buf; - } - } - - strm.next_in += ret; - strm.avail_in -= ret; - - strm.next_out = dst; - strm.avail_out = len; - strm.total_out = 0; - - if (zlib_inflateInit2(&strm, -MAX_WBITS) != Z_OK) { - DBG_FLT("binfmt_flat: zlib init failed?\n"); - goto out_free_buf; - } - - while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) { - ret = bprm->file->f_op->read(bprm->file, buf, LBUFSIZE, &fpos); - if (ret <= 0) - break; - if (ret >= (unsigned long) -4096) - break; - len -= ret; - - strm.next_in = buf; - strm.avail_in = ret; - strm.total_in = 0; - } - - if (ret < 0) { - DBG_FLT("binfmt_flat: decompression failed (%d), %s\n", - ret, strm.msg); - goto out_zlib; - } - - retval = 0; -out_zlib: - zlib_inflateEnd(&strm); -out_free_buf: - kfree(buf); -out_free: - kfree(strm.workspace); -out: - return retval; -} - -#endif /* CONFIG_BINFMT_ZFLAT */ - -/****************************************************************************/ - -static abi_ulong -calc_reloc(abi_ulong r, struct lib_info *p, int curid, int internalp) -{ - abi_ulong addr; - int id; - abi_ulong start_brk; - abi_ulong start_data; - abi_ulong text_len; - abi_ulong start_code; - -#ifdef CONFIG_BINFMT_SHARED_FLAT -#error needs checking - if (r == 0) - id = curid; /* Relocs of 0 are always self referring */ - else { - id = (r >> 24) & 0xff; /* Find ID for this reloc */ - r &= 0x00ffffff; /* Trim ID off here */ - } - if (id >= MAX_SHARED_LIBS) { - fprintf(stderr, "BINFMT_FLAT: reference 0x%x to shared library %d\n", - (unsigned) r, id); - goto failed; - } - if (curid != id) { - if (internalp) { - fprintf(stderr, "BINFMT_FLAT: reloc address 0x%x not " - "in same module (%d != %d)\n", - (unsigned) r, curid, id); - goto failed; - } else if ( ! p[id].loaded && - load_flat_shared_library(id, p) > (unsigned long) -4096) { - fprintf(stderr, "BINFMT_FLAT: failed to load library %d\n", id); - goto failed; - } - /* Check versioning information (i.e. time stamps) */ - if (p[id].build_date && p[curid].build_date - && p[curid].build_date < p[id].build_date) { - fprintf(stderr, "BINFMT_FLAT: library %d is younger than %d\n", - id, curid); - goto failed; - } - } -#else - id = 0; -#endif - - start_brk = p[id].start_brk; - start_data = p[id].start_data; - start_code = p[id].start_code; - text_len = p[id].text_len; - - if (!flat_reloc_valid(r, start_brk - start_data + text_len)) { - fprintf(stderr, "BINFMT_FLAT: reloc outside program 0x%x " - "(0 - 0x%x/0x%x)\n", - (int) r,(int)(start_brk-start_code),(int)text_len); - goto failed; - } - - if (r < text_len) /* In text segment */ - addr = r + start_code; - else /* In data segment */ - addr = r - text_len + start_data; - - /* Range checked already above so doing the range tests is redundant...*/ - return(addr); - -failed: - abort(); - return RELOC_FAILED; -} - -/****************************************************************************/ - -/* ??? This does not handle endianness correctly. */ -static void old_reloc(struct lib_info *libinfo, uint32_t rl) -{ -#ifdef DEBUG - const char *segment[] = { "TEXT", "DATA", "BSS", "*UNKNOWN*" }; -#endif - uint32_t *ptr; - uint32_t offset; - int reloc_type; - - offset = rl & 0x3fffffff; - reloc_type = rl >> 30; - /* ??? How to handle this? */ -#if defined(CONFIG_COLDFIRE) - ptr = (uint32_t *) ((unsigned long) libinfo->start_code + offset); -#else - ptr = (uint32_t *) ((unsigned long) libinfo->start_data + offset); -#endif - -#ifdef DEBUG - fprintf(stderr, "Relocation of variable at DATASEG+%x " - "(address %p, currently %x) into segment %s\n", - offset, ptr, (int)*ptr, segment[reloc_type]); -#endif - - switch (reloc_type) { - case OLD_FLAT_RELOC_TYPE_TEXT: - *ptr += libinfo->start_code; - break; - case OLD_FLAT_RELOC_TYPE_DATA: - *ptr += libinfo->start_data; - break; - case OLD_FLAT_RELOC_TYPE_BSS: - *ptr += libinfo->end_data; - break; - default: - fprintf(stderr, "BINFMT_FLAT: Unknown relocation type=%x\n", - reloc_type); - break; - } - DBG_FLT("Relocation became %x\n", (int)*ptr); -} - -/****************************************************************************/ - -static int load_flat_file(struct linux_binprm * bprm, - struct lib_info *libinfo, int id, abi_ulong *extra_stack) -{ - struct flat_hdr * hdr; - abi_ulong textpos = 0, datapos = 0; - abi_long result; - abi_ulong realdatastart = 0; - abi_ulong text_len, data_len, bss_len, stack_len, flags; - abi_ulong extra; - abi_ulong reloc = 0, rp; - int i, rev, relocs = 0; - abi_ulong fpos; - abi_ulong start_code; - abi_ulong indx_len; - - hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */ - - text_len = ntohl(hdr->data_start); - data_len = ntohl(hdr->data_end) - ntohl(hdr->data_start); - bss_len = ntohl(hdr->bss_end) - ntohl(hdr->data_end); - stack_len = ntohl(hdr->stack_size); - if (extra_stack) { - stack_len += *extra_stack; - *extra_stack = stack_len; - } - relocs = ntohl(hdr->reloc_count); - flags = ntohl(hdr->flags); - rev = ntohl(hdr->rev); - - DBG_FLT("BINFMT_FLAT: Loading file: %s\n", bprm->filename); - - if (rev != FLAT_VERSION && rev != OLD_FLAT_VERSION) { - fprintf(stderr, "BINFMT_FLAT: bad magic/rev (0x%x, need 0x%x)\n", - rev, (int) FLAT_VERSION); - return -ENOEXEC; - } - - /* Don't allow old format executables to use shared libraries */ - if (rev == OLD_FLAT_VERSION && id != 0) { - fprintf(stderr, "BINFMT_FLAT: shared libraries are not available\n"); - return -ENOEXEC; - } - - /* - * fix up the flags for the older format, there were all kinds - * of endian hacks, this only works for the simple cases - */ - if (rev == OLD_FLAT_VERSION && flat_old_ram_flag(flags)) - flags = FLAT_FLAG_RAM; - -#ifndef CONFIG_BINFMT_ZFLAT - if (flags & (FLAT_FLAG_GZIP|FLAT_FLAG_GZDATA)) { - fprintf(stderr, "Support for ZFLAT executables is not enabled\n"); - return -ENOEXEC; - } -#endif - - /* - * calculate the extra space we need to map in - */ - extra = relocs * sizeof(abi_ulong); - if (extra < bss_len + stack_len) - extra = bss_len + stack_len; - - /* Add space for library base pointers. Make sure this does not - misalign the doesn't misalign the data segment. */ - indx_len = MAX_SHARED_LIBS * sizeof(abi_ulong); - indx_len = (indx_len + 15) & ~(abi_ulong)15; - - /* - * there are a couple of cases here, the separate code/data - * case, and then the fully copied to RAM case which lumps - * it all together. - */ - if ((flags & (FLAT_FLAG_RAM|FLAT_FLAG_GZIP)) == 0) { - /* - * this should give us a ROM ptr, but if it doesn't we don't - * really care - */ - DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n"); - - textpos = target_mmap(0, text_len, PROT_READ|PROT_EXEC, - MAP_PRIVATE, bprm->fd, 0); - if (textpos == -1) { - fprintf(stderr, "Unable to mmap process text\n"); - return -1; - } - - realdatastart = target_mmap(0, data_len + extra + indx_len, - PROT_READ|PROT_WRITE|PROT_EXEC, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - - if (realdatastart == -1) { - fprintf(stderr, "Unable to allocate RAM for process data\n"); - return realdatastart; - } - datapos = realdatastart + indx_len; - - DBG_FLT("BINFMT_FLAT: Allocated data+bss+stack (%d bytes): %x\n", - (int)(data_len + bss_len + stack_len), (int)datapos); - - fpos = ntohl(hdr->data_start); -#ifdef CONFIG_BINFMT_ZFLAT - if (flags & FLAT_FLAG_GZDATA) { - result = decompress_exec(bprm, fpos, (char *) datapos, - data_len + (relocs * sizeof(abi_ulong))) - } else -#endif - { - result = target_pread(bprm->fd, datapos, - data_len + (relocs * sizeof(abi_ulong)), - fpos); - } - if (result < 0) { - fprintf(stderr, "Unable to read data+bss\n"); - return result; - } - - reloc = datapos + (ntohl(hdr->reloc_start) - text_len); - - } else { - - textpos = target_mmap(0, text_len + data_len + extra + indx_len, - PROT_READ | PROT_EXEC | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (textpos == -1 ) { - fprintf(stderr, "Unable to allocate RAM for process text/data\n"); - return -1; - } - - realdatastart = textpos + ntohl(hdr->data_start); - datapos = realdatastart + indx_len; - reloc = (textpos + ntohl(hdr->reloc_start) + indx_len); - -#ifdef CONFIG_BINFMT_ZFLAT -#error code needs checking - /* - * load it all in and treat it like a RAM load from now on - */ - if (flags & FLAT_FLAG_GZIP) { - result = decompress_exec(bprm, sizeof (struct flat_hdr), - (((char *) textpos) + sizeof (struct flat_hdr)), - (text_len + data_len + (relocs * sizeof(unsigned long)) - - sizeof (struct flat_hdr)), - 0); - memmove((void *) datapos, (void *) realdatastart, - data_len + (relocs * sizeof(unsigned long))); - } else if (flags & FLAT_FLAG_GZDATA) { - fpos = 0; - result = bprm->file->f_op->read(bprm->file, - (char *) textpos, text_len, &fpos); - if (result < (unsigned long) -4096) - result = decompress_exec(bprm, text_len, (char *) datapos, - data_len + (relocs * sizeof(unsigned long)), 0); - } - else -#endif - { - result = target_pread(bprm->fd, textpos, - text_len, 0); - if (result >= 0) { - result = target_pread(bprm->fd, datapos, - data_len + (relocs * sizeof(abi_ulong)), - ntohl(hdr->data_start)); - } - } - if (result < 0) { - fprintf(stderr, "Unable to read code+data+bss\n"); - return result; - } - } - - DBG_FLT("Mapping is 0x%x, Entry point is 0x%x, data_start is 0x%x\n", - (int)textpos, 0x00ffffff&ntohl(hdr->entry), - ntohl(hdr->data_start)); - - /* The main program needs a little extra setup in the task structure */ - start_code = textpos + sizeof (struct flat_hdr); - - DBG_FLT("%s %s: TEXT=%x-%x DATA=%x-%x BSS=%x-%x\n", - id ? "Lib" : "Load", bprm->filename, - (int) start_code, (int) (textpos + text_len), - (int) datapos, - (int) (datapos + data_len), - (int) (datapos + data_len), - (int) (((datapos + data_len + bss_len) + 3) & ~3)); - - text_len -= sizeof(struct flat_hdr); /* the real code len */ - - /* Store the current module values into the global library structure */ - libinfo[id].start_code = start_code; - libinfo[id].start_data = datapos; - libinfo[id].end_data = datapos + data_len; - libinfo[id].start_brk = datapos + data_len + bss_len; - libinfo[id].text_len = text_len; - libinfo[id].loaded = 1; - libinfo[id].entry = (0x00ffffff & ntohl(hdr->entry)) + textpos; - libinfo[id].build_date = ntohl(hdr->build_date); - - /* - * We just load the allocations into some temporary memory to - * help simplify all this mumbo jumbo - * - * We've got two different sections of relocation entries. - * The first is the GOT which resides at the beginning of the data segment - * and is terminated with a -1. This one can be relocated in place. - * The second is the extra relocation entries tacked after the image's - * data segment. These require a little more processing as the entry is - * really an offset into the image which contains an offset into the - * image. - */ - if (flags & FLAT_FLAG_GOTPIC) { - rp = datapos; - while (1) { - abi_ulong addr; - if (get_user_ual(addr, rp)) - return -EFAULT; - if (addr == -1) - break; - if (addr) { - addr = calc_reloc(addr, libinfo, id, 0); - if (addr == RELOC_FAILED) - return -ENOEXEC; - if (put_user_ual(addr, rp)) - return -EFAULT; - } - rp += sizeof(abi_ulong); - } - } - - /* - * Now run through the relocation entries. - * We've got to be careful here as C++ produces relocatable zero - * entries in the constructor and destructor tables which are then - * tested for being not zero (which will always occur unless we're - * based from address zero). This causes an endless loop as __start - * is at zero. The solution used is to not relocate zero addresses. - * This has the negative side effect of not allowing a global data - * reference to be statically initialised to _stext (I've moved - * __start to address 4 so that is okay). - */ - if (rev > OLD_FLAT_VERSION) { - abi_ulong persistent = 0; - for (i = 0; i < relocs; i++) { - abi_ulong addr, relval; - - /* Get the address of the pointer to be - relocated (of course, the address has to be - relocated first). */ - if (get_user_ual(relval, reloc + i * sizeof(abi_ulong))) - return -EFAULT; - relval = ntohl(relval); - if (flat_set_persistent(relval, &persistent)) - continue; - addr = flat_get_relocate_addr(relval); - rp = calc_reloc(addr, libinfo, id, 1); - if (rp == RELOC_FAILED) - return -ENOEXEC; - - /* Get the pointer's value. */ - if (get_user_ual(addr, rp)) - return -EFAULT; - addr = flat_get_addr_from_rp(addr, relval, flags, &persistent); - if (addr != 0) { - /* - * Do the relocation. PIC relocs in the data section are - * already in target order - */ - if ((flags & FLAT_FLAG_GOTPIC) == 0) - addr = ntohl(addr); - addr = calc_reloc(addr, libinfo, id, 0); - if (addr == RELOC_FAILED) - return -ENOEXEC; - - /* Write back the relocated pointer. */ - if (flat_put_addr_at_rp(rp, addr, relval)) - return -EFAULT; - } - } - } else { - for (i = 0; i < relocs; i++) { - abi_ulong relval; - if (get_user_ual(relval, reloc + i * sizeof(abi_ulong))) - return -EFAULT; - old_reloc(&libinfo[0], relval); - } - } - - /* zero the BSS. */ - memset(g2h(datapos + data_len), 0, bss_len); - - return 0; -} - - -/****************************************************************************/ -#ifdef CONFIG_BINFMT_SHARED_FLAT - -/* - * Load a shared library into memory. The library gets its own data - * segment (including bss) but not argv/argc/environ. - */ - -static int load_flat_shared_library(int id, struct lib_info *libs) -{ - struct linux_binprm bprm; - int res; - char buf[16]; - - /* Create the file name */ - sprintf(buf, "/lib/lib%d.so", id); - - /* Open the file up */ - bprm.filename = buf; - bprm.file = open_exec(bprm.filename); - res = PTR_ERR(bprm.file); - if (IS_ERR(bprm.file)) - return res; - - res = prepare_binprm(&bprm); - - if (res <= (unsigned long)-4096) - res = load_flat_file(&bprm, libs, id, NULL); - if (bprm.file) { - allow_write_access(bprm.file); - fput(bprm.file); - bprm.file = NULL; - } - return(res); -} - -#endif /* CONFIG_BINFMT_SHARED_FLAT */ - -int load_flt_binary(struct linux_binprm *bprm, struct image_info *info) -{ - struct lib_info libinfo[MAX_SHARED_LIBS]; - abi_ulong p; - abi_ulong stack_len; - abi_ulong start_addr; - abi_ulong sp; - int res; - int i, j; - - memset(libinfo, 0, sizeof(libinfo)); - /* - * We have to add the size of our arguments to our stack size - * otherwise it's too easy for users to create stack overflows - * by passing in a huge argument list. And yes, we have to be - * pedantic and include space for the argv/envp array as it may have - * a lot of entries. - */ - stack_len = 0; - for (i = 0; i < bprm->argc; ++i) { - /* the argv strings */ - stack_len += strlen(bprm->argv[i]); - } - for (i = 0; i < bprm->envc; ++i) { - /* the envp strings */ - stack_len += strlen(bprm->envp[i]); - } - stack_len += (bprm->argc + 1) * 4; /* the argv array */ - stack_len += (bprm->envc + 1) * 4; /* the envp array */ - - - res = load_flat_file(bprm, libinfo, 0, &stack_len); - if (res > (unsigned long)-4096) - return res; - - /* Update data segment pointers for all libraries */ - for (i=0; i<MAX_SHARED_LIBS; i++) { - if (libinfo[i].loaded) { - abi_ulong p; - p = libinfo[i].start_data; - for (j=0; j<MAX_SHARED_LIBS; j++) { - p -= 4; - /* FIXME - handle put_user() failures */ - if (put_user_ual(libinfo[j].loaded - ? libinfo[j].start_data - : UNLOADED_LIB, - p)) - return -EFAULT; - } - } - } - - p = ((libinfo[0].start_brk + stack_len + 3) & ~3) - 4; - DBG_FLT("p=%x\n", (int)p); - - /* Copy argv/envp. */ - p = copy_strings(p, bprm->envc, bprm->envp); - p = copy_strings(p, bprm->argc, bprm->argv); - /* Align stack. */ - sp = p & ~(abi_ulong)(sizeof(abi_ulong) - 1); - /* Enforce final stack alignment of 16 bytes. This is sufficient - for all current targets, and excess alignment is harmless. */ - stack_len = bprm->envc + bprm->argc + 2; - stack_len += 3; /* argc, arvg, argp */ - stack_len *= sizeof(abi_ulong); - if ((sp + stack_len) & 15) - sp -= 16 - ((sp + stack_len) & 15); - sp = loader_build_argptr(bprm->envc, bprm->argc, sp, p, - flat_argvp_envp_on_stack()); - - /* Fake some return addresses to ensure the call chain will - * initialise library in order for us. We are required to call - * lib 1 first, then 2, ... and finally the main program (id 0). - */ - start_addr = libinfo[0].entry; - -#ifdef CONFIG_BINFMT_SHARED_FLAT -#error here - for (i = MAX_SHARED_LIBS-1; i>0; i--) { - if (libinfo[i].loaded) { - /* Push previos first to call address */ - --sp; - if (put_user_ual(start_addr, sp)) - return -EFAULT; - start_addr = libinfo[i].entry; - } - } -#endif - - /* Stash our initial stack pointer into the mm structure */ - info->start_code = libinfo[0].start_code; - info->end_code = libinfo[0].start_code = libinfo[0].text_len; - info->start_data = libinfo[0].start_data; - info->end_data = libinfo[0].end_data; - info->start_brk = libinfo[0].start_brk; - info->start_stack = sp; - info->stack_limit = libinfo[0].start_brk; - info->entry = start_addr; - info->code_offset = info->start_code; - info->data_offset = info->start_data - libinfo[0].text_len; - - DBG_FLT("start_thread(entry=0x%x, start_stack=0x%x)\n", - (int)info->entry, (int)info->start_stack); - - return 0; -} diff --git a/qemu/linux-user/i386/syscall_nr.h b/qemu/linux-user/i386/syscall_nr.h deleted file mode 100644 index bc1bc233e..000000000 --- a/qemu/linux-user/i386/syscall_nr.h +++ /dev/null @@ -1,382 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_restart_syscall 0 -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lchown 16 -#define TARGET_NR_break 17 -#define TARGET_NR_oldstat 18 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_oldfstat 28 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 -#define TARGET_NR_oldolduname 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 -#define TARGET_NR_oldlstat 84 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_olduname 109 -#define TARGET_NR_iopl 110 -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_vm86old 113 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_modify_ldt 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 -#define TARGET_NR_vm86 166 -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_chown 182 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 -#define TARGET_NR_getpmsg 188 /* some people actually want streams */ -#define TARGET_NR_putpmsg 189 /* some people actually want streams */ -#define TARGET_NR_vfork 190 -#define TARGET_NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_lchown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_chown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_pivot_root 217 -#define TARGET_NR_mincore 218 -#define TARGET_NR_madvise 219 -#define TARGET_NR_madvise1 219 /* delete when C lib stub is removed */ -#define TARGET_NR_getdents64 220 -#define TARGET_NR_fcntl64 221 -/* 223 is unused */ -#define TARGET_NR_gettid 224 -#define TARGET_NR_readahead 225 -#define TARGET_NR_setxattr 226 -#define TARGET_NR_lsetxattr 227 -#define TARGET_NR_fsetxattr 228 -#define TARGET_NR_getxattr 229 -#define TARGET_NR_lgetxattr 230 -#define TARGET_NR_fgetxattr 231 -#define TARGET_NR_listxattr 232 -#define TARGET_NR_llistxattr 233 -#define TARGET_NR_flistxattr 234 -#define TARGET_NR_removexattr 235 -#define TARGET_NR_lremovexattr 236 -#define TARGET_NR_fremovexattr 237 -#define TARGET_NR_tkill 238 -#define TARGET_NR_sendfile64 239 -#define TARGET_NR_futex 240 -#define TARGET_NR_sched_setaffinity 241 -#define TARGET_NR_sched_getaffinity 242 -#define TARGET_NR_set_thread_area 243 -#define TARGET_NR_get_thread_area 244 -#define TARGET_NR_io_setup 245 -#define TARGET_NR_io_destroy 246 -#define TARGET_NR_io_getevents 247 -#define TARGET_NR_io_submit 248 -#define TARGET_NR_io_cancel 249 -#define TARGET_NR_fadvise64 250 -/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ -#define TARGET_NR_exit_group 252 -#define TARGET_NR_lookup_dcookie 253 -#define TARGET_NR_epoll_create 254 -#define TARGET_NR_epoll_ctl 255 -#define TARGET_NR_epoll_wait 256 -#define TARGET_NR_remap_file_pages 257 -#define TARGET_NR_set_tid_address 258 -#define TARGET_NR_timer_create 259 -#define TARGET_NR_timer_settime (TARGET_NR_timer_create+1) -#define TARGET_NR_timer_gettime (TARGET_NR_timer_create+2) -#define TARGET_NR_timer_getoverrun (TARGET_NR_timer_create+3) -#define TARGET_NR_timer_delete (TARGET_NR_timer_create+4) -#define TARGET_NR_clock_settime (TARGET_NR_timer_create+5) -#define TARGET_NR_clock_gettime (TARGET_NR_timer_create+6) -#define TARGET_NR_clock_getres (TARGET_NR_timer_create+7) -#define TARGET_NR_clock_nanosleep (TARGET_NR_timer_create+8) -#define TARGET_NR_statfs64 268 -#define TARGET_NR_fstatfs64 269 -#define TARGET_NR_tgkill 270 -#define TARGET_NR_utimes 271 -#define TARGET_NR_fadvise64_64 272 -#define TARGET_NR_vserver 273 -#define TARGET_NR_mbind 274 -#define TARGET_NR_get_mempolicy 275 -#define TARGET_NR_set_mempolicy 276 -#define TARGET_NR_mq_open 277 -#define TARGET_NR_mq_unlink (TARGET_NR_mq_open+1) -#define TARGET_NR_mq_timedsend (TARGET_NR_mq_open+2) -#define TARGET_NR_mq_timedreceive (TARGET_NR_mq_open+3) -#define TARGET_NR_mq_notify (TARGET_NR_mq_open+4) -#define TARGET_NR_mq_getsetattr (TARGET_NR_mq_open+5) -#define TARGET_NR_kexec_load 283 -#define TARGET_NR_waitid 284 -/* #define TARGET_NR_sys_setaltroot 285 */ -#define TARGET_NR_add_key 286 -#define TARGET_NR_request_key 287 -#define TARGET_NR_keyctl 288 -#define TARGET_NR_ioprio_set 289 -#define TARGET_NR_ioprio_get 290 -#define TARGET_NR_inotify_init 291 -#define TARGET_NR_inotify_add_watch 292 -#define TARGET_NR_inotify_rm_watch 293 -#define TARGET_NR_migrate_pages 294 -#define TARGET_NR_openat 295 -#define TARGET_NR_mkdirat 296 -#define TARGET_NR_mknodat 297 -#define TARGET_NR_fchownat 298 -#define TARGET_NR_futimesat 299 -#define TARGET_NR_fstatat64 300 -#define TARGET_NR_unlinkat 301 -#define TARGET_NR_renameat 302 -#define TARGET_NR_linkat 303 -#define TARGET_NR_symlinkat 304 -#define TARGET_NR_readlinkat 305 -#define TARGET_NR_fchmodat 306 -#define TARGET_NR_faccessat 307 -#define TARGET_NR_pselect6 308 -#define TARGET_NR_ppoll 309 -#define TARGET_NR_unshare 310 -#define TARGET_NR_set_robust_list 311 -#define TARGET_NR_get_robust_list 312 -#define TARGET_NR_splice 313 -#define TARGET_NR_sync_file_range 314 -#define TARGET_NR_tee 315 -#define TARGET_NR_vmsplice 316 -#define TARGET_NR_move_pages 317 -#define TARGET_NR_getcpu 318 -#define TARGET_NR_epoll_pwait 319 -#define TARGET_NR_utimensat 320 -#define TARGET_NR_signalfd 321 -#define TARGET_NR_timerfd_create 322 -#define TARGET_NR_eventfd 323 -#define TARGET_NR_fallocate 324 -#define TARGET_NR_timerfd_settime 325 -#define TARGET_NR_timerfd_gettime 326 -#define TARGET_NR_signalfd4 327 -#define TARGET_NR_eventfd2 328 -#define TARGET_NR_epoll_create1 329 -#define TARGET_NR_dup3 330 -#define TARGET_NR_pipe2 331 -#define TARGET_NR_inotify_init1 332 -#define TARGET_NR_preadv 333 -#define TARGET_NR_pwritev 334 -#define TARGET_NR_rt_tgsigqueueinfo 335 -#define TARGET_NR_perf_event_open 336 -#define TARGET_NR_recvmmsg 337 -#define TARGET_NR_fanotify_init 338 -#define TARGET_NR_fanotify_mark 339 -#define TARGET_NR_prlimit64 340 -#define TARGET_NR_name_to_handle_at 341 -#define TARGET_NR_open_by_handle_at 342 -#define TARGET_NR_clock_adjtime 343 -#define TARGET_NR_syncfs 344 -#define TARGET_NR_sendmmsg 345 -#define TARGET_NR_setns 346 -#define TARGET_NR_process_vm_readv 347 -#define TARGET_NR_process_vm_writev 348 -#define TARGET_NR_kcmp 349 -#define TARGET_NR_finit_module 350 -#define TARGET_NR_sched_setattr 351 -#define TARGET_NR_sched_getattr 352 -#define TARGET_NR_renameat2 353 -#define TARGET_NR_seccomp 354 -#define TARGET_NR_getrandom 355 -#define TARGET_NR_memfd_create 356 -#define TARGET_NR_bpf 357 -#define TARGET_NR_execveat 358 -#define TARGET_NR_socket 359 -#define TARGET_NR_socketpair 360 -#define TARGET_NR_bind 361 -#define TARGET_NR_connect 362 -#define TARGET_NR_listen 363 -#define TARGET_NR_accept4 364 -#define TARGET_NR_getsockopt 365 -#define TARGET_NR_setsockopt 366 -#define TARGET_NR_getsockname 367 -#define TARGET_NR_getpeername 368 -#define TARGET_NR_sendto 369 -#define TARGET_NR_sendmsg 370 -#define TARGET_NR_recvfrom 371 -#define TARGET_NR_recvmsg 372 -#define TARGET_NR_shutdown 373 -#define TARGET_NR_userfaultfd 374 -#define TARGET_NR_membarrier 375 -#define TARGET_NR_mlock2 376 -#define TARGET_NR_copy_file_range 377 diff --git a/qemu/linux-user/i386/target_cpu.h b/qemu/linux-user/i386/target_cpu.h deleted file mode 100644 index 58f86454d..000000000 --- a/qemu/linux-user/i386/target_cpu.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * i386 specific CPU ABI and functions for linux-user - * - * Copyright (c) 2003 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUX86State *env, target_ulong newsp) -{ - if (newsp) { - env->regs[R_ESP] = newsp; - } - env->regs[R_EAX] = 0; -} - -#if defined(TARGET_ABI32) -abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr); - -static inline void cpu_set_tls(CPUX86State *env, target_ulong newtls) -{ - do_set_thread_area(env, newtls); - cpu_x86_load_seg(env, R_GS, env->segs[R_GS].selector); -} -#else -abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr); - -static inline void cpu_set_tls(CPUX86State *env, target_ulong newtls) -{ - do_arch_prctl(env, TARGET_ARCH_SET_FS, newtls); -} -#endif /* defined(TARGET_ABI32) */ - -#endif /* !defined(TARGET_CPU_H) */ diff --git a/qemu/linux-user/i386/target_signal.h b/qemu/linux-user/i386/target_signal.h deleted file mode 100644 index 9baf7fbeb..000000000 --- a/qemu/linux-user/i386/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUX86State *state) -{ - return state->regs[R_ESP]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/i386/target_structs.h b/qemu/linux-user/i386/target_structs.h deleted file mode 100644 index 65f535e16..000000000 --- a/qemu/linux-user/i386/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * i386 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/i386/target_syscall.h b/qemu/linux-user/i386/target_syscall.h deleted file mode 100644 index 0ac84dc02..000000000 --- a/qemu/linux-user/i386/target_syscall.h +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* default linux values for the selectors */ -#define __USER_CS (0x23) -#define __USER_DS (0x2B) - -struct target_pt_regs { - long ebx; - long ecx; - long edx; - long esi; - long edi; - long ebp; - long eax; - int xds; - int xes; - long orig_eax; - long eip; - int xcs; - long eflags; - long esp; - int xss; -}; - -/* ioctls */ - -#define TARGET_LDT_ENTRIES 8192 -#define TARGET_LDT_ENTRY_SIZE 8 - -#define TARGET_GDT_ENTRIES 9 -#define TARGET_GDT_ENTRY_TLS_ENTRIES 3 -#define TARGET_GDT_ENTRY_TLS_MIN 6 -#define TARGET_GDT_ENTRY_TLS_MAX (TARGET_GDT_ENTRY_TLS_MIN + TARGET_GDT_ENTRY_TLS_ENTRIES - 1) - -struct target_modify_ldt_ldt_s { - unsigned int entry_number; - abi_ulong base_addr; - unsigned int limit; - unsigned int flags; -}; - -/* vm86 defines */ - -#define TARGET_BIOSSEG 0x0f000 - -#define TARGET_CPU_086 0 -#define TARGET_CPU_186 1 -#define TARGET_CPU_286 2 -#define TARGET_CPU_386 3 -#define TARGET_CPU_486 4 -#define TARGET_CPU_586 5 - -#define TARGET_VM86_SIGNAL 0 /* return due to signal */ -#define TARGET_VM86_UNKNOWN 1 /* unhandled GP fault - IO-instruction or similar */ -#define TARGET_VM86_INTx 2 /* int3/int x instruction (ARG = x) */ -#define TARGET_VM86_STI 3 /* sti/popf/iret instruction enabled virtual interrupts */ - -/* - * Additional return values when invoking new vm86() - */ -#define TARGET_VM86_PICRETURN 4 /* return due to pending PIC request */ -#define TARGET_VM86_TRAP 6 /* return due to DOS-debugger request */ - -/* - * function codes when invoking new vm86() - */ -#define TARGET_VM86_PLUS_INSTALL_CHECK 0 -#define TARGET_VM86_ENTER 1 -#define TARGET_VM86_ENTER_NO_BYPASS 2 -#define TARGET_VM86_REQUEST_IRQ 3 -#define TARGET_VM86_FREE_IRQ 4 -#define TARGET_VM86_GET_IRQ_BITS 5 -#define TARGET_VM86_GET_AND_RESET_IRQ 6 - -/* - * This is the stack-layout seen by the user space program when we have - * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout - * is 'kernel_vm86_regs' (see below). - */ - -struct target_vm86_regs { -/* - * normal regs, with special meaning for the segment descriptors.. - */ - abi_long ebx; - abi_long ecx; - abi_long edx; - abi_long esi; - abi_long edi; - abi_long ebp; - abi_long eax; - abi_long __null_ds; - abi_long __null_es; - abi_long __null_fs; - abi_long __null_gs; - abi_long orig_eax; - abi_long eip; - unsigned short cs, __csh; - abi_long eflags; - abi_long esp; - unsigned short ss, __ssh; -/* - * these are specific to v86 mode: - */ - unsigned short es, __esh; - unsigned short ds, __dsh; - unsigned short fs, __fsh; - unsigned short gs, __gsh; -}; - -struct target_revectored_struct { - abi_ulong __map[8]; /* 256 bits */ -}; - -struct target_vm86_struct { - struct target_vm86_regs regs; - abi_ulong flags; - abi_ulong screen_bitmap; - abi_ulong cpu_type; - struct target_revectored_struct int_revectored; - struct target_revectored_struct int21_revectored; -}; - -/* - * flags masks - */ -#define TARGET_VM86_SCREEN_BITMAP 0x0001 - -struct target_vm86plus_info_struct { - abi_ulong flags; -#define TARGET_force_return_for_pic (1 << 0) -#define TARGET_vm86dbg_active (1 << 1) /* for debugger */ -#define TARGET_vm86dbg_TFpendig (1 << 2) /* for debugger */ -#define TARGET_is_vm86pus (1 << 31) /* for vm86 internal use */ - unsigned char vm86dbg_intxxtab[32]; /* for debugger */ -}; - -struct target_vm86plus_struct { - struct target_vm86_regs regs; - abi_ulong flags; - abi_ulong screen_bitmap; - abi_ulong cpu_type; - struct target_revectored_struct int_revectored; - struct target_revectored_struct int21_revectored; - struct target_vm86plus_info_struct vm86plus; -}; - -#define UNAME_MACHINE "i686" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/i386/termbits.h b/qemu/linux-user/i386/termbits.h deleted file mode 100644 index e051a3af7..000000000 --- a/qemu/linux-user/i386/termbits.h +++ /dev/null @@ -1,226 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/ioctls.h b/qemu/linux-user/ioctls.h deleted file mode 100644 index e67265510..000000000 --- a/qemu/linux-user/ioctls.h +++ /dev/null @@ -1,388 +0,0 @@ - /* emulated ioctl list */ - - IOCTL(TCGETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TCSETS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TCSETSF, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TCSETSW, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TIOCGWINSZ, IOC_R, MK_PTR(MK_STRUCT(STRUCT_winsize))) - IOCTL(TIOCSWINSZ, IOC_W, MK_PTR(MK_STRUCT(STRUCT_winsize))) - IOCTL(FIONREAD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TCGETA, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TCSETA, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TCSETAW, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TCSETAF, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TCSBRK, 0, TYPE_INT) - IOCTL(TCSBRKP, 0, TYPE_INT) - IOCTL(TCXONC, 0, TYPE_INT) - IOCTL(TCFLSH, 0, TYPE_INT) - IOCTL(TIOCEXCL, 0, TYPE_NULL) - IOCTL(TIOCNXCL, 0, TYPE_NULL) - IOCTL(TIOCSCTTY, 0, TYPE_INT) - IOCTL(TIOCGPGRP, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSPGRP, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCGSID, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCOUTQ, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSTI, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCMGET, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCMBIS, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCMBIC, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCMSET, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCGSOFTCAR, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSSOFTCAR, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCLINUX, IOC_R | IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCCONS, 0, TYPE_NULL) - IOCTL(TIOCGSERIAL, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSSERIAL, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCPKT, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(FIONBIO, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCNOTTY, 0, TYPE_NULL) - IOCTL(TIOCGETD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSETD, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCGPTN, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSPTLCK, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(FIOCLEX, 0, TYPE_NULL) - IOCTL(FIONCLEX, 0, TYPE_NULL) - IOCTL(FIOASYNC, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(TIOCGLCKTRMIOS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TIOCSLCKTRMIOS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) - IOCTL(TIOCSERCONFIG, 0, TYPE_NULL) - IOCTL(TIOCSERGETLSR, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(TIOCSERGETMULTI, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct))) - IOCTL(TIOCSERSETMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct))) - IOCTL(TIOCMIWAIT, 0, TYPE_INT) - IOCTL(TIOCGICOUNT, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_icounter_struct))) - - IOCTL(KIOCSOUND, 0, TYPE_INT) - IOCTL(KDMKTONE, 0, TYPE_INT) - IOCTL(KDSETMODE, 0, TYPE_INT) - IOCTL(KDGKBTYPE, IOC_R, MK_PTR(TYPE_CHAR)) - IOCTL(KDGKBMODE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(KDSKBMODE, 0, TYPE_INT) - IOCTL(KDGKBENT, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_kbentry))) - IOCTL(KDGKBSENT, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_kbsentry))) - IOCTL(KDGKBLED, 0, TYPE_INT) - IOCTL(KDSKBLED, 0, TYPE_INT) - IOCTL(KDGETLED, 0, TYPE_INT) - IOCTL(KDSETLED, 0, TYPE_INT) - IOCTL_SPECIAL(KDSIGACCEPT, 0, do_ioctl_kdsigaccept, TYPE_INT) - - IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(BLKRRPART, 0, TYPE_NULL) - IOCTL(BLKGETSIZE, IOC_R, MK_PTR(TYPE_ULONG)) -#ifdef BLKGETSIZE64 - IOCTL(BLKGETSIZE64, IOC_R, MK_PTR(TYPE_ULONGLONG)) -#endif - IOCTL(BLKFLSBUF, 0, TYPE_NULL) - IOCTL(BLKRASET, 0, TYPE_INT) - IOCTL(BLKRAGET, IOC_R, MK_PTR(TYPE_LONG)) - IOCTL(BLKSSZGET, IOC_R, MK_PTR(TYPE_LONG)) - IOCTL(BLKBSZGET, IOC_R, MK_PTR(TYPE_INT)) - IOCTL_SPECIAL(BLKPG, IOC_W, do_ioctl_blkpg, - MK_PTR(MK_STRUCT(STRUCT_blkpg_ioctl_arg))) -#ifdef FIBMAP - IOCTL(FIBMAP, IOC_W | IOC_R, MK_PTR(TYPE_LONG)) -#endif -#ifdef FIGETBSZ - IOCTL(FIGETBSZ, IOC_R, MK_PTR(TYPE_LONG)) -#endif -#ifdef CONFIG_FIEMAP - IOCTL_SPECIAL(FS_IOC_FIEMAP, IOC_W | IOC_R, do_ioctl_fs_ioc_fiemap, - MK_PTR(MK_STRUCT(STRUCT_fiemap))) -#endif - - IOCTL(SIOCATMARK, 0, TYPE_NULL) - IOCTL(SIOCGIFNAME, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SIOCGIFFLAGS, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_short_ifreq))) - IOCTL(SIOCSIFFLAGS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_short_ifreq))) - IOCTL(SIOCGIFADDR, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFADDR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFBRDADDR, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFBRDADDR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFDSTADDR, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFDSTADDR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFNETMASK, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFNETMASK, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFHWADDR, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFHWADDR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFTXQLEN, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCSIFTXQLEN, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFMETRIC, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_int_ifreq))) - IOCTL(SIOCSIFMETRIC, IOC_W, MK_PTR(MK_STRUCT(STRUCT_int_ifreq))) - IOCTL(SIOCGIFMTU, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_int_ifreq))) - IOCTL(SIOCSIFMTU, IOC_W, MK_PTR(MK_STRUCT(STRUCT_int_ifreq))) - IOCTL(SIOCGIFMAP, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_ifmap_ifreq))) - IOCTL(SIOCSIFMAP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_ifmap_ifreq))) - IOCTL(SIOCGIFSLAVE, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_char_ifreq))) - IOCTL(SIOCSIFSLAVE, IOC_W, MK_PTR(MK_STRUCT(STRUCT_char_ifreq))) - IOCTL(SIOCGIFMEM, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_ptr_ifreq))) - IOCTL(SIOCSIFMEM, IOC_W, MK_PTR(MK_STRUCT(STRUCT_ptr_ifreq))) - IOCTL(SIOCADDMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCDELMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq))) - IOCTL(SIOCGIFINDEX, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_int_ifreq))) - IOCTL(SIOCSIFLINK, 0, TYPE_NULL) - IOCTL_SPECIAL(SIOCGIFCONF, IOC_W | IOC_R, do_ioctl_ifconf, - MK_PTR(MK_STRUCT(STRUCT_ifconf))) - IOCTL(SIOCGIFENCAP, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SIOCSIFENCAP, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SIOCDARP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCSARP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCGARP, IOC_R, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCDRARP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCSRARP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCGRARP, IOC_R, MK_PTR(MK_STRUCT(STRUCT_arpreq))) - IOCTL(SIOCGIWNAME, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_char_ifreq))) - - IOCTL(CDROMPAUSE, 0, TYPE_NULL) - IOCTL(CDROMSTART, 0, TYPE_NULL) - IOCTL(CDROMSTOP, 0, TYPE_NULL) - IOCTL(CDROMRESUME, 0, TYPE_NULL) - IOCTL(CDROMEJECT, 0, TYPE_NULL) - IOCTL(CDROMEJECT_SW, 0, TYPE_INT) - IOCTL(CDROMCLOSETRAY, 0, TYPE_NULL) - IOCTL(CDROMRESET, 0, TYPE_NULL) - IOCTL(CDROMPLAYMSF, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(CDROMPLAYTRKIND, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADTOCHDR, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADTOCENTRY, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMVOLCTRL, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(CDROMSUBCHNL, IOC_RW, MK_PTR(TYPE_INT)) - /* XXX: incorrect (need specific handling) */ - IOCTL(CDROMREADAUDIO, IOC_W, MK_PTR(MK_STRUCT(STRUCT_cdrom_read_audio))) - IOCTL(CDROMREADCOOKED, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADRAW, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADMODE1, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADMODE2, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMREADALL, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROMMULTISESSION, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(CDROM_GET_UPC, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(CDROMVOLREAD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(CDROMSEEK, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(CDROMPLAYBLK, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(CDROM_MEDIA_CHANGED, 0, TYPE_NULL) - IOCTL(CDROM_SET_OPTIONS, 0, TYPE_INT) - IOCTL(CDROM_CLEAR_OPTIONS, 0, TYPE_INT) - IOCTL(CDROM_SELECT_SPEED, 0, TYPE_INT) - IOCTL(CDROM_SELECT_DISC, 0, TYPE_INT) - IOCTL(CDROM_DRIVE_STATUS, 0, TYPE_NULL) - IOCTL(CDROM_DISC_STATUS, 0, TYPE_NULL) - IOCTL(CDROMAUDIOBUFSIZ, 0, TYPE_INT) - -#if 0 - IOCTL(SNDCTL_COPR_HALT, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_LOAD, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_RCODE, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_RCVMSG, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_RDATA, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_RESET, 0, TYPE_NULL) - IOCTL(SNDCTL_COPR_RUN, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_SENDMSG, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_WCODE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_COPR_WDATA, IOC_W, MK_PTR(TYPE_INT)) -#endif - IOCTL(SNDCTL_DSP_CHANNELS, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_GETBLKSIZE, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_GETCAPS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_GETFMTS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_GETIPTR, IOC_R, MK_PTR(MK_STRUCT(STRUCT_count_info))) - IOCTL(SNDCTL_DSP_GETOPTR, IOC_R, MK_PTR(MK_STRUCT(STRUCT_count_info))) - IOCTL(SNDCTL_DSP_GETISPACE, IOC_R, MK_PTR(MK_STRUCT(STRUCT_audio_buf_info))) - IOCTL(SNDCTL_DSP_GETOSPACE, IOC_R, MK_PTR(MK_STRUCT(STRUCT_audio_buf_info))) - IOCTL(SNDCTL_DSP_GETTRIGGER, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_MAPINBUF, IOC_R, MK_PTR(MK_STRUCT(STRUCT_buffmem_desc))) - IOCTL(SNDCTL_DSP_MAPOUTBUF, IOC_R, MK_PTR(MK_STRUCT(STRUCT_buffmem_desc))) - IOCTL(SNDCTL_DSP_NONBLOCK, 0, TYPE_NULL) - IOCTL(SNDCTL_DSP_POST, 0, TYPE_NULL) - IOCTL(SNDCTL_DSP_RESET, 0, TYPE_NULL) - IOCTL(SNDCTL_DSP_SETDUPLEX, 0, TYPE_NULL) - IOCTL(SNDCTL_DSP_SETFMT, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_SETFRAGMENT, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_SETSYNCRO, 0, TYPE_NULL) - IOCTL(SNDCTL_DSP_SETTRIGGER, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_SPEED, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_STEREO, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_SUBDIVIDE, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_DSP_SYNC, 0, TYPE_NULL) -#if 0 - IOCTL(SNDCTL_FM_4OP_ENABLE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_FM_LOAD_INSTR, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_MIDI_INFO, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_MIDI_MPUCMD, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_MIDI_MPUMODE, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_MIDI_PRETIME, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_CTRLRATE, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_GETINCOUNT, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_GETOUTCOUNT, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_NRMIDIS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_NRSYNTHS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_OUTOFBAND, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_PANIC, 0, TYPE_NULL) - IOCTL(SNDCTL_SEQ_PERCMODE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_RESET, 0, TYPE_NULL) - IOCTL(SNDCTL_SEQ_RESETSAMPLES, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_SYNC, 0, TYPE_NULL) - IOCTL(SNDCTL_SEQ_TESTMIDI, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SEQ_THRESHOLD, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SYNTH_INFO, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_SYNTH_MEMAVL, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_TMR_CONTINUE, 0, TYPE_NULL) - IOCTL(SNDCTL_TMR_METRONOME, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_TMR_SELECT, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_TMR_SOURCE, IOC_RW, MK_PTR(TYPE_INT)) -#if 0 - /* we invalidate these defines because they have a same number as - termios ioctls */ - IOCTL(SNDCTL_TMR_START, 0, TYPE_NULL) - IOCTL(SNDCTL_TMR_STOP, 0, TYPE_NULL) -#endif - IOCTL(SNDCTL_TMR_TEMPO, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SNDCTL_TMR_TIMEBASE, IOC_RW, MK_PTR(TYPE_INT)) - - IOCTL(SOUND_PCM_WRITE_FILTER, IOC_W | IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_PCM_READ_RATE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_PCM_READ_CHANNELS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_PCM_READ_BITS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_PCM_READ_FILTER, IOC_R, MK_PTR(TYPE_INT)) -#endif - IOCTL(SOUND_MIXER_INFO, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_ACCESS, 0, TYPE_PTRVOID) - IOCTL(SOUND_MIXER_PRIVATE1, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_PRIVATE2, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_PRIVATE3, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_PRIVATE4, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_PRIVATE5, IOC_RW, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_VOLUME, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_BASS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_TREBLE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_SYNTH, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_PCM, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_SPEAKER, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_LINE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_MIC, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_CD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_IMIX, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_ALTPCM, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_RECLEV, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_IGAIN, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_OGAIN, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_LINE1, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_LINE2, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_LINE3, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_MUTE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_ENHANCE, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_LOUD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_RECSRC, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_DEVMASK, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_RECMASK, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_STEREODEVS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_READ_CAPS, IOC_R, MK_PTR(TYPE_INT)) - - IOCTL(SOUND_MIXER_WRITE_VOLUME, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_BASS, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_TREBLE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_SYNTH, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_PCM, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_SPEAKER, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_LINE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_MIC, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_CD, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_IMIX, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_ALTPCM, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_RECLEV, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_IGAIN, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_OGAIN, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_LINE1, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_LINE2, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_LINE3, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_MUTE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_ENHANCE, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_LOUD, IOC_W, MK_PTR(TYPE_INT)) - IOCTL(SOUND_MIXER_WRITE_RECSRC, IOC_W, MK_PTR(TYPE_INT)) - - IOCTL(HDIO_GETGEO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_hd_geometry))) - IOCTL(HDIO_GET_UNMASKINTR, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_MULTCOUNT, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_IDENTITY, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_KEEPSETTINGS, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_NOWERR, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_DMA, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_GET_32BIT, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_DRIVE_CMD, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(HDIO_SET_UNMASKINTR, 0, TYPE_INT) - IOCTL(HDIO_SET_MULTCOUNT, 0, TYPE_INT) - IOCTL(HDIO_SET_KEEPSETTINGS, 0, TYPE_INT) - IOCTL(HDIO_SET_NOWERR, 0, TYPE_INT) - IOCTL(HDIO_SET_DMA, 0, TYPE_INT) - IOCTL(HDIO_SET_32BIT, 0, TYPE_INT) - IOCTL(HDIO_SET_PIO_MODE, 0, TYPE_INT) - - IOCTL(VFAT_IOCTL_READDIR_BOTH, IOC_R, MK_PTR(MK_ARRAY(MK_STRUCT(STRUCT_dirent), 2))) - IOCTL(VFAT_IOCTL_READDIR_SHORT, IOC_R, MK_PTR(MK_ARRAY(MK_STRUCT(STRUCT_dirent), 2))) - - IOCTL(LOOP_SET_FD, 0, TYPE_INT) - IOCTL(LOOP_CLR_FD, 0, TYPE_INT) - IOCTL(LOOP_SET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info))) - IOCTL(LOOP_GET_STATUS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info))) - IOCTL(LOOP_SET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64))) - IOCTL(LOOP_GET_STATUS64, IOC_W, MK_PTR(MK_STRUCT(STRUCT_loop_info64))) - IOCTL(LOOP_CHANGE_FD, 0, TYPE_INT) - - IOCTL(MTIOCTOP, IOC_W, MK_PTR(MK_STRUCT(STRUCT_mtop))) - IOCTL(MTIOCGET, IOC_R, MK_PTR(MK_STRUCT(STRUCT_mtget))) - IOCTL(MTIOCPOS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_mtpos))) - - IOCTL(FBIOGET_FSCREENINFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_fb_fix_screeninfo))) - IOCTL(FBIOGET_VSCREENINFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo))) - IOCTL(FBIOPUT_VSCREENINFO, IOC_W, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo))) - IOCTL(FBIOGETCMAP, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_cmap))) - IOCTL(FBIOPUTCMAP, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_cmap))) - IOCTL(FBIOPAN_DISPLAY, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo))) - IOCTL(FBIOGET_CON2FBMAP, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_con2fbmap))) - IOCTL(FBIOPUT_CON2FBMAP, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_con2fbmap))) - - IOCTL(VT_OPENQRY, IOC_R, MK_PTR(TYPE_INT)) - IOCTL(VT_GETSTATE, IOC_R, MK_PTR(MK_STRUCT(STRUCT_vt_stat))) - IOCTL(VT_ACTIVATE, 0, TYPE_INT) - IOCTL(VT_WAITACTIVE, 0, TYPE_INT) - IOCTL(VT_LOCKSWITCH, 0, TYPE_INT) - IOCTL(VT_UNLOCKSWITCH, 0, TYPE_INT) - IOCTL(VT_GETMODE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_vt_mode))) - IOCTL(VT_SETMODE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_vt_mode))) - IOCTL(VT_RELDISP, 0, TYPE_INT) - IOCTL(VT_DISALLOCATE, 0, TYPE_INT) - - IOCTL(DM_VERSION, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_REMOVE_ALL, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_LIST_DEVICES, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_CREATE, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_REMOVE, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_RENAME, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_SUSPEND, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_STATUS, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_WAIT, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_TABLE_LOAD, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_TABLE_CLEAR, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_TABLE_DEPS, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_TABLE_STATUS, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_LIST_VERSIONS,IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_TARGET_MSG, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(DM_DEV_SET_GEOMETRY, IOC_RW, do_ioctl_dm, - MK_PTR(MK_STRUCT(STRUCT_dm_ioctl))) - IOCTL_SPECIAL(SIOCADDRT, IOC_W, do_ioctl_rt, - MK_PTR(MK_STRUCT(STRUCT_rtentry))) - IOCTL_SPECIAL(SIOCDELRT, IOC_W, do_ioctl_rt, - MK_PTR(MK_STRUCT(STRUCT_rtentry))) diff --git a/qemu/linux-user/linux_loop.h b/qemu/linux-user/linux_loop.h deleted file mode 100644 index 8974caa9d..000000000 --- a/qemu/linux-user/linux_loop.h +++ /dev/null @@ -1,95 +0,0 @@ -/* Copied from 2.6.25 kernel headers to avoid problems on older hosts. */ -#ifndef _LINUX_LOOP_H -#define _LINUX_LOOP_H - -/* - * include/linux/loop.h - * - * Written by Theodore Ts'o, 3/29/93. - * - * Copyright 1993 by Theodore Ts'o. Redistribution of this file is - * permitted under the GNU General Public License. - */ - -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 - - -/* - * Loop flags - */ -enum { - LO_FLAGS_READ_ONLY = 1, - LO_FLAGS_USE_AOPS = 2, - LO_FLAGS_AUTOCLEAR = 4, -}; - -#include <linux/version.h> -#include <asm/posix_types.h> /* for __kernel_old_dev_t */ -#include <asm/types.h> /* for __u64 */ - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) /* This is a guess. */ -#define __kernel_old_dev_t __kernel_dev_t -#endif - -/* Backwards compatibility version */ -struct loop_info { - int lo_number; /* ioctl r/o */ - __kernel_old_dev_t lo_device; /* ioctl r/o */ - unsigned long lo_inode; /* ioctl r/o */ - __kernel_old_dev_t lo_rdevice; /* ioctl r/o */ - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; /* ioctl w/o */ - int lo_flags; /* ioctl r/o */ - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - unsigned long lo_init[2]; - char reserved[4]; -}; - -struct loop_info64 { - __u64 lo_device; /* ioctl r/o */ - __u64 lo_inode; /* ioctl r/o */ - __u64 lo_rdevice; /* ioctl r/o */ - __u64 lo_offset; - __u64 lo_sizelimit;/* bytes, 0 == max available */ - __u32 lo_number; /* ioctl r/o */ - __u32 lo_encrypt_type; - __u32 lo_encrypt_key_size; /* ioctl w/o */ - __u32 lo_flags; /* ioctl r/o */ - __u8 lo_file_name[LO_NAME_SIZE]; - __u8 lo_crypt_name[LO_NAME_SIZE]; - __u8 lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - __u64 lo_init[2]; -}; - -/* - * Loop filter types - */ - -#define LO_CRYPT_NONE 0 -#define LO_CRYPT_XOR 1 -#define LO_CRYPT_DES 2 -#define LO_CRYPT_FISH2 3 /* Twofish encryption */ -#define LO_CRYPT_BLOW 4 -#define LO_CRYPT_CAST128 5 -#define LO_CRYPT_IDEA 6 -#define LO_CRYPT_DUMMY 9 -#define LO_CRYPT_SKIPJACK 10 -#define LO_CRYPT_CRYPTOAPI 18 -#define MAX_LO_CRYPT 20 - -/* - * IOCTL commands --- we will commandeer 0x4C ('L') - */ - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 -#define LOOP_SET_STATUS64 0x4C04 -#define LOOP_GET_STATUS64 0x4C05 -#define LOOP_CHANGE_FD 0x4C06 - -#endif diff --git a/qemu/linux-user/linuxload.c b/qemu/linux-user/linuxload.c deleted file mode 100644 index 6f0d6054c..000000000 --- a/qemu/linux-user/linuxload.c +++ /dev/null @@ -1,167 +0,0 @@ -/* Code for loading Linux executables. Mostly linux kernel code. */ - -#include "qemu/osdep.h" - -#include "qemu.h" - -#define NGROUPS 32 - -/* ??? This should really be somewhere else. */ -abi_long memcpy_to_target(abi_ulong dest, const void *src, - unsigned long len) -{ - void *host_ptr; - - host_ptr = lock_user(VERIFY_WRITE, dest, len, 0); - if (!host_ptr) - return -TARGET_EFAULT; - memcpy(host_ptr, src, len); - unlock_user(host_ptr, dest, 1); - return 0; -} - -static int count(char ** vec) -{ - int i; - - for(i = 0; *vec; i++) { - vec++; - } - - return(i); -} - -static int prepare_binprm(struct linux_binprm *bprm) -{ - struct stat st; - int mode; - int retval; - - if(fstat(bprm->fd, &st) < 0) { - return(-errno); - } - - mode = st.st_mode; - if(!S_ISREG(mode)) { /* Must be regular file */ - return(-EACCES); - } - if(!(mode & 0111)) { /* Must have at least one execute bit set */ - return(-EACCES); - } - - bprm->e_uid = geteuid(); - bprm->e_gid = getegid(); - - /* Set-uid? */ - if(mode & S_ISUID) { - bprm->e_uid = st.st_uid; - } - - /* Set-gid? */ - /* - * If setgid is set but no group execute bit then this - * is a candidate for mandatory locking, not a setgid - * executable. - */ - if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { - bprm->e_gid = st.st_gid; - } - - retval = read(bprm->fd, bprm->buf, BPRM_BUF_SIZE); - if (retval < 0) { - perror("prepare_binprm"); - exit(-1); - } - if (retval < BPRM_BUF_SIZE) { - /* Make sure the rest of the loader won't read garbage. */ - memset(bprm->buf + retval, 0, BPRM_BUF_SIZE - retval); - } - return retval; -} - -/* Construct the envp and argv tables on the target stack. */ -abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, - abi_ulong stringp, int push_ptr) -{ - TaskState *ts = (TaskState *)thread_cpu->opaque; - int n = sizeof(abi_ulong); - abi_ulong envp; - abi_ulong argv; - - sp -= (envc + 1) * n; - envp = sp; - sp -= (argc + 1) * n; - argv = sp; - if (push_ptr) { - /* FIXME - handle put_user() failures */ - sp -= n; - put_user_ual(envp, sp); - sp -= n; - put_user_ual(argv, sp); - } - sp -= n; - /* FIXME - handle put_user() failures */ - put_user_ual(argc, sp); - ts->info->arg_start = stringp; - while (argc-- > 0) { - /* FIXME - handle put_user() failures */ - put_user_ual(stringp, argv); - argv += n; - stringp += target_strlen(stringp) + 1; - } - ts->info->arg_end = stringp; - /* FIXME - handle put_user() failures */ - put_user_ual(0, argv); - while (envc-- > 0) { - /* FIXME - handle put_user() failures */ - put_user_ual(stringp, envp); - envp += n; - stringp += target_strlen(stringp) + 1; - } - /* FIXME - handle put_user() failures */ - put_user_ual(0, envp); - - return sp; -} - -int loader_exec(int fdexec, const char *filename, char **argv, char **envp, - struct target_pt_regs * regs, struct image_info *infop, - struct linux_binprm *bprm) -{ - int retval; - - bprm->fd = fdexec; - bprm->filename = (char *)filename; - bprm->argc = count(argv); - bprm->argv = argv; - bprm->envc = count(envp); - bprm->envp = envp; - - retval = prepare_binprm(bprm); - - if(retval>=0) { - if (bprm->buf[0] == 0x7f - && bprm->buf[1] == 'E' - && bprm->buf[2] == 'L' - && bprm->buf[3] == 'F') { - retval = load_elf_binary(bprm, infop); -#if defined(TARGET_HAS_BFLT) - } else if (bprm->buf[0] == 'b' - && bprm->buf[1] == 'F' - && bprm->buf[2] == 'L' - && bprm->buf[3] == 'T') { - retval = load_flt_binary(bprm, infop); -#endif - } else { - return -ENOEXEC; - } - } - - if(retval>=0) { - /* success. Initialize important registers */ - do_init_thread(regs, infop); - return retval; - } - - return(retval); -} diff --git a/qemu/linux-user/m68k-sim.c b/qemu/linux-user/m68k-sim.c deleted file mode 100644 index 34d332d8b..000000000 --- a/qemu/linux-user/m68k-sim.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * m68k simulator syscall interface - * - * Copyright (c) 2005 CodeSourcery, LLC. Written by Paul Brook. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "qemu/osdep.h" - -#include "qemu.h" - -#define SYS_EXIT 1 -#define SYS_READ 3 -#define SYS_WRITE 4 -#define SYS_OPEN 5 -#define SYS_CLOSE 6 -#define SYS_BRK 17 -#define SYS_FSTAT 28 -#define SYS_ISATTY 29 -#define SYS_LSEEK 199 - -struct m68k_sim_stat { - uint16_t sim_st_dev; - uint16_t sim_st_ino; - uint32_t sim_st_mode; - uint16_t sim_st_nlink; - uint16_t sim_st_uid; - uint16_t sim_st_gid; - uint16_t sim_st_rdev; - uint32_t sim_st_size; - uint32_t sim_st_atime; - uint32_t sim_st_mtime; - uint32_t sim_st_ctime; - uint32_t sim_st_blksize; - uint32_t sim_st_blocks; -}; - -static inline uint32_t check_err(CPUM68KState *env, uint32_t code) -{ - env->dregs[0] = code; - if (code == (uint32_t)-1) { - env->dregs[1] = errno; - } else { - env->dregs[1] = 0; - } - return code; -} - -#define SIM_O_APPEND 0x0008 -#define SIM_O_CREAT 0x0200 -#define SIM_O_TRUNC 0x0400 -#define SIM_O_EXCL 0x0800 -#define SIM_O_NONBLOCK 0x4000 -#define SIM_O_NOCTTY 0x8000 -#define SIM_O_SYNC 0x2000 - -static int translate_openflags(int flags) -{ - int hf; - - switch (flags & 3) { - case 0: hf = O_RDONLY; break; - case 1: hf = O_WRONLY; break; - case 2: hf = O_RDWR; break; - default: hf = O_RDWR; break; - } - - if (flags & SIM_O_APPEND) hf |= O_APPEND; - if (flags & SIM_O_CREAT) hf |= O_CREAT; - if (flags & SIM_O_TRUNC) hf |= O_TRUNC; - if (flags & SIM_O_EXCL) hf |= O_EXCL; - if (flags & SIM_O_NONBLOCK) hf |= O_NONBLOCK; - if (flags & SIM_O_NOCTTY) hf |= O_NOCTTY; - if (flags & SIM_O_SYNC) hf |= O_SYNC; - - return hf; -} - -#define ARG(x) tswap32(args[x]) -void do_m68k_simcall(CPUM68KState *env, int nr) -{ - M68kCPU *cpu = m68k_env_get_cpu(env); - uint32_t *args; - - args = (uint32_t *)(unsigned long)(env->aregs[7] + 4); - switch (nr) { - case SYS_EXIT: - exit(ARG(0)); - case SYS_READ: - check_err(env, read(ARG(0), (void *)(unsigned long)ARG(1), ARG(2))); - break; - case SYS_WRITE: - check_err(env, write(ARG(0), (void *)(unsigned long)ARG(1), ARG(2))); - break; - case SYS_OPEN: - check_err(env, open((char *)(unsigned long)ARG(0), - translate_openflags(ARG(1)), ARG(2))); - break; - case SYS_CLOSE: - { - /* Ignore attempts to close stdin/out/err. */ - int fd = ARG(0); - if (fd > 2) - check_err(env, close(fd)); - else - check_err(env, 0); - break; - } - case SYS_BRK: - { - int32_t ret; - - ret = do_brk((abi_ulong)ARG(0)); - if (ret == -ENOMEM) - ret = -1; - check_err(env, ret); - } - break; - case SYS_FSTAT: - { - struct stat s; - int rc; - struct m68k_sim_stat *p; - rc = check_err(env, fstat(ARG(0), &s)); - if (rc == 0) { - p = (struct m68k_sim_stat *)(unsigned long)ARG(1); - p->sim_st_dev = tswap16(s.st_dev); - p->sim_st_ino = tswap16(s.st_ino); - p->sim_st_mode = tswap32(s.st_mode); - p->sim_st_nlink = tswap16(s.st_nlink); - p->sim_st_uid = tswap16(s.st_uid); - p->sim_st_gid = tswap16(s.st_gid); - p->sim_st_rdev = tswap16(s.st_rdev); - p->sim_st_size = tswap32(s.st_size); - p->sim_st_atime = tswap32(s.st_atime); - p->sim_st_mtime = tswap32(s.st_mtime); - p->sim_st_ctime = tswap32(s.st_ctime); - p->sim_st_blksize = tswap32(s.st_blksize); - p->sim_st_blocks = tswap32(s.st_blocks); - } - } - break; - case SYS_ISATTY: - check_err(env, isatty(ARG(0))); - break; - case SYS_LSEEK: - check_err(env, lseek(ARG(0), (int32_t)ARG(1), ARG(2))); - break; - default: - cpu_abort(CPU(cpu), "Unsupported m68k sim syscall %d\n", nr); - } -} diff --git a/qemu/linux-user/m68k/syscall_nr.h b/qemu/linux-user/m68k/syscall_nr.h deleted file mode 100644 index 4b50fb29b..000000000 --- a/qemu/linux-user/m68k/syscall_nr.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_chown 16 -#define TARGET_NR_break 17 -#define TARGET_NR_oldstat 18 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_oldfstat 28 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 -#define TARGET_NR_oldolduname 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 -#define TARGET_NR_oldlstat 84 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_olduname 109 -//#define TARGET_NR_iopl /* 110 */ not supported -#define TARGET_NR_vhangup 111 -//#define TARGET_NR_idle /* 112 */ Obsolete -//#define TARGET_NR_vm86 /* 113 */ not supported -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_cacheflush 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 -#define TARGET_NR_getpagesize 166 -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_lchown 182 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 -#define TARGET_NR_getpmsg 188 /* some people actually want streams */ -#define TARGET_NR_putpmsg 189 /* some people actually want streams */ -#define TARGET_NR_vfork 190 -#define TARGET_NR_ugetrlimit 191 -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_chown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_lchown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_pivot_root 217 -#define TARGET_NR_getdents64 220 -#define TARGET_NR_gettid 221 -#define TARGET_NR_tkill 222 -#define TARGET_NR_setxattr 223 -#define TARGET_NR_lsetxattr 224 -#define TARGET_NR_fsetxattr 225 -#define TARGET_NR_getxattr 226 -#define TARGET_NR_lgetxattr 227 -#define TARGET_NR_fgetxattr 228 -#define TARGET_NR_listxattr 229 -#define TARGET_NR_llistxattr 230 -#define TARGET_NR_flistxattr 231 -#define TARGET_NR_removexattr 232 -#define TARGET_NR_lremovexattr 233 -#define TARGET_NR_fremovexattr 234 -#define TARGET_NR_futex 235 -#define TARGET_NR_sendfile64 236 -#define TARGET_NR_mincore 237 -#define TARGET_NR_madvise 238 -#define TARGET_NR_fcntl64 239 -#define TARGET_NR_readahead 240 -#define TARGET_NR_io_setup 241 -#define TARGET_NR_io_destroy 242 -#define TARGET_NR_io_getevents 243 -#define TARGET_NR_io_submit 244 -#define TARGET_NR_io_cancel 245 -#define TARGET_NR_fadvise64 246 -#define TARGET_NR_exit_group 247 -#define TARGET_NR_lookup_dcookie 248 -#define TARGET_NR_epoll_create 249 -#define TARGET_NR_epoll_ctl 250 -#define TARGET_NR_epoll_wait 251 -#define TARGET_NR_remap_file_pages 252 -#define TARGET_NR_set_tid_address 253 -#define TARGET_NR_timer_create 254 -#define TARGET_NR_timer_settime 255 -#define TARGET_NR_timer_gettime 256 -#define TARGET_NR_timer_getoverrun 257 -#define TARGET_NR_timer_delete 258 -#define TARGET_NR_clock_settime 259 -#define TARGET_NR_clock_gettime 260 -#define TARGET_NR_clock_getres 261 -#define TARGET_NR_clock_nanosleep 262 -#define TARGET_NR_statfs64 263 -#define TARGET_NR_fstatfs64 264 -#define TARGET_NR_tgkill 265 -#define TARGET_NR_utimes 266 -#define TARGET_NR_fadvise64_64 267 -#define TARGET_NR_mbind 268 -#define TARGET_NR_get_mempolicy 269 -#define TARGET_NR_set_mempolicy 270 -#define TARGET_NR_mq_open 271 -#define TARGET_NR_mq_unlink 272 -#define TARGET_NR_mq_timedsend 273 -#define TARGET_NR_mq_timedreceive 274 -#define TARGET_NR_mq_notify 275 -#define TARGET_NR_mq_getsetattr 276 -#define TARGET_NR_waitid 277 -#define TARGET_NR_vserver 278 -#define TARGET_NR_add_key 279 -#define TARGET_NR_request_key 280 -#define TARGET_NR_keyctl 281 -#define TARGET_NR_ioprio_set 282 -#define TARGET_NR_ioprio_get 283 -#define TARGET_NR_inotify_init 284 -#define TARGET_NR_inotify_add_watch 285 -#define TARGET_NR_inotify_rm_watch 286 -#define TARGET_NR_migrate_pages 287 -#define TARGET_NR_openat 288 -#define TARGET_NR_mkdirat 289 -#define TARGET_NR_mknodat 290 -#define TARGET_NR_fchownat 291 -#define TARGET_NR_futimesat 292 -#define TARGET_NR_fstatat64 293 -#define TARGET_NR_unlinkat 294 -#define TARGET_NR_renameat 295 -#define TARGET_NR_linkat 296 -#define TARGET_NR_symlinkat 297 -#define TARGET_NR_readlinkat 298 -#define TARGET_NR_fchmodat 299 -#define TARGET_NR_faccessat 300 -#define TARGET_NR_pselect6 301 -#define TARGET_NR_ppoll 302 -#define TARGET_NR_unshare 303 -#define TARGET_NR_set_robust_list 304 -#define TARGET_NR_get_robust_list 305 -#define TARGET_NR_splice 306 -#define TARGET_NR_sync_file_range 307 -#define TARGET_NR_tee 308 -#define TARGET_NR_vmsplice 309 -#define TARGET_NR_move_pages 310 -#define TARGET_NR_sched_setaffinity 311 -#define TARGET_NR_sched_getaffinity 312 -#define TARGET_NR_kexec_load 313 -#define TARGET_NR_getcpu 314 -#define TARGET_NR_epoll_pwait 315 -#define TARGET_NR_utimensat 316 -#define TARGET_NR_signalfd 317 -#define TARGET_NR_timerfd_create 318 -#define TARGET_NR_eventfd 319 -#define TARGET_NR_fallocate 320 -#define TARGET_NR_timerfd_settime 321 -#define TARGET_NR_timerfd_gettime 322 -#define TARGET_NR_signalfd4 323 -#define TARGET_NR_eventfd2 324 -#define TARGET_NR_epoll_create1 325 -#define TARGET_NR_dup3 326 -#define TARGET_NR_pipe2 327 -#define TARGET_NR_inotify_init1 328 -#define TARGET_NR_inotify_init1 328 -#define TARGET_NR_preadv 329 -#define TARGET_NR_pwritev 330 -#define TARGET_NR_rt_tgsigqueueinfo 331 -#define TARGET_NR_perf_event_open 332 -#define TARGET_NR_get_thread_area 333 -#define TARGET_NR_set_thread_area 334 -#define TARGET_NR_atomic_cmpxchg_32 335 -#define TARGET_NR_atomic_barrier 336 -#define TARGET_NR_fanotify_init 337 -#define TARGET_NR_fanotify_mark 338 -#define TARGET_NR_prlimit64 339 -#define TARGET_NR_name_to_handle_at 340 -#define TARGET_NR_open_by_handle_at 341 -#define TARGET_NR_clock_adjtime 342 -#define TARGET_NR_syncfs 343 -#define TARGET_NR_setns 344 -#define TARGET_NR_process_vm_readv 345 -#define TARGET_NR_process_vm_writev 346 -#define TARGET_NR_kcmp 347 -#define TARGET_NR_finit_module 348 -#define TARGET_NR_sched_setattr 349 -#define TARGET_NR_sched_getattr 350 -#define TARGET_NR_renameat2 351 -#define TARGET_NR_getrandom 352 -#define TARGET_NR_memfd_create 353 -#define TARGET_NR_bpf 354 -#define TARGET_NR_execveat 355 -#define TARGET_NR_socket 356 -#define TARGET_NR_socketpair 357 -#define TARGET_NR_bind 358 -#define TARGET_NR_connect 359 -#define TARGET_NR_listen 360 -#define TARGET_NR_accept4 361 -#define TARGET_NR_getsockopt 362 -#define TARGET_NR_setsockopt 363 -#define TARGET_NR_getsockname 364 -#define TARGET_NR_getpeername 365 -#define TARGET_NR_sendto 366 -#define TARGET_NR_sendmsg 367 -#define TARGET_NR_recvfrom 368 -#define TARGET_NR_recvmsg 369 -#define TARGET_NR_shutdown 370 -#define TARGET_NR_recvmmsg 371 -#define TARGET_NR_sendmmsg 372 -#define TARGET_NR_userfaultfd 373 -#define TARGET_NR_membarrier 374 -#define TARGET_NR_mlock2 375 diff --git a/qemu/linux-user/m68k/target_cpu.h b/qemu/linux-user/m68k/target_cpu.h deleted file mode 100644 index bb4d3fabe..000000000 --- a/qemu/linux-user/m68k/target_cpu.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * m68k specific CPU ABI and functions for linux-user - * - * Copyright (c) 2005-2007 CodeSourcery - * Written by Paul Brook - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUM68KState *env, target_ulong newsp) -{ - if (newsp) { - env->aregs[7] = newsp; - } - env->dregs[0] = 0; -} - -static inline void cpu_set_tls(CPUM68KState *env, target_ulong newtls) -{ - CPUState *cs = CPU(m68k_env_get_cpu(env)); - TaskState *ts = cs->opaque; - - ts->tp_value = newtls; -} - -#endif diff --git a/qemu/linux-user/m68k/target_signal.h b/qemu/linux-user/m68k/target_signal.h deleted file mode 100644 index 479758a42..000000000 --- a/qemu/linux-user/m68k/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUM68KState *state) -{ - return state->aregs[7]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/m68k/target_structs.h b/qemu/linux-user/m68k/target_structs.h deleted file mode 100644 index de257c97d..000000000 --- a/qemu/linux-user/m68k/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * m68k specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/m68k/target_syscall.h b/qemu/linux-user/m68k/target_syscall.h deleted file mode 100644 index 97a4cc0cb..000000000 --- a/qemu/linux-user/m68k/target_syscall.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* this struct defines the way the registers are stored on the - stack during a system call. */ - -struct target_pt_regs { - abi_long d1, d2, d3, d4, d5, d6, d7; - abi_long a0, a1, a2, a3, a4, a5, a6; - abi_ulong d0; - abi_ulong usp; - abi_ulong orig_d0; - int16_t stkadj; - uint16_t sr; - abi_ulong pc; - uint16_t fntvex; - uint16_t __fill; -}; - -#define UNAME_MACHINE "m68k" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -void do_m68k_simcall(CPUM68KState *, int); - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/m68k/termbits.h b/qemu/linux-user/m68k/termbits.h deleted file mode 100644 index f7982fb6c..000000000 --- a/qemu/linux-user/m68k/termbits.h +++ /dev/null @@ -1,227 +0,0 @@ -/* from asm/termbits.h */ -/* NOTE: exactly the same as i386 */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/main.c b/qemu/linux-user/main.c deleted file mode 100644 index 5f3ec9747..000000000 --- a/qemu/linux-user/main.c +++ /dev/null @@ -1,4704 +0,0 @@ -/* - * qemu user main - * - * Copyright (c) 2003-2008 Fabrice Bellard - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#include "qemu/osdep.h" -#include <sys/mman.h> -#include <sys/syscall.h> -#include <sys/resource.h> - -#include "qemu.h" -#include "qemu/path.h" -#include "qemu/cutils.h" -#include "qemu/help_option.h" -#include "cpu.h" -#include "tcg.h" -#include "qemu/timer.h" -#include "qemu/envlist.h" -#include "elf.h" -#include "exec/log.h" - -char *exec_path; - -int singlestep; -static const char *filename; -static const char *argv0; -static int gdbstub_port; -static envlist_t *envlist; -static const char *cpu_model; -unsigned long mmap_min_addr; -unsigned long guest_base; -int have_guest_base; - -#define EXCP_DUMP(env, fmt, ...) \ -do { \ - CPUState *cs = ENV_GET_CPU(env); \ - fprintf(stderr, fmt , ## __VA_ARGS__); \ - cpu_dump_state(cs, stderr, fprintf, 0); \ - if (qemu_log_separate()) { \ - qemu_log(fmt, ## __VA_ARGS__); \ - log_cpu_state(cs, 0); \ - } \ -} while (0) - -#if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64) -/* - * When running 32-on-64 we should make sure we can fit all of the possible - * guest address space into a contiguous chunk of virtual host memory. - * - * This way we will never overlap with our own libraries or binaries or stack - * or anything else that QEMU maps. - */ -# ifdef TARGET_MIPS -/* MIPS only supports 31 bits of virtual address space for user space */ -unsigned long reserved_va = 0x77000000; -# else -unsigned long reserved_va = 0xf7000000; -# endif -#else -unsigned long reserved_va; -#endif - -static void usage(int exitcode); - -static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX; -const char *qemu_uname_release; - -/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so - we allocate a bigger stack. Need a better solution, for example - by remapping the process stack directly at the right place */ -unsigned long guest_stack_size = 8 * 1024 * 1024UL; - -void gemu_log(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); -} - -#if defined(TARGET_I386) -int cpu_get_pic_interrupt(CPUX86State *env) -{ - return -1; -} -#endif - -/***********************************************************/ -/* Helper routines for implementing atomic operations. */ - -/* To implement exclusive operations we force all cpus to syncronise. - We don't require a full sync, only that no cpus are executing guest code. - The alternative is to map target atomic ops onto host equivalents, - which requires quite a lot of per host/target work. */ -static pthread_mutex_t cpu_list_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t exclusive_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t exclusive_cond = PTHREAD_COND_INITIALIZER; -static pthread_cond_t exclusive_resume = PTHREAD_COND_INITIALIZER; -static int pending_cpus; - -/* Make sure everything is in a consistent state for calling fork(). */ -void fork_start(void) -{ - qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock); - pthread_mutex_lock(&exclusive_lock); - mmap_fork_start(); -} - -void fork_end(int child) -{ - mmap_fork_end(child); - if (child) { - CPUState *cpu, *next_cpu; - /* Child processes created by fork() only have a single thread. - Discard information about the parent threads. */ - CPU_FOREACH_SAFE(cpu, next_cpu) { - if (cpu != thread_cpu) { - QTAILQ_REMOVE(&cpus, thread_cpu, node); - } - } - pending_cpus = 0; - pthread_mutex_init(&exclusive_lock, NULL); - pthread_mutex_init(&cpu_list_mutex, NULL); - pthread_cond_init(&exclusive_cond, NULL); - pthread_cond_init(&exclusive_resume, NULL); - qemu_mutex_init(&tcg_ctx.tb_ctx.tb_lock); - gdbserver_fork(thread_cpu); - } else { - pthread_mutex_unlock(&exclusive_lock); - qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock); - } -} - -/* Wait for pending exclusive operations to complete. The exclusive lock - must be held. */ -static inline void exclusive_idle(void) -{ - while (pending_cpus) { - pthread_cond_wait(&exclusive_resume, &exclusive_lock); - } -} - -/* Start an exclusive operation. - Must only be called from outside cpu_arm_exec. */ -static inline void start_exclusive(void) -{ - CPUState *other_cpu; - - pthread_mutex_lock(&exclusive_lock); - exclusive_idle(); - - pending_cpus = 1; - /* Make all other cpus stop executing. */ - CPU_FOREACH(other_cpu) { - if (other_cpu->running) { - pending_cpus++; - cpu_exit(other_cpu); - } - } - if (pending_cpus > 1) { - pthread_cond_wait(&exclusive_cond, &exclusive_lock); - } -} - -/* Finish an exclusive operation. */ -static inline void __attribute__((unused)) end_exclusive(void) -{ - pending_cpus = 0; - pthread_cond_broadcast(&exclusive_resume); - pthread_mutex_unlock(&exclusive_lock); -} - -/* Wait for exclusive ops to finish, and begin cpu execution. */ -static inline void cpu_exec_start(CPUState *cpu) -{ - pthread_mutex_lock(&exclusive_lock); - exclusive_idle(); - cpu->running = true; - pthread_mutex_unlock(&exclusive_lock); -} - -/* Mark cpu as not executing, and release pending exclusive ops. */ -static inline void cpu_exec_end(CPUState *cpu) -{ - pthread_mutex_lock(&exclusive_lock); - cpu->running = false; - if (pending_cpus > 1) { - pending_cpus--; - if (pending_cpus == 1) { - pthread_cond_signal(&exclusive_cond); - } - } - exclusive_idle(); - pthread_mutex_unlock(&exclusive_lock); -} - -void cpu_list_lock(void) -{ - pthread_mutex_lock(&cpu_list_mutex); -} - -void cpu_list_unlock(void) -{ - pthread_mutex_unlock(&cpu_list_mutex); -} - - -#ifdef TARGET_I386 -/***********************************************************/ -/* CPUX86 core interface */ - -uint64_t cpu_get_tsc(CPUX86State *env) -{ - return cpu_get_host_ticks(); -} - -static void write_dt(void *ptr, unsigned long addr, unsigned long limit, - int flags) -{ - unsigned int e1, e2; - uint32_t *p; - e1 = (addr << 16) | (limit & 0xffff); - e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000); - e2 |= flags; - p = ptr; - p[0] = tswap32(e1); - p[1] = tswap32(e2); -} - -static uint64_t *idt_table; -#ifdef TARGET_X86_64 -static void set_gate64(void *ptr, unsigned int type, unsigned int dpl, - uint64_t addr, unsigned int sel) -{ - uint32_t *p, e1, e2; - e1 = (addr & 0xffff) | (sel << 16); - e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8); - p = ptr; - p[0] = tswap32(e1); - p[1] = tswap32(e2); - p[2] = tswap32(addr >> 32); - p[3] = 0; -} -/* only dpl matters as we do only user space emulation */ -static void set_idt(int n, unsigned int dpl) -{ - set_gate64(idt_table + n * 2, 0, dpl, 0, 0); -} -#else -static void set_gate(void *ptr, unsigned int type, unsigned int dpl, - uint32_t addr, unsigned int sel) -{ - uint32_t *p, e1, e2; - e1 = (addr & 0xffff) | (sel << 16); - e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8); - p = ptr; - p[0] = tswap32(e1); - p[1] = tswap32(e2); -} - -/* only dpl matters as we do only user space emulation */ -static void set_idt(int n, unsigned int dpl) -{ - set_gate(idt_table + n, 0, dpl, 0, 0); -} -#endif - -void cpu_loop(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - int trapnr; - abi_ulong pc; - target_siginfo_t info; - - for(;;) { - cpu_exec_start(cs); - trapnr = cpu_x86_exec(cs); - cpu_exec_end(cs); - switch(trapnr) { - case 0x80: - /* linux syscall from int $0x80 */ - env->regs[R_EAX] = do_syscall(env, - env->regs[R_EAX], - env->regs[R_EBX], - env->regs[R_ECX], - env->regs[R_EDX], - env->regs[R_ESI], - env->regs[R_EDI], - env->regs[R_EBP], - 0, 0); - break; -#ifndef TARGET_ABI32 - case EXCP_SYSCALL: - /* linux syscall from syscall instruction */ - env->regs[R_EAX] = do_syscall(env, - env->regs[R_EAX], - env->regs[R_EDI], - env->regs[R_ESI], - env->regs[R_EDX], - env->regs[10], - env->regs[8], - env->regs[9], - 0, 0); - break; -#endif - case EXCP0B_NOSEG: - case EXCP0C_STACK: - info.si_signo = TARGET_SIGBUS; - info.si_errno = 0; - info.si_code = TARGET_SI_KERNEL; - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - break; - case EXCP0D_GPF: - /* XXX: potential problem if ABI32 */ -#ifndef TARGET_X86_64 - if (env->eflags & VM_MASK) { - handle_vm86_fault(env); - } else -#endif - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SI_KERNEL; - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP0E_PAGE: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - if (!(env->error_code & 1)) - info.si_code = TARGET_SEGV_MAPERR; - else - info.si_code = TARGET_SEGV_ACCERR; - info._sifields._sigfault._addr = env->cr[2]; - queue_signal(env, info.si_signo, &info); - break; - case EXCP00_DIVZ: -#ifndef TARGET_X86_64 - if (env->eflags & VM_MASK) { - handle_vm86_trap(env, trapnr); - } else -#endif - { - /* division by zero */ - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - info.si_code = TARGET_FPE_INTDIV; - info._sifields._sigfault._addr = env->eip; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP01_DB: - case EXCP03_INT3: -#ifndef TARGET_X86_64 - if (env->eflags & VM_MASK) { - handle_vm86_trap(env, trapnr); - } else -#endif - { - info.si_signo = TARGET_SIGTRAP; - info.si_errno = 0; - if (trapnr == EXCP01_DB) { - info.si_code = TARGET_TRAP_BRKPT; - info._sifields._sigfault._addr = env->eip; - } else { - info.si_code = TARGET_SI_KERNEL; - info._sifields._sigfault._addr = 0; - } - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP04_INTO: - case EXCP05_BOUND: -#ifndef TARGET_X86_64 - if (env->eflags & VM_MASK) { - handle_vm86_trap(env, trapnr); - } else -#endif - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SI_KERNEL; - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP06_ILLOP: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPN; - info._sifields._sigfault._addr = env->eip; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - pc = env->segs[R_CS].base + env->eip; - EXCP_DUMP(env, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n", - (long)pc, trapnr); - abort(); - } - process_pending_signals(env); - } -} -#endif - -#ifdef TARGET_ARM - -#define get_user_code_u32(x, gaddr, env) \ - ({ abi_long __r = get_user_u32((x), (gaddr)); \ - if (!__r && bswap_code(arm_sctlr_b(env))) { \ - (x) = bswap32(x); \ - } \ - __r; \ - }) - -#define get_user_code_u16(x, gaddr, env) \ - ({ abi_long __r = get_user_u16((x), (gaddr)); \ - if (!__r && bswap_code(arm_sctlr_b(env))) { \ - (x) = bswap16(x); \ - } \ - __r; \ - }) - -#define get_user_data_u32(x, gaddr, env) \ - ({ abi_long __r = get_user_u32((x), (gaddr)); \ - if (!__r && arm_cpu_bswap_data(env)) { \ - (x) = bswap32(x); \ - } \ - __r; \ - }) - -#define get_user_data_u16(x, gaddr, env) \ - ({ abi_long __r = get_user_u16((x), (gaddr)); \ - if (!__r && arm_cpu_bswap_data(env)) { \ - (x) = bswap16(x); \ - } \ - __r; \ - }) - -#define put_user_data_u32(x, gaddr, env) \ - ({ typeof(x) __x = (x); \ - if (arm_cpu_bswap_data(env)) { \ - __x = bswap32(__x); \ - } \ - put_user_u32(__x, (gaddr)); \ - }) - -#define put_user_data_u16(x, gaddr, env) \ - ({ typeof(x) __x = (x); \ - if (arm_cpu_bswap_data(env)) { \ - __x = bswap16(__x); \ - } \ - put_user_u16(__x, (gaddr)); \ - }) - -#ifdef TARGET_ABI32 -/* Commpage handling -- there is no commpage for AArch64 */ - -/* - * See the Linux kernel's Documentation/arm/kernel_user_helpers.txt - * Input: - * r0 = pointer to oldval - * r1 = pointer to newval - * r2 = pointer to target value - * - * Output: - * r0 = 0 if *ptr was changed, non-0 if no exchange happened - * C set if *ptr was changed, clear if no exchange happened - * - * Note segv's in kernel helpers are a bit tricky, we can set the - * data address sensibly but the PC address is just the entry point. - */ -static void arm_kernel_cmpxchg64_helper(CPUARMState *env) -{ - uint64_t oldval, newval, val; - uint32_t addr, cpsr; - target_siginfo_t info; - - /* Based on the 32 bit code in do_kernel_trap */ - - /* XXX: This only works between threads, not between processes. - It's probably possible to implement this with native host - operations. However things like ldrex/strex are much harder so - there's not much point trying. */ - start_exclusive(); - cpsr = cpsr_read(env); - addr = env->regs[2]; - - if (get_user_u64(oldval, env->regs[0])) { - env->exception.vaddress = env->regs[0]; - goto segv; - }; - - if (get_user_u64(newval, env->regs[1])) { - env->exception.vaddress = env->regs[1]; - goto segv; - }; - - if (get_user_u64(val, addr)) { - env->exception.vaddress = addr; - goto segv; - } - - if (val == oldval) { - val = newval; - - if (put_user_u64(val, addr)) { - env->exception.vaddress = addr; - goto segv; - }; - - env->regs[0] = 0; - cpsr |= CPSR_C; - } else { - env->regs[0] = -1; - cpsr &= ~CPSR_C; - } - cpsr_write(env, cpsr, CPSR_C, CPSRWriteByInstr); - end_exclusive(); - return; - -segv: - end_exclusive(); - /* We get the PC of the entry address - which is as good as anything, - on a real kernel what you get depends on which mode it uses. */ - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->exception.vaddress; - queue_signal(env, info.si_signo, &info); -} - -/* Handle a jump to the kernel code page. */ -static int -do_kernel_trap(CPUARMState *env) -{ - uint32_t addr; - uint32_t cpsr; - uint32_t val; - - switch (env->regs[15]) { - case 0xffff0fa0: /* __kernel_memory_barrier */ - /* ??? No-op. Will need to do better for SMP. */ - break; - case 0xffff0fc0: /* __kernel_cmpxchg */ - /* XXX: This only works between threads, not between processes. - It's probably possible to implement this with native host - operations. However things like ldrex/strex are much harder so - there's not much point trying. */ - start_exclusive(); - cpsr = cpsr_read(env); - addr = env->regs[2]; - /* FIXME: This should SEGV if the access fails. */ - if (get_user_u32(val, addr)) - val = ~env->regs[0]; - if (val == env->regs[0]) { - val = env->regs[1]; - /* FIXME: Check for segfaults. */ - put_user_u32(val, addr); - env->regs[0] = 0; - cpsr |= CPSR_C; - } else { - env->regs[0] = -1; - cpsr &= ~CPSR_C; - } - cpsr_write(env, cpsr, CPSR_C, CPSRWriteByInstr); - end_exclusive(); - break; - case 0xffff0fe0: /* __kernel_get_tls */ - env->regs[0] = cpu_get_tls(env); - break; - case 0xffff0f60: /* __kernel_cmpxchg64 */ - arm_kernel_cmpxchg64_helper(env); - break; - - default: - return 1; - } - /* Jump back to the caller. */ - addr = env->regs[14]; - if (addr & 1) { - env->thumb = 1; - addr &= ~1; - } - env->regs[15] = addr; - - return 0; -} - -/* Store exclusive handling for AArch32 */ -static int do_strex(CPUARMState *env) -{ - uint64_t val; - int size; - int rc = 1; - int segv = 0; - uint32_t addr; - start_exclusive(); - if (env->exclusive_addr != env->exclusive_test) { - goto fail; - } - /* We know we're always AArch32 so the address is in uint32_t range - * unless it was the -1 exclusive-monitor-lost value (which won't - * match exclusive_test above). - */ - assert(extract64(env->exclusive_addr, 32, 32) == 0); - addr = env->exclusive_addr; - size = env->exclusive_info & 0xf; - switch (size) { - case 0: - segv = get_user_u8(val, addr); - break; - case 1: - segv = get_user_data_u16(val, addr, env); - break; - case 2: - case 3: - segv = get_user_data_u32(val, addr, env); - break; - default: - abort(); - } - if (segv) { - env->exception.vaddress = addr; - goto done; - } - if (size == 3) { - uint32_t valhi; - segv = get_user_data_u32(valhi, addr + 4, env); - if (segv) { - env->exception.vaddress = addr + 4; - goto done; - } - if (arm_cpu_bswap_data(env)) { - val = deposit64((uint64_t)valhi, 32, 32, val); - } else { - val = deposit64(val, 32, 32, valhi); - } - } - if (val != env->exclusive_val) { - goto fail; - } - - val = env->regs[(env->exclusive_info >> 8) & 0xf]; - switch (size) { - case 0: - segv = put_user_u8(val, addr); - break; - case 1: - segv = put_user_data_u16(val, addr, env); - break; - case 2: - case 3: - segv = put_user_data_u32(val, addr, env); - break; - } - if (segv) { - env->exception.vaddress = addr; - goto done; - } - if (size == 3) { - val = env->regs[(env->exclusive_info >> 12) & 0xf]; - segv = put_user_data_u32(val, addr + 4, env); - if (segv) { - env->exception.vaddress = addr + 4; - goto done; - } - } - rc = 0; -fail: - env->regs[15] += 4; - env->regs[(env->exclusive_info >> 4) & 0xf] = rc; -done: - end_exclusive(); - return segv; -} - -void cpu_loop(CPUARMState *env) -{ - CPUState *cs = CPU(arm_env_get_cpu(env)); - int trapnr; - unsigned int n, insn; - target_siginfo_t info; - uint32_t addr; - - for(;;) { - cpu_exec_start(cs); - trapnr = cpu_arm_exec(cs); - cpu_exec_end(cs); - switch(trapnr) { - case EXCP_UDEF: - { - TaskState *ts = cs->opaque; - uint32_t opcode; - int rc; - - /* we handle the FPU emulation here, as Linux */ - /* we get the opcode */ - /* FIXME - what to do if get_user() fails? */ - get_user_code_u32(opcode, env->regs[15], env); - - rc = EmulateAll(opcode, &ts->fpa, env); - if (rc == 0) { /* illegal instruction */ - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPN; - info._sifields._sigfault._addr = env->regs[15]; - queue_signal(env, info.si_signo, &info); - } else if (rc < 0) { /* FP exception */ - int arm_fpe=0; - - /* translate softfloat flags to FPSR flags */ - if (-rc & float_flag_invalid) - arm_fpe |= BIT_IOC; - if (-rc & float_flag_divbyzero) - arm_fpe |= BIT_DZC; - if (-rc & float_flag_overflow) - arm_fpe |= BIT_OFC; - if (-rc & float_flag_underflow) - arm_fpe |= BIT_UFC; - if (-rc & float_flag_inexact) - arm_fpe |= BIT_IXC; - - FPSR fpsr = ts->fpa.fpsr; - //printf("fpsr 0x%x, arm_fpe 0x%x\n",fpsr,arm_fpe); - - if (fpsr & (arm_fpe << 16)) { /* exception enabled? */ - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - - /* ordered by priority, least first */ - if (arm_fpe & BIT_IXC) info.si_code = TARGET_FPE_FLTRES; - if (arm_fpe & BIT_UFC) info.si_code = TARGET_FPE_FLTUND; - if (arm_fpe & BIT_OFC) info.si_code = TARGET_FPE_FLTOVF; - if (arm_fpe & BIT_DZC) info.si_code = TARGET_FPE_FLTDIV; - if (arm_fpe & BIT_IOC) info.si_code = TARGET_FPE_FLTINV; - - info._sifields._sigfault._addr = env->regs[15]; - queue_signal(env, info.si_signo, &info); - } else { - env->regs[15] += 4; - } - - /* accumulate unenabled exceptions */ - if ((!(fpsr & BIT_IXE)) && (arm_fpe & BIT_IXC)) - fpsr |= BIT_IXC; - if ((!(fpsr & BIT_UFE)) && (arm_fpe & BIT_UFC)) - fpsr |= BIT_UFC; - if ((!(fpsr & BIT_OFE)) && (arm_fpe & BIT_OFC)) - fpsr |= BIT_OFC; - if ((!(fpsr & BIT_DZE)) && (arm_fpe & BIT_DZC)) - fpsr |= BIT_DZC; - if ((!(fpsr & BIT_IOE)) && (arm_fpe & BIT_IOC)) - fpsr |= BIT_IOC; - ts->fpa.fpsr=fpsr; - } else { /* everything OK */ - /* increment PC */ - env->regs[15] += 4; - } - } - break; - case EXCP_SWI: - case EXCP_BKPT: - { - env->eabi = 1; - /* system call */ - if (trapnr == EXCP_BKPT) { - if (env->thumb) { - /* FIXME - what to do if get_user() fails? */ - get_user_code_u16(insn, env->regs[15], env); - n = insn & 0xff; - env->regs[15] += 2; - } else { - /* FIXME - what to do if get_user() fails? */ - get_user_code_u32(insn, env->regs[15], env); - n = (insn & 0xf) | ((insn >> 4) & 0xff0); - env->regs[15] += 4; - } - } else { - if (env->thumb) { - /* FIXME - what to do if get_user() fails? */ - get_user_code_u16(insn, env->regs[15] - 2, env); - n = insn & 0xff; - } else { - /* FIXME - what to do if get_user() fails? */ - get_user_code_u32(insn, env->regs[15] - 4, env); - n = insn & 0xffffff; - } - } - - if (n == ARM_NR_cacheflush) { - /* nop */ - } else if (n == ARM_NR_semihosting - || n == ARM_NR_thumb_semihosting) { - env->regs[0] = do_arm_semihosting (env); - } else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) { - /* linux syscall */ - if (env->thumb || n == 0) { - n = env->regs[7]; - } else { - n -= ARM_SYSCALL_BASE; - env->eabi = 0; - } - if ( n > ARM_NR_BASE) { - switch (n) { - case ARM_NR_cacheflush: - /* nop */ - break; - case ARM_NR_set_tls: - cpu_set_tls(env, env->regs[0]); - env->regs[0] = 0; - break; - case ARM_NR_breakpoint: - env->regs[15] -= env->thumb ? 2 : 4; - goto excp_debug; - default: - gemu_log("qemu: Unsupported ARM syscall: 0x%x\n", - n); - env->regs[0] = -TARGET_ENOSYS; - break; - } - } else { - env->regs[0] = do_syscall(env, - n, - env->regs[0], - env->regs[1], - env->regs[2], - env->regs[3], - env->regs[4], - env->regs[5], - 0, 0); - } - } else { - goto error; - } - } - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_STREX: - if (!do_strex(env)) { - break; - } - /* fall through for segv */ - case EXCP_PREFETCH_ABORT: - case EXCP_DATA_ABORT: - addr = env->exception.vaddress; - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = addr; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_DEBUG: - excp_debug: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - case EXCP_KERNEL_TRAP: - if (do_kernel_trap(env)) - goto error; - break; - case EXCP_YIELD: - /* nothing to do here for user-mode, just resume guest code */ - break; - default: - error: - EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr); - abort(); - } - process_pending_signals(env); - } -} - -#else - -/* - * Handle AArch64 store-release exclusive - * - * rs = gets the status result of store exclusive - * rt = is the register that is stored - * rt2 = is the second register store (in STP) - * - */ -static int do_strex_a64(CPUARMState *env) -{ - uint64_t val; - int size; - bool is_pair; - int rc = 1; - int segv = 0; - uint64_t addr; - int rs, rt, rt2; - - start_exclusive(); - /* size | is_pair << 2 | (rs << 4) | (rt << 9) | (rt2 << 14)); */ - size = extract32(env->exclusive_info, 0, 2); - is_pair = extract32(env->exclusive_info, 2, 1); - rs = extract32(env->exclusive_info, 4, 5); - rt = extract32(env->exclusive_info, 9, 5); - rt2 = extract32(env->exclusive_info, 14, 5); - - addr = env->exclusive_addr; - - if (addr != env->exclusive_test) { - goto finish; - } - - switch (size) { - case 0: - segv = get_user_u8(val, addr); - break; - case 1: - segv = get_user_u16(val, addr); - break; - case 2: - segv = get_user_u32(val, addr); - break; - case 3: - segv = get_user_u64(val, addr); - break; - default: - abort(); - } - if (segv) { - env->exception.vaddress = addr; - goto error; - } - if (val != env->exclusive_val) { - goto finish; - } - if (is_pair) { - if (size == 2) { - segv = get_user_u32(val, addr + 4); - } else { - segv = get_user_u64(val, addr + 8); - } - if (segv) { - env->exception.vaddress = addr + (size == 2 ? 4 : 8); - goto error; - } - if (val != env->exclusive_high) { - goto finish; - } - } - /* handle the zero register */ - val = rt == 31 ? 0 : env->xregs[rt]; - switch (size) { - case 0: - segv = put_user_u8(val, addr); - break; - case 1: - segv = put_user_u16(val, addr); - break; - case 2: - segv = put_user_u32(val, addr); - break; - case 3: - segv = put_user_u64(val, addr); - break; - } - if (segv) { - goto error; - } - if (is_pair) { - /* handle the zero register */ - val = rt2 == 31 ? 0 : env->xregs[rt2]; - if (size == 2) { - segv = put_user_u32(val, addr + 4); - } else { - segv = put_user_u64(val, addr + 8); - } - if (segv) { - env->exception.vaddress = addr + (size == 2 ? 4 : 8); - goto error; - } - } - rc = 0; -finish: - env->pc += 4; - /* rs == 31 encodes a write to the ZR, thus throwing away - * the status return. This is rather silly but valid. - */ - if (rs < 31) { - env->xregs[rs] = rc; - } -error: - /* instruction faulted, PC does not advance */ - /* either way a strex releases any exclusive lock we have */ - env->exclusive_addr = -1; - end_exclusive(); - return segv; -} - -/* AArch64 main loop */ -void cpu_loop(CPUARMState *env) -{ - CPUState *cs = CPU(arm_env_get_cpu(env)); - int trapnr, sig; - target_siginfo_t info; - - for (;;) { - cpu_exec_start(cs); - trapnr = cpu_arm_exec(cs); - cpu_exec_end(cs); - - switch (trapnr) { - case EXCP_SWI: - env->xregs[0] = do_syscall(env, - env->xregs[8], - env->xregs[0], - env->xregs[1], - env->xregs[2], - env->xregs[3], - env->xregs[4], - env->xregs[5], - 0, 0); - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_UDEF: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPN; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_STREX: - if (!do_strex_a64(env)) { - break; - } - /* fall through for segv */ - case EXCP_PREFETCH_ABORT: - case EXCP_DATA_ABORT: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->exception.vaddress; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_DEBUG: - case EXCP_BKPT: - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_SEMIHOST: - env->xregs[0] = do_arm_semihosting(env); - break; - case EXCP_YIELD: - /* nothing to do here for user-mode, just resume guest code */ - break; - default: - EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr); - abort(); - } - process_pending_signals(env); - /* Exception return on AArch64 always clears the exclusive monitor, - * so any return to running guest code implies this. - * A strex (successful or otherwise) also clears the monitor, so - * we don't need to specialcase EXCP_STREX. - */ - env->exclusive_addr = -1; - } -} -#endif /* ndef TARGET_ABI32 */ - -#endif - -#ifdef TARGET_UNICORE32 - -void cpu_loop(CPUUniCore32State *env) -{ - CPUState *cs = CPU(uc32_env_get_cpu(env)); - int trapnr; - unsigned int n, insn; - target_siginfo_t info; - - for (;;) { - cpu_exec_start(cs); - trapnr = uc32_cpu_exec(cs); - cpu_exec_end(cs); - switch (trapnr) { - case UC32_EXCP_PRIV: - { - /* system call */ - get_user_u32(insn, env->regs[31] - 4); - n = insn & 0xffffff; - - if (n >= UC32_SYSCALL_BASE) { - /* linux syscall */ - n -= UC32_SYSCALL_BASE; - if (n == UC32_SYSCALL_NR_set_tls) { - cpu_set_tls(env, env->regs[0]); - env->regs[0] = 0; - } else { - env->regs[0] = do_syscall(env, - n, - env->regs[0], - env->regs[1], - env->regs[2], - env->regs[3], - env->regs[4], - env->regs[5], - 0, 0); - } - } else { - goto error; - } - } - break; - case UC32_EXCP_DTRAP: - case UC32_EXCP_ITRAP: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->cp0.c4_faultaddr; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - goto error; - } - process_pending_signals(env); - } - -error: - EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr); - abort(); -} -#endif - -#ifdef TARGET_SPARC -#define SPARC64_STACK_BIAS 2047 - -//#define DEBUG_WIN - -/* WARNING: dealing with register windows _is_ complicated. More info - can be found at http://www.sics.se/~psm/sparcstack.html */ -static inline int get_reg_index(CPUSPARCState *env, int cwp, int index) -{ - index = (index + cwp * 16) % (16 * env->nwindows); - /* wrap handling : if cwp is on the last window, then we use the - registers 'after' the end */ - if (index < 8 && env->cwp == env->nwindows - 1) - index += 16 * env->nwindows; - return index; -} - -/* save the register window 'cwp1' */ -static inline void save_window_offset(CPUSPARCState *env, int cwp1) -{ - unsigned int i; - abi_ulong sp_ptr; - - sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; -#ifdef TARGET_SPARC64 - if (sp_ptr & 3) - sp_ptr += SPARC64_STACK_BIAS; -#endif -#if defined(DEBUG_WIN) - printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n", - sp_ptr, cwp1); -#endif - for(i = 0; i < 16; i++) { - /* FIXME - what to do if put_user() fails? */ - put_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr); - sp_ptr += sizeof(abi_ulong); - } -} - -static void save_window(CPUSPARCState *env) -{ -#ifndef TARGET_SPARC64 - unsigned int new_wim; - new_wim = ((env->wim >> 1) | (env->wim << (env->nwindows - 1))) & - ((1LL << env->nwindows) - 1); - save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); - env->wim = new_wim; -#else - save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2)); - env->cansave++; - env->canrestore--; -#endif -} - -static void restore_window(CPUSPARCState *env) -{ -#ifndef TARGET_SPARC64 - unsigned int new_wim; -#endif - unsigned int i, cwp1; - abi_ulong sp_ptr; - -#ifndef TARGET_SPARC64 - new_wim = ((env->wim << 1) | (env->wim >> (env->nwindows - 1))) & - ((1LL << env->nwindows) - 1); -#endif - - /* restore the invalid window */ - cwp1 = cpu_cwp_inc(env, env->cwp + 1); - sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)]; -#ifdef TARGET_SPARC64 - if (sp_ptr & 3) - sp_ptr += SPARC64_STACK_BIAS; -#endif -#if defined(DEBUG_WIN) - printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n", - sp_ptr, cwp1); -#endif - for(i = 0; i < 16; i++) { - /* FIXME - what to do if get_user() fails? */ - get_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr); - sp_ptr += sizeof(abi_ulong); - } -#ifdef TARGET_SPARC64 - env->canrestore++; - if (env->cleanwin < env->nwindows - 1) - env->cleanwin++; - env->cansave--; -#else - env->wim = new_wim; -#endif -} - -static void flush_windows(CPUSPARCState *env) -{ - int offset, cwp1; - - offset = 1; - for(;;) { - /* if restore would invoke restore_window(), then we can stop */ - cwp1 = cpu_cwp_inc(env, env->cwp + offset); -#ifndef TARGET_SPARC64 - if (env->wim & (1 << cwp1)) - break; -#else - if (env->canrestore == 0) - break; - env->cansave++; - env->canrestore--; -#endif - save_window_offset(env, cwp1); - offset++; - } - cwp1 = cpu_cwp_inc(env, env->cwp + 1); -#ifndef TARGET_SPARC64 - /* set wim so that restore will reload the registers */ - env->wim = 1 << cwp1; -#endif -#if defined(DEBUG_WIN) - printf("flush_windows: nb=%d\n", offset - 1); -#endif -} - -void cpu_loop (CPUSPARCState *env) -{ - CPUState *cs = CPU(sparc_env_get_cpu(env)); - int trapnr; - abi_long ret; - target_siginfo_t info; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_sparc_exec(cs); - cpu_exec_end(cs); - - /* Compute PSR before exposing state. */ - if (env->cc_op != CC_OP_FLAGS) { - cpu_get_psr(env); - } - - switch (trapnr) { -#ifndef TARGET_SPARC64 - case 0x88: - case 0x90: -#else - case 0x110: - case 0x16d: -#endif - ret = do_syscall (env, env->gregs[1], - env->regwptr[0], env->regwptr[1], - env->regwptr[2], env->regwptr[3], - env->regwptr[4], env->regwptr[5], - 0, 0); - if ((abi_ulong)ret >= (abi_ulong)(-515)) { -#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) - env->xcc |= PSR_CARRY; -#else - env->psr |= PSR_CARRY; -#endif - ret = -ret; - } else { -#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) - env->xcc &= ~PSR_CARRY; -#else - env->psr &= ~PSR_CARRY; -#endif - } - env->regwptr[0] = ret; - /* next instruction */ - env->pc = env->npc; - env->npc = env->npc + 4; - break; - case 0x83: /* flush windows */ -#ifdef TARGET_ABI32 - case 0x103: -#endif - flush_windows(env); - /* next instruction */ - env->pc = env->npc; - env->npc = env->npc + 4; - break; -#ifndef TARGET_SPARC64 - case TT_WIN_OVF: /* window overflow */ - save_window(env); - break; - case TT_WIN_UNF: /* window underflow */ - restore_window(env); - break; - case TT_TFAULT: - case TT_DFAULT: - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->mmuregs[4]; - queue_signal(env, info.si_signo, &info); - } - break; -#else - case TT_SPILL: /* window overflow */ - save_window(env); - break; - case TT_FILL: /* window underflow */ - restore_window(env); - break; - case TT_TFAULT: - case TT_DFAULT: - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - if (trapnr == TT_DFAULT) - info._sifields._sigfault._addr = env->dmmuregs[4]; - else - info._sifields._sigfault._addr = cpu_tsptr(env)->tpc; - queue_signal(env, info.si_signo, &info); - } - break; -#ifndef TARGET_ABI32 - case 0x16e: - flush_windows(env); - sparc64_get_context(env); - break; - case 0x16f: - flush_windows(env); - sparc64_set_context(env); - break; -#endif -#endif - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case TT_ILL_INSN: - { - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPC; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} - -#endif - -#ifdef TARGET_PPC -static inline uint64_t cpu_ppc_get_tb(CPUPPCState *env) -{ - return cpu_get_host_ticks(); -} - -uint64_t cpu_ppc_load_tbl(CPUPPCState *env) -{ - return cpu_ppc_get_tb(env); -} - -uint32_t cpu_ppc_load_tbu(CPUPPCState *env) -{ - return cpu_ppc_get_tb(env) >> 32; -} - -uint64_t cpu_ppc_load_atbl(CPUPPCState *env) -{ - return cpu_ppc_get_tb(env); -} - -uint32_t cpu_ppc_load_atbu(CPUPPCState *env) -{ - return cpu_ppc_get_tb(env) >> 32; -} - -uint32_t cpu_ppc601_load_rtcu(CPUPPCState *env) -__attribute__ (( alias ("cpu_ppc_load_tbu") )); - -uint32_t cpu_ppc601_load_rtcl(CPUPPCState *env) -{ - return cpu_ppc_load_tbl(env) & 0x3FFFFF80; -} - -/* XXX: to be fixed */ -int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp) -{ - return -1; -} - -int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val) -{ - return -1; -} - -static int do_store_exclusive(CPUPPCState *env) -{ - target_ulong addr; - target_ulong page_addr; - target_ulong val, val2 __attribute__((unused)) = 0; - int flags; - int segv = 0; - - addr = env->reserve_ea; - page_addr = addr & TARGET_PAGE_MASK; - start_exclusive(); - mmap_lock(); - flags = page_get_flags(page_addr); - if ((flags & PAGE_READ) == 0) { - segv = 1; - } else { - int reg = env->reserve_info & 0x1f; - int size = env->reserve_info >> 5; - int stored = 0; - - if (addr == env->reserve_addr) { - switch (size) { - case 1: segv = get_user_u8(val, addr); break; - case 2: segv = get_user_u16(val, addr); break; - case 4: segv = get_user_u32(val, addr); break; -#if defined(TARGET_PPC64) - case 8: segv = get_user_u64(val, addr); break; - case 16: { - segv = get_user_u64(val, addr); - if (!segv) { - segv = get_user_u64(val2, addr + 8); - } - break; - } -#endif - default: abort(); - } - if (!segv && val == env->reserve_val) { - val = env->gpr[reg]; - switch (size) { - case 1: segv = put_user_u8(val, addr); break; - case 2: segv = put_user_u16(val, addr); break; - case 4: segv = put_user_u32(val, addr); break; -#if defined(TARGET_PPC64) - case 8: segv = put_user_u64(val, addr); break; - case 16: { - if (val2 == env->reserve_val2) { - if (msr_le) { - val2 = val; - val = env->gpr[reg+1]; - } else { - val2 = env->gpr[reg+1]; - } - segv = put_user_u64(val, addr); - if (!segv) { - segv = put_user_u64(val2, addr + 8); - } - } - break; - } -#endif - default: abort(); - } - if (!segv) { - stored = 1; - } - } - } - env->crf[0] = (stored << 1) | xer_so; - env->reserve_addr = (target_ulong)-1; - } - if (!segv) { - env->nip += 4; - } - mmap_unlock(); - end_exclusive(); - return segv; -} - -void cpu_loop(CPUPPCState *env) -{ - CPUState *cs = CPU(ppc_env_get_cpu(env)); - target_siginfo_t info; - int trapnr; - target_ulong ret; - - for(;;) { - cpu_exec_start(cs); - trapnr = cpu_ppc_exec(cs); - cpu_exec_end(cs); - switch(trapnr) { - case POWERPC_EXCP_NONE: - /* Just go on */ - break; - case POWERPC_EXCP_CRITICAL: /* Critical input */ - cpu_abort(cs, "Critical interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_MCHECK: /* Machine check exception */ - cpu_abort(cs, "Machine check exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_DSI: /* Data storage exception */ - EXCP_DUMP(env, "Invalid data memory access: 0x" TARGET_FMT_lx "\n", - env->spr[SPR_DAR]); - /* XXX: check this. Seems bugged */ - switch (env->error_code & 0xFF000000) { - case 0x40000000: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - break; - case 0x04000000: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLADR; - break; - case 0x08000000: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_ACCERR; - break; - default: - /* Let's send a regular segfault... */ - EXCP_DUMP(env, "Invalid segfault errno (%02x)\n", - env->error_code); - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - break; - } - info._sifields._sigfault._addr = env->nip; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_ISI: /* Instruction storage exception */ - EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" TARGET_FMT_lx - "\n", env->spr[SPR_SRR0]); - /* XXX: check this */ - switch (env->error_code & 0xFF000000) { - case 0x40000000: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - break; - case 0x10000000: - case 0x08000000: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_ACCERR; - break; - default: - /* Let's send a regular segfault... */ - EXCP_DUMP(env, "Invalid segfault errno (%02x)\n", - env->error_code); - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - break; - } - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_EXTERNAL: /* External input */ - cpu_abort(cs, "External interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_ALIGN: /* Alignment exception */ - EXCP_DUMP(env, "Unaligned memory access\n"); - /* XXX: check this */ - info.si_signo = TARGET_SIGBUS; - info.si_errno = 0; - info.si_code = TARGET_BUS_ADRALN; - info._sifields._sigfault._addr = env->nip; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_PROGRAM: /* Program exception */ - /* XXX: check this */ - switch (env->error_code & ~0xF) { - case POWERPC_EXCP_FP: - EXCP_DUMP(env, "Floating point program exception\n"); - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - switch (env->error_code & 0xF) { - case POWERPC_EXCP_FP_OX: - info.si_code = TARGET_FPE_FLTOVF; - break; - case POWERPC_EXCP_FP_UX: - info.si_code = TARGET_FPE_FLTUND; - break; - case POWERPC_EXCP_FP_ZX: - case POWERPC_EXCP_FP_VXZDZ: - info.si_code = TARGET_FPE_FLTDIV; - break; - case POWERPC_EXCP_FP_XX: - info.si_code = TARGET_FPE_FLTRES; - break; - case POWERPC_EXCP_FP_VXSOFT: - info.si_code = TARGET_FPE_FLTINV; - break; - case POWERPC_EXCP_FP_VXSNAN: - case POWERPC_EXCP_FP_VXISI: - case POWERPC_EXCP_FP_VXIDI: - case POWERPC_EXCP_FP_VXIMZ: - case POWERPC_EXCP_FP_VXVC: - case POWERPC_EXCP_FP_VXSQRT: - case POWERPC_EXCP_FP_VXCVI: - info.si_code = TARGET_FPE_FLTSUB; - break; - default: - EXCP_DUMP(env, "Unknown floating point exception (%02x)\n", - env->error_code); - break; - } - break; - case POWERPC_EXCP_INVAL: - EXCP_DUMP(env, "Invalid instruction\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - switch (env->error_code & 0xF) { - case POWERPC_EXCP_INVAL_INVAL: - info.si_code = TARGET_ILL_ILLOPC; - break; - case POWERPC_EXCP_INVAL_LSWX: - info.si_code = TARGET_ILL_ILLOPN; - break; - case POWERPC_EXCP_INVAL_SPR: - info.si_code = TARGET_ILL_PRVREG; - break; - case POWERPC_EXCP_INVAL_FP: - info.si_code = TARGET_ILL_COPROC; - break; - default: - EXCP_DUMP(env, "Unknown invalid operation (%02x)\n", - env->error_code & 0xF); - info.si_code = TARGET_ILL_ILLADR; - break; - } - break; - case POWERPC_EXCP_PRIV: - EXCP_DUMP(env, "Privilege violation\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - switch (env->error_code & 0xF) { - case POWERPC_EXCP_PRIV_OPC: - info.si_code = TARGET_ILL_PRVOPC; - break; - case POWERPC_EXCP_PRIV_REG: - info.si_code = TARGET_ILL_PRVREG; - break; - default: - EXCP_DUMP(env, "Unknown privilege violation (%02x)\n", - env->error_code & 0xF); - info.si_code = TARGET_ILL_PRVOPC; - break; - } - break; - case POWERPC_EXCP_TRAP: - cpu_abort(cs, "Tried to call a TRAP\n"); - break; - default: - /* Should not happen ! */ - cpu_abort(cs, "Unknown program exception (%02x)\n", - env->error_code); - break; - } - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ - EXCP_DUMP(env, "No floating point allowed\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_COPROC; - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_SYSCALL: /* System call exception */ - cpu_abort(cs, "Syscall exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */ - EXCP_DUMP(env, "No APU instruction allowed\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_COPROC; - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_DECR: /* Decrementer exception */ - cpu_abort(cs, "Decrementer interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_FIT: /* Fixed-interval timer interrupt */ - cpu_abort(cs, "Fix interval timer interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_WDT: /* Watchdog timer interrupt */ - cpu_abort(cs, "Watchdog timer interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_DTLB: /* Data TLB error */ - cpu_abort(cs, "Data TLB exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_ITLB: /* Instruction TLB error */ - cpu_abort(cs, "Instruction TLB exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */ - EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_COPROC; - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */ - cpu_abort(cs, "Embedded floating-point data IRQ not handled\n"); - break; - case POWERPC_EXCP_EFPRI: /* Embedded floating-point round IRQ */ - cpu_abort(cs, "Embedded floating-point round IRQ not handled\n"); - break; - case POWERPC_EXCP_EPERFM: /* Embedded performance monitor IRQ */ - cpu_abort(cs, "Performance monitor exception not handled\n"); - break; - case POWERPC_EXCP_DOORI: /* Embedded doorbell interrupt */ - cpu_abort(cs, "Doorbell interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_DOORCI: /* Embedded doorbell critical interrupt */ - cpu_abort(cs, "Doorbell critical interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_RESET: /* System reset exception */ - cpu_abort(cs, "Reset interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_DSEG: /* Data segment exception */ - cpu_abort(cs, "Data segment exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_ISEG: /* Instruction segment exception */ - cpu_abort(cs, "Instruction segment exception " - "while in user mode. Aborting\n"); - break; - /* PowerPC 64 with hypervisor mode support */ - case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */ - cpu_abort(cs, "Hypervisor decrementer interrupt " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_TRACE: /* Trace exception */ - /* Nothing to do: - * we use this exception to emulate step-by-step execution mode. - */ - break; - /* PowerPC 64 with hypervisor mode support */ - case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */ - cpu_abort(cs, "Hypervisor data storage exception " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_HISI: /* Hypervisor instruction storage excp */ - cpu_abort(cs, "Hypervisor instruction storage exception " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */ - cpu_abort(cs, "Hypervisor data segment exception " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment excp */ - cpu_abort(cs, "Hypervisor instruction segment exception " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_VPU: /* Vector unavailable exception */ - EXCP_DUMP(env, "No Altivec instructions allowed\n"); - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_COPROC; - info._sifields._sigfault._addr = env->nip - 4; - queue_signal(env, info.si_signo, &info); - break; - case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */ - cpu_abort(cs, "Programmable interval timer interrupt " - "while in user mode. Aborting\n"); - break; - case POWERPC_EXCP_IO: /* IO error exception */ - cpu_abort(cs, "IO error exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_RUNM: /* Run mode exception */ - cpu_abort(cs, "Run mode exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_EMUL: /* Emulation trap exception */ - cpu_abort(cs, "Emulation trap exception not handled\n"); - break; - case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */ - cpu_abort(cs, "Instruction fetch TLB exception " - "while in user-mode. Aborting"); - break; - case POWERPC_EXCP_DLTLB: /* Data load TLB miss */ - cpu_abort(cs, "Data load TLB exception while in user-mode. " - "Aborting"); - break; - case POWERPC_EXCP_DSTLB: /* Data store TLB miss */ - cpu_abort(cs, "Data store TLB exception while in user-mode. " - "Aborting"); - break; - case POWERPC_EXCP_FPA: /* Floating-point assist exception */ - cpu_abort(cs, "Floating-point assist exception not handled\n"); - break; - case POWERPC_EXCP_IABR: /* Instruction address breakpoint */ - cpu_abort(cs, "Instruction address breakpoint exception " - "not handled\n"); - break; - case POWERPC_EXCP_SMI: /* System management interrupt */ - cpu_abort(cs, "System management interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_THERM: /* Thermal interrupt */ - cpu_abort(cs, "Thermal interrupt interrupt while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_PERFM: /* Embedded performance monitor IRQ */ - cpu_abort(cs, "Performance monitor exception not handled\n"); - break; - case POWERPC_EXCP_VPUA: /* Vector assist exception */ - cpu_abort(cs, "Vector assist exception not handled\n"); - break; - case POWERPC_EXCP_SOFTP: /* Soft patch exception */ - cpu_abort(cs, "Soft patch exception not handled\n"); - break; - case POWERPC_EXCP_MAINT: /* Maintenance exception */ - cpu_abort(cs, "Maintenance exception while in user mode. " - "Aborting\n"); - break; - case POWERPC_EXCP_STOP: /* stop translation */ - /* We did invalidate the instruction cache. Go on */ - break; - case POWERPC_EXCP_BRANCH: /* branch instruction: */ - /* We just stopped because of a branch. Go on */ - break; - case POWERPC_EXCP_SYSCALL_USER: - /* system call in user-mode emulation */ - /* WARNING: - * PPC ABI uses overflow flag in cr0 to signal an error - * in syscalls. - */ - env->crf[0] &= ~0x1; - ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4], - env->gpr[5], env->gpr[6], env->gpr[7], - env->gpr[8], 0, 0); - if (ret == (target_ulong)(-TARGET_QEMU_ESIGRETURN)) { - /* Returning from a successful sigreturn syscall. - Avoid corrupting register state. */ - break; - } - if (ret > (target_ulong)(-515)) { - env->crf[0] |= 0x1; - ret = -ret; - } - env->gpr[3] = ret; - break; - case POWERPC_EXCP_STCX: - if (do_store_exclusive(env)) { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->nip; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - default: - cpu_abort(cs, "Unknown exception 0x%d. Aborting\n", trapnr); - break; - } - process_pending_signals(env); - } -} -#endif - -#ifdef TARGET_MIPS - -# ifdef TARGET_ABI_MIPSO32 -# define MIPS_SYS(name, args) args, -static const uint8_t mips_syscall_args[] = { - MIPS_SYS(sys_syscall , 8) /* 4000 */ - MIPS_SYS(sys_exit , 1) - MIPS_SYS(sys_fork , 0) - MIPS_SYS(sys_read , 3) - MIPS_SYS(sys_write , 3) - MIPS_SYS(sys_open , 3) /* 4005 */ - MIPS_SYS(sys_close , 1) - MIPS_SYS(sys_waitpid , 3) - MIPS_SYS(sys_creat , 2) - MIPS_SYS(sys_link , 2) - MIPS_SYS(sys_unlink , 1) /* 4010 */ - MIPS_SYS(sys_execve , 0) - MIPS_SYS(sys_chdir , 1) - MIPS_SYS(sys_time , 1) - MIPS_SYS(sys_mknod , 3) - MIPS_SYS(sys_chmod , 2) /* 4015 */ - MIPS_SYS(sys_lchown , 3) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_ni_syscall , 0) /* was sys_stat */ - MIPS_SYS(sys_lseek , 3) - MIPS_SYS(sys_getpid , 0) /* 4020 */ - MIPS_SYS(sys_mount , 5) - MIPS_SYS(sys_umount , 1) - MIPS_SYS(sys_setuid , 1) - MIPS_SYS(sys_getuid , 0) - MIPS_SYS(sys_stime , 1) /* 4025 */ - MIPS_SYS(sys_ptrace , 4) - MIPS_SYS(sys_alarm , 1) - MIPS_SYS(sys_ni_syscall , 0) /* was sys_fstat */ - MIPS_SYS(sys_pause , 0) - MIPS_SYS(sys_utime , 2) /* 4030 */ - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_access , 2) - MIPS_SYS(sys_nice , 1) - MIPS_SYS(sys_ni_syscall , 0) /* 4035 */ - MIPS_SYS(sys_sync , 0) - MIPS_SYS(sys_kill , 2) - MIPS_SYS(sys_rename , 2) - MIPS_SYS(sys_mkdir , 2) - MIPS_SYS(sys_rmdir , 1) /* 4040 */ - MIPS_SYS(sys_dup , 1) - MIPS_SYS(sys_pipe , 0) - MIPS_SYS(sys_times , 1) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_brk , 1) /* 4045 */ - MIPS_SYS(sys_setgid , 1) - MIPS_SYS(sys_getgid , 0) - MIPS_SYS(sys_ni_syscall , 0) /* was signal(2) */ - MIPS_SYS(sys_geteuid , 0) - MIPS_SYS(sys_getegid , 0) /* 4050 */ - MIPS_SYS(sys_acct , 0) - MIPS_SYS(sys_umount2 , 2) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_ioctl , 3) - MIPS_SYS(sys_fcntl , 3) /* 4055 */ - MIPS_SYS(sys_ni_syscall , 2) - MIPS_SYS(sys_setpgid , 2) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_olduname , 1) - MIPS_SYS(sys_umask , 1) /* 4060 */ - MIPS_SYS(sys_chroot , 1) - MIPS_SYS(sys_ustat , 2) - MIPS_SYS(sys_dup2 , 2) - MIPS_SYS(sys_getppid , 0) - MIPS_SYS(sys_getpgrp , 0) /* 4065 */ - MIPS_SYS(sys_setsid , 0) - MIPS_SYS(sys_sigaction , 3) - MIPS_SYS(sys_sgetmask , 0) - MIPS_SYS(sys_ssetmask , 1) - MIPS_SYS(sys_setreuid , 2) /* 4070 */ - MIPS_SYS(sys_setregid , 2) - MIPS_SYS(sys_sigsuspend , 0) - MIPS_SYS(sys_sigpending , 1) - MIPS_SYS(sys_sethostname , 2) - MIPS_SYS(sys_setrlimit , 2) /* 4075 */ - MIPS_SYS(sys_getrlimit , 2) - MIPS_SYS(sys_getrusage , 2) - MIPS_SYS(sys_gettimeofday, 2) - MIPS_SYS(sys_settimeofday, 2) - MIPS_SYS(sys_getgroups , 2) /* 4080 */ - MIPS_SYS(sys_setgroups , 2) - MIPS_SYS(sys_ni_syscall , 0) /* old_select */ - MIPS_SYS(sys_symlink , 2) - MIPS_SYS(sys_ni_syscall , 0) /* was sys_lstat */ - MIPS_SYS(sys_readlink , 3) /* 4085 */ - MIPS_SYS(sys_uselib , 1) - MIPS_SYS(sys_swapon , 2) - MIPS_SYS(sys_reboot , 3) - MIPS_SYS(old_readdir , 3) - MIPS_SYS(old_mmap , 6) /* 4090 */ - MIPS_SYS(sys_munmap , 2) - MIPS_SYS(sys_truncate , 2) - MIPS_SYS(sys_ftruncate , 2) - MIPS_SYS(sys_fchmod , 2) - MIPS_SYS(sys_fchown , 3) /* 4095 */ - MIPS_SYS(sys_getpriority , 2) - MIPS_SYS(sys_setpriority , 3) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_statfs , 2) - MIPS_SYS(sys_fstatfs , 2) /* 4100 */ - MIPS_SYS(sys_ni_syscall , 0) /* was ioperm(2) */ - MIPS_SYS(sys_socketcall , 2) - MIPS_SYS(sys_syslog , 3) - MIPS_SYS(sys_setitimer , 3) - MIPS_SYS(sys_getitimer , 2) /* 4105 */ - MIPS_SYS(sys_newstat , 2) - MIPS_SYS(sys_newlstat , 2) - MIPS_SYS(sys_newfstat , 2) - MIPS_SYS(sys_uname , 1) - MIPS_SYS(sys_ni_syscall , 0) /* 4110 was iopl(2) */ - MIPS_SYS(sys_vhangup , 0) - MIPS_SYS(sys_ni_syscall , 0) /* was sys_idle() */ - MIPS_SYS(sys_ni_syscall , 0) /* was sys_vm86 */ - MIPS_SYS(sys_wait4 , 4) - MIPS_SYS(sys_swapoff , 1) /* 4115 */ - MIPS_SYS(sys_sysinfo , 1) - MIPS_SYS(sys_ipc , 6) - MIPS_SYS(sys_fsync , 1) - MIPS_SYS(sys_sigreturn , 0) - MIPS_SYS(sys_clone , 6) /* 4120 */ - MIPS_SYS(sys_setdomainname, 2) - MIPS_SYS(sys_newuname , 1) - MIPS_SYS(sys_ni_syscall , 0) /* sys_modify_ldt */ - MIPS_SYS(sys_adjtimex , 1) - MIPS_SYS(sys_mprotect , 3) /* 4125 */ - MIPS_SYS(sys_sigprocmask , 3) - MIPS_SYS(sys_ni_syscall , 0) /* was create_module */ - MIPS_SYS(sys_init_module , 5) - MIPS_SYS(sys_delete_module, 1) - MIPS_SYS(sys_ni_syscall , 0) /* 4130 was get_kernel_syms */ - MIPS_SYS(sys_quotactl , 0) - MIPS_SYS(sys_getpgid , 1) - MIPS_SYS(sys_fchdir , 1) - MIPS_SYS(sys_bdflush , 2) - MIPS_SYS(sys_sysfs , 3) /* 4135 */ - MIPS_SYS(sys_personality , 1) - MIPS_SYS(sys_ni_syscall , 0) /* for afs_syscall */ - MIPS_SYS(sys_setfsuid , 1) - MIPS_SYS(sys_setfsgid , 1) - MIPS_SYS(sys_llseek , 5) /* 4140 */ - MIPS_SYS(sys_getdents , 3) - MIPS_SYS(sys_select , 5) - MIPS_SYS(sys_flock , 2) - MIPS_SYS(sys_msync , 3) - MIPS_SYS(sys_readv , 3) /* 4145 */ - MIPS_SYS(sys_writev , 3) - MIPS_SYS(sys_cacheflush , 3) - MIPS_SYS(sys_cachectl , 3) - MIPS_SYS(sys_sysmips , 4) - MIPS_SYS(sys_ni_syscall , 0) /* 4150 */ - MIPS_SYS(sys_getsid , 1) - MIPS_SYS(sys_fdatasync , 0) - MIPS_SYS(sys_sysctl , 1) - MIPS_SYS(sys_mlock , 2) - MIPS_SYS(sys_munlock , 2) /* 4155 */ - MIPS_SYS(sys_mlockall , 1) - MIPS_SYS(sys_munlockall , 0) - MIPS_SYS(sys_sched_setparam, 2) - MIPS_SYS(sys_sched_getparam, 2) - MIPS_SYS(sys_sched_setscheduler, 3) /* 4160 */ - MIPS_SYS(sys_sched_getscheduler, 1) - MIPS_SYS(sys_sched_yield , 0) - MIPS_SYS(sys_sched_get_priority_max, 1) - MIPS_SYS(sys_sched_get_priority_min, 1) - MIPS_SYS(sys_sched_rr_get_interval, 2) /* 4165 */ - MIPS_SYS(sys_nanosleep, 2) - MIPS_SYS(sys_mremap , 5) - MIPS_SYS(sys_accept , 3) - MIPS_SYS(sys_bind , 3) - MIPS_SYS(sys_connect , 3) /* 4170 */ - MIPS_SYS(sys_getpeername , 3) - MIPS_SYS(sys_getsockname , 3) - MIPS_SYS(sys_getsockopt , 5) - MIPS_SYS(sys_listen , 2) - MIPS_SYS(sys_recv , 4) /* 4175 */ - MIPS_SYS(sys_recvfrom , 6) - MIPS_SYS(sys_recvmsg , 3) - MIPS_SYS(sys_send , 4) - MIPS_SYS(sys_sendmsg , 3) - MIPS_SYS(sys_sendto , 6) /* 4180 */ - MIPS_SYS(sys_setsockopt , 5) - MIPS_SYS(sys_shutdown , 2) - MIPS_SYS(sys_socket , 3) - MIPS_SYS(sys_socketpair , 4) - MIPS_SYS(sys_setresuid , 3) /* 4185 */ - MIPS_SYS(sys_getresuid , 3) - MIPS_SYS(sys_ni_syscall , 0) /* was sys_query_module */ - MIPS_SYS(sys_poll , 3) - MIPS_SYS(sys_nfsservctl , 3) - MIPS_SYS(sys_setresgid , 3) /* 4190 */ - MIPS_SYS(sys_getresgid , 3) - MIPS_SYS(sys_prctl , 5) - MIPS_SYS(sys_rt_sigreturn, 0) - MIPS_SYS(sys_rt_sigaction, 4) - MIPS_SYS(sys_rt_sigprocmask, 4) /* 4195 */ - MIPS_SYS(sys_rt_sigpending, 2) - MIPS_SYS(sys_rt_sigtimedwait, 4) - MIPS_SYS(sys_rt_sigqueueinfo, 3) - MIPS_SYS(sys_rt_sigsuspend, 0) - MIPS_SYS(sys_pread64 , 6) /* 4200 */ - MIPS_SYS(sys_pwrite64 , 6) - MIPS_SYS(sys_chown , 3) - MIPS_SYS(sys_getcwd , 2) - MIPS_SYS(sys_capget , 2) - MIPS_SYS(sys_capset , 2) /* 4205 */ - MIPS_SYS(sys_sigaltstack , 2) - MIPS_SYS(sys_sendfile , 4) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_mmap2 , 6) /* 4210 */ - MIPS_SYS(sys_truncate64 , 4) - MIPS_SYS(sys_ftruncate64 , 4) - MIPS_SYS(sys_stat64 , 2) - MIPS_SYS(sys_lstat64 , 2) - MIPS_SYS(sys_fstat64 , 2) /* 4215 */ - MIPS_SYS(sys_pivot_root , 2) - MIPS_SYS(sys_mincore , 3) - MIPS_SYS(sys_madvise , 3) - MIPS_SYS(sys_getdents64 , 3) - MIPS_SYS(sys_fcntl64 , 3) /* 4220 */ - MIPS_SYS(sys_ni_syscall , 0) - MIPS_SYS(sys_gettid , 0) - MIPS_SYS(sys_readahead , 5) - MIPS_SYS(sys_setxattr , 5) - MIPS_SYS(sys_lsetxattr , 5) /* 4225 */ - MIPS_SYS(sys_fsetxattr , 5) - MIPS_SYS(sys_getxattr , 4) - MIPS_SYS(sys_lgetxattr , 4) - MIPS_SYS(sys_fgetxattr , 4) - MIPS_SYS(sys_listxattr , 3) /* 4230 */ - MIPS_SYS(sys_llistxattr , 3) - MIPS_SYS(sys_flistxattr , 3) - MIPS_SYS(sys_removexattr , 2) - MIPS_SYS(sys_lremovexattr, 2) - MIPS_SYS(sys_fremovexattr, 2) /* 4235 */ - MIPS_SYS(sys_tkill , 2) - MIPS_SYS(sys_sendfile64 , 5) - MIPS_SYS(sys_futex , 6) - MIPS_SYS(sys_sched_setaffinity, 3) - MIPS_SYS(sys_sched_getaffinity, 3) /* 4240 */ - MIPS_SYS(sys_io_setup , 2) - MIPS_SYS(sys_io_destroy , 1) - MIPS_SYS(sys_io_getevents, 5) - MIPS_SYS(sys_io_submit , 3) - MIPS_SYS(sys_io_cancel , 3) /* 4245 */ - MIPS_SYS(sys_exit_group , 1) - MIPS_SYS(sys_lookup_dcookie, 3) - MIPS_SYS(sys_epoll_create, 1) - MIPS_SYS(sys_epoll_ctl , 4) - MIPS_SYS(sys_epoll_wait , 3) /* 4250 */ - MIPS_SYS(sys_remap_file_pages, 5) - MIPS_SYS(sys_set_tid_address, 1) - MIPS_SYS(sys_restart_syscall, 0) - MIPS_SYS(sys_fadvise64_64, 7) - MIPS_SYS(sys_statfs64 , 3) /* 4255 */ - MIPS_SYS(sys_fstatfs64 , 2) - MIPS_SYS(sys_timer_create, 3) - MIPS_SYS(sys_timer_settime, 4) - MIPS_SYS(sys_timer_gettime, 2) - MIPS_SYS(sys_timer_getoverrun, 1) /* 4260 */ - MIPS_SYS(sys_timer_delete, 1) - MIPS_SYS(sys_clock_settime, 2) - MIPS_SYS(sys_clock_gettime, 2) - MIPS_SYS(sys_clock_getres, 2) - MIPS_SYS(sys_clock_nanosleep, 4) /* 4265 */ - MIPS_SYS(sys_tgkill , 3) - MIPS_SYS(sys_utimes , 2) - MIPS_SYS(sys_mbind , 4) - MIPS_SYS(sys_ni_syscall , 0) /* sys_get_mempolicy */ - MIPS_SYS(sys_ni_syscall , 0) /* 4270 sys_set_mempolicy */ - MIPS_SYS(sys_mq_open , 4) - MIPS_SYS(sys_mq_unlink , 1) - MIPS_SYS(sys_mq_timedsend, 5) - MIPS_SYS(sys_mq_timedreceive, 5) - MIPS_SYS(sys_mq_notify , 2) /* 4275 */ - MIPS_SYS(sys_mq_getsetattr, 3) - MIPS_SYS(sys_ni_syscall , 0) /* sys_vserver */ - MIPS_SYS(sys_waitid , 4) - MIPS_SYS(sys_ni_syscall , 0) /* available, was setaltroot */ - MIPS_SYS(sys_add_key , 5) - MIPS_SYS(sys_request_key, 4) - MIPS_SYS(sys_keyctl , 5) - MIPS_SYS(sys_set_thread_area, 1) - MIPS_SYS(sys_inotify_init, 0) - MIPS_SYS(sys_inotify_add_watch, 3) /* 4285 */ - MIPS_SYS(sys_inotify_rm_watch, 2) - MIPS_SYS(sys_migrate_pages, 4) - MIPS_SYS(sys_openat, 4) - MIPS_SYS(sys_mkdirat, 3) - MIPS_SYS(sys_mknodat, 4) /* 4290 */ - MIPS_SYS(sys_fchownat, 5) - MIPS_SYS(sys_futimesat, 3) - MIPS_SYS(sys_fstatat64, 4) - MIPS_SYS(sys_unlinkat, 3) - MIPS_SYS(sys_renameat, 4) /* 4295 */ - MIPS_SYS(sys_linkat, 5) - MIPS_SYS(sys_symlinkat, 3) - MIPS_SYS(sys_readlinkat, 4) - MIPS_SYS(sys_fchmodat, 3) - MIPS_SYS(sys_faccessat, 3) /* 4300 */ - MIPS_SYS(sys_pselect6, 6) - MIPS_SYS(sys_ppoll, 5) - MIPS_SYS(sys_unshare, 1) - MIPS_SYS(sys_splice, 6) - MIPS_SYS(sys_sync_file_range, 7) /* 4305 */ - MIPS_SYS(sys_tee, 4) - MIPS_SYS(sys_vmsplice, 4) - MIPS_SYS(sys_move_pages, 6) - MIPS_SYS(sys_set_robust_list, 2) - MIPS_SYS(sys_get_robust_list, 3) /* 4310 */ - MIPS_SYS(sys_kexec_load, 4) - MIPS_SYS(sys_getcpu, 3) - MIPS_SYS(sys_epoll_pwait, 6) - MIPS_SYS(sys_ioprio_set, 3) - MIPS_SYS(sys_ioprio_get, 2) - MIPS_SYS(sys_utimensat, 4) - MIPS_SYS(sys_signalfd, 3) - MIPS_SYS(sys_ni_syscall, 0) /* was timerfd */ - MIPS_SYS(sys_eventfd, 1) - MIPS_SYS(sys_fallocate, 6) /* 4320 */ - MIPS_SYS(sys_timerfd_create, 2) - MIPS_SYS(sys_timerfd_gettime, 2) - MIPS_SYS(sys_timerfd_settime, 4) - MIPS_SYS(sys_signalfd4, 4) - MIPS_SYS(sys_eventfd2, 2) /* 4325 */ - MIPS_SYS(sys_epoll_create1, 1) - MIPS_SYS(sys_dup3, 3) - MIPS_SYS(sys_pipe2, 2) - MIPS_SYS(sys_inotify_init1, 1) - MIPS_SYS(sys_preadv, 6) /* 4330 */ - MIPS_SYS(sys_pwritev, 6) - MIPS_SYS(sys_rt_tgsigqueueinfo, 4) - MIPS_SYS(sys_perf_event_open, 5) - MIPS_SYS(sys_accept4, 4) - MIPS_SYS(sys_recvmmsg, 5) /* 4335 */ - MIPS_SYS(sys_fanotify_init, 2) - MIPS_SYS(sys_fanotify_mark, 6) - MIPS_SYS(sys_prlimit64, 4) - MIPS_SYS(sys_name_to_handle_at, 5) - MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */ - MIPS_SYS(sys_clock_adjtime, 2) - MIPS_SYS(sys_syncfs, 1) -}; -# undef MIPS_SYS -# endif /* O32 */ - -static int do_store_exclusive(CPUMIPSState *env) -{ - target_ulong addr; - target_ulong page_addr; - target_ulong val; - int flags; - int segv = 0; - int reg; - int d; - - addr = env->lladdr; - page_addr = addr & TARGET_PAGE_MASK; - start_exclusive(); - mmap_lock(); - flags = page_get_flags(page_addr); - if ((flags & PAGE_READ) == 0) { - segv = 1; - } else { - reg = env->llreg & 0x1f; - d = (env->llreg & 0x20) != 0; - if (d) { - segv = get_user_s64(val, addr); - } else { - segv = get_user_s32(val, addr); - } - if (!segv) { - if (val != env->llval) { - env->active_tc.gpr[reg] = 0; - } else { - if (d) { - segv = put_user_u64(env->llnewval, addr); - } else { - segv = put_user_u32(env->llnewval, addr); - } - if (!segv) { - env->active_tc.gpr[reg] = 1; - } - } - } - } - env->lladdr = -1; - if (!segv) { - env->active_tc.PC += 4; - } - mmap_unlock(); - end_exclusive(); - return segv; -} - -/* Break codes */ -enum { - BRK_OVERFLOW = 6, - BRK_DIVZERO = 7 -}; - -static int do_break(CPUMIPSState *env, target_siginfo_t *info, - unsigned int code) -{ - int ret = -1; - - switch (code) { - case BRK_OVERFLOW: - case BRK_DIVZERO: - info->si_signo = TARGET_SIGFPE; - info->si_errno = 0; - info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV; - queue_signal(env, info->si_signo, &*info); - ret = 0; - break; - default: - info->si_signo = TARGET_SIGTRAP; - info->si_errno = 0; - queue_signal(env, info->si_signo, &*info); - ret = 0; - break; - } - - return ret; -} - -void cpu_loop(CPUMIPSState *env) -{ - CPUState *cs = CPU(mips_env_get_cpu(env)); - target_siginfo_t info; - int trapnr; - abi_long ret; -# ifdef TARGET_ABI_MIPSO32 - unsigned int syscall_num; -# endif - - for(;;) { - cpu_exec_start(cs); - trapnr = cpu_mips_exec(cs); - cpu_exec_end(cs); - switch(trapnr) { - case EXCP_SYSCALL: - env->active_tc.PC += 4; -# ifdef TARGET_ABI_MIPSO32 - syscall_num = env->active_tc.gpr[2] - 4000; - if (syscall_num >= sizeof(mips_syscall_args)) { - ret = -TARGET_ENOSYS; - } else { - int nb_args; - abi_ulong sp_reg; - abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0; - - nb_args = mips_syscall_args[syscall_num]; - sp_reg = env->active_tc.gpr[29]; - switch (nb_args) { - /* these arguments are taken from the stack */ - case 8: - if ((ret = get_user_ual(arg8, sp_reg + 28)) != 0) { - goto done_syscall; - } - case 7: - if ((ret = get_user_ual(arg7, sp_reg + 24)) != 0) { - goto done_syscall; - } - case 6: - if ((ret = get_user_ual(arg6, sp_reg + 20)) != 0) { - goto done_syscall; - } - case 5: - if ((ret = get_user_ual(arg5, sp_reg + 16)) != 0) { - goto done_syscall; - } - default: - break; - } - ret = do_syscall(env, env->active_tc.gpr[2], - env->active_tc.gpr[4], - env->active_tc.gpr[5], - env->active_tc.gpr[6], - env->active_tc.gpr[7], - arg5, arg6, arg7, arg8); - } -done_syscall: -# else - ret = do_syscall(env, env->active_tc.gpr[2], - env->active_tc.gpr[4], env->active_tc.gpr[5], - env->active_tc.gpr[6], env->active_tc.gpr[7], - env->active_tc.gpr[8], env->active_tc.gpr[9], - env->active_tc.gpr[10], env->active_tc.gpr[11]); -# endif /* O32 */ - if (ret == -TARGET_QEMU_ESIGRETURN) { - /* Returning from a successful sigreturn syscall. - Avoid clobbering register state. */ - break; - } - if ((abi_ulong)ret >= (abi_ulong)-1133) { - env->active_tc.gpr[7] = 1; /* error flag */ - ret = -ret; - } else { - env->active_tc.gpr[7] = 0; /* error flag */ - } - env->active_tc.gpr[2] = ret; - break; - case EXCP_TLBL: - case EXCP_TLBS: - case EXCP_AdEL: - case EXCP_AdES: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->CP0_BadVAddr; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_CpU: - case EXCP_RI: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = 0; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - case EXCP_SC: - if (do_store_exclusive(env)) { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->active_tc.PC; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_DSPDIS: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPC; - queue_signal(env, info.si_signo, &info); - break; - /* The code below was inspired by the MIPS Linux kernel trap - * handling code in arch/mips/kernel/traps.c. - */ - case EXCP_BREAK: - { - abi_ulong trap_instr; - unsigned int code; - - if (env->hflags & MIPS_HFLAG_M16) { - if (env->insn_flags & ASE_MICROMIPS) { - /* microMIPS mode */ - ret = get_user_u16(trap_instr, env->active_tc.PC); - if (ret != 0) { - goto error; - } - - if ((trap_instr >> 10) == 0x11) { - /* 16-bit instruction */ - code = trap_instr & 0xf; - } else { - /* 32-bit instruction */ - abi_ulong instr_lo; - - ret = get_user_u16(instr_lo, - env->active_tc.PC + 2); - if (ret != 0) { - goto error; - } - trap_instr = (trap_instr << 16) | instr_lo; - code = ((trap_instr >> 6) & ((1 << 20) - 1)); - /* Unfortunately, microMIPS also suffers from - the old assembler bug... */ - if (code >= (1 << 10)) { - code >>= 10; - } - } - } else { - /* MIPS16e mode */ - ret = get_user_u16(trap_instr, env->active_tc.PC); - if (ret != 0) { - goto error; - } - code = (trap_instr >> 6) & 0x3f; - } - } else { - ret = get_user_u32(trap_instr, env->active_tc.PC); - if (ret != 0) { - goto error; - } - - /* As described in the original Linux kernel code, the - * below checks on 'code' are to work around an old - * assembly bug. - */ - code = ((trap_instr >> 6) & ((1 << 20) - 1)); - if (code >= (1 << 10)) { - code >>= 10; - } - } - - if (do_break(env, &info, code) != 0) { - goto error; - } - } - break; - case EXCP_TRAP: - { - abi_ulong trap_instr; - unsigned int code = 0; - - if (env->hflags & MIPS_HFLAG_M16) { - /* microMIPS mode */ - abi_ulong instr[2]; - - ret = get_user_u16(instr[0], env->active_tc.PC) || - get_user_u16(instr[1], env->active_tc.PC + 2); - - trap_instr = (instr[0] << 16) | instr[1]; - } else { - ret = get_user_u32(trap_instr, env->active_tc.PC); - } - - if (ret != 0) { - goto error; - } - - /* The immediate versions don't provide a code. */ - if (!(trap_instr & 0xFC000000)) { - if (env->hflags & MIPS_HFLAG_M16) { - /* microMIPS mode */ - code = ((trap_instr >> 12) & ((1 << 4) - 1)); - } else { - code = ((trap_instr >> 6) & ((1 << 10) - 1)); - } - } - - if (do_break(env, &info, code) != 0) { - goto error; - } - } - break; - default: -error: - EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr); - abort(); - } - process_pending_signals(env); - } -} -#endif - -#ifdef TARGET_OPENRISC - -void cpu_loop(CPUOpenRISCState *env) -{ - CPUState *cs = CPU(openrisc_env_get_cpu(env)); - int trapnr, gdbsig; - - for (;;) { - cpu_exec_start(cs); - trapnr = cpu_openrisc_exec(cs); - cpu_exec_end(cs); - gdbsig = 0; - - switch (trapnr) { - case EXCP_RESET: - qemu_log_mask(CPU_LOG_INT, "\nReset request, exit, pc is %#x\n", env->pc); - exit(EXIT_FAILURE); - break; - case EXCP_BUSERR: - qemu_log_mask(CPU_LOG_INT, "\nBus error, exit, pc is %#x\n", env->pc); - gdbsig = TARGET_SIGBUS; - break; - case EXCP_DPF: - case EXCP_IPF: - cpu_dump_state(cs, stderr, fprintf, 0); - gdbsig = TARGET_SIGSEGV; - break; - case EXCP_TICK: - qemu_log_mask(CPU_LOG_INT, "\nTick time interrupt pc is %#x\n", env->pc); - break; - case EXCP_ALIGN: - qemu_log_mask(CPU_LOG_INT, "\nAlignment pc is %#x\n", env->pc); - gdbsig = TARGET_SIGBUS; - break; - case EXCP_ILLEGAL: - qemu_log_mask(CPU_LOG_INT, "\nIllegal instructionpc is %#x\n", env->pc); - gdbsig = TARGET_SIGILL; - break; - case EXCP_INT: - qemu_log_mask(CPU_LOG_INT, "\nExternal interruptpc is %#x\n", env->pc); - break; - case EXCP_DTLBMISS: - case EXCP_ITLBMISS: - qemu_log_mask(CPU_LOG_INT, "\nTLB miss\n"); - break; - case EXCP_RANGE: - qemu_log_mask(CPU_LOG_INT, "\nRange\n"); - gdbsig = TARGET_SIGSEGV; - break; - case EXCP_SYSCALL: - env->pc += 4; /* 0xc00; */ - env->gpr[11] = do_syscall(env, - env->gpr[11], /* return value */ - env->gpr[3], /* r3 - r7 are params */ - env->gpr[4], - env->gpr[5], - env->gpr[6], - env->gpr[7], - env->gpr[8], 0, 0); - break; - case EXCP_FPE: - qemu_log_mask(CPU_LOG_INT, "\nFloating point error\n"); - break; - case EXCP_TRAP: - qemu_log_mask(CPU_LOG_INT, "\nTrap\n"); - gdbsig = TARGET_SIGTRAP; - break; - case EXCP_NR: - qemu_log_mask(CPU_LOG_INT, "\nNR\n"); - break; - default: - EXCP_DUMP(env, "\nqemu: unhandled CPU exception %#x - aborting\n", - trapnr); - gdbsig = TARGET_SIGILL; - break; - } - if (gdbsig) { - gdb_handlesig(cs, gdbsig); - if (gdbsig != TARGET_SIGTRAP) { - exit(EXIT_FAILURE); - } - } - - process_pending_signals(env); - } -} - -#endif /* TARGET_OPENRISC */ - -#ifdef TARGET_SH4 -void cpu_loop(CPUSH4State *env) -{ - CPUState *cs = CPU(sh_env_get_cpu(env)); - int trapnr, ret; - target_siginfo_t info; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_sh4_exec(cs); - cpu_exec_end(cs); - - switch (trapnr) { - case 0x160: - env->pc += 2; - ret = do_syscall(env, - env->gregs[3], - env->gregs[4], - env->gregs[5], - env->gregs[6], - env->gregs[7], - env->gregs[0], - env->gregs[1], - 0, 0); - env->gregs[0] = ret; - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - case 0xa0: - case 0xc0: - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->tea; - queue_signal(env, info.si_signo, &info); - break; - - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} -#endif - -#ifdef TARGET_CRIS -void cpu_loop(CPUCRISState *env) -{ - CPUState *cs = CPU(cris_env_get_cpu(env)); - int trapnr, ret; - target_siginfo_t info; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_cris_exec(cs); - cpu_exec_end(cs); - switch (trapnr) { - case 0xaa: - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->pregs[PR_EDA]; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_BREAK: - ret = do_syscall(env, - env->regs[9], - env->regs[10], - env->regs[11], - env->regs[12], - env->regs[13], - env->pregs[7], - env->pregs[11], - 0, 0); - env->regs[10] = ret; - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} -#endif - -#ifdef TARGET_MICROBLAZE -void cpu_loop(CPUMBState *env) -{ - CPUState *cs = CPU(mb_env_get_cpu(env)); - int trapnr, ret; - target_siginfo_t info; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_mb_exec(cs); - cpu_exec_end(cs); - switch (trapnr) { - case 0xaa: - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_BREAK: - /* Return address is 4 bytes after the call. */ - env->regs[14] += 4; - env->sregs[SR_PC] = env->regs[14]; - ret = do_syscall(env, - env->regs[12], - env->regs[5], - env->regs[6], - env->regs[7], - env->regs[8], - env->regs[9], - env->regs[10], - 0, 0); - env->regs[3] = ret; - break; - case EXCP_HW_EXCP: - env->regs[17] = env->sregs[SR_PC] + 4; - if (env->iflags & D_FLAG) { - env->sregs[SR_ESR] |= 1 << 12; - env->sregs[SR_PC] -= 4; - /* FIXME: if branch was immed, replay the imm as well. */ - } - - env->iflags &= ~(IMM_FLAG | D_FLAG); - - switch (env->sregs[SR_ESR] & 31) { - case ESR_EC_DIVZERO: - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - info.si_code = TARGET_FPE_FLTDIV; - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - break; - case ESR_EC_FPU: - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - if (env->sregs[SR_FSR] & FSR_IO) { - info.si_code = TARGET_FPE_FLTINV; - } - if (env->sregs[SR_FSR] & FSR_DZ) { - info.si_code = TARGET_FPE_FLTDIV; - } - info._sifields._sigfault._addr = 0; - queue_signal(env, info.si_signo, &info); - break; - default: - printf ("Unhandled hw-exception: 0x%x\n", - env->sregs[SR_ESR] & ESR_EC_MASK); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - break; - } - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} -#endif - -#ifdef TARGET_M68K - -void cpu_loop(CPUM68KState *env) -{ - CPUState *cs = CPU(m68k_env_get_cpu(env)); - int trapnr; - unsigned int n; - target_siginfo_t info; - TaskState *ts = cs->opaque; - - for(;;) { - cpu_exec_start(cs); - trapnr = cpu_m68k_exec(cs); - cpu_exec_end(cs); - switch(trapnr) { - case EXCP_ILLEGAL: - { - if (ts->sim_syscalls) { - uint16_t nr; - get_user_u16(nr, env->pc + 2); - env->pc += 4; - do_m68k_simcall(env, nr); - } else { - goto do_sigill; - } - } - break; - case EXCP_HALT_INSN: - /* Semihosing syscall. */ - env->pc += 4; - do_m68k_semihosting(env, env->dregs[0]); - break; - case EXCP_LINEA: - case EXCP_LINEF: - case EXCP_UNSUPPORTED: - do_sigill: - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPN; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_TRAP0: - { - ts->sim_syscalls = 0; - n = env->dregs[0]; - env->pc += 2; - env->dregs[0] = do_syscall(env, - n, - env->dregs[1], - env->dregs[2], - env->dregs[3], - env->dregs[4], - env->dregs[5], - env->aregs[0], - 0, 0); - } - break; - case EXCP_INTERRUPT: - /* just indicate that signals should be handled asap */ - break; - case EXCP_ACCESS: - { - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - /* XXX: check env->error_code */ - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = env->mmu.ar; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_DEBUG: - { - int sig; - - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) - { - info.si_signo = sig; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - } - break; - default: - EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr); - abort(); - } - process_pending_signals(env); - } -} -#endif /* TARGET_M68K */ - -#ifdef TARGET_ALPHA -static void do_store_exclusive(CPUAlphaState *env, int reg, int quad) -{ - target_ulong addr, val, tmp; - target_siginfo_t info; - int ret = 0; - - addr = env->lock_addr; - tmp = env->lock_st_addr; - env->lock_addr = -1; - env->lock_st_addr = 0; - - start_exclusive(); - mmap_lock(); - - if (addr == tmp) { - if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) { - goto do_sigsegv; - } - - if (val == env->lock_value) { - tmp = env->ir[reg]; - if (quad ? put_user_u64(tmp, addr) : put_user_u32(tmp, addr)) { - goto do_sigsegv; - } - ret = 1; - } - } - env->ir[reg] = ret; - env->pc += 4; - - mmap_unlock(); - end_exclusive(); - return; - - do_sigsegv: - mmap_unlock(); - end_exclusive(); - - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = addr; - queue_signal(env, TARGET_SIGSEGV, &info); -} - -void cpu_loop(CPUAlphaState *env) -{ - CPUState *cs = CPU(alpha_env_get_cpu(env)); - int trapnr; - target_siginfo_t info; - abi_long sysret; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_alpha_exec(cs); - cpu_exec_end(cs); - - /* All of the traps imply a transition through PALcode, which - implies an REI instruction has been executed. Which means - that the intr_flag should be cleared. */ - env->intr_flag = 0; - - switch (trapnr) { - case EXCP_RESET: - fprintf(stderr, "Reset requested. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_MCHK: - fprintf(stderr, "Machine check exception. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_SMP_INTERRUPT: - case EXCP_CLK_INTERRUPT: - case EXCP_DEV_INTERRUPT: - fprintf(stderr, "External interrupt. Exit\n"); - exit(EXIT_FAILURE); - break; - case EXCP_MMFAULT: - env->lock_addr = -1; - info.si_signo = TARGET_SIGSEGV; - info.si_errno = 0; - info.si_code = (page_get_flags(env->trap_arg0) & PAGE_VALID - ? TARGET_SEGV_ACCERR : TARGET_SEGV_MAPERR); - info._sifields._sigfault._addr = env->trap_arg0; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_UNALIGN: - env->lock_addr = -1; - info.si_signo = TARGET_SIGBUS; - info.si_errno = 0; - info.si_code = TARGET_BUS_ADRALN; - info._sifields._sigfault._addr = env->trap_arg0; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_OPCDEC: - do_sigill: - env->lock_addr = -1; - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_ILLOPC; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_ARITH: - env->lock_addr = -1; - info.si_signo = TARGET_SIGFPE; - info.si_errno = 0; - info.si_code = TARGET_FPE_FLTINV; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case EXCP_FEN: - /* No-op. Linux simply re-enables the FPU. */ - break; - case EXCP_CALL_PAL: - env->lock_addr = -1; - switch (env->error_code) { - case 0x80: - /* BPT */ - info.si_signo = TARGET_SIGTRAP; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case 0x81: - /* BUGCHK */ - info.si_signo = TARGET_SIGTRAP; - info.si_errno = 0; - info.si_code = 0; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - case 0x83: - /* CALLSYS */ - trapnr = env->ir[IR_V0]; - sysret = do_syscall(env, trapnr, - env->ir[IR_A0], env->ir[IR_A1], - env->ir[IR_A2], env->ir[IR_A3], - env->ir[IR_A4], env->ir[IR_A5], - 0, 0); - if (trapnr == TARGET_NR_sigreturn - || trapnr == TARGET_NR_rt_sigreturn) { - break; - } - /* Syscall writes 0 to V0 to bypass error check, similar - to how this is handled internal to Linux kernel. - (Ab)use trapnr temporarily as boolean indicating error. */ - trapnr = (env->ir[IR_V0] != 0 && sysret < 0); - env->ir[IR_V0] = (trapnr ? -sysret : sysret); - env->ir[IR_A3] = trapnr; - break; - case 0x86: - /* IMB */ - /* ??? We can probably elide the code using page_unprotect - that is checking for self-modifying code. Instead we - could simply call tb_flush here. Until we work out the - changes required to turn off the extra write protection, - this can be a no-op. */ - break; - case 0x9E: - /* RDUNIQUE */ - /* Handled in the translator for usermode. */ - abort(); - case 0x9F: - /* WRUNIQUE */ - /* Handled in the translator for usermode. */ - abort(); - case 0xAA: - /* GENTRAP */ - info.si_signo = TARGET_SIGFPE; - switch (env->ir[IR_A0]) { - case TARGET_GEN_INTOVF: - info.si_code = TARGET_FPE_INTOVF; - break; - case TARGET_GEN_INTDIV: - info.si_code = TARGET_FPE_INTDIV; - break; - case TARGET_GEN_FLTOVF: - info.si_code = TARGET_FPE_FLTOVF; - break; - case TARGET_GEN_FLTUND: - info.si_code = TARGET_FPE_FLTUND; - break; - case TARGET_GEN_FLTINV: - info.si_code = TARGET_FPE_FLTINV; - break; - case TARGET_GEN_FLTINE: - info.si_code = TARGET_FPE_FLTRES; - break; - case TARGET_GEN_ROPRAND: - info.si_code = 0; - break; - default: - info.si_signo = TARGET_SIGTRAP; - info.si_code = 0; - break; - } - info.si_errno = 0; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); - break; - default: - goto do_sigill; - } - break; - case EXCP_DEBUG: - info.si_signo = gdb_handlesig(cs, TARGET_SIGTRAP); - if (info.si_signo) { - env->lock_addr = -1; - info.si_errno = 0; - info.si_code = TARGET_TRAP_BRKPT; - queue_signal(env, info.si_signo, &info); - } - break; - case EXCP_STL_C: - case EXCP_STQ_C: - do_store_exclusive(env, env->error_code, trapnr - EXCP_STL_C); - break; - case EXCP_INTERRUPT: - /* Just indicate that signals should be handled asap. */ - break; - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} -#endif /* TARGET_ALPHA */ - -#ifdef TARGET_S390X -void cpu_loop(CPUS390XState *env) -{ - CPUState *cs = CPU(s390_env_get_cpu(env)); - int trapnr, n, sig; - target_siginfo_t info; - target_ulong addr; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_s390x_exec(cs); - cpu_exec_end(cs); - switch (trapnr) { - case EXCP_INTERRUPT: - /* Just indicate that signals should be handled asap. */ - break; - - case EXCP_SVC: - n = env->int_svc_code; - if (!n) { - /* syscalls > 255 */ - n = env->regs[1]; - } - env->psw.addr += env->int_svc_ilen; - env->regs[2] = do_syscall(env, n, env->regs[2], env->regs[3], - env->regs[4], env->regs[5], - env->regs[6], env->regs[7], 0, 0); - break; - - case EXCP_DEBUG: - sig = gdb_handlesig(cs, TARGET_SIGTRAP); - if (sig) { - n = TARGET_TRAP_BRKPT; - goto do_signal_pc; - } - break; - case EXCP_PGM: - n = env->int_pgm_code; - switch (n) { - case PGM_OPERATION: - case PGM_PRIVILEGED: - sig = TARGET_SIGILL; - n = TARGET_ILL_ILLOPC; - goto do_signal_pc; - case PGM_PROTECTION: - case PGM_ADDRESSING: - sig = TARGET_SIGSEGV; - /* XXX: check env->error_code */ - n = TARGET_SEGV_MAPERR; - addr = env->__excp_addr; - goto do_signal; - case PGM_EXECUTE: - case PGM_SPECIFICATION: - case PGM_SPECIAL_OP: - case PGM_OPERAND: - do_sigill_opn: - sig = TARGET_SIGILL; - n = TARGET_ILL_ILLOPN; - goto do_signal_pc; - - case PGM_FIXPT_OVERFLOW: - sig = TARGET_SIGFPE; - n = TARGET_FPE_INTOVF; - goto do_signal_pc; - case PGM_FIXPT_DIVIDE: - sig = TARGET_SIGFPE; - n = TARGET_FPE_INTDIV; - goto do_signal_pc; - - case PGM_DATA: - n = (env->fpc >> 8) & 0xff; - if (n == 0xff) { - /* compare-and-trap */ - goto do_sigill_opn; - } else { - /* An IEEE exception, simulated or otherwise. */ - if (n & 0x80) { - n = TARGET_FPE_FLTINV; - } else if (n & 0x40) { - n = TARGET_FPE_FLTDIV; - } else if (n & 0x20) { - n = TARGET_FPE_FLTOVF; - } else if (n & 0x10) { - n = TARGET_FPE_FLTUND; - } else if (n & 0x08) { - n = TARGET_FPE_FLTRES; - } else { - /* ??? Quantum exception; BFP, DFP error. */ - goto do_sigill_opn; - } - sig = TARGET_SIGFPE; - goto do_signal_pc; - } - - default: - fprintf(stderr, "Unhandled program exception: %#x\n", n); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - break; - - do_signal_pc: - addr = env->psw.addr; - do_signal: - info.si_signo = sig; - info.si_errno = 0; - info.si_code = n; - info._sifields._sigfault._addr = addr; - queue_signal(env, info.si_signo, &info); - break; - - default: - fprintf(stderr, "Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(cs, stderr, fprintf, 0); - exit(EXIT_FAILURE); - } - process_pending_signals (env); - } -} - -#endif /* TARGET_S390X */ - -#ifdef TARGET_TILEGX - -static void gen_sigill_reg(CPUTLGState *env) -{ - target_siginfo_t info; - - info.si_signo = TARGET_SIGILL; - info.si_errno = 0; - info.si_code = TARGET_ILL_PRVREG; - info._sifields._sigfault._addr = env->pc; - queue_signal(env, info.si_signo, &info); -} - -static void do_signal(CPUTLGState *env, int signo, int sigcode) -{ - target_siginfo_t info; - - info.si_signo = signo; - info.si_errno = 0; - info._sifields._sigfault._addr = env->pc; - - if (signo == TARGET_SIGSEGV) { - /* The passed in sigcode is a dummy; check for a page mapping - and pass either MAPERR or ACCERR. */ - target_ulong addr = env->excaddr; - info._sifields._sigfault._addr = addr; - if (page_check_range(addr, 1, PAGE_VALID) < 0) { - sigcode = TARGET_SEGV_MAPERR; - } else { - sigcode = TARGET_SEGV_ACCERR; - } - } - info.si_code = sigcode; - - queue_signal(env, info.si_signo, &info); -} - -static void gen_sigsegv_maperr(CPUTLGState *env, target_ulong addr) -{ - env->excaddr = addr; - do_signal(env, TARGET_SIGSEGV, 0); -} - -static void set_regval(CPUTLGState *env, uint8_t reg, uint64_t val) -{ - if (unlikely(reg >= TILEGX_R_COUNT)) { - switch (reg) { - case TILEGX_R_SN: - case TILEGX_R_ZERO: - return; - case TILEGX_R_IDN0: - case TILEGX_R_IDN1: - case TILEGX_R_UDN0: - case TILEGX_R_UDN1: - case TILEGX_R_UDN2: - case TILEGX_R_UDN3: - gen_sigill_reg(env); - return; - default: - g_assert_not_reached(); - } - } - env->regs[reg] = val; -} - -/* - * Compare the 8-byte contents of the CmpValue SPR with the 8-byte value in - * memory at the address held in the first source register. If the values are - * not equal, then no memory operation is performed. If the values are equal, - * the 8-byte quantity from the second source register is written into memory - * at the address held in the first source register. In either case, the result - * of the instruction is the value read from memory. The compare and write to - * memory are atomic and thus can be used for synchronization purposes. This - * instruction only operates for addresses aligned to a 8-byte boundary. - * Unaligned memory access causes an Unaligned Data Reference interrupt. - * - * Functional Description (64-bit) - * uint64_t memVal = memoryReadDoubleWord (rf[SrcA]); - * rf[Dest] = memVal; - * if (memVal == SPR[CmpValueSPR]) - * memoryWriteDoubleWord (rf[SrcA], rf[SrcB]); - * - * Functional Description (32-bit) - * uint64_t memVal = signExtend32 (memoryReadWord (rf[SrcA])); - * rf[Dest] = memVal; - * if (memVal == signExtend32 (SPR[CmpValueSPR])) - * memoryWriteWord (rf[SrcA], rf[SrcB]); - * - * - * This function also processes exch and exch4 which need not process SPR. - */ -static void do_exch(CPUTLGState *env, bool quad, bool cmp) -{ - target_ulong addr; - target_long val, sprval; - - start_exclusive(); - - addr = env->atomic_srca; - if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) { - goto sigsegv_maperr; - } - - if (cmp) { - if (quad) { - sprval = env->spregs[TILEGX_SPR_CMPEXCH]; - } else { - sprval = sextract64(env->spregs[TILEGX_SPR_CMPEXCH], 0, 32); - } - } - - if (!cmp || val == sprval) { - target_long valb = env->atomic_srcb; - if (quad ? put_user_u64(valb, addr) : put_user_u32(valb, addr)) { - goto sigsegv_maperr; - } - } - - set_regval(env, env->atomic_dstr, val); - end_exclusive(); - return; - - sigsegv_maperr: - end_exclusive(); - gen_sigsegv_maperr(env, addr); -} - -static void do_fetch(CPUTLGState *env, int trapnr, bool quad) -{ - int8_t write = 1; - target_ulong addr; - target_long val, valb; - - start_exclusive(); - - addr = env->atomic_srca; - valb = env->atomic_srcb; - if (quad ? get_user_s64(val, addr) : get_user_s32(val, addr)) { - goto sigsegv_maperr; - } - - switch (trapnr) { - case TILEGX_EXCP_OPCODE_FETCHADD: - case TILEGX_EXCP_OPCODE_FETCHADD4: - valb += val; - break; - case TILEGX_EXCP_OPCODE_FETCHADDGEZ: - valb += val; - if (valb < 0) { - write = 0; - } - break; - case TILEGX_EXCP_OPCODE_FETCHADDGEZ4: - valb += val; - if ((int32_t)valb < 0) { - write = 0; - } - break; - case TILEGX_EXCP_OPCODE_FETCHAND: - case TILEGX_EXCP_OPCODE_FETCHAND4: - valb &= val; - break; - case TILEGX_EXCP_OPCODE_FETCHOR: - case TILEGX_EXCP_OPCODE_FETCHOR4: - valb |= val; - break; - default: - g_assert_not_reached(); - } - - if (write) { - if (quad ? put_user_u64(valb, addr) : put_user_u32(valb, addr)) { - goto sigsegv_maperr; - } - } - - set_regval(env, env->atomic_dstr, val); - end_exclusive(); - return; - - sigsegv_maperr: - end_exclusive(); - gen_sigsegv_maperr(env, addr); -} - -void cpu_loop(CPUTLGState *env) -{ - CPUState *cs = CPU(tilegx_env_get_cpu(env)); - int trapnr; - - while (1) { - cpu_exec_start(cs); - trapnr = cpu_tilegx_exec(cs); - cpu_exec_end(cs); - switch (trapnr) { - case TILEGX_EXCP_SYSCALL: - env->regs[TILEGX_R_RE] = do_syscall(env, env->regs[TILEGX_R_NR], - env->regs[0], env->regs[1], - env->regs[2], env->regs[3], - env->regs[4], env->regs[5], - env->regs[6], env->regs[7]); - env->regs[TILEGX_R_ERR] = TILEGX_IS_ERRNO(env->regs[TILEGX_R_RE]) - ? - env->regs[TILEGX_R_RE] - : 0; - break; - case TILEGX_EXCP_OPCODE_EXCH: - do_exch(env, true, false); - break; - case TILEGX_EXCP_OPCODE_EXCH4: - do_exch(env, false, false); - break; - case TILEGX_EXCP_OPCODE_CMPEXCH: - do_exch(env, true, true); - break; - case TILEGX_EXCP_OPCODE_CMPEXCH4: - do_exch(env, false, true); - break; - case TILEGX_EXCP_OPCODE_FETCHADD: - case TILEGX_EXCP_OPCODE_FETCHADDGEZ: - case TILEGX_EXCP_OPCODE_FETCHAND: - case TILEGX_EXCP_OPCODE_FETCHOR: - do_fetch(env, trapnr, true); - break; - case TILEGX_EXCP_OPCODE_FETCHADD4: - case TILEGX_EXCP_OPCODE_FETCHADDGEZ4: - case TILEGX_EXCP_OPCODE_FETCHAND4: - case TILEGX_EXCP_OPCODE_FETCHOR4: - do_fetch(env, trapnr, false); - break; - case TILEGX_EXCP_SIGNAL: - do_signal(env, env->signo, env->sigcode); - break; - case TILEGX_EXCP_REG_IDN_ACCESS: - case TILEGX_EXCP_REG_UDN_ACCESS: - gen_sigill_reg(env); - break; - default: - fprintf(stderr, "trapnr is %d[0x%x].\n", trapnr, trapnr); - g_assert_not_reached(); - } - process_pending_signals(env); - } -} - -#endif - -THREAD CPUState *thread_cpu; - -void task_settid(TaskState *ts) -{ - if (ts->ts_tid == 0) { - ts->ts_tid = (pid_t)syscall(SYS_gettid); - } -} - -void stop_all_tasks(void) -{ - /* - * We trust that when using NPTL, start_exclusive() - * handles thread stopping correctly. - */ - start_exclusive(); -} - -/* Assumes contents are already zeroed. */ -void init_task_state(TaskState *ts) -{ - int i; - - ts->used = 1; - ts->first_free = ts->sigqueue_table; - for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) { - ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1]; - } - ts->sigqueue_table[i].next = NULL; -} - -CPUArchState *cpu_copy(CPUArchState *env) -{ - CPUState *cpu = ENV_GET_CPU(env); - CPUState *new_cpu = cpu_init(cpu_model); - CPUArchState *new_env = new_cpu->env_ptr; - CPUBreakpoint *bp; - CPUWatchpoint *wp; - - /* Reset non arch specific state */ - cpu_reset(new_cpu); - - memcpy(new_env, env, sizeof(CPUArchState)); - - /* Clone all break/watchpoints. - Note: Once we support ptrace with hw-debug register access, make sure - BP_CPU break/watchpoints are handled correctly on clone. */ - QTAILQ_INIT(&new_cpu->breakpoints); - QTAILQ_INIT(&new_cpu->watchpoints); - QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) { - cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL); - } - QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { - cpu_watchpoint_insert(new_cpu, wp->vaddr, wp->len, wp->flags, NULL); - } - - return new_env; -} - -static void handle_arg_help(const char *arg) -{ - usage(EXIT_SUCCESS); -} - -static void handle_arg_log(const char *arg) -{ - int mask; - - mask = qemu_str_to_log_mask(arg); - if (!mask) { - qemu_print_log_usage(stdout); - exit(EXIT_FAILURE); - } - qemu_set_log(mask); -} - -static void handle_arg_log_filename(const char *arg) -{ - qemu_set_log_filename(arg); -} - -static void handle_arg_set_env(const char *arg) -{ - char *r, *p, *token; - r = p = strdup(arg); - while ((token = strsep(&p, ",")) != NULL) { - if (envlist_setenv(envlist, token) != 0) { - usage(EXIT_FAILURE); - } - } - free(r); -} - -static void handle_arg_unset_env(const char *arg) -{ - char *r, *p, *token; - r = p = strdup(arg); - while ((token = strsep(&p, ",")) != NULL) { - if (envlist_unsetenv(envlist, token) != 0) { - usage(EXIT_FAILURE); - } - } - free(r); -} - -static void handle_arg_argv0(const char *arg) -{ - argv0 = strdup(arg); -} - -static void handle_arg_stack_size(const char *arg) -{ - char *p; - guest_stack_size = strtoul(arg, &p, 0); - if (guest_stack_size == 0) { - usage(EXIT_FAILURE); - } - - if (*p == 'M') { - guest_stack_size *= 1024 * 1024; - } else if (*p == 'k' || *p == 'K') { - guest_stack_size *= 1024; - } -} - -static void handle_arg_ld_prefix(const char *arg) -{ - interp_prefix = strdup(arg); -} - -static void handle_arg_pagesize(const char *arg) -{ - qemu_host_page_size = atoi(arg); - if (qemu_host_page_size == 0 || - (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) { - fprintf(stderr, "page size must be a power of two\n"); - exit(EXIT_FAILURE); - } -} - -static void handle_arg_randseed(const char *arg) -{ - unsigned long long seed; - - if (parse_uint_full(arg, &seed, 0) != 0 || seed > UINT_MAX) { - fprintf(stderr, "Invalid seed number: %s\n", arg); - exit(EXIT_FAILURE); - } - srand(seed); -} - -static void handle_arg_gdb(const char *arg) -{ - gdbstub_port = atoi(arg); -} - -static void handle_arg_uname(const char *arg) -{ - qemu_uname_release = strdup(arg); -} - -static void handle_arg_cpu(const char *arg) -{ - cpu_model = strdup(arg); - if (cpu_model == NULL || is_help_option(cpu_model)) { - /* XXX: implement xxx_cpu_list for targets that still miss it */ -#if defined(cpu_list) - cpu_list(stdout, &fprintf); -#endif - exit(EXIT_FAILURE); - } -} - -static void handle_arg_guest_base(const char *arg) -{ - guest_base = strtol(arg, NULL, 0); - have_guest_base = 1; -} - -static void handle_arg_reserved_va(const char *arg) -{ - char *p; - int shift = 0; - reserved_va = strtoul(arg, &p, 0); - switch (*p) { - case 'k': - case 'K': - shift = 10; - break; - case 'M': - shift = 20; - break; - case 'G': - shift = 30; - break; - } - if (shift) { - unsigned long unshifted = reserved_va; - p++; - reserved_va <<= shift; - if (((reserved_va >> shift) != unshifted) -#if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS - || (reserved_va > (1ul << TARGET_VIRT_ADDR_SPACE_BITS)) -#endif - ) { - fprintf(stderr, "Reserved virtual address too big\n"); - exit(EXIT_FAILURE); - } - } - if (*p) { - fprintf(stderr, "Unrecognised -R size suffix '%s'\n", p); - exit(EXIT_FAILURE); - } -} - -static void handle_arg_singlestep(const char *arg) -{ - singlestep = 1; -} - -static void handle_arg_strace(const char *arg) -{ - do_strace = 1; -} - -static void handle_arg_version(const char *arg) -{ - printf("qemu-" TARGET_NAME " version " QEMU_VERSION QEMU_PKGVERSION - ", Copyright (c) 2003-2008 Fabrice Bellard\n"); - exit(EXIT_SUCCESS); -} - -struct qemu_argument { - const char *argv; - const char *env; - bool has_arg; - void (*handle_opt)(const char *arg); - const char *example; - const char *help; -}; - -static const struct qemu_argument arg_table[] = { - {"h", "", false, handle_arg_help, - "", "print this help"}, - {"help", "", false, handle_arg_help, - "", ""}, - {"g", "QEMU_GDB", true, handle_arg_gdb, - "port", "wait gdb connection to 'port'"}, - {"L", "QEMU_LD_PREFIX", true, handle_arg_ld_prefix, - "path", "set the elf interpreter prefix to 'path'"}, - {"s", "QEMU_STACK_SIZE", true, handle_arg_stack_size, - "size", "set the stack size to 'size' bytes"}, - {"cpu", "QEMU_CPU", true, handle_arg_cpu, - "model", "select CPU (-cpu help for list)"}, - {"E", "QEMU_SET_ENV", true, handle_arg_set_env, - "var=value", "sets targets environment variable (see below)"}, - {"U", "QEMU_UNSET_ENV", true, handle_arg_unset_env, - "var", "unsets targets environment variable (see below)"}, - {"0", "QEMU_ARGV0", true, handle_arg_argv0, - "argv0", "forces target process argv[0] to be 'argv0'"}, - {"r", "QEMU_UNAME", true, handle_arg_uname, - "uname", "set qemu uname release string to 'uname'"}, - {"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base, - "address", "set guest_base address to 'address'"}, - {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va, - "size", "reserve 'size' bytes for guest virtual address space"}, - {"d", "QEMU_LOG", true, handle_arg_log, - "item[,...]", "enable logging of specified items " - "(use '-d help' for a list of items)"}, - {"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename, - "logfile", "write logs to 'logfile' (default stderr)"}, - {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize, - "pagesize", "set the host page size to 'pagesize'"}, - {"singlestep", "QEMU_SINGLESTEP", false, handle_arg_singlestep, - "", "run in singlestep mode"}, - {"strace", "QEMU_STRACE", false, handle_arg_strace, - "", "log system calls"}, - {"seed", "QEMU_RAND_SEED", true, handle_arg_randseed, - "", "Seed for pseudo-random number generator"}, - {"version", "QEMU_VERSION", false, handle_arg_version, - "", "display version information and exit"}, - {NULL, NULL, false, NULL, NULL, NULL} -}; - -static void usage(int exitcode) -{ - const struct qemu_argument *arginfo; - int maxarglen; - int maxenvlen; - - printf("usage: qemu-" TARGET_NAME " [options] program [arguments...]\n" - "Linux CPU emulator (compiled for " TARGET_NAME " emulation)\n" - "\n" - "Options and associated environment variables:\n" - "\n"); - - /* Calculate column widths. We must always have at least enough space - * for the column header. - */ - maxarglen = strlen("Argument"); - maxenvlen = strlen("Env-variable"); - - for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) { - int arglen = strlen(arginfo->argv); - if (arginfo->has_arg) { - arglen += strlen(arginfo->example) + 1; - } - if (strlen(arginfo->env) > maxenvlen) { - maxenvlen = strlen(arginfo->env); - } - if (arglen > maxarglen) { - maxarglen = arglen; - } - } - - printf("%-*s %-*s Description\n", maxarglen+1, "Argument", - maxenvlen, "Env-variable"); - - for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) { - if (arginfo->has_arg) { - printf("-%s %-*s %-*s %s\n", arginfo->argv, - (int)(maxarglen - strlen(arginfo->argv) - 1), - arginfo->example, maxenvlen, arginfo->env, arginfo->help); - } else { - printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv, - maxenvlen, arginfo->env, - arginfo->help); - } - } - - printf("\n" - "Defaults:\n" - "QEMU_LD_PREFIX = %s\n" - "QEMU_STACK_SIZE = %ld byte\n", - interp_prefix, - guest_stack_size); - - printf("\n" - "You can use -E and -U options or the QEMU_SET_ENV and\n" - "QEMU_UNSET_ENV environment variables to set and unset\n" - "environment variables for the target process.\n" - "It is possible to provide several variables by separating them\n" - "by commas in getsubopt(3) style. Additionally it is possible to\n" - "provide the -E and -U options multiple times.\n" - "The following lines are equivalent:\n" - " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n" - " -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n" - " QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n" - "Note that if you provide several changes to a single variable\n" - "the last change will stay in effect.\n"); - - exit(exitcode); -} - -static int parse_args(int argc, char **argv) -{ - const char *r; - int optind; - const struct qemu_argument *arginfo; - - for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) { - if (arginfo->env == NULL) { - continue; - } - - r = getenv(arginfo->env); - if (r != NULL) { - arginfo->handle_opt(r); - } - } - - optind = 1; - for (;;) { - if (optind >= argc) { - break; - } - r = argv[optind]; - if (r[0] != '-') { - break; - } - optind++; - r++; - if (!strcmp(r, "-")) { - break; - } - /* Treat --foo the same as -foo. */ - if (r[0] == '-') { - r++; - } - - for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) { - if (!strcmp(r, arginfo->argv)) { - if (arginfo->has_arg) { - if (optind >= argc) { - (void) fprintf(stderr, - "qemu: missing argument for option '%s'\n", r); - exit(EXIT_FAILURE); - } - arginfo->handle_opt(argv[optind]); - optind++; - } else { - arginfo->handle_opt(NULL); - } - break; - } - } - - /* no option matched the current argv */ - if (arginfo->handle_opt == NULL) { - (void) fprintf(stderr, "qemu: unknown option '%s'\n", r); - exit(EXIT_FAILURE); - } - } - - if (optind >= argc) { - (void) fprintf(stderr, "qemu: no user program specified\n"); - exit(EXIT_FAILURE); - } - - filename = argv[optind]; - exec_path = argv[optind]; - - return optind; -} - -int main(int argc, char **argv, char **envp) -{ - struct target_pt_regs regs1, *regs = ®s1; - struct image_info info1, *info = &info1; - struct linux_binprm bprm; - TaskState *ts; - CPUArchState *env; - CPUState *cpu; - int optind; - char **target_environ, **wrk; - char **target_argv; - int target_argc; - int i; - int ret; - int execfd; - - module_call_init(MODULE_INIT_QOM); - - if ((envlist = envlist_create()) == NULL) { - (void) fprintf(stderr, "Unable to allocate envlist\n"); - exit(EXIT_FAILURE); - } - - /* add current environment into the list */ - for (wrk = environ; *wrk != NULL; wrk++) { - (void) envlist_setenv(envlist, *wrk); - } - - /* Read the stack limit from the kernel. If it's "unlimited", - then we can do little else besides use the default. */ - { - struct rlimit lim; - if (getrlimit(RLIMIT_STACK, &lim) == 0 - && lim.rlim_cur != RLIM_INFINITY - && lim.rlim_cur == (target_long)lim.rlim_cur) { - guest_stack_size = lim.rlim_cur; - } - } - - cpu_model = NULL; -#if defined(cpudef_setup) - cpudef_setup(); /* parse cpu definitions in target config file (TBD) */ -#endif - - srand(time(NULL)); - - optind = parse_args(argc, argv); - - /* Zero out regs */ - memset(regs, 0, sizeof(struct target_pt_regs)); - - /* Zero out image_info */ - memset(info, 0, sizeof(struct image_info)); - - memset(&bprm, 0, sizeof (bprm)); - - /* Scan interp_prefix dir for replacement files. */ - init_paths(interp_prefix); - - init_qemu_uname_release(); - - if (cpu_model == NULL) { -#if defined(TARGET_I386) -#ifdef TARGET_X86_64 - cpu_model = "qemu64"; -#else - cpu_model = "qemu32"; -#endif -#elif defined(TARGET_ARM) - cpu_model = "any"; -#elif defined(TARGET_UNICORE32) - cpu_model = "any"; -#elif defined(TARGET_M68K) - cpu_model = "any"; -#elif defined(TARGET_SPARC) -#ifdef TARGET_SPARC64 - cpu_model = "TI UltraSparc II"; -#else - cpu_model = "Fujitsu MB86904"; -#endif -#elif defined(TARGET_MIPS) -#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) - cpu_model = "5KEf"; -#else - cpu_model = "24Kf"; -#endif -#elif defined TARGET_OPENRISC - cpu_model = "or1200"; -#elif defined(TARGET_PPC) -# ifdef TARGET_PPC64 - cpu_model = "POWER8"; -# else - cpu_model = "750"; -# endif -#elif defined TARGET_SH4 - cpu_model = TYPE_SH7785_CPU; -#else - cpu_model = "any"; -#endif - } - tcg_exec_init(0); - /* NOTE: we need to init the CPU at this stage to get - qemu_host_page_size */ - cpu = cpu_init(cpu_model); - if (!cpu) { - fprintf(stderr, "Unable to find CPU definition\n"); - exit(EXIT_FAILURE); - } - env = cpu->env_ptr; - cpu_reset(cpu); - - thread_cpu = cpu; - - if (getenv("QEMU_STRACE")) { - do_strace = 1; - } - - if (getenv("QEMU_RAND_SEED")) { - handle_arg_randseed(getenv("QEMU_RAND_SEED")); - } - - target_environ = envlist_to_environ(envlist, NULL); - envlist_free(envlist); - - /* - * Now that page sizes are configured in cpu_init() we can do - * proper page alignment for guest_base. - */ - guest_base = HOST_PAGE_ALIGN(guest_base); - - if (reserved_va || have_guest_base) { - guest_base = init_guest_space(guest_base, reserved_va, 0, - have_guest_base); - if (guest_base == (unsigned long)-1) { - fprintf(stderr, "Unable to reserve 0x%lx bytes of virtual address " - "space for use as guest address space (check your virtual " - "memory ulimit setting or reserve less using -R option)\n", - reserved_va); - exit(EXIT_FAILURE); - } - - if (reserved_va) { - mmap_next_start = reserved_va; - } - } - - /* - * Read in mmap_min_addr kernel parameter. This value is used - * When loading the ELF image to determine whether guest_base - * is needed. It is also used in mmap_find_vma. - */ - { - FILE *fp; - - if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) { - unsigned long tmp; - if (fscanf(fp, "%lu", &tmp) == 1) { - mmap_min_addr = tmp; - qemu_log_mask(CPU_LOG_PAGE, "host mmap_min_addr=0x%lx\n", mmap_min_addr); - } - fclose(fp); - } - } - - /* - * Prepare copy of argv vector for target. - */ - target_argc = argc - optind; - target_argv = calloc(target_argc + 1, sizeof (char *)); - if (target_argv == NULL) { - (void) fprintf(stderr, "Unable to allocate memory for target_argv\n"); - exit(EXIT_FAILURE); - } - - /* - * If argv0 is specified (using '-0' switch) we replace - * argv[0] pointer with the given one. - */ - i = 0; - if (argv0 != NULL) { - target_argv[i++] = strdup(argv0); - } - for (; i < target_argc; i++) { - target_argv[i] = strdup(argv[optind + i]); - } - target_argv[target_argc] = NULL; - - ts = g_new0(TaskState, 1); - init_task_state(ts); - /* build Task State */ - ts->info = info; - ts->bprm = &bprm; - cpu->opaque = ts; - task_settid(ts); - - execfd = qemu_getauxval(AT_EXECFD); - if (execfd == 0) { - execfd = open(filename, O_RDONLY); - if (execfd < 0) { - printf("Error while loading %s: %s\n", filename, strerror(errno)); - _exit(EXIT_FAILURE); - } - } - - ret = loader_exec(execfd, filename, target_argv, target_environ, regs, - info, &bprm); - if (ret != 0) { - printf("Error while loading %s: %s\n", filename, strerror(-ret)); - _exit(EXIT_FAILURE); - } - - for (wrk = target_environ; *wrk; wrk++) { - free(*wrk); - } - - free(target_environ); - - if (qemu_loglevel_mask(CPU_LOG_PAGE)) { - qemu_log("guest_base 0x%lx\n", guest_base); - log_page_dump(); - - qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk); - qemu_log("end_code 0x" TARGET_ABI_FMT_lx "\n", info->end_code); - qemu_log("start_code 0x" TARGET_ABI_FMT_lx "\n", - info->start_code); - qemu_log("start_data 0x" TARGET_ABI_FMT_lx "\n", - info->start_data); - qemu_log("end_data 0x" TARGET_ABI_FMT_lx "\n", info->end_data); - qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n", - info->start_stack); - qemu_log("brk 0x" TARGET_ABI_FMT_lx "\n", info->brk); - qemu_log("entry 0x" TARGET_ABI_FMT_lx "\n", info->entry); - } - - target_set_brk(info->brk); - syscall_init(); - signal_init(); - - /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay - generating the prologue until now so that the prologue can take - the real value of GUEST_BASE into account. */ - tcg_prologue_init(&tcg_ctx); - -#if defined(TARGET_I386) - env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK; - env->hflags |= HF_PE_MASK | HF_CPL_MASK; - if (env->features[FEAT_1_EDX] & CPUID_SSE) { - env->cr[4] |= CR4_OSFXSR_MASK; - env->hflags |= HF_OSFXSR_MASK; - } -#ifndef TARGET_ABI32 - /* enable 64 bit mode if possible */ - if (!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM)) { - fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n"); - exit(EXIT_FAILURE); - } - env->cr[4] |= CR4_PAE_MASK; - env->efer |= MSR_EFER_LMA | MSR_EFER_LME; - env->hflags |= HF_LMA_MASK; -#endif - - /* flags setup : we activate the IRQs by default as in user mode */ - env->eflags |= IF_MASK; - - /* linux register setup */ -#ifndef TARGET_ABI32 - env->regs[R_EAX] = regs->rax; - env->regs[R_EBX] = regs->rbx; - env->regs[R_ECX] = regs->rcx; - env->regs[R_EDX] = regs->rdx; - env->regs[R_ESI] = regs->rsi; - env->regs[R_EDI] = regs->rdi; - env->regs[R_EBP] = regs->rbp; - env->regs[R_ESP] = regs->rsp; - env->eip = regs->rip; -#else - env->regs[R_EAX] = regs->eax; - env->regs[R_EBX] = regs->ebx; - env->regs[R_ECX] = regs->ecx; - env->regs[R_EDX] = regs->edx; - env->regs[R_ESI] = regs->esi; - env->regs[R_EDI] = regs->edi; - env->regs[R_EBP] = regs->ebp; - env->regs[R_ESP] = regs->esp; - env->eip = regs->eip; -#endif - - /* linux interrupt setup */ -#ifndef TARGET_ABI32 - env->idt.limit = 511; -#else - env->idt.limit = 255; -#endif - env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1), - PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); - idt_table = g2h(env->idt.base); - set_idt(0, 0); - set_idt(1, 0); - set_idt(2, 0); - set_idt(3, 3); - set_idt(4, 3); - set_idt(5, 0); - set_idt(6, 0); - set_idt(7, 0); - set_idt(8, 0); - set_idt(9, 0); - set_idt(10, 0); - set_idt(11, 0); - set_idt(12, 0); - set_idt(13, 0); - set_idt(14, 0); - set_idt(15, 0); - set_idt(16, 0); - set_idt(17, 0); - set_idt(18, 0); - set_idt(19, 0); - set_idt(0x80, 3); - - /* linux segment setup */ - { - uint64_t *gdt_table; - env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES, - PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); - env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1; - gdt_table = g2h(env->gdt.base); -#ifdef TARGET_ABI32 - write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff, - DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK | - (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT)); -#else - /* 64 bit code segment */ - write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff, - DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK | - DESC_L_MASK | - (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT)); -#endif - write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff, - DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK | - (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT)); - } - cpu_x86_load_seg(env, R_CS, __USER_CS); - cpu_x86_load_seg(env, R_SS, __USER_DS); -#ifdef TARGET_ABI32 - cpu_x86_load_seg(env, R_DS, __USER_DS); - cpu_x86_load_seg(env, R_ES, __USER_DS); - cpu_x86_load_seg(env, R_FS, __USER_DS); - cpu_x86_load_seg(env, R_GS, __USER_DS); - /* This hack makes Wine work... */ - env->segs[R_FS].selector = 0; -#else - cpu_x86_load_seg(env, R_DS, 0); - cpu_x86_load_seg(env, R_ES, 0); - cpu_x86_load_seg(env, R_FS, 0); - cpu_x86_load_seg(env, R_GS, 0); -#endif -#elif defined(TARGET_AARCH64) - { - int i; - - if (!(arm_feature(env, ARM_FEATURE_AARCH64))) { - fprintf(stderr, - "The selected ARM CPU does not support 64 bit mode\n"); - exit(EXIT_FAILURE); - } - - for (i = 0; i < 31; i++) { - env->xregs[i] = regs->regs[i]; - } - env->pc = regs->pc; - env->xregs[31] = regs->sp; - } -#elif defined(TARGET_ARM) - { - int i; - cpsr_write(env, regs->uregs[16], CPSR_USER | CPSR_EXEC, - CPSRWriteByInstr); - for(i = 0; i < 16; i++) { - env->regs[i] = regs->uregs[i]; - } -#ifdef TARGET_WORDS_BIGENDIAN - /* Enable BE8. */ - if (EF_ARM_EABI_VERSION(info->elf_flags) >= EF_ARM_EABI_VER4 - && (info->elf_flags & EF_ARM_BE8)) { - env->uncached_cpsr |= CPSR_E; - env->cp15.sctlr_el[1] |= SCTLR_E0E; - } else { - env->cp15.sctlr_el[1] |= SCTLR_B; - } -#endif - } -#elif defined(TARGET_UNICORE32) - { - int i; - cpu_asr_write(env, regs->uregs[32], 0xffffffff); - for (i = 0; i < 32; i++) { - env->regs[i] = regs->uregs[i]; - } - } -#elif defined(TARGET_SPARC) - { - int i; - env->pc = regs->pc; - env->npc = regs->npc; - env->y = regs->y; - for(i = 0; i < 8; i++) - env->gregs[i] = regs->u_regs[i]; - for(i = 0; i < 8; i++) - env->regwptr[i] = regs->u_regs[i + 8]; - } -#elif defined(TARGET_PPC) - { - int i; - -#if defined(TARGET_PPC64) -#if defined(TARGET_ABI32) - env->msr &= ~((target_ulong)1 << MSR_SF); -#else - env->msr |= (target_ulong)1 << MSR_SF; -#endif -#endif - env->nip = regs->nip; - for(i = 0; i < 32; i++) { - env->gpr[i] = regs->gpr[i]; - } - } -#elif defined(TARGET_M68K) - { - env->pc = regs->pc; - env->dregs[0] = regs->d0; - env->dregs[1] = regs->d1; - env->dregs[2] = regs->d2; - env->dregs[3] = regs->d3; - env->dregs[4] = regs->d4; - env->dregs[5] = regs->d5; - env->dregs[6] = regs->d6; - env->dregs[7] = regs->d7; - env->aregs[0] = regs->a0; - env->aregs[1] = regs->a1; - env->aregs[2] = regs->a2; - env->aregs[3] = regs->a3; - env->aregs[4] = regs->a4; - env->aregs[5] = regs->a5; - env->aregs[6] = regs->a6; - env->aregs[7] = regs->usp; - env->sr = regs->sr; - ts->sim_syscalls = 1; - } -#elif defined(TARGET_MICROBLAZE) - { - env->regs[0] = regs->r0; - env->regs[1] = regs->r1; - env->regs[2] = regs->r2; - env->regs[3] = regs->r3; - env->regs[4] = regs->r4; - env->regs[5] = regs->r5; - env->regs[6] = regs->r6; - env->regs[7] = regs->r7; - env->regs[8] = regs->r8; - env->regs[9] = regs->r9; - env->regs[10] = regs->r10; - env->regs[11] = regs->r11; - env->regs[12] = regs->r12; - env->regs[13] = regs->r13; - env->regs[14] = regs->r14; - env->regs[15] = regs->r15; - env->regs[16] = regs->r16; - env->regs[17] = regs->r17; - env->regs[18] = regs->r18; - env->regs[19] = regs->r19; - env->regs[20] = regs->r20; - env->regs[21] = regs->r21; - env->regs[22] = regs->r22; - env->regs[23] = regs->r23; - env->regs[24] = regs->r24; - env->regs[25] = regs->r25; - env->regs[26] = regs->r26; - env->regs[27] = regs->r27; - env->regs[28] = regs->r28; - env->regs[29] = regs->r29; - env->regs[30] = regs->r30; - env->regs[31] = regs->r31; - env->sregs[SR_PC] = regs->pc; - } -#elif defined(TARGET_MIPS) - { - int i; - - for(i = 0; i < 32; i++) { - env->active_tc.gpr[i] = regs->regs[i]; - } - env->active_tc.PC = regs->cp0_epc & ~(target_ulong)1; - if (regs->cp0_epc & 1) { - env->hflags |= MIPS_HFLAG_M16; - } - } -#elif defined(TARGET_OPENRISC) - { - int i; - - for (i = 0; i < 32; i++) { - env->gpr[i] = regs->gpr[i]; - } - - env->sr = regs->sr; - env->pc = regs->pc; - } -#elif defined(TARGET_SH4) - { - int i; - - for(i = 0; i < 16; i++) { - env->gregs[i] = regs->regs[i]; - } - env->pc = regs->pc; - } -#elif defined(TARGET_ALPHA) - { - int i; - - for(i = 0; i < 28; i++) { - env->ir[i] = ((abi_ulong *)regs)[i]; - } - env->ir[IR_SP] = regs->usp; - env->pc = regs->pc; - } -#elif defined(TARGET_CRIS) - { - env->regs[0] = regs->r0; - env->regs[1] = regs->r1; - env->regs[2] = regs->r2; - env->regs[3] = regs->r3; - env->regs[4] = regs->r4; - env->regs[5] = regs->r5; - env->regs[6] = regs->r6; - env->regs[7] = regs->r7; - env->regs[8] = regs->r8; - env->regs[9] = regs->r9; - env->regs[10] = regs->r10; - env->regs[11] = regs->r11; - env->regs[12] = regs->r12; - env->regs[13] = regs->r13; - env->regs[14] = info->start_stack; - env->regs[15] = regs->acr; - env->pc = regs->erp; - } -#elif defined(TARGET_S390X) - { - int i; - for (i = 0; i < 16; i++) { - env->regs[i] = regs->gprs[i]; - } - env->psw.mask = regs->psw.mask; - env->psw.addr = regs->psw.addr; - } -#elif defined(TARGET_TILEGX) - { - int i; - for (i = 0; i < TILEGX_R_COUNT; i++) { - env->regs[i] = regs->regs[i]; - } - for (i = 0; i < TILEGX_SPR_COUNT; i++) { - env->spregs[i] = 0; - } - env->pc = regs->pc; - } -#else -#error unsupported target CPU -#endif - -#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32) - ts->stack_base = info->start_stack; - ts->heap_base = info->brk; - /* This will be filled in on the first SYS_HEAPINFO call. */ - ts->heap_limit = 0; -#endif - - if (gdbstub_port) { - if (gdbserver_start(gdbstub_port) < 0) { - fprintf(stderr, "qemu: could not open gdbserver on port %d\n", - gdbstub_port); - exit(EXIT_FAILURE); - } - gdb_handlesig(cpu, 0); - } - cpu_loop(env); - /* never exits */ - return 0; -} diff --git a/qemu/linux-user/microblaze/syscall_nr.h b/qemu/linux-user/microblaze/syscall_nr.h deleted file mode 100644 index 0704449ba..000000000 --- a/qemu/linux-user/microblaze/syscall_nr.h +++ /dev/null @@ -1,392 +0,0 @@ -#define TARGET_NR_restart_syscall 0 /* ok */ -#define TARGET_NR_exit 1 /* ok */ -#define TARGET_NR_fork 2 /* not for no MMU - weird */ -#define TARGET_NR_read 3 /* ok */ -#define TARGET_NR_write 4 /* ok */ -#define TARGET_NR_open 5 /* openat */ -#define TARGET_NR_close 6 /* ok */ -#define TARGET_NR_waitpid 7 /* waitid */ -#define TARGET_NR_creat 8 /* openat */ -#define TARGET_NR_link 9 /* linkat */ -#define TARGET_NR_unlink 10 /* unlinkat */ -#define TARGET_NR_execve 11 /* ok */ -#define TARGET_NR_chdir 12 /* ok */ -#define TARGET_NR_time 13 /* obsolete -> sys_gettimeofday */ -#define TARGET_NR_mknod 14 /* mknodat */ -#define TARGET_NR_chmod 15 /* fchmodat */ -#define TARGET_NR_lchown 16 /* ok */ -#define TARGET_NR_break 17 /* don't know */ -#define TARGET_NR_oldstat 18 /* remove */ -#define TARGET_NR_lseek 19 /* ok */ -#define TARGET_NR_getpid 20 /* ok */ -#define TARGET_NR_mount 21 /* ok */ -#define TARGET_NR_umount 22 /* ok */ /* use only umount2 */ -#define TARGET_NR_setuid 23 /* ok */ -#define TARGET_NR_getuid 24 /* ok */ -#define TARGET_NR_stime 25 /* obsolete -> sys_settimeofday */ -#define TARGET_NR_ptrace 26 /* ok */ -#define TARGET_NR_alarm 27 /* obsolete -> sys_setitimer */ -#define TARGET_NR_oldfstat 28 /* remove */ -#define TARGET_NR_pause 29 /* obsolete -> sys_rt_sigtimedwait */ -#define TARGET_NR_utime 30 /* obsolete -> sys_utimesat */ -#define TARGET_NR_stty 31 /* remove */ -#define TARGET_NR_gtty 32 /* remove */ -#define TARGET_NR_access 33 /* faccessat */ -#define TARGET_NR_nice 34 /* can be implemented by sys_setpriority */ -#define TARGET_NR_ftime 35 /* remove */ -#define TARGET_NR_sync 36 /* ok */ -#define TARGET_NR_kill 37 /* ok */ -#define TARGET_NR_rename 38 /* renameat */ -#define TARGET_NR_mkdir 39 /* mkdirat */ -#define TARGET_NR_rmdir 40 /* unlinkat */ -#define TARGET_NR_dup 41 /* ok */ -#define TARGET_NR_pipe 42 /* ok */ -#define TARGET_NR_times 43 /* ok */ -#define TARGET_NR_prof 44 /* remove */ -#define TARGET_NR_brk 45 /* ok -mmu, nommu specific */ -#define TARGET_NR_setgid 46 /* ok */ -#define TARGET_NR_getgid 47 /* ok */ -#define TARGET_NR_signal 48 /* obsolete -> sys_rt_sigaction */ -#define TARGET_NR_geteuid 49 /* ok */ -#define TARGET_NR_getegid 50 /* ok */ -#define TARGET_NR_acct 51 /* add it and then I can disable it */ -#define TARGET_NR_umount2 52 /* remove */ -#define TARGET_NR_lock 53 /* remove */ -#define TARGET_NR_ioctl 54 /* ok */ -#define TARGET_NR_fcntl 55 /* ok -> 64bit version*/ -#define TARGET_NR_mpx 56 /* remove */ -#define TARGET_NR_setpgid 57 /* ok */ -#define TARGET_NR_ulimit 58 /* remove */ -#define TARGET_NR_oldolduname 59 /* remove */ -#define TARGET_NR_umask 60 /* ok */ -#define TARGET_NR_chroot 61 /* ok */ -#define TARGET_NR_ustat 62 /* obsolete -> statfs64 */ -#define TARGET_NR_dup2 63 /* ok */ -#define TARGET_NR_getppid 64 /* ok */ -#define TARGET_NR_getpgrp 65 /* obsolete -> sys_getpgid */ -#define TARGET_NR_setsid 66 /* ok */ -#define TARGET_NR_sigaction 67 /* obsolete -> rt_sigaction */ -#define TARGET_NR_sgetmask 68 /* obsolete -> sys_rt_sigprocmask */ -#define TARGET_NR_ssetmask 69 /* obsolete ->sys_rt_sigprocmask */ -#define TARGET_NR_setreuid 70 /* ok */ -#define TARGET_NR_setregid 71 /* ok */ -#define TARGET_NR_sigsuspend 72 /* obsolete -> rt_sigsuspend */ -#define TARGET_NR_sigpending 73 /* obsolete -> sys_rt_sigpending */ -#define TARGET_NR_sethostname 74 /* ok */ -#define TARGET_NR_setrlimit 75 /* ok */ -#define TARGET_NR_getrlimit 76 /* ok Back compatible 2Gig limited rlimit */ -#define TARGET_NR_getrusage 77 /* ok */ -#define TARGET_NR_gettimeofday 78 /* ok */ -#define TARGET_NR_settimeofday 79 /* ok */ -#define TARGET_NR_getgroups 80 /* ok */ -#define TARGET_NR_setgroups 81 /* ok */ -#define TARGET_NR_select 82 /* obsolete -> sys_pselect7 */ -#define TARGET_NR_symlink 83 /* symlinkat */ -#define TARGET_NR_oldlstat 84 /* remove */ -#define TARGET_NR_readlink 85 /* obsolete -> sys_readlinkat */ -#define TARGET_NR_uselib 86 /* remove */ -#define TARGET_NR_swapon 87 /* ok */ -#define TARGET_NR_reboot 88 /* ok */ -#define TARGET_NR_readdir 89 /* remove ? */ -#define TARGET_NR_mmap 90 /* obsolete -> sys_mmap2 */ -#define TARGET_NR_munmap 91 /* ok - mmu and nommu */ -#define TARGET_NR_truncate 92 /* ok or truncate64 */ -#define TARGET_NR_ftruncate 93 /* ok or ftruncate64 */ -#define TARGET_NR_fchmod 94 /* ok */ -#define TARGET_NR_fchown 95 /* ok */ -#define TARGET_NR_getpriority 96 /* ok */ -#define TARGET_NR_setpriority 97 /* ok */ -#define TARGET_NR_profil 98 /* remove */ -#define TARGET_NR_statfs 99 /* ok or statfs64 */ -#define TARGET_NR_fstatfs 100 /* ok or fstatfs64 */ -#define TARGET_NR_ioperm 101 /* remove */ -#define TARGET_NR_socketcall 102 /* remove */ -#define TARGET_NR_syslog 103 /* ok */ -#define TARGET_NR_setitimer 104 /* ok */ -#define TARGET_NR_getitimer 105 /* ok */ -#define TARGET_NR_stat 106 /* remove */ -#define TARGET_NR_lstat 107 /* remove */ -#define TARGET_NR_fstat 108 /* remove */ -#define TARGET_NR_olduname 109 /* remove */ -#define TARGET_NR_iopl 110 /* remove */ -#define TARGET_NR_vhangup 111 /* ok */ -#define TARGET_NR_idle 112 /* remove */ -#define TARGET_NR_vm86old 113 /* remove */ -#define TARGET_NR_wait4 114 /* obsolete -> waitid */ -#define TARGET_NR_swapoff 115 /* ok */ -#define TARGET_NR_sysinfo 116 /* ok */ -#define TARGET_NR_ipc 117 /* remove - direct call */ -#define TARGET_NR_fsync 118 /* ok */ -#define TARGET_NR_sigreturn 119 /* obsolete -> sys_rt_sigreturn */ -#define TARGET_NR_clone 120 /* ok */ -#define TARGET_NR_setdomainname 121 /* ok */ -#define TARGET_NR_uname 122 /* remove */ -#define TARGET_NR_modify_ldt 123 /* remove */ -#define TARGET_NR_adjtimex 124 /* ok */ -#define TARGET_NR_mprotect 125 /* remove */ -#define TARGET_NR_sigprocmask 126 /* obsolete -> sys_rt_sigprocmask */ -#define TARGET_NR_create_module 127 /* remove */ -#define TARGET_NR_init_module 128 /* ok */ -#define TARGET_NR_delete_module 129 /* ok */ -#define TARGET_NR_get_kernel_syms 130 /* remove */ -#define TARGET_NR_quotactl 131 /* ok */ -#define TARGET_NR_getpgid 132 /* ok */ -#define TARGET_NR_fchdir 133 /* ok */ -#define TARGET_NR_bdflush 134 /* remove */ -#define TARGET_NR_sysfs 135 /* needed for busybox */ -#define TARGET_NR_personality 136 /* ok */ -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 /* ok */ -#define TARGET_NR_setfsgid 139 /* ok */ -#define TARGET_NR__llseek 140 /* remove only lseek */ -#define TARGET_NR_getdents 141 /* ok or getdents64 */ -#define TARGET_NR__newselect 142 /* remove */ -#define TARGET_NR_flock 143 /* ok */ -#define TARGET_NR_msync 144 /* remove */ -#define TARGET_NR_readv 145 /* ok */ -#define TARGET_NR_writev 146 /* ok */ -#define TARGET_NR_getsid 147 /* ok */ -#define TARGET_NR_fdatasync 148 /* ok */ -#define TARGET_NR__sysctl 149 /* remove */ -#define TARGET_NR_mlock 150 /* ok - nommu or mmu */ -#define TARGET_NR_munlock 151 /* ok - nommu or mmu */ -#define TARGET_NR_mlockall 152 /* ok - nommu or mmu */ -#define TARGET_NR_munlockall 153 /* ok - nommu or mmu */ -#define TARGET_NR_sched_setparam 154 /* ok */ -#define TARGET_NR_sched_getparam 155 /* ok */ -#define TARGET_NR_sched_setscheduler 156 /* ok */ -#define TARGET_NR_sched_getscheduler 157 /* ok */ -#define TARGET_NR_sched_yield 158 /* ok */ -#define TARGET_NR_sched_get_priority_max 159 /* ok */ -#define TARGET_NR_sched_get_priority_min 160 /* ok */ -#define TARGET_NR_sched_rr_get_interval 161 /* ok */ -#define TARGET_NR_nanosleep 162 /* ok */ -#define TARGET_NR_mremap 163 /* ok - nommu or mmu */ -#define TARGET_NR_setresuid 164 /* ok */ -#define TARGET_NR_getresuid 165 /* ok */ -#define TARGET_NR_vm86 166 /* remove */ -#define TARGET_NR_query_module 167 /* ok */ -#define TARGET_NR_poll 168 /* obsolete -> sys_ppoll */ -#define TARGET_NR_nfsservctl 169 /* ok */ -#define TARGET_NR_setresgid 170 /* ok */ -#define TARGET_NR_getresgid 171 /* ok */ -#define TARGET_NR_prctl 172 /* ok */ -#define TARGET_NR_rt_sigreturn 173 /* ok */ -#define TARGET_NR_rt_sigaction 174 /* ok */ -#define TARGET_NR_rt_sigprocmask 175 /* ok */ -#define TARGET_NR_rt_sigpending 176 /* ok */ -#define TARGET_NR_rt_sigtimedwait 177 /* ok */ -#define TARGET_NR_rt_sigqueueinfo 178 /* ok */ -#define TARGET_NR_rt_sigsuspend 179 /* ok */ -#define TARGET_NR_pread64 180 /* ok */ -#define TARGET_NR_pwrite64 181 /* ok */ -#define TARGET_NR_chown 182 /* obsolete -> fchownat */ -#define TARGET_NR_getcwd 183 /* ok */ -#define TARGET_NR_capget 184 /* ok */ -#define TARGET_NR_capset 185 /* ok */ -#define TARGET_NR_sigaltstack 186 /* remove */ -#define TARGET_NR_sendfile 187 /* ok -> exist 64bit version*/ -#define TARGET_NR_getpmsg 188 /* remove - some people actually want streams */ -#define TARGET_NR_putpmsg 189 /* remove - some people actually want streams */ -#define TARGET_NR_vfork 190 /* for noMMU - group with clone -> maybe remove */ -#define TARGET_NR_ugetrlimit 191 /* remove - SuS compliant getrlimit */ -#define TARGET_NR_mmap2 192 /* ok */ -#define TARGET_NR_truncate64 193 /* ok */ -#define TARGET_NR_ftruncate64 194 /* ok */ -#define TARGET_NR_stat64 195 /* remove _ARCH_WANT_STAT64 */ -#define TARGET_NR_lstat64 196 /* remove _ARCH_WANT_STAT64 */ -#define TARGET_NR_fstat64 197 /* remove _ARCH_WANT_STAT64 */ -#define TARGET_NR_lchown32 198 /* ok - without 32 */ -#define TARGET_NR_getuid32 199 /* ok - without 32 */ -#define TARGET_NR_getgid32 200 /* ok - without 32 */ -#define TARGET_NR_geteuid32 201 /* ok - without 32 */ -#define TARGET_NR_getegid32 202 /* ok - without 32 */ -#define TARGET_NR_setreuid32 203 /* ok - without 32 */ -#define TARGET_NR_setregid32 204 /* ok - without 32 */ -#define TARGET_NR_getgroups32 205 /* ok - without 32 */ -#define TARGET_NR_setgroups32 206 /* ok - without 32 */ -#define TARGET_NR_fchown32 207 /* ok - without 32 */ -#define TARGET_NR_setresuid32 208 /* ok - without 32 */ -#define TARGET_NR_getresuid32 209 /* ok - without 32 */ -#define TARGET_NR_setresgid32 210 /* ok - without 32 */ -#define TARGET_NR_getresgid32 211 /* ok - without 32 */ -#define TARGET_NR_chown32 212 /* ok - without 32 -obsolete -> fchownat */ -#define TARGET_NR_setuid32 213 /* ok - without 32 */ -#define TARGET_NR_setgid32 214 /* ok - without 32 */ -#define TARGET_NR_setfsuid32 215 /* ok - without 32 */ -#define TARGET_NR_setfsgid32 216 /* ok - without 32 */ -#define TARGET_NR_pivot_root 217 /* ok */ -#define TARGET_NR_mincore 218 /* ok */ -#define TARGET_NR_madvise 219 /* ok */ -//#define TARGET_NR_madvise1 219 /* remove delete when C lib stub is removed */ -#define TARGET_NR_getdents64 220 /* ok */ -#define TARGET_NR_fcntl64 221 /* ok */ -/* 223 is unused */ -#define TARGET_NR_gettid 224 /* ok */ -#define TARGET_NR_readahead 225 /* ok */ -#define TARGET_NR_setxattr 226 /* ok */ -#define TARGET_NR_lsetxattr 227 /* ok */ -#define TARGET_NR_fsetxattr 228 /* ok */ -#define TARGET_NR_getxattr 229 /* ok */ -#define TARGET_NR_lgetxattr 230 /* ok */ -#define TARGET_NR_fgetxattr 231 /* ok */ -#define TARGET_NR_listxattr 232 /* ok */ -#define TARGET_NR_llistxattr 233 /* ok */ -#define TARGET_NR_flistxattr 234 /* ok */ -#define TARGET_NR_removexattr 235 /* ok */ -#define TARGET_NR_lremovexattr 236 /* ok */ -#define TARGET_NR_fremovexattr 237 /* ok */ -#define TARGET_NR_tkill 238 /* ok */ -#define TARGET_NR_sendfile64 239 /* ok */ -#define TARGET_NR_futex 240 /* ok */ -#define TARGET_NR_sched_setaffinity 241 /* ok */ -#define TARGET_NR_sched_getaffinity 242 /* ok */ -#define TARGET_NR_set_thread_area 243 /* remove */ -#define TARGET_NR_get_thread_area 244 /* remove */ -#define TARGET_NR_io_setup 245 /* ok */ -#define TARGET_NR_io_destroy 246 /* ok */ -#define TARGET_NR_io_getevents 247 /* ok */ -#define TARGET_NR_io_submit 248 /* ok */ -#define TARGET_NR_io_cancel 249 /* ok */ -#define TARGET_NR_fadvise64 250 /* remove -> sys_fadvise64_64 */ -/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */ -#define TARGET_NR_exit_group 252 /* ok */ -#define TARGET_NR_lookup_dcookie 253 /* ok */ -#define TARGET_NR_epoll_create 254 /* ok */ -#define TARGET_NR_epoll_ctl 255 /* ok */ -#define TARGET_NR_epoll_wait 256 /* obsolete -> sys_epoll_pwait */ -#define TARGET_NR_remap_file_pages 257 /* only for mmu */ -#define TARGET_NR_set_tid_address 258 /* ok */ -#define TARGET_NR_timer_create 259 /* ok */ -#define TARGET_NR_timer_settime (TARGET_NR_timer_create+1) /* 260 */ /* ok */ -#define TARGET_NR_timer_gettime (TARGET_NR_timer_create+2) /* 261 */ /* ok */ -#define TARGET_NR_timer_getoverrun (TARGET_NR_timer_create+3) /* 262 */ /* ok */ -#define TARGET_NR_timer_delete (TARGET_NR_timer_create+4) /* 263 */ /* ok */ -#define TARGET_NR_clock_settime (TARGET_NR_timer_create+5) /* 264 */ /* ok */ -#define TARGET_NR_clock_gettime (TARGET_NR_timer_create+6) /* 265 */ /* ok */ -#define TARGET_NR_clock_getres (TARGET_NR_timer_create+7) /* 266 */ /* ok */ -#define TARGET_NR_clock_nanosleep (TARGET_NR_timer_create+8) /* 267 */ /* ok */ -#define TARGET_NR_statfs64 268 /* ok */ -#define TARGET_NR_fstatfs64 269 /* ok */ -#define TARGET_NR_tgkill 270 /* ok */ -#define TARGET_NR_utimes 271 /* obsolete -> sys_futimesat */ -#define TARGET_NR_fadvise64_64 272 /* ok */ -#define TARGET_NR_vserver 273 /* ok */ -#define TARGET_NR_mbind 274 /* only for mmu */ -#define TARGET_NR_get_mempolicy 275 /* only for mmu */ -#define TARGET_NR_set_mempolicy 276 /* only for mmu */ -#define TARGET_NR_mq_open 277 /* ok */ -#define TARGET_NR_mq_unlink (TARGET_NR_mq_open+1) /* 278 */ /* ok */ -#define TARGET_NR_mq_timedsend (TARGET_NR_mq_open+2) /* 279 */ /* ok */ -#define TARGET_NR_mq_timedreceive (TARGET_NR_mq_open+3) /* 280 */ /* ok */ -#define TARGET_NR_mq_notify (TARGET_NR_mq_open+4) /* 281 */ /* ok */ -#define TARGET_NR_mq_getsetattr (TARGET_NR_mq_open+5) /* 282 */ /* ok */ -#define TARGET_NR_kexec_load 283 /* ok */ -#define TARGET_NR_waitid 284 /* ok */ -/* #define TARGET_NR_sys_setaltroot 285 */ -#define TARGET_NR_add_key 286 /* ok */ -#define TARGET_NR_request_key 287 /* ok */ -#define TARGET_NR_keyctl 288 /* ok */ -#define TARGET_NR_ioprio_set 289 /* ok */ -#define TARGET_NR_ioprio_get 290 /* ok */ -#define TARGET_NR_inotify_init 291 /* ok */ -#define TARGET_NR_inotify_add_watch 292 /* ok */ -#define TARGET_NR_inotify_rm_watch 293 /* ok */ -#define TARGET_NR_migrate_pages 294 /* mmu */ -#define TARGET_NR_openat 295 /* ok */ -#define TARGET_NR_mkdirat 296 /* ok */ -#define TARGET_NR_mknodat 297 /* ok */ -#define TARGET_NR_fchownat 298 /* ok */ -#define TARGET_NR_futimesat 299 /* obsolete -> sys_utimesat */ -#define TARGET_NR_fstatat64 300 /* stat64 */ -#define TARGET_NR_unlinkat 301 /* ok */ -#define TARGET_NR_renameat 302 /* ok */ -#define TARGET_NR_linkat 303 /* ok */ -#define TARGET_NR_symlinkat 304 /* ok */ -#define TARGET_NR_readlinkat 305 /* ok */ -#define TARGET_NR_fchmodat 306 /* ok */ -#define TARGET_NR_faccessat 307 /* ok */ -#define TARGET_NR_pselect6 308 /* obsolete -> sys_pselect7 */ -#define TARGET_NR_ppoll 309 /* ok */ -#define TARGET_NR_unshare 310 /* ok */ -#define TARGET_NR_set_robust_list 311 /* ok */ -#define TARGET_NR_get_robust_list 312 /* ok */ -#define TARGET_NR_splice 313 /* ok */ -#define TARGET_NR_sync_file_range 314 /* ok */ -#define TARGET_NR_tee 315 /* ok */ -#define TARGET_NR_vmsplice 316 /* ok */ -#define TARGET_NR_move_pages 317 /* mmu */ -#define TARGET_NR_getcpu 318 /* ok */ -#define TARGET_NR_epoll_pwait 319 /* ok */ -#define TARGET_NR_utimensat 320 /* ok */ -#define TARGET_NR_signalfd 321 /* ok */ -#define TARGET_NR_timerfd_create 322 /* ok */ -#define TARGET_NR_eventfd 323 /* ok */ -#define TARGET_NR_fallocate 324 /* ok */ -#define TARGET_NR_semtimedop 325 /* ok - semaphore group */ -#define TARGET_NR_timerfd_settime 326 /* ok */ -#define TARGET_NR_timerfd_gettime 327 /* ok */ -/* sysv ipc syscalls */ -#define TARGET_NR_semctl 328 /* ok */ -#define TARGET_NR_semget 329 /* ok */ -#define TARGET_NR_semop 330 /* ok */ -#define TARGET_NR_msgctl 331 /* ok */ -#define TARGET_NR_msgget 332 /* ok */ -#define TARGET_NR_msgrcv 333 /* ok */ -#define TARGET_NR_msgsnd 334 /* ok */ -#define TARGET_NR_shmat 335 /* ok */ -#define TARGET_NR_shmctl 336 /* ok */ -#define TARGET_NR_shmdt 337 /* ok */ -#define TARGET_NR_shmget 338 /* ok */ - - -#define TARGET_NR_signalfd4 339 /* new */ -#define TARGET_NR_eventfd2 340 /* new */ -#define TARGET_NR_epoll_create1 341 /* new */ -#define TARGET_NR_dup3 342 /* new */ -#define TARGET_NR_pipe2 343 /* new */ -#define TARGET_NR_inotify_init1 344 /* new */ -#define TARGET_NR_socket 345 /* new */ -#define TARGET_NR_socketpair 346 /* new */ -#define TARGET_NR_bind 347 /* new */ -#define TARGET_NR_listen 348 /* new */ -#define TARGET_NR_accept 349 /* new */ -#define TARGET_NR_connect 350 /* new */ -#define TARGET_NR_getsockname 351 /* new */ -#define TARGET_NR_getpeername 352 /* new */ -#define TARGET_NR_sendto 353 /* new */ -#define TARGET_NR_send 354 /* new */ -#define TARGET_NR_recvfrom 355 /* new */ -#define TARGET_NR_recv 356 /* new */ -#define TARGET_NR_setsockopt 357 /* new */ -#define TARGET_NR_getsockopt 358 /* new */ -#define TARGET_NR_shutdown 359 /* new */ -#define TARGET_NR_sendmsg 360 /* new */ -#define TARGET_NR_recvmsg 361 /* new */ -#define TARGET_NR_accept04 362 /* new */ -#define TARGET_NR_preadv 363 /* new */ -#define TARGET_NR_pwritev 364 /* new */ -#define TARGET_NR_rt_tgsigqueueinfo 365 /* new */ -#define TARGET_NR_perf_event_open 366 /* new */ -#define TARGET_NR_recvmmsg 367 /* new */ -#define TARGET_NR_fanotify_init 368 -#define TARGET_NR_fanotify_mark 369 -#define TARGET_NR_prlimit64 370 -#define TARGET_NR_name_to_handle_at 371 -#define TARGET_NR_open_by_handle_at 372 -#define TARGET_NR_clock_adjtime 373 -#define TARGET_NR_syncfs 374 -#define TARGET_NR_setns 375 -#define TARGET_NR_sendmmsg 376 -#define TARGET_NR_process_vm_readv 377 -#define TARGET_NR_process_vm_writev 378 -#define TARGET_NR_kcmp 379 -#define TARGET_NR_finit_module 380 -#define TARGET_NR_sched_setattr 381 -#define TARGET_NR_sched_getattr 382 -#define TARGET_NR_renameat2 383 -#define TARGET_NR_seccomp 384 -#define TARGET_NR_getrandom 385 -#define TARGET_NR_memfd_create 386 -#define TARGET_NR_bpf 387 -#define TARGET_NR_execveat 388 diff --git a/qemu/linux-user/microblaze/target_cpu.h b/qemu/linux-user/microblaze/target_cpu.h deleted file mode 100644 index c6386ea9e..000000000 --- a/qemu/linux-user/microblaze/target_cpu.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * MicroBlaze specific CPU ABI and functions for linux-user - * - * Copyright (c) 2009 Edgar E. Iglesias - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUMBState *env, target_ulong newsp) -{ - if (newsp) { - env->regs[R_SP] = newsp; - } - env->regs[3] = 0; -} - -static inline void cpu_set_tls(CPUMBState *env, target_ulong newtls) -{ - env->regs[21] = newtls; -} - -#endif diff --git a/qemu/linux-user/microblaze/target_signal.h b/qemu/linux-user/microblaze/target_signal.h deleted file mode 100644 index 3d1f7a723..000000000 --- a/qemu/linux-user/microblaze/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_ulong ss_size; - abi_long ss_flags; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUMBState *state) -{ - return state->regs[14]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/microblaze/target_structs.h b/qemu/linux-user/microblaze/target_structs.h deleted file mode 100644 index 325e2f6d4..000000000 --- a/qemu/linux-user/microblaze/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * MicroBlaze specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/microblaze/target_syscall.h b/qemu/linux-user/microblaze/target_syscall.h deleted file mode 100644 index 3c1ed27c0..000000000 --- a/qemu/linux-user/microblaze/target_syscall.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef MICROBLAZE_SYSCALLS_H -#define MICROBLAZE_SYSCALLS_H 1 - -#define UNAME_MACHINE "microblaze" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -/* We use microblaze_reg_t to keep things similar to the kernel sources. */ -typedef uint32_t microblaze_reg_t; - -struct target_pt_regs { - microblaze_reg_t r0; - microblaze_reg_t r1; - microblaze_reg_t r2; - microblaze_reg_t r3; - microblaze_reg_t r4; - microblaze_reg_t r5; - microblaze_reg_t r6; - microblaze_reg_t r7; - microblaze_reg_t r8; - microblaze_reg_t r9; - microblaze_reg_t r10; - microblaze_reg_t r11; - microblaze_reg_t r12; - microblaze_reg_t r13; - microblaze_reg_t r14; - microblaze_reg_t r15; - microblaze_reg_t r16; - microblaze_reg_t r17; - microblaze_reg_t r18; - microblaze_reg_t r19; - microblaze_reg_t r20; - microblaze_reg_t r21; - microblaze_reg_t r22; - microblaze_reg_t r23; - microblaze_reg_t r24; - microblaze_reg_t r25; - microblaze_reg_t r26; - microblaze_reg_t r27; - microblaze_reg_t r28; - microblaze_reg_t r29; - microblaze_reg_t r30; - microblaze_reg_t r31; - microblaze_reg_t pc; - microblaze_reg_t msr; - microblaze_reg_t ear; - microblaze_reg_t esr; - microblaze_reg_t fsr; - uint32_t kernel_mode; -}; - -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif diff --git a/qemu/linux-user/microblaze/termbits.h b/qemu/linux-user/microblaze/termbits.h deleted file mode 100644 index fc82ca084..000000000 --- a/qemu/linux-user/microblaze/termbits.h +++ /dev/null @@ -1,213 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* ioctls */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/mips/syscall_nr.h b/qemu/linux-user/mips/syscall_nr.h deleted file mode 100644 index 6819f865e..000000000 --- a/qemu/linux-user/mips/syscall_nr.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Linux o32 style syscalls are in the range from 4000 to 4999. - */ -#define TARGET_NR_Linux 4000 -#define TARGET_NR_syscall (TARGET_NR_Linux + 0) -#define TARGET_NR_exit (TARGET_NR_Linux + 1) -#define TARGET_NR_fork (TARGET_NR_Linux + 2) -#define TARGET_NR_read (TARGET_NR_Linux + 3) -#define TARGET_NR_write (TARGET_NR_Linux + 4) -#define TARGET_NR_open (TARGET_NR_Linux + 5) -#define TARGET_NR_close (TARGET_NR_Linux + 6) -#define TARGET_NR_waitpid (TARGET_NR_Linux + 7) -#define TARGET_NR_creat (TARGET_NR_Linux + 8) -#define TARGET_NR_link (TARGET_NR_Linux + 9) -#define TARGET_NR_unlink (TARGET_NR_Linux + 10) -#define TARGET_NR_execve (TARGET_NR_Linux + 11) -#define TARGET_NR_chdir (TARGET_NR_Linux + 12) -#define TARGET_NR_time (TARGET_NR_Linux + 13) -#define TARGET_NR_mknod (TARGET_NR_Linux + 14) -#define TARGET_NR_chmod (TARGET_NR_Linux + 15) -#define TARGET_NR_lchown (TARGET_NR_Linux + 16) -#define TARGET_NR_break (TARGET_NR_Linux + 17) -#define TARGET_NR_unused18 (TARGET_NR_Linux + 18) -#define TARGET_NR_lseek (TARGET_NR_Linux + 19) -#define TARGET_NR_getpid (TARGET_NR_Linux + 20) -#define TARGET_NR_mount (TARGET_NR_Linux + 21) -#define TARGET_NR_umount (TARGET_NR_Linux + 22) -#define TARGET_NR_setuid (TARGET_NR_Linux + 23) -#define TARGET_NR_getuid (TARGET_NR_Linux + 24) -#define TARGET_NR_stime (TARGET_NR_Linux + 25) -#define TARGET_NR_ptrace (TARGET_NR_Linux + 26) -#define TARGET_NR_alarm (TARGET_NR_Linux + 27) -#define TARGET_NR_unused28 (TARGET_NR_Linux + 28) -#define TARGET_NR_pause (TARGET_NR_Linux + 29) -#define TARGET_NR_utime (TARGET_NR_Linux + 30) -#define TARGET_NR_stty (TARGET_NR_Linux + 31) -#define TARGET_NR_gtty (TARGET_NR_Linux + 32) -#define TARGET_NR_access (TARGET_NR_Linux + 33) -#define TARGET_NR_nice (TARGET_NR_Linux + 34) -#define TARGET_NR_ftime (TARGET_NR_Linux + 35) -#define TARGET_NR_sync (TARGET_NR_Linux + 36) -#define TARGET_NR_kill (TARGET_NR_Linux + 37) -#define TARGET_NR_rename (TARGET_NR_Linux + 38) -#define TARGET_NR_mkdir (TARGET_NR_Linux + 39) -#define TARGET_NR_rmdir (TARGET_NR_Linux + 40) -#define TARGET_NR_dup (TARGET_NR_Linux + 41) -#define TARGET_NR_pipe (TARGET_NR_Linux + 42) -#define TARGET_NR_times (TARGET_NR_Linux + 43) -#define TARGET_NR_prof (TARGET_NR_Linux + 44) -#define TARGET_NR_brk (TARGET_NR_Linux + 45) -#define TARGET_NR_setgid (TARGET_NR_Linux + 46) -#define TARGET_NR_getgid (TARGET_NR_Linux + 47) -#define TARGET_NR_signal (TARGET_NR_Linux + 48) -#define TARGET_NR_geteuid (TARGET_NR_Linux + 49) -#define TARGET_NR_getegid (TARGET_NR_Linux + 50) -#define TARGET_NR_acct (TARGET_NR_Linux + 51) -#define TARGET_NR_umount2 (TARGET_NR_Linux + 52) -#define TARGET_NR_lock (TARGET_NR_Linux + 53) -#define TARGET_NR_ioctl (TARGET_NR_Linux + 54) -#define TARGET_NR_fcntl (TARGET_NR_Linux + 55) -#define TARGET_NR_mpx (TARGET_NR_Linux + 56) -#define TARGET_NR_setpgid (TARGET_NR_Linux + 57) -#define TARGET_NR_ulimit (TARGET_NR_Linux + 58) -#define TARGET_NR_unused59 (TARGET_NR_Linux + 59) -#define TARGET_NR_umask (TARGET_NR_Linux + 60) -#define TARGET_NR_chroot (TARGET_NR_Linux + 61) -#define TARGET_NR_ustat (TARGET_NR_Linux + 62) -#define TARGET_NR_dup2 (TARGET_NR_Linux + 63) -#define TARGET_NR_getppid (TARGET_NR_Linux + 64) -#define TARGET_NR_getpgrp (TARGET_NR_Linux + 65) -#define TARGET_NR_setsid (TARGET_NR_Linux + 66) -#define TARGET_NR_sigaction (TARGET_NR_Linux + 67) -#define TARGET_NR_sgetmask (TARGET_NR_Linux + 68) -#define TARGET_NR_ssetmask (TARGET_NR_Linux + 69) -#define TARGET_NR_setreuid (TARGET_NR_Linux + 70) -#define TARGET_NR_setregid (TARGET_NR_Linux + 71) -#define TARGET_NR_sigsuspend (TARGET_NR_Linux + 72) -#define TARGET_NR_sigpending (TARGET_NR_Linux + 73) -#define TARGET_NR_sethostname (TARGET_NR_Linux + 74) -#define TARGET_NR_setrlimit (TARGET_NR_Linux + 75) -#define TARGET_NR_getrlimit (TARGET_NR_Linux + 76) -#define TARGET_NR_getrusage (TARGET_NR_Linux + 77) -#define TARGET_NR_gettimeofday (TARGET_NR_Linux + 78) -#define TARGET_NR_settimeofday (TARGET_NR_Linux + 79) -#define TARGET_NR_getgroups (TARGET_NR_Linux + 80) -#define TARGET_NR_setgroups (TARGET_NR_Linux + 81) -#define TARGET_NR_reserved82 (TARGET_NR_Linux + 82) -#define TARGET_NR_symlink (TARGET_NR_Linux + 83) -#define TARGET_NR_unused84 (TARGET_NR_Linux + 84) -#define TARGET_NR_readlink (TARGET_NR_Linux + 85) -#define TARGET_NR_uselib (TARGET_NR_Linux + 86) -#define TARGET_NR_swapon (TARGET_NR_Linux + 87) -#define TARGET_NR_reboot (TARGET_NR_Linux + 88) -#define TARGET_NR_readdir (TARGET_NR_Linux + 89) -#define TARGET_NR_mmap (TARGET_NR_Linux + 90) -#define TARGET_NR_munmap (TARGET_NR_Linux + 91) -#define TARGET_NR_truncate (TARGET_NR_Linux + 92) -#define TARGET_NR_ftruncate (TARGET_NR_Linux + 93) -#define TARGET_NR_fchmod (TARGET_NR_Linux + 94) -#define TARGET_NR_fchown (TARGET_NR_Linux + 95) -#define TARGET_NR_getpriority (TARGET_NR_Linux + 96) -#define TARGET_NR_setpriority (TARGET_NR_Linux + 97) -#define TARGET_NR_profil (TARGET_NR_Linux + 98) -#define TARGET_NR_statfs (TARGET_NR_Linux + 99) -#define TARGET_NR_fstatfs (TARGET_NR_Linux + 100) -#define TARGET_NR_ioperm (TARGET_NR_Linux + 101) -#define TARGET_NR_socketcall (TARGET_NR_Linux + 102) -#define TARGET_NR_syslog (TARGET_NR_Linux + 103) -#define TARGET_NR_setitimer (TARGET_NR_Linux + 104) -#define TARGET_NR_getitimer (TARGET_NR_Linux + 105) -#define TARGET_NR_stat (TARGET_NR_Linux + 106) -#define TARGET_NR_lstat (TARGET_NR_Linux + 107) -#define TARGET_NR_fstat (TARGET_NR_Linux + 108) -#define TARGET_NR_unused109 (TARGET_NR_Linux + 109) -#define TARGET_NR_iopl (TARGET_NR_Linux + 110) -#define TARGET_NR_vhangup (TARGET_NR_Linux + 111) -#define TARGET_NR_idle (TARGET_NR_Linux + 112) -#define TARGET_NR_vm86 (TARGET_NR_Linux + 113) -#define TARGET_NR_wait4 (TARGET_NR_Linux + 114) -#define TARGET_NR_swapoff (TARGET_NR_Linux + 115) -#define TARGET_NR_sysinfo (TARGET_NR_Linux + 116) -#define TARGET_NR_ipc (TARGET_NR_Linux + 117) -#define TARGET_NR_fsync (TARGET_NR_Linux + 118) -#define TARGET_NR_sigreturn (TARGET_NR_Linux + 119) -#define TARGET_NR_clone (TARGET_NR_Linux + 120) -#define TARGET_NR_setdomainname (TARGET_NR_Linux + 121) -#define TARGET_NR_uname (TARGET_NR_Linux + 122) -#define TARGET_NR_modify_ldt (TARGET_NR_Linux + 123) -#define TARGET_NR_adjtimex (TARGET_NR_Linux + 124) -#define TARGET_NR_mprotect (TARGET_NR_Linux + 125) -#define TARGET_NR_sigprocmask (TARGET_NR_Linux + 126) -#define TARGET_NR_create_module (TARGET_NR_Linux + 127) -#define TARGET_NR_init_module (TARGET_NR_Linux + 128) -#define TARGET_NR_delete_module (TARGET_NR_Linux + 129) -#define TARGET_NR_get_kernel_syms (TARGET_NR_Linux + 130) -#define TARGET_NR_quotactl (TARGET_NR_Linux + 131) -#define TARGET_NR_getpgid (TARGET_NR_Linux + 132) -#define TARGET_NR_fchdir (TARGET_NR_Linux + 133) -#define TARGET_NR_bdflush (TARGET_NR_Linux + 134) -#define TARGET_NR_sysfs (TARGET_NR_Linux + 135) -#define TARGET_NR_personality (TARGET_NR_Linux + 136) -#define TARGET_NR_afs_syscall (TARGET_NR_Linux + 137) /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid (TARGET_NR_Linux + 138) -#define TARGET_NR_setfsgid (TARGET_NR_Linux + 139) -#define TARGET_NR__llseek (TARGET_NR_Linux + 140) -#define TARGET_NR_getdents (TARGET_NR_Linux + 141) -#define TARGET_NR__newselect (TARGET_NR_Linux + 142) -#define TARGET_NR_flock (TARGET_NR_Linux + 143) -#define TARGET_NR_msync (TARGET_NR_Linux + 144) -#define TARGET_NR_readv (TARGET_NR_Linux + 145) -#define TARGET_NR_writev (TARGET_NR_Linux + 146) -#define TARGET_NR_cacheflush (TARGET_NR_Linux + 147) -#define TARGET_NR_cachectl (TARGET_NR_Linux + 148) -#define TARGET_NR_sysmips (TARGET_NR_Linux + 149) -#define TARGET_NR_unused150 (TARGET_NR_Linux + 150) -#define TARGET_NR_getsid (TARGET_NR_Linux + 151) -#define TARGET_NR_fdatasync (TARGET_NR_Linux + 152) -#define TARGET_NR__sysctl (TARGET_NR_Linux + 153) -#define TARGET_NR_mlock (TARGET_NR_Linux + 154) -#define TARGET_NR_munlock (TARGET_NR_Linux + 155) -#define TARGET_NR_mlockall (TARGET_NR_Linux + 156) -#define TARGET_NR_munlockall (TARGET_NR_Linux + 157) -#define TARGET_NR_sched_setparam (TARGET_NR_Linux + 158) -#define TARGET_NR_sched_getparam (TARGET_NR_Linux + 159) -#define TARGET_NR_sched_setscheduler (TARGET_NR_Linux + 160) -#define TARGET_NR_sched_getscheduler (TARGET_NR_Linux + 161) -#define TARGET_NR_sched_yield (TARGET_NR_Linux + 162) -#define TARGET_NR_sched_get_priority_max (TARGET_NR_Linux + 163) -#define TARGET_NR_sched_get_priority_min (TARGET_NR_Linux + 164) -#define TARGET_NR_sched_rr_get_interval (TARGET_NR_Linux + 165) -#define TARGET_NR_nanosleep (TARGET_NR_Linux + 166) -#define TARGET_NR_mremap (TARGET_NR_Linux + 167) -#define TARGET_NR_accept (TARGET_NR_Linux + 168) -#define TARGET_NR_bind (TARGET_NR_Linux + 169) -#define TARGET_NR_connect (TARGET_NR_Linux + 170) -#define TARGET_NR_getpeername (TARGET_NR_Linux + 171) -#define TARGET_NR_getsockname (TARGET_NR_Linux + 172) -#define TARGET_NR_getsockopt (TARGET_NR_Linux + 173) -#define TARGET_NR_listen (TARGET_NR_Linux + 174) -#define TARGET_NR_recv (TARGET_NR_Linux + 175) -#define TARGET_NR_recvfrom (TARGET_NR_Linux + 176) -#define TARGET_NR_recvmsg (TARGET_NR_Linux + 177) -#define TARGET_NR_send (TARGET_NR_Linux + 178) -#define TARGET_NR_sendmsg (TARGET_NR_Linux + 179) -#define TARGET_NR_sendto (TARGET_NR_Linux + 180) -#define TARGET_NR_setsockopt (TARGET_NR_Linux + 181) -#define TARGET_NR_shutdown (TARGET_NR_Linux + 182) -#define TARGET_NR_socket (TARGET_NR_Linux + 183) -#define TARGET_NR_socketpair (TARGET_NR_Linux + 184) -#define TARGET_NR_setresuid (TARGET_NR_Linux + 185) -#define TARGET_NR_getresuid (TARGET_NR_Linux + 186) -#define TARGET_NR_query_module (TARGET_NR_Linux + 187) -#define TARGET_NR_poll (TARGET_NR_Linux + 188) -#define TARGET_NR_nfsservctl (TARGET_NR_Linux + 189) -#define TARGET_NR_setresgid (TARGET_NR_Linux + 190) -#define TARGET_NR_getresgid (TARGET_NR_Linux + 191) -#define TARGET_NR_prctl (TARGET_NR_Linux + 192) -#define TARGET_NR_rt_sigreturn (TARGET_NR_Linux + 193) -#define TARGET_NR_rt_sigaction (TARGET_NR_Linux + 194) -#define TARGET_NR_rt_sigprocmask (TARGET_NR_Linux + 195) -#define TARGET_NR_rt_sigpending (TARGET_NR_Linux + 196) -#define TARGET_NR_rt_sigtimedwait (TARGET_NR_Linux + 197) -#define TARGET_NR_rt_sigqueueinfo (TARGET_NR_Linux + 198) -#define TARGET_NR_rt_sigsuspend (TARGET_NR_Linux + 199) -#define TARGET_NR_pread64 (TARGET_NR_Linux + 200) -#define TARGET_NR_pwrite64 (TARGET_NR_Linux + 201) -#define TARGET_NR_chown (TARGET_NR_Linux + 202) -#define TARGET_NR_getcwd (TARGET_NR_Linux + 203) -#define TARGET_NR_capget (TARGET_NR_Linux + 204) -#define TARGET_NR_capset (TARGET_NR_Linux + 205) -#define TARGET_NR_sigaltstack (TARGET_NR_Linux + 206) -#define TARGET_NR_sendfile (TARGET_NR_Linux + 207) -#define TARGET_NR_getpmsg (TARGET_NR_Linux + 208) -#define TARGET_NR_putpmsg (TARGET_NR_Linux + 209) -#define TARGET_NR_mmap2 (TARGET_NR_Linux + 210) -#define TARGET_NR_truncate64 (TARGET_NR_Linux + 211) -#define TARGET_NR_ftruncate64 (TARGET_NR_Linux + 212) -#define TARGET_NR_stat64 (TARGET_NR_Linux + 213) -#define TARGET_NR_lstat64 (TARGET_NR_Linux + 214) -#define TARGET_NR_fstat64 (TARGET_NR_Linux + 215) -#define TARGET_NR_pivot_root (TARGET_NR_Linux + 216) -#define TARGET_NR_mincore (TARGET_NR_Linux + 217) -#define TARGET_NR_madvise (TARGET_NR_Linux + 218) -#define TARGET_NR_getdents64 (TARGET_NR_Linux + 219) -#define TARGET_NR_fcntl64 (TARGET_NR_Linux + 220) -#define TARGET_NR_reserved221 (TARGET_NR_Linux + 221) -#define TARGET_NR_gettid (TARGET_NR_Linux + 222) -#define TARGET_NR_readahead (TARGET_NR_Linux + 223) -#define TARGET_NR_setxattr (TARGET_NR_Linux + 224) -#define TARGET_NR_lsetxattr (TARGET_NR_Linux + 225) -#define TARGET_NR_fsetxattr (TARGET_NR_Linux + 226) -#define TARGET_NR_getxattr (TARGET_NR_Linux + 227) -#define TARGET_NR_lgetxattr (TARGET_NR_Linux + 228) -#define TARGET_NR_fgetxattr (TARGET_NR_Linux + 229) -#define TARGET_NR_listxattr (TARGET_NR_Linux + 230) -#define TARGET_NR_llistxattr (TARGET_NR_Linux + 231) -#define TARGET_NR_flistxattr (TARGET_NR_Linux + 232) -#define TARGET_NR_removexattr (TARGET_NR_Linux + 233) -#define TARGET_NR_lremovexattr (TARGET_NR_Linux + 234) -#define TARGET_NR_fremovexattr (TARGET_NR_Linux + 235) -#define TARGET_NR_tkill (TARGET_NR_Linux + 236) -#define TARGET_NR_sendfile64 (TARGET_NR_Linux + 237) -#define TARGET_NR_futex (TARGET_NR_Linux + 238) -#define TARGET_NR_sched_setaffinity (TARGET_NR_Linux + 239) -#define TARGET_NR_sched_getaffinity (TARGET_NR_Linux + 240) -#define TARGET_NR_io_setup (TARGET_NR_Linux + 241) -#define TARGET_NR_io_destroy (TARGET_NR_Linux + 242) -#define TARGET_NR_io_getevents (TARGET_NR_Linux + 243) -#define TARGET_NR_io_submit (TARGET_NR_Linux + 244) -#define TARGET_NR_io_cancel (TARGET_NR_Linux + 245) -#define TARGET_NR_exit_group (TARGET_NR_Linux + 246) -#define TARGET_NR_lookup_dcookie (TARGET_NR_Linux + 247) -#define TARGET_NR_epoll_create (TARGET_NR_Linux + 248) -#define TARGET_NR_epoll_ctl (TARGET_NR_Linux + 249) -#define TARGET_NR_epoll_wait (TARGET_NR_Linux + 250) -#define TARGET_NR_remap_file_pages (TARGET_NR_Linux + 251) -#define TARGET_NR_set_tid_address (TARGET_NR_Linux + 252) -#define TARGET_NR_restart_syscall (TARGET_NR_Linux + 253) -#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 254) -#define TARGET_NR_statfs64 (TARGET_NR_Linux + 255) -#define TARGET_NR_fstatfs64 (TARGET_NR_Linux + 256) -#define TARGET_NR_timer_create (TARGET_NR_Linux + 257) -#define TARGET_NR_timer_settime (TARGET_NR_Linux + 258) -#define TARGET_NR_timer_gettime (TARGET_NR_Linux + 259) -#define TARGET_NR_timer_getoverrun (TARGET_NR_Linux + 260) -#define TARGET_NR_timer_delete (TARGET_NR_Linux + 261) -#define TARGET_NR_clock_settime (TARGET_NR_Linux + 262) -#define TARGET_NR_clock_gettime (TARGET_NR_Linux + 263) -#define TARGET_NR_clock_getres (TARGET_NR_Linux + 264) -#define TARGET_NR_clock_nanosleep (TARGET_NR_Linux + 265) -#define TARGET_NR_tgkill (TARGET_NR_Linux + 266) -#define TARGET_NR_utimes (TARGET_NR_Linux + 267) -#define TARGET_NR_mbind (TARGET_NR_Linux + 268) -#define TARGET_NR_get_mempolicy (TARGET_NR_Linux + 269) -#define TARGET_NR_set_mempolicy (TARGET_NR_Linux + 270) -#define TARGET_NR_mq_open (TARGET_NR_Linux + 271) -#define TARGET_NR_mq_unlink (TARGET_NR_Linux + 272) -#define TARGET_NR_mq_timedsend (TARGET_NR_Linux + 273) -#define TARGET_NR_mq_timedreceive (TARGET_NR_Linux + 274) -#define TARGET_NR_mq_notify (TARGET_NR_Linux + 275) -#define TARGET_NR_mq_getsetattr (TARGET_NR_Linux + 276) -#define TARGET_NR_vserver (TARGET_NR_Linux + 277) -#define TARGET_NR_waitid (TARGET_NR_Linux + 278) -/* #define TARGET_NR_sys_setaltroot (TARGET_NR_Linux + 279) */ -#define TARGET_NR_add_key (TARGET_NR_Linux + 280) -#define TARGET_NR_request_key (TARGET_NR_Linux + 281) -#define TARGET_NR_keyctl (TARGET_NR_Linux + 282) -#define TARGET_NR_set_thread_area (TARGET_NR_Linux + 283) -#define TARGET_NR_inotify_init (TARGET_NR_Linux + 284) -#define TARGET_NR_inotify_add_watch (TARGET_NR_Linux + 285) -#define TARGET_NR_inotify_rm_watch (TARGET_NR_Linux + 286) -#define TARGET_NR_migrate_pages (TARGET_NR_Linux + 287) -#define TARGET_NR_openat (TARGET_NR_Linux + 288) -#define TARGET_NR_mkdirat (TARGET_NR_Linux + 289) -#define TARGET_NR_mknodat (TARGET_NR_Linux + 290) -#define TARGET_NR_fchownat (TARGET_NR_Linux + 291) -#define TARGET_NR_futimesat (TARGET_NR_Linux + 292) -#define TARGET_NR_fstatat64 (TARGET_NR_Linux + 293) -#define TARGET_NR_unlinkat (TARGET_NR_Linux + 294) -#define TARGET_NR_renameat (TARGET_NR_Linux + 295) -#define TARGET_NR_linkat (TARGET_NR_Linux + 296) -#define TARGET_NR_symlinkat (TARGET_NR_Linux + 297) -#define TARGET_NR_readlinkat (TARGET_NR_Linux + 298) -#define TARGET_NR_fchmodat (TARGET_NR_Linux + 299) -#define TARGET_NR_faccessat (TARGET_NR_Linux + 300) -#define TARGET_NR_pselect6 (TARGET_NR_Linux + 301) -#define TARGET_NR_ppoll (TARGET_NR_Linux + 302) -#define TARGET_NR_unshare (TARGET_NR_Linux + 303) -#define TARGET_NR_splice (TARGET_NR_Linux + 304) -#define TARGET_NR_sync_file_range (TARGET_NR_Linux + 305) -#define TARGET_NR_tee (TARGET_NR_Linux + 306) -#define TARGET_NR_vmsplice (TARGET_NR_Linux + 307) -#define TARGET_NR_move_pages (TARGET_NR_Linux + 308) -#define TARGET_NR_set_robust_list (TARGET_NR_Linux + 309) -#define TARGET_NR_get_robust_list (TARGET_NR_Linux + 310) -#define TARGET_NR_kexec_load (TARGET_NR_Linux + 311) -#define TARGET_NR_getcpu (TARGET_NR_Linux + 312) -#define TARGET_NR_epoll_pwait (TARGET_NR_Linux + 313) -#define TARGET_NR_ioprio_set (TARGET_NR_Linux + 314) -#define TARGET_NR_ioprio_get (TARGET_NR_Linux + 315) -#define TARGET_NR_utimensat (TARGET_NR_Linux + 316) -#define TARGET_NR_signalfd (TARGET_NR_Linux + 317) -#define TARGET_NR_timerfd (TARGET_NR_Linux + 318) -#define TARGET_NR_eventfd (TARGET_NR_Linux + 319) -#define TARGET_NR_fallocate (TARGET_NR_Linux + 320) -#define TARGET_NR_timerfd_create (TARGET_NR_Linux + 321) -#define TARGET_NR_timerfd_gettime (TARGET_NR_Linux + 322) -#define TARGET_NR_timerfd_settime (TARGET_NR_Linux + 323) -#define TARGET_NR_signalfd4 (TARGET_NR_Linux + 324) -#define TARGET_NR_eventfd2 (TARGET_NR_Linux + 325) -#define TARGET_NR_epoll_create1 (TARGET_NR_Linux + 326) -#define TARGET_NR_dup3 (TARGET_NR_Linux + 327) -#define TARGET_NR_pipe2 (TARGET_NR_Linux + 328) -#define TARGET_NR_inotify_init1 (TARGET_NR_Linux + 329) -#define TARGET_NR_preadv (TARGET_NR_Linux + 330) -#define TARGET_NR_pwritev (TARGET_NR_Linux + 331) -#define TARGET_NR_rt_tgsigqueueinfo (TARGET_NR_Linux + 332) -#define TARGET_NR_perf_event_open (TARGET_NR_Linux + 333) -#define TARGET_NR_accept4 (TARGET_NR_Linux + 334) -#define TARGET_NR_recvmmsg (TARGET_NR_Linux + 335) -#define TARGET_NR_fanotify_init (TARGET_NR_Linux + 336) -#define TARGET_NR_fanotify_mark (TARGET_NR_Linux + 337) -#define TARGET_NR_prlimit64 (TARGET_NR_Linux + 338) -#define TARGET_NR_name_to_handle_at (TARGET_NR_Linux + 339) -#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 340) -#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 341) -#define TARGET_NR_syncfs (TARGET_NR_Linux + 342) -#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 343) -#define TARGET_NR_setns (TARGET_NR_Linux + 344) -#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 345) -#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 346) -#define TARGET_NR_kcmp (TARGET_NR_Linux + 347) -#define TARGET_NR_finit_module (TARGET_NR_Linux + 348) - -#define TARGET_NR_sched_setattr (TARGET_NR_Linux + 349) -#define TARGET_NR_sched_getattr (TARGET_NR_Linux + 350) -#define TARGET_NR_renameat2 (TARGET_NR_Linux + 351) -#define TARGET_NR_seccomp (TARGET_NR_Linux + 352) -#define TARGET_NR_getrandom (TARGET_NR_Linux + 353) -#define TARGET_NR_memfd_create (TARGET_NR_Linux + 354) -#define TARGET_NR_bpf (TARGET_NR_Linux + 355) -#define TARGET_NR_execveat (TARGET_NR_Linux + 356) -#define TARGET_NR_userfaultfd (TARGET_NR_Linux + 357) -#define TARGET_NR_membarrier (TARGET_NR_Linux + 358) -#define TARGET_NR_mlock2 (TARGET_NR_Linux + 359) diff --git a/qemu/linux-user/mips/target_cpu.h b/qemu/linux-user/mips/target_cpu.h deleted file mode 100644 index 19b885500..000000000 --- a/qemu/linux-user/mips/target_cpu.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * MIPS specific CPU ABI and functions for linux-user - * - * Copyright (c) 2004-2005 Jocelyn Mayer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUMIPSState *env, target_ulong newsp) -{ - if (newsp) { - env->active_tc.gpr[29] = newsp; - } - env->active_tc.gpr[7] = 0; - env->active_tc.gpr[2] = 0; -} - -static inline void cpu_set_tls(CPUMIPSState *env, target_ulong newtls) -{ - env->active_tc.CP0_UserLocal = newtls; -} - -#endif diff --git a/qemu/linux-user/mips/target_signal.h b/qemu/linux-user/mips/target_signal.h deleted file mode 100644 index 6e1dc8b6e..000000000 --- a/qemu/linux-user/mips/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_long ss_sp; - abi_ulong ss_size; - abi_long ss_flags; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUMIPSState *state) -{ - return state->active_tc.gpr[29]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/mips/target_structs.h b/qemu/linux-user/mips/target_structs.h deleted file mode 100644 index 16021e8a9..000000000 --- a/qemu/linux-user/mips/target_structs.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * MIPS specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_uint mode; /* Read/write permission. */ - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad1; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ - abi_ulong shm_dtime; /* time of last shmdt() */ - abi_ulong shm_ctime; /* time of last change by shmctl() */ - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused1; - abi_ulong __unused2; -}; - -#endif diff --git a/qemu/linux-user/mips/target_syscall.h b/qemu/linux-user/mips/target_syscall.h deleted file mode 100644 index 68db160e5..000000000 --- a/qemu/linux-user/mips/target_syscall.h +++ /dev/null @@ -1,237 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* this struct defines the way the registers are stored on the - stack during a system call. */ - -struct target_pt_regs { - /* Pad bytes for argument save space on the stack. */ - abi_ulong pad0[6]; - - /* Saved main processor registers. */ - abi_ulong regs[32]; - - /* Saved special registers. */ - abi_ulong cp0_status; - abi_ulong lo; - abi_ulong hi; - abi_ulong cp0_badvaddr; - abi_ulong cp0_cause; - abi_ulong cp0_epc; -}; - -/* Target errno definitions taken from asm-mips/errno.h */ -#undef TARGET_ENOMSG -#define TARGET_ENOMSG 35 /* Identifier removed */ -#undef TARGET_EIDRM -#define TARGET_EIDRM 36 /* Identifier removed */ -#undef TARGET_ECHRNG -#define TARGET_ECHRNG 37 /* Channel number out of range */ -#undef TARGET_EL2NSYNC -#define TARGET_EL2NSYNC 38 /* Level 2 not synchronized */ -#undef TARGET_EL3HLT -#define TARGET_EL3HLT 39 /* Level 3 halted */ -#undef TARGET_EL3RST -#define TARGET_EL3RST 40 /* Level 3 reset */ -#undef TARGET_ELNRNG -#define TARGET_ELNRNG 41 /* Link number out of range */ -#undef TARGET_EUNATCH -#define TARGET_EUNATCH 42 /* Protocol driver not attached */ -#undef TARGET_ENOCSI -#define TARGET_ENOCSI 43 /* No CSI structure available */ -#undef TARGET_EL2HLT -#define TARGET_EL2HLT 44 /* Level 2 halted */ -#undef TARGET_EDEADLK -#define TARGET_EDEADLK 45 /* Resource deadlock would occur */ -#undef TARGET_ENOLCK -#define TARGET_ENOLCK 46 /* No record locks available */ -#undef TARGET_EBADE -#define TARGET_EBADE 50 /* Invalid exchange */ -#undef TARGET_EBADR -#define TARGET_EBADR 51 /* Invalid request descriptor */ -#undef TARGET_EXFULL -#define TARGET_EXFULL 52 /* TARGET_Exchange full */ -#undef TARGET_ENOANO -#define TARGET_ENOANO 53 /* No anode */ -#undef TARGET_EBADRQC -#define TARGET_EBADRQC 54 /* Invalid request code */ -#undef TARGET_EBADSLT -#define TARGET_EBADSLT 55 /* Invalid slot */ -#undef TARGET_EDEADLOCK -#define TARGET_EDEADLOCK 56 /* File locking deadlock error */ -#undef TARGET_EBFONT -#define TARGET_EBFONT 59 /* Bad font file format */ -#undef TARGET_ENOSTR -#define TARGET_ENOSTR 60 /* Device not a stream */ -#undef TARGET_ENODATA -#define TARGET_ENODATA 61 /* No data available */ -#undef TARGET_ETIME -#define TARGET_ETIME 62 /* Timer expired */ -#undef TARGET_ENOSR -#define TARGET_ENOSR 63 /* Out of streams resources */ -#undef TARGET_ENONET -#define TARGET_ENONET 64 /* Machine is not on the network */ -#undef TARGET_ENOPKG -#define TARGET_ENOPKG 65 /* Package not installed */ -#undef TARGET_EREMOTE -#define TARGET_EREMOTE 66 /* Object is remote */ -#undef TARGET_ENOLINK -#define TARGET_ENOLINK 67 /* Link has been severed */ -#undef TARGET_EADV -#define TARGET_EADV 68 /* Advertise error */ -#undef TARGET_ESRMNT -#define TARGET_ESRMNT 69 /* Srmount error */ -#undef TARGET_ECOMM -#define TARGET_ECOMM 70 /* Communication error on send */ -#undef TARGET_EPROTO -#define TARGET_EPROTO 71 /* Protocol error */ -#undef TARGET_EDOTDOT -#define TARGET_EDOTDOT 73 /* RFS specific error */ -#undef TARGET_EMULTIHOP -#define TARGET_EMULTIHOP 74 /* Multihop attempted */ -#undef TARGET_EBADMSG -#define TARGET_EBADMSG 77 /* Not a data message */ -#undef TARGET_ENAMETOOLONG -#define TARGET_ENAMETOOLONG 78 /* File name too long */ -#undef TARGET_EOVERFLOW -#define TARGET_EOVERFLOW 79 /* Value too large for defined data type */ -#undef TARGET_ENOTUNIQ -#define TARGET_ENOTUNIQ 80 /* Name not unique on network */ -#undef TARGET_EBADFD -#define TARGET_EBADFD 81 /* File descriptor in bad state */ -#undef TARGET_EREMCHG -#define TARGET_EREMCHG 82 /* Remote address changed */ -#undef TARGET_ELIBACC -#define TARGET_ELIBACC 83 /* Can not access a needed shared library */ -#undef TARGET_ELIBBAD -#define TARGET_ELIBBAD 84 /* Accessing a corrupted shared library */ -#undef TARGET_ELIBSCN -#define TARGET_ELIBSCN 85 /* .lib section in a.out corrupted */ -#undef TARGET_ELIBMAX -#define TARGET_ELIBMAX 86 /* Attempting to link in too many shared libraries */ -#undef TARGET_ELIBEXEC -#define TARGET_ELIBEXEC 87 /* Cannot exec a shared library directly */ -#undef TARGET_EILSEQ -#define TARGET_EILSEQ 88 /* Illegal byte sequence */ -#undef TARGET_ENOSYS -#define TARGET_ENOSYS 89 /* Function not implemented */ -#undef TARGET_ELOOP -#define TARGET_ELOOP 90 /* Too many symbolic links encountered */ -#undef TARGET_ERESTART -#define TARGET_ERESTART 91 /* Interrupted system call should be restarted */ -#undef TARGET_ESTRPIPE -#define TARGET_ESTRPIPE 92 /* Streams pipe error */ -#undef TARGET_ENOTEMPTY -#define TARGET_ENOTEMPTY 93 /* Directory not empty */ -#undef TARGET_EUSERS -#define TARGET_EUSERS 94 /* Too many users */ -#undef TARGET_ENOTSOCK -#define TARGET_ENOTSOCK 95 /* Socket operation on non-socket */ -#undef TARGET_EDESTADDRREQ -#define TARGET_EDESTADDRREQ 96 /* Destination address required */ -#undef TARGET_EMSGSIZE -#define TARGET_EMSGSIZE 97 /* Message too long */ -#undef TARGET_EPROTOTYPE -#define TARGET_EPROTOTYPE 98 /* Protocol wrong type for socket */ -#undef TARGET_ENOPROTOOPT -#define TARGET_ENOPROTOOPT 99 /* Protocol not available */ -#undef TARGET_EPROTONOSUPPORT -#define TARGET_EPROTONOSUPPORT 120 /* Protocol not supported */ -#undef TARGET_ESOCKTNOSUPPORT -#define TARGET_ESOCKTNOSUPPORT 121 /* Socket type not supported */ -#undef TARGET_EOPNOTSUPP -#define TARGET_EOPNOTSUPP 122 /* Operation not supported on transport endpoint */ -#undef TARGET_EPFNOSUPPORT -#define TARGET_EPFNOSUPPORT 123 /* Protocol family not supported */ -#undef TARGET_EAFNOSUPPORT -#define TARGET_EAFNOSUPPORT 124 /* Address family not supported by protocol */ -#undef TARGET_EADDRINUSE -#define TARGET_EADDRINUSE 125 /* Address already in use */ -#undef TARGET_EADDRNOTAVAIL -#define TARGET_EADDRNOTAVAIL 126 /* Cannot assign requested address */ -#undef TARGET_ENETDOWN -#define TARGET_ENETDOWN 127 /* Network is down */ -#undef TARGET_ENETUNREACH -#define TARGET_ENETUNREACH 128 /* Network is unreachable */ -#undef TARGET_ENETRESET -#define TARGET_ENETRESET 129 /* Network dropped connection because of reset */ -#undef TARGET_ECONNABORTED -#define TARGET_ECONNABORTED 130 /* Software caused connection abort */ -#undef TARGET_ECONNRESET -#define TARGET_ECONNRESET 131 /* Connection reset by peer */ -#undef TARGET_ENOBUFS -#define TARGET_ENOBUFS 132 /* No buffer space available */ -#undef TARGET_EISCONN -#define TARGET_EISCONN 133 /* Transport endpoint is already connected */ -#undef TARGET_ENOTCONN -#define TARGET_ENOTCONN 134 /* Transport endpoint is not connected */ -#undef TARGET_EUCLEAN -#define TARGET_EUCLEAN 135 /* Structure needs cleaning */ -#undef TARGET_ENOTNAM -#define TARGET_ENOTNAM 137 /* Not a XENIX named type file */ -#undef TARGET_ENAVAIL -#define TARGET_ENAVAIL 138 /* No XENIX semaphores available */ -#undef TARGET_EISNAM -#define TARGET_EISNAM 139 /* Is a named type file */ -#undef TARGET_EREMOTEIO -#define TARGET_EREMOTEIO 140 /* Remote I/O error */ -#undef TARGET_EINIT -#define TARGET_EINIT 141 /* Reserved */ -#undef TARGET_EREMDEV -#define TARGET_EREMDEV 142 /* TARGET_Error 142 */ -#undef TARGET_ESHUTDOWN -#define TARGET_ESHUTDOWN 143 /* Cannot send after transport endpoint shutdown */ -#undef TARGET_ETOOMANYREFS -#define TARGET_ETOOMANYREFS 144 /* Too many references: cannot splice */ -#undef TARGET_ETIMEDOUT -#define TARGET_ETIMEDOUT 145 /* Connection timed out */ -#undef TARGET_ECONNREFUSED -#define TARGET_ECONNREFUSED 146 /* Connection refused */ -#undef TARGET_EHOSTDOWN -#define TARGET_EHOSTDOWN 147 /* Host is down */ -#undef TARGET_EHOSTUNREACH -#define TARGET_EHOSTUNREACH 148 /* No route to host */ -#undef TARGET_EALREADY -#define TARGET_EALREADY 149 /* Operation already in progress */ -#undef TARGET_EINPROGRESS -#define TARGET_EINPROGRESS 150 /* Operation now in progress */ -#undef TARGET_ESTALE -#define TARGET_ESTALE 151 /* Stale NFS file handle */ -#undef TARGET_ECANCELED -#define TARGET_ECANCELED 158 /* AIO operation canceled */ -/* - * These error are Linux extensions. - */ -#undef TARGET_ENOMEDIUM -#define TARGET_ENOMEDIUM 159 /* No medium found */ -#undef TARGET_EMEDIUMTYPE -#define TARGET_EMEDIUMTYPE 160 /* Wrong medium type */ -#undef TARGET_ENOKEY -#define TARGET_ENOKEY 161 /* Required key not available */ -#undef TARGET_EKEYEXPIRED -#define TARGET_EKEYEXPIRED 162 /* Key has expired */ -#undef TARGET_EKEYREVOKED -#define TARGET_EKEYREVOKED 163 /* Key has been revoked */ -#undef TARGET_EKEYREJECTED -#define TARGET_EKEYREJECTED 164 /* Key was rejected by service */ - -/* for robust mutexes */ -#undef TARGET_EOWNERDEAD -#define TARGET_EOWNERDEAD 165 /* Owner died */ -#undef TARGET_ENOTRECOVERABLE -#define TARGET_ENOTRECOVERABLE 166 /* State not recoverable */ - - - -/* Nasty hack: define a fake errno value for use by sigreturn. */ -#define TARGET_QEMU_ESIGRETURN 255 - -#define UNAME_MACHINE "mips" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/mips/termbits.h b/qemu/linux-user/mips/termbits.h deleted file mode 100644 index d3a6cf8f9..000000000 --- a/qemu/linux-user/mips/termbits.h +++ /dev/null @@ -1,245 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 23 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_IEXTEN 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_TOSTOP 0100000 -#define TARGET_ITOSTOP TARGET_TOSTOP - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VMIN 4 -#define TARGET_VTIME 5 -#define TARGET_VEOL2 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -/* VDSUSP not supported */ -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOF 16 -#define TARGET_VEOL 17 - -/* ioctls */ - -#define TARGET_TCGETA 0x5401 -#define TARGET_TCSETA 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */ -#define TARGET_TCSETAW 0x5403 -#define TARGET_TCSETAF 0x5404 - -#define TARGET_TCSBRK 0x5405 -#define TARGET_TCXONC 0x5406 -#define TARGET_TCFLSH 0x5407 - -#define TARGET_TCGETS 0x540d -#define TARGET_TCSETS 0x540e -#define TARGET_TCSETSW 0x540f -#define TARGET_TCSETSF 0x5410 - -#define TARGET_TIOCEXCL 0x740d /* set exclusive use of tty */ -#define TARGET_TIOCNXCL 0x740e /* reset exclusive use of tty */ -#define TARGET_TIOCOUTQ 0x7472 /* output queue size */ -#define TARGET_TIOCSTI 0x5472 /* simulate terminal input */ -#define TARGET_TIOCMGET 0x741d /* get all modem bits */ -#define TARGET_TIOCMBIS 0x741b /* bis modem bits */ -#define TARGET_TIOCMBIC 0x741c /* bic modem bits */ -#define TARGET_TIOCMSET 0x741a /* set all modem bits */ -#define TARGET_TIOCPKT 0x5470 /* pty: set/clear packet mode */ -#define TARGET_TIOCPKT_DATA 0x00 /* data packet */ -#define TARGET_TIOCPKT_FLUSHREAD 0x01 /* flush packet */ -#define TARGET_TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ -#define TARGET_TIOCPKT_STOP 0x04 /* stop output */ -#define TARGET_TIOCPKT_START 0x08 /* start output */ -#define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ -#define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ -/* #define TIOCPKT_IOCTL 0x40 state change of pty driver */ -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) /* set window size */ -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) /* get window size */ -#define TARGET_TIOCNOTTY 0x5471 /* void tty association */ -#define TARGET_TIOCSETD 0x7401 -#define TARGET_TIOCGETD 0x7400 - -#define TARGET_FIOCLEX 0x6601 -#define TARGET_FIONCLEX 0x6602 -#define TARGET_FIOASYNC 0x667d -#define TARGET_FIONBIO 0x667e -#define TARGET_FIOQSIZE 0x667f - -#define TARGET_TIOCGLTC 0x7474 /* get special local chars */ -#define TARGET_TIOCSLTC 0x7475 /* set special local chars */ -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) /* set pgrp of tty */ -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) /* get pgrp of tty */ -#define TARGET_TIOCCONS TARGET_IOW('t', 120, int) /* become virtual console */ - -#define TARGET_FIONREAD 0x467f -#define TARGET_TIOCINQ TARGET_FIONREAD - -#define TARGET_TIOCGETP 0x7408 -#define TARGET_TIOCSETP 0x7409 -#define TARGET_TIOCSETN 0x740a /* TIOCSETP wo flush */ - -/* #define TARGET_TIOCSETA TARGET_IOW('t', 20, struct termios) set termios struct */ -/* #define TARGET_TIOCSETAW TARGET_IOW('t', 21, struct termios) drain output, set */ -/* #define TARGET_TIOCSETAF TARGET_IOW('t', 22, struct termios) drn out, fls in, set */ -/* #define TARGET_TIOCGETD TARGET_IOR('t', 26, int) get line discipline */ -/* #define TARGET_TIOCSETD TARGET_IOW('t', 27, int) set line discipline */ - /* 127-124 compat */ - -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -/* I hope the range from 0x5480 on is free ... */ -#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */ -#define TARGET_TIOCGSOFTCAR 0x5481 -#define TARGET_TIOCSSOFTCAR 0x5482 -#define TARGET_TIOCLINUX 0x5483 -#define TARGET_TIOCGSERIAL 0x5484 -#define TARGET_TIOCSSERIAL 0x5485 -#define TARGET_TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSERCONFIG 0x5488 -#define TARGET_TIOCSERGWILD 0x5489 -#define TARGET_TIOCSERSWILD 0x548a -#define TARGET_TIOCGLCKTRMIOS 0x548b -#define TARGET_TIOCSLCKTRMIOS 0x548c -#define TARGET_TIOCSERGSTRUCT 0x548d /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x548e /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x548f /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x5490 /* Set multiport config */ -#define TARGET_TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */ diff --git a/qemu/linux-user/mips64/syscall_nr.h b/qemu/linux-user/mips64/syscall_nr.h deleted file mode 100644 index 746cc267e..000000000 --- a/qemu/linux-user/mips64/syscall_nr.h +++ /dev/null @@ -1,656 +0,0 @@ -#ifdef TARGET_ABI32 -/* - * Linux N32 syscalls are in the range from 6000 to 6999. - */ -#define TARGET_NR_Linux 6000 -#define TARGET_NR_read (TARGET_NR_Linux + 0) -#define TARGET_NR_write (TARGET_NR_Linux + 1) -#define TARGET_NR_open (TARGET_NR_Linux + 2) -#define TARGET_NR_close (TARGET_NR_Linux + 3) -#define TARGET_NR_stat (TARGET_NR_Linux + 4) -#define TARGET_NR_fstat (TARGET_NR_Linux + 5) -#define TARGET_NR_lstat (TARGET_NR_Linux + 6) -#define TARGET_NR_poll (TARGET_NR_Linux + 7) -#define TARGET_NR_lseek (TARGET_NR_Linux + 8) -#define TARGET_NR_mmap (TARGET_NR_Linux + 9) -#define TARGET_NR_mprotect (TARGET_NR_Linux + 10) -#define TARGET_NR_munmap (TARGET_NR_Linux + 11) -#define TARGET_NR_brk (TARGET_NR_Linux + 12) -#define TARGET_NR_rt_sigaction (TARGET_NR_Linux + 13) -#define TARGET_NR_rt_sigprocmask (TARGET_NR_Linux + 14) -#define TARGET_NR_ioctl (TARGET_NR_Linux + 15) -#define TARGET_NR_pread64 (TARGET_NR_Linux + 16) -#define TARGET_NR_pwrite64 (TARGET_NR_Linux + 17) -#define TARGET_NR_readv (TARGET_NR_Linux + 18) -#define TARGET_NR_writev (TARGET_NR_Linux + 19) -#define TARGET_NR_access (TARGET_NR_Linux + 20) -#define TARGET_NR_pipe (TARGET_NR_Linux + 21) -#define TARGET_NR__newselect (TARGET_NR_Linux + 22) -#define TARGET_NR_sched_yield (TARGET_NR_Linux + 23) -#define TARGET_NR_mremap (TARGET_NR_Linux + 24) -#define TARGET_NR_msync (TARGET_NR_Linux + 25) -#define TARGET_NR_mincore (TARGET_NR_Linux + 26) -#define TARGET_NR_madvise (TARGET_NR_Linux + 27) -#define TARGET_NR_shmget (TARGET_NR_Linux + 28) -#define TARGET_NR_shmat (TARGET_NR_Linux + 29) -#define TARGET_NR_shmctl (TARGET_NR_Linux + 30) -#define TARGET_NR_dup (TARGET_NR_Linux + 31) -#define TARGET_NR_dup2 (TARGET_NR_Linux + 32) -#define TARGET_NR_pause (TARGET_NR_Linux + 33) -#define TARGET_NR_nanosleep (TARGET_NR_Linux + 34) -#define TARGET_NR_getitimer (TARGET_NR_Linux + 35) -#define TARGET_NR_setitimer (TARGET_NR_Linux + 36) -#define TARGET_NR_alarm (TARGET_NR_Linux + 37) -#define TARGET_NR_getpid (TARGET_NR_Linux + 38) -#define TARGET_NR_sendfile (TARGET_NR_Linux + 39) -#define TARGET_NR_socket (TARGET_NR_Linux + 40) -#define TARGET_NR_connect (TARGET_NR_Linux + 41) -#define TARGET_NR_accept (TARGET_NR_Linux + 42) -#define TARGET_NR_sendto (TARGET_NR_Linux + 43) -#define TARGET_NR_recvfrom (TARGET_NR_Linux + 44) -#define TARGET_NR_sendmsg (TARGET_NR_Linux + 45) -#define TARGET_NR_recvmsg (TARGET_NR_Linux + 46) -#define TARGET_NR_shutdown (TARGET_NR_Linux + 47) -#define TARGET_NR_bind (TARGET_NR_Linux + 48) -#define TARGET_NR_listen (TARGET_NR_Linux + 49) -#define TARGET_NR_getsockname (TARGET_NR_Linux + 50) -#define TARGET_NR_getpeername (TARGET_NR_Linux + 51) -#define TARGET_NR_socketpair (TARGET_NR_Linux + 52) -#define TARGET_NR_setsockopt (TARGET_NR_Linux + 53) -#define TARGET_NR_getsockopt (TARGET_NR_Linux + 54) -#define TARGET_NR_clone (TARGET_NR_Linux + 55) -#define TARGET_NR_fork (TARGET_NR_Linux + 56) -#define TARGET_NR_execve (TARGET_NR_Linux + 57) -#define TARGET_NR_exit (TARGET_NR_Linux + 58) -#define TARGET_NR_wait4 (TARGET_NR_Linux + 59) -#define TARGET_NR_kill (TARGET_NR_Linux + 60) -#define TARGET_NR_uname (TARGET_NR_Linux + 61) -#define TARGET_NR_semget (TARGET_NR_Linux + 62) -#define TARGET_NR_semop (TARGET_NR_Linux + 63) -#define TARGET_NR_semctl (TARGET_NR_Linux + 64) -#define TARGET_NR_shmdt (TARGET_NR_Linux + 65) -#define TARGET_NR_msgget (TARGET_NR_Linux + 66) -#define TARGET_NR_msgsnd (TARGET_NR_Linux + 67) -#define TARGET_NR_msgrcv (TARGET_NR_Linux + 68) -#define TARGET_NR_msgctl (TARGET_NR_Linux + 69) -#define TARGET_NR_fcntl (TARGET_NR_Linux + 70) -#define TARGET_NR_flock (TARGET_NR_Linux + 71) -#define TARGET_NR_fsync (TARGET_NR_Linux + 72) -#define TARGET_NR_fdatasync (TARGET_NR_Linux + 73) -#define TARGET_NR_truncate (TARGET_NR_Linux + 74) -#define TARGET_NR_ftruncate (TARGET_NR_Linux + 75) -#define TARGET_NR_getdents (TARGET_NR_Linux + 76) -#define TARGET_NR_getcwd (TARGET_NR_Linux + 77) -#define TARGET_NR_chdir (TARGET_NR_Linux + 78) -#define TARGET_NR_fchdir (TARGET_NR_Linux + 79) -#define TARGET_NR_rename (TARGET_NR_Linux + 80) -#define TARGET_NR_mkdir (TARGET_NR_Linux + 81) -#define TARGET_NR_rmdir (TARGET_NR_Linux + 82) -#define TARGET_NR_creat (TARGET_NR_Linux + 83) -#define TARGET_NR_link (TARGET_NR_Linux + 84) -#define TARGET_NR_unlink (TARGET_NR_Linux + 85) -#define TARGET_NR_symlink (TARGET_NR_Linux + 86) -#define TARGET_NR_readlink (TARGET_NR_Linux + 87) -#define TARGET_NR_chmod (TARGET_NR_Linux + 88) -#define TARGET_NR_fchmod (TARGET_NR_Linux + 89) -#define TARGET_NR_chown (TARGET_NR_Linux + 90) -#define TARGET_NR_fchown (TARGET_NR_Linux + 91) -#define TARGET_NR_lchown (TARGET_NR_Linux + 92) -#define TARGET_NR_umask (TARGET_NR_Linux + 93) -#define TARGET_NR_gettimeofday (TARGET_NR_Linux + 94) -#define TARGET_NR_getrlimit (TARGET_NR_Linux + 95) -#define TARGET_NR_getrusage (TARGET_NR_Linux + 96) -#define TARGET_NR_sysinfo (TARGET_NR_Linux + 97) -#define TARGET_NR_times (TARGET_NR_Linux + 98) -#define TARGET_NR_ptrace (TARGET_NR_Linux + 99) -#define TARGET_NR_getuid (TARGET_NR_Linux + 100) -#define TARGET_NR_syslog (TARGET_NR_Linux + 101) -#define TARGET_NR_getgid (TARGET_NR_Linux + 102) -#define TARGET_NR_setuid (TARGET_NR_Linux + 103) -#define TARGET_NR_setgid (TARGET_NR_Linux + 104) -#define TARGET_NR_geteuid (TARGET_NR_Linux + 105) -#define TARGET_NR_getegid (TARGET_NR_Linux + 106) -#define TARGET_NR_setpgid (TARGET_NR_Linux + 107) -#define TARGET_NR_getppid (TARGET_NR_Linux + 108) -#define TARGET_NR_getpgrp (TARGET_NR_Linux + 109) -#define TARGET_NR_setsid (TARGET_NR_Linux + 110) -#define TARGET_NR_setreuid (TARGET_NR_Linux + 111) -#define TARGET_NR_setregid (TARGET_NR_Linux + 112) -#define TARGET_NR_getgroups (TARGET_NR_Linux + 113) -#define TARGET_NR_setgroups (TARGET_NR_Linux + 114) -#define TARGET_NR_setresuid (TARGET_NR_Linux + 115) -#define TARGET_NR_getresuid (TARGET_NR_Linux + 116) -#define TARGET_NR_setresgid (TARGET_NR_Linux + 117) -#define TARGET_NR_getresgid (TARGET_NR_Linux + 118) -#define TARGET_NR_getpgid (TARGET_NR_Linux + 119) -#define TARGET_NR_setfsuid (TARGET_NR_Linux + 120) -#define TARGET_NR_setfsgid (TARGET_NR_Linux + 121) -#define TARGET_NR_getsid (TARGET_NR_Linux + 122) -#define TARGET_NR_capget (TARGET_NR_Linux + 123) -#define TARGET_NR_capset (TARGET_NR_Linux + 124) -#define TARGET_NR_rt_sigpending (TARGET_NR_Linux + 125) -#define TARGET_NR_rt_sigtimedwait (TARGET_NR_Linux + 126) -#define TARGET_NR_rt_sigqueueinfo (TARGET_NR_Linux + 127) -#define TARGET_NR_rt_sigsuspend (TARGET_NR_Linux + 128) -#define TARGET_NR_sigaltstack (TARGET_NR_Linux + 129) -#define TARGET_NR_utime (TARGET_NR_Linux + 130) -#define TARGET_NR_mknod (TARGET_NR_Linux + 131) -#define TARGET_NR_personality (TARGET_NR_Linux + 132) -#define TARGET_NR_ustat (TARGET_NR_Linux + 133) -#define TARGET_NR_statfs (TARGET_NR_Linux + 134) -#define TARGET_NR_fstatfs (TARGET_NR_Linux + 135) -#define TARGET_NR_sysfs (TARGET_NR_Linux + 136) -#define TARGET_NR_getpriority (TARGET_NR_Linux + 137) -#define TARGET_NR_setpriority (TARGET_NR_Linux + 138) -#define TARGET_NR_sched_setparam (TARGET_NR_Linux + 139) -#define TARGET_NR_sched_getparam (TARGET_NR_Linux + 140) -#define TARGET_NR_sched_setscheduler (TARGET_NR_Linux + 141) -#define TARGET_NR_sched_getscheduler (TARGET_NR_Linux + 142) -#define TARGET_NR_sched_get_priority_max (TARGET_NR_Linux + 143) -#define TARGET_NR_sched_get_priority_min (TARGET_NR_Linux + 144) -#define TARGET_NR_sched_rr_get_interval (TARGET_NR_Linux + 145) -#define TARGET_NR_mlock (TARGET_NR_Linux + 146) -#define TARGET_NR_munlock (TARGET_NR_Linux + 147) -#define TARGET_NR_mlockall (TARGET_NR_Linux + 148) -#define TARGET_NR_munlockall (TARGET_NR_Linux + 149) -#define TARGET_NR_vhangup (TARGET_NR_Linux + 150) -#define TARGET_NR_pivot_root (TARGET_NR_Linux + 151) -#define TARGET_NR__sysctl (TARGET_NR_Linux + 152) -#define TARGET_NR_prctl (TARGET_NR_Linux + 153) -#define TARGET_NR_adjtimex (TARGET_NR_Linux + 154) -#define TARGET_NR_setrlimit (TARGET_NR_Linux + 155) -#define TARGET_NR_chroot (TARGET_NR_Linux + 156) -#define TARGET_NR_sync (TARGET_NR_Linux + 157) -#define TARGET_NR_acct (TARGET_NR_Linux + 158) -#define TARGET_NR_settimeofday (TARGET_NR_Linux + 159) -#define TARGET_NR_mount (TARGET_NR_Linux + 160) -#define TARGET_NR_umount2 (TARGET_NR_Linux + 161) -#define TARGET_NR_swapon (TARGET_NR_Linux + 162) -#define TARGET_NR_swapoff (TARGET_NR_Linux + 163) -#define TARGET_NR_reboot (TARGET_NR_Linux + 164) -#define TARGET_NR_sethostname (TARGET_NR_Linux + 165) -#define TARGET_NR_setdomainname (TARGET_NR_Linux + 166) -#define TARGET_NR_create_module (TARGET_NR_Linux + 167) -#define TARGET_NR_init_module (TARGET_NR_Linux + 168) -#define TARGET_NR_delete_module (TARGET_NR_Linux + 169) -#define TARGET_NR_get_kernel_syms (TARGET_NR_Linux + 170) -#define TARGET_NR_query_module (TARGET_NR_Linux + 171) -#define TARGET_NR_quotactl (TARGET_NR_Linux + 172) -#define TARGET_NR_nfsservctl (TARGET_NR_Linux + 173) -#define TARGET_NR_getpmsg (TARGET_NR_Linux + 174) -#define TARGET_NR_putpmsg (TARGET_NR_Linux + 175) -#define TARGET_NR_afs_syscall (TARGET_NR_Linux + 176) -#define TARGET_NR_reserved177 (TARGET_NR_Linux + 177) -#define TARGET_NR_gettid (TARGET_NR_Linux + 178) -#define TARGET_NR_readahead (TARGET_NR_Linux + 179) -#define TARGET_NR_setxattr (TARGET_NR_Linux + 180) -#define TARGET_NR_lsetxattr (TARGET_NR_Linux + 181) -#define TARGET_NR_fsetxattr (TARGET_NR_Linux + 182) -#define TARGET_NR_getxattr (TARGET_NR_Linux + 183) -#define TARGET_NR_lgetxattr (TARGET_NR_Linux + 184) -#define TARGET_NR_fgetxattr (TARGET_NR_Linux + 185) -#define TARGET_NR_listxattr (TARGET_NR_Linux + 186) -#define TARGET_NR_llistxattr (TARGET_NR_Linux + 187) -#define TARGET_NR_flistxattr (TARGET_NR_Linux + 188) -#define TARGET_NR_removexattr (TARGET_NR_Linux + 189) -#define TARGET_NR_lremovexattr (TARGET_NR_Linux + 190) -#define TARGET_NR_fremovexattr (TARGET_NR_Linux + 191) -#define TARGET_NR_tkill (TARGET_NR_Linux + 192) -#define TARGET_NR_reserved193 (TARGET_NR_Linux + 193) -#define TARGET_NR_futex (TARGET_NR_Linux + 194) -#define TARGET_NR_sched_setaffinity (TARGET_NR_Linux + 195) -#define TARGET_NR_sched_getaffinity (TARGET_NR_Linux + 196) -#define TARGET_NR_cacheflush (TARGET_NR_Linux + 197) -#define TARGET_NR_cachectl (TARGET_NR_Linux + 198) -#define TARGET_NR_sysmips (TARGET_NR_Linux + 199) -#define TARGET_NR_io_setup (TARGET_NR_Linux + 200) -#define TARGET_NR_io_destroy (TARGET_NR_Linux + 201) -#define TARGET_NR_io_getevents (TARGET_NR_Linux + 202) -#define TARGET_NR_io_submit (TARGET_NR_Linux + 203) -#define TARGET_NR_io_cancel (TARGET_NR_Linux + 204) -#define TARGET_NR_exit_group (TARGET_NR_Linux + 205) -#define TARGET_NR_lookup_dcookie (TARGET_NR_Linux + 206) -#define TARGET_NR_epoll_create (TARGET_NR_Linux + 207) -#define TARGET_NR_epoll_ctl (TARGET_NR_Linux + 208) -#define TARGET_NR_epoll_wait (TARGET_NR_Linux + 209) -#define TARGET_NR_remap_file_pages (TARGET_NR_Linux + 210) -#define TARGET_NR_rt_sigreturn (TARGET_NR_Linux + 211) -#define TARGET_NR_fcntl64 (TARGET_NR_Linux + 212) -#define TARGET_NR_set_tid_address (TARGET_NR_Linux + 213) -#define TARGET_NR_restart_syscall (TARGET_NR_Linux + 214) -#define TARGET_NR_semtimedop (TARGET_NR_Linux + 215) -#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 216) -#define TARGET_NR_statfs64 (TARGET_NR_Linux + 217) -#define TARGET_NR_fstatfs64 (TARGET_NR_Linux + 218) -#define TARGET_NR_sendfile64 (TARGET_NR_Linux + 219) -#define TARGET_NR_timer_create (TARGET_NR_Linux + 220) -#define TARGET_NR_timer_settime (TARGET_NR_Linux + 221) -#define TARGET_NR_timer_gettime (TARGET_NR_Linux + 222) -#define TARGET_NR_timer_getoverrun (TARGET_NR_Linux + 223) -#define TARGET_NR_timer_delete (TARGET_NR_Linux + 224) -#define TARGET_NR_clock_settime (TARGET_NR_Linux + 225) -#define TARGET_NR_clock_gettime (TARGET_NR_Linux + 226) -#define TARGET_NR_clock_getres (TARGET_NR_Linux + 227) -#define TARGET_NR_clock_nanosleep (TARGET_NR_Linux + 228) -#define TARGET_NR_tgkill (TARGET_NR_Linux + 229) -#define TARGET_NR_utimes (TARGET_NR_Linux + 230) -#define TARGET_NR_mbind (TARGET_NR_Linux + 231) -#define TARGET_NR_get_mempolicy (TARGET_NR_Linux + 232) -#define TARGET_NR_set_mempolicy (TARGET_NR_Linux + 233) -#define TARGET_NR_mq_open (TARGET_NR_Linux + 234) -#define TARGET_NR_mq_unlink (TARGET_NR_Linux + 235) -#define TARGET_NR_mq_timedsend (TARGET_NR_Linux + 236) -#define TARGET_NR_mq_timedreceive (TARGET_NR_Linux + 237) -#define TARGET_NR_mq_notify (TARGET_NR_Linux + 238) -#define TARGET_NR_mq_getsetattr (TARGET_NR_Linux + 239) -#define TARGET_NR_vserver (TARGET_NR_Linux + 240) -#define TARGET_NR_waitid (TARGET_NR_Linux + 241) -/* #define TARGET_NR_sys_setaltroot (TARGET_NR_Linux + 242) */ -#define TARGET_NR_add_key (TARGET_NR_Linux + 243) -#define TARGET_NR_request_key (TARGET_NR_Linux + 244) -#define TARGET_NR_keyctl (TARGET_NR_Linux + 245) -#define TARGET_NR_set_thread_area (TARGET_NR_Linux + 246) -#define TARGET_NR_inotify_init (TARGET_NR_Linux + 247) -#define TARGET_NR_inotify_add_watch (TARGET_NR_Linux + 248) -#define TARGET_NR_inotify_rm_watch (TARGET_NR_Linux + 249) -#define TARGET_NR_migrate_pages (TARGET_NR_Linux + 250) -#define TARGET_NR_openat (TARGET_NR_Linux + 251) -#define TARGET_NR_mkdirat (TARGET_NR_Linux + 252) -#define TARGET_NR_mknodat (TARGET_NR_Linux + 253) -#define TARGET_NR_fchownat (TARGET_NR_Linux + 254) -#define TARGET_NR_futimesat (TARGET_NR_Linux + 255) -#define TARGET_NR_newfstatat (TARGET_NR_Linux + 256) -#define TARGET_NR_unlinkat (TARGET_NR_Linux + 257) -#define TARGET_NR_renameat (TARGET_NR_Linux + 258) -#define TARGET_NR_linkat (TARGET_NR_Linux + 259) -#define TARGET_NR_symlinkat (TARGET_NR_Linux + 260) -#define TARGET_NR_readlinkat (TARGET_NR_Linux + 261) -#define TARGET_NR_fchmodat (TARGET_NR_Linux + 262) -#define TARGET_NR_faccessat (TARGET_NR_Linux + 263) -#define TARGET_NR_pselect6 (TARGET_NR_Linux + 264) -#define TARGET_NR_ppoll (TARGET_NR_Linux + 265) -#define TARGET_NR_unshare (TARGET_NR_Linux + 266) -#define TARGET_NR_splice (TARGET_NR_Linux + 267) -#define TARGET_NR_sync_file_range (TARGET_NR_Linux + 268) -#define TARGET_NR_tee (TARGET_NR_Linux + 269) -#define TARGET_NR_vmsplice (TARGET_NR_Linux + 270) -#define TARGET_NR_move_pages (TARGET_NR_Linux + 271) -#define TARGET_NR_set_robust_list (TARGET_NR_Linux + 272) -#define TARGET_NR_get_robust_list (TARGET_NR_Linux + 273) -#define TARGET_NR_kexec_load (TARGET_NR_Linux + 274) -#define TARGET_NR_getcpu (TARGET_NR_Linux + 275) -#define TARGET_NR_epoll_pwait (TARGET_NR_Linux + 276) -#define TARGET_NR_ioprio_set (TARGET_NR_Linux + 277) -#define TARGET_NR_ioprio_get (TARGET_NR_Linux + 278) -#define TARGET_NR_utimensat (TARGET_NR_Linux + 279) -#define TARGET_NR_signalfd (TARGET_NR_Linux + 280) -#define TARGET_NR_timerfd (TARGET_NR_Linux + 281) -#define TARGET_NR_eventfd (TARGET_NR_Linux + 282) -#define TARGET_NR_fallocate (TARGET_NR_Linux + 283) -#define TARGET_NR_timerfd_create (TARGET_NR_Linux + 284) -#define TARGET_NR_timerfd_gettime (TARGET_NR_Linux + 285) -#define TARGET_NR_timerfd_settime (TARGET_NR_Linux + 286) -#define TARGET_NR_signalfd4 (TARGET_NR_Linux + 287) -#define TARGET_NR_eventfd2 (TARGET_NR_Linux + 288) -#define TARGET_NR_epoll_create1 (TARGET_NR_Linux + 289) -#define TARGET_NR_dup3 (TARGET_NR_Linux + 290) -#define TARGET_NR_pipe2 (TARGET_NR_Linux + 291) -#define TARGET_NR_inotify_init1 (TARGET_NR_Linux + 292) -#define TARGET_NR_preadv (TARGET_NR_Linux + 293) -#define TARGET_NR_pwritev (TARGET_NR_Linux + 294) -#define TARGET_NR_rt_tgsigqueueinfo (TARGET_NR_Linux + 295) -#define TARGET_NR_perf_event_open (TARGET_NR_Linux + 296) -#define TARGET_NR_accept4 (TARGET_NR_Linux + 297) -#define TARGET_NR_recvmmsg (TARGET_NR_Linux + 298) -#define TARGET_NR_getdents64 (TARGET_NR_Linux + 299) -#define TARGET_NR_fanotify_init (TARGET_NR_Linux + 300) -#define TARGET_NR_fanotify_mark (TARGET_NR_Linux + 301) -#define TARGET_NR_prlimit64 (TARGET_NR_Linux + 302) -#define TARGET_NR_name_to_handle_at (TARGET_NR_Linux + 303) -#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 304) -#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 305) -#define TARGET_NR_syncfs (TARGET_NR_Linux + 306) -#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 307) -#define TARGET_NR_setns (TARGET_NR_Linux + 308) -#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 309) -#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 310) -#define TARGET_NR_kcmp (TARGET_NR_Linux + 311) -#define TARGET_NR_finit_module (TARGET_NR_Linux + 312) -#define TARGET_NR_sched_setattr (TARGET_NR_Linux + 313) -#define TARGET_NR_sched_getattr (TARGET_NR_Linux + 314) -#define TARGET_NR_renameat2 (TARGET_NR_Linux + 315) -#define TARGET_NR_seccomp (TARGET_NR_Linux + 316) -#define TARGET_NR_getrandom (TARGET_NR_Linux + 317) -#define TARGET_NR_memfd_create (TARGET_NR_Linux + 318) -#define TARGET_NR_bpf (TARGET_NR_Linux + 319) -#define TARGET_NR_execveat (TARGET_NR_Linux + 320) -#define TARGET_NR_userfaultfd (TARGET_NR_Linux + 321) -#define TARGET_NR_membarrier (TARGET_NR_Linux + 322) -#define TARGET_NR_mlock2 (TARGET_NR_Linux + 323) - -#else -/* - * Linux 64-bit syscalls are in the range from 5000 to 5999. - */ -#define TARGET_NR_Linux 5000 -#define TARGET_NR_read (TARGET_NR_Linux + 0) -#define TARGET_NR_write (TARGET_NR_Linux + 1) -#define TARGET_NR_open (TARGET_NR_Linux + 2) -#define TARGET_NR_close (TARGET_NR_Linux + 3) -#define TARGET_NR_stat (TARGET_NR_Linux + 4) -#define TARGET_NR_fstat (TARGET_NR_Linux + 5) -#define TARGET_NR_lstat (TARGET_NR_Linux + 6) -#define TARGET_NR_poll (TARGET_NR_Linux + 7) -#define TARGET_NR_lseek (TARGET_NR_Linux + 8) -#define TARGET_NR_mmap (TARGET_NR_Linux + 9) -#define TARGET_NR_mprotect (TARGET_NR_Linux + 10) -#define TARGET_NR_munmap (TARGET_NR_Linux + 11) -#define TARGET_NR_brk (TARGET_NR_Linux + 12) -#define TARGET_NR_rt_sigaction (TARGET_NR_Linux + 13) -#define TARGET_NR_rt_sigprocmask (TARGET_NR_Linux + 14) -#define TARGET_NR_ioctl (TARGET_NR_Linux + 15) -#define TARGET_NR_pread64 (TARGET_NR_Linux + 16) -#define TARGET_NR_pwrite64 (TARGET_NR_Linux + 17) -#define TARGET_NR_readv (TARGET_NR_Linux + 18) -#define TARGET_NR_writev (TARGET_NR_Linux + 19) -#define TARGET_NR_access (TARGET_NR_Linux + 20) -#define TARGET_NR_pipe (TARGET_NR_Linux + 21) -#define TARGET_NR__newselect (TARGET_NR_Linux + 22) -#define TARGET_NR_sched_yield (TARGET_NR_Linux + 23) -#define TARGET_NR_mremap (TARGET_NR_Linux + 24) -#define TARGET_NR_msync (TARGET_NR_Linux + 25) -#define TARGET_NR_mincore (TARGET_NR_Linux + 26) -#define TARGET_NR_madvise (TARGET_NR_Linux + 27) -#define TARGET_NR_shmget (TARGET_NR_Linux + 28) -#define TARGET_NR_shmat (TARGET_NR_Linux + 29) -#define TARGET_NR_shmctl (TARGET_NR_Linux + 30) -#define TARGET_NR_dup (TARGET_NR_Linux + 31) -#define TARGET_NR_dup2 (TARGET_NR_Linux + 32) -#define TARGET_NR_pause (TARGET_NR_Linux + 33) -#define TARGET_NR_nanosleep (TARGET_NR_Linux + 34) -#define TARGET_NR_getitimer (TARGET_NR_Linux + 35) -#define TARGET_NR_setitimer (TARGET_NR_Linux + 36) -#define TARGET_NR_alarm (TARGET_NR_Linux + 37) -#define TARGET_NR_getpid (TARGET_NR_Linux + 38) -#define TARGET_NR_sendfile (TARGET_NR_Linux + 39) -#define TARGET_NR_socket (TARGET_NR_Linux + 40) -#define TARGET_NR_connect (TARGET_NR_Linux + 41) -#define TARGET_NR_accept (TARGET_NR_Linux + 42) -#define TARGET_NR_sendto (TARGET_NR_Linux + 43) -#define TARGET_NR_recvfrom (TARGET_NR_Linux + 44) -#define TARGET_NR_sendmsg (TARGET_NR_Linux + 45) -#define TARGET_NR_recvmsg (TARGET_NR_Linux + 46) -#define TARGET_NR_shutdown (TARGET_NR_Linux + 47) -#define TARGET_NR_bind (TARGET_NR_Linux + 48) -#define TARGET_NR_listen (TARGET_NR_Linux + 49) -#define TARGET_NR_getsockname (TARGET_NR_Linux + 50) -#define TARGET_NR_getpeername (TARGET_NR_Linux + 51) -#define TARGET_NR_socketpair (TARGET_NR_Linux + 52) -#define TARGET_NR_setsockopt (TARGET_NR_Linux + 53) -#define TARGET_NR_getsockopt (TARGET_NR_Linux + 54) -#define TARGET_NR_clone (TARGET_NR_Linux + 55) -#define TARGET_NR_fork (TARGET_NR_Linux + 56) -#define TARGET_NR_execve (TARGET_NR_Linux + 57) -#define TARGET_NR_exit (TARGET_NR_Linux + 58) -#define TARGET_NR_wait4 (TARGET_NR_Linux + 59) -#define TARGET_NR_kill (TARGET_NR_Linux + 60) -#define TARGET_NR_uname (TARGET_NR_Linux + 61) -#define TARGET_NR_semget (TARGET_NR_Linux + 62) -#define TARGET_NR_semop (TARGET_NR_Linux + 63) -#define TARGET_NR_semctl (TARGET_NR_Linux + 64) -#define TARGET_NR_shmdt (TARGET_NR_Linux + 65) -#define TARGET_NR_msgget (TARGET_NR_Linux + 66) -#define TARGET_NR_msgsnd (TARGET_NR_Linux + 67) -#define TARGET_NR_msgrcv (TARGET_NR_Linux + 68) -#define TARGET_NR_msgctl (TARGET_NR_Linux + 69) -#define TARGET_NR_fcntl (TARGET_NR_Linux + 70) -#define TARGET_NR_flock (TARGET_NR_Linux + 71) -#define TARGET_NR_fsync (TARGET_NR_Linux + 72) -#define TARGET_NR_fdatasync (TARGET_NR_Linux + 73) -#define TARGET_NR_truncate (TARGET_NR_Linux + 74) -#define TARGET_NR_ftruncate (TARGET_NR_Linux + 75) -#define TARGET_NR_getdents (TARGET_NR_Linux + 76) -#define TARGET_NR_getcwd (TARGET_NR_Linux + 77) -#define TARGET_NR_chdir (TARGET_NR_Linux + 78) -#define TARGET_NR_fchdir (TARGET_NR_Linux + 79) -#define TARGET_NR_rename (TARGET_NR_Linux + 80) -#define TARGET_NR_mkdir (TARGET_NR_Linux + 81) -#define TARGET_NR_rmdir (TARGET_NR_Linux + 82) -#define TARGET_NR_creat (TARGET_NR_Linux + 83) -#define TARGET_NR_link (TARGET_NR_Linux + 84) -#define TARGET_NR_unlink (TARGET_NR_Linux + 85) -#define TARGET_NR_symlink (TARGET_NR_Linux + 86) -#define TARGET_NR_readlink (TARGET_NR_Linux + 87) -#define TARGET_NR_chmod (TARGET_NR_Linux + 88) -#define TARGET_NR_fchmod (TARGET_NR_Linux + 89) -#define TARGET_NR_chown (TARGET_NR_Linux + 90) -#define TARGET_NR_fchown (TARGET_NR_Linux + 91) -#define TARGET_NR_lchown (TARGET_NR_Linux + 92) -#define TARGET_NR_umask (TARGET_NR_Linux + 93) -#define TARGET_NR_gettimeofday (TARGET_NR_Linux + 94) -#define TARGET_NR_getrlimit (TARGET_NR_Linux + 95) -#define TARGET_NR_getrusage (TARGET_NR_Linux + 96) -#define TARGET_NR_sysinfo (TARGET_NR_Linux + 97) -#define TARGET_NR_times (TARGET_NR_Linux + 98) -#define TARGET_NR_ptrace (TARGET_NR_Linux + 99) -#define TARGET_NR_getuid (TARGET_NR_Linux + 100) -#define TARGET_NR_syslog (TARGET_NR_Linux + 101) -#define TARGET_NR_getgid (TARGET_NR_Linux + 102) -#define TARGET_NR_setuid (TARGET_NR_Linux + 103) -#define TARGET_NR_setgid (TARGET_NR_Linux + 104) -#define TARGET_NR_geteuid (TARGET_NR_Linux + 105) -#define TARGET_NR_getegid (TARGET_NR_Linux + 106) -#define TARGET_NR_setpgid (TARGET_NR_Linux + 107) -#define TARGET_NR_getppid (TARGET_NR_Linux + 108) -#define TARGET_NR_getpgrp (TARGET_NR_Linux + 109) -#define TARGET_NR_setsid (TARGET_NR_Linux + 110) -#define TARGET_NR_setreuid (TARGET_NR_Linux + 111) -#define TARGET_NR_setregid (TARGET_NR_Linux + 112) -#define TARGET_NR_getgroups (TARGET_NR_Linux + 113) -#define TARGET_NR_setgroups (TARGET_NR_Linux + 114) -#define TARGET_NR_setresuid (TARGET_NR_Linux + 115) -#define TARGET_NR_getresuid (TARGET_NR_Linux + 116) -#define TARGET_NR_setresgid (TARGET_NR_Linux + 117) -#define TARGET_NR_getresgid (TARGET_NR_Linux + 118) -#define TARGET_NR_getpgid (TARGET_NR_Linux + 119) -#define TARGET_NR_setfsuid (TARGET_NR_Linux + 120) -#define TARGET_NR_setfsgid (TARGET_NR_Linux + 121) -#define TARGET_NR_getsid (TARGET_NR_Linux + 122) -#define TARGET_NR_capget (TARGET_NR_Linux + 123) -#define TARGET_NR_capset (TARGET_NR_Linux + 124) -#define TARGET_NR_rt_sigpending (TARGET_NR_Linux + 125) -#define TARGET_NR_rt_sigtimedwait (TARGET_NR_Linux + 126) -#define TARGET_NR_rt_sigqueueinfo (TARGET_NR_Linux + 127) -#define TARGET_NR_rt_sigsuspend (TARGET_NR_Linux + 128) -#define TARGET_NR_sigaltstack (TARGET_NR_Linux + 129) -#define TARGET_NR_utime (TARGET_NR_Linux + 130) -#define TARGET_NR_mknod (TARGET_NR_Linux + 131) -#define TARGET_NR_personality (TARGET_NR_Linux + 132) -#define TARGET_NR_ustat (TARGET_NR_Linux + 133) -#define TARGET_NR_statfs (TARGET_NR_Linux + 134) -#define TARGET_NR_fstatfs (TARGET_NR_Linux + 135) -#define TARGET_NR_sysfs (TARGET_NR_Linux + 136) -#define TARGET_NR_getpriority (TARGET_NR_Linux + 137) -#define TARGET_NR_setpriority (TARGET_NR_Linux + 138) -#define TARGET_NR_sched_setparam (TARGET_NR_Linux + 139) -#define TARGET_NR_sched_getparam (TARGET_NR_Linux + 140) -#define TARGET_NR_sched_setscheduler (TARGET_NR_Linux + 141) -#define TARGET_NR_sched_getscheduler (TARGET_NR_Linux + 142) -#define TARGET_NR_sched_get_priority_max (TARGET_NR_Linux + 143) -#define TARGET_NR_sched_get_priority_min (TARGET_NR_Linux + 144) -#define TARGET_NR_sched_rr_get_interval (TARGET_NR_Linux + 145) -#define TARGET_NR_mlock (TARGET_NR_Linux + 146) -#define TARGET_NR_munlock (TARGET_NR_Linux + 147) -#define TARGET_NR_mlockall (TARGET_NR_Linux + 148) -#define TARGET_NR_munlockall (TARGET_NR_Linux + 149) -#define TARGET_NR_vhangup (TARGET_NR_Linux + 150) -#define TARGET_NR_pivot_root (TARGET_NR_Linux + 151) -#define TARGET_NR__sysctl (TARGET_NR_Linux + 152) -#define TARGET_NR_prctl (TARGET_NR_Linux + 153) -#define TARGET_NR_adjtimex (TARGET_NR_Linux + 154) -#define TARGET_NR_setrlimit (TARGET_NR_Linux + 155) -#define TARGET_NR_chroot (TARGET_NR_Linux + 156) -#define TARGET_NR_sync (TARGET_NR_Linux + 157) -#define TARGET_NR_acct (TARGET_NR_Linux + 158) -#define TARGET_NR_settimeofday (TARGET_NR_Linux + 159) -#define TARGET_NR_mount (TARGET_NR_Linux + 160) -#define TARGET_NR_umount2 (TARGET_NR_Linux + 161) -#define TARGET_NR_swapon (TARGET_NR_Linux + 162) -#define TARGET_NR_swapoff (TARGET_NR_Linux + 163) -#define TARGET_NR_reboot (TARGET_NR_Linux + 164) -#define TARGET_NR_sethostname (TARGET_NR_Linux + 165) -#define TARGET_NR_setdomainname (TARGET_NR_Linux + 166) -#define TARGET_NR_create_module (TARGET_NR_Linux + 167) -#define TARGET_NR_init_module (TARGET_NR_Linux + 168) -#define TARGET_NR_delete_module (TARGET_NR_Linux + 169) -#define TARGET_NR_get_kernel_syms (TARGET_NR_Linux + 170) -#define TARGET_NR_query_module (TARGET_NR_Linux + 171) -#define TARGET_NR_quotactl (TARGET_NR_Linux + 172) -#define TARGET_NR_nfsservctl (TARGET_NR_Linux + 173) -#define TARGET_NR_getpmsg (TARGET_NR_Linux + 174) -#define TARGET_NR_putpmsg (TARGET_NR_Linux + 175) -#define TARGET_NR_afs_syscall (TARGET_NR_Linux + 176) -#define TARGET_NR_reserved177 (TARGET_NR_Linux + 177) -#define TARGET_NR_gettid (TARGET_NR_Linux + 178) -#define TARGET_NR_readahead (TARGET_NR_Linux + 179) -#define TARGET_NR_setxattr (TARGET_NR_Linux + 180) -#define TARGET_NR_lsetxattr (TARGET_NR_Linux + 181) -#define TARGET_NR_fsetxattr (TARGET_NR_Linux + 182) -#define TARGET_NR_getxattr (TARGET_NR_Linux + 183) -#define TARGET_NR_lgetxattr (TARGET_NR_Linux + 184) -#define TARGET_NR_fgetxattr (TARGET_NR_Linux + 185) -#define TARGET_NR_listxattr (TARGET_NR_Linux + 186) -#define TARGET_NR_llistxattr (TARGET_NR_Linux + 187) -#define TARGET_NR_flistxattr (TARGET_NR_Linux + 188) -#define TARGET_NR_removexattr (TARGET_NR_Linux + 189) -#define TARGET_NR_lremovexattr (TARGET_NR_Linux + 190) -#define TARGET_NR_fremovexattr (TARGET_NR_Linux + 191) -#define TARGET_NR_tkill (TARGET_NR_Linux + 192) -#define TARGET_NR_reserved193 (TARGET_NR_Linux + 193) -#define TARGET_NR_futex (TARGET_NR_Linux + 194) -#define TARGET_NR_sched_setaffinity (TARGET_NR_Linux + 195) -#define TARGET_NR_sched_getaffinity (TARGET_NR_Linux + 196) -#define TARGET_NR_cacheflush (TARGET_NR_Linux + 197) -#define TARGET_NR_cachectl (TARGET_NR_Linux + 198) -#define TARGET_NR_sysmips (TARGET_NR_Linux + 199) -#define TARGET_NR_io_setup (TARGET_NR_Linux + 200) -#define TARGET_NR_io_destroy (TARGET_NR_Linux + 201) -#define TARGET_NR_io_getevents (TARGET_NR_Linux + 202) -#define TARGET_NR_io_submit (TARGET_NR_Linux + 203) -#define TARGET_NR_io_cancel (TARGET_NR_Linux + 204) -#define TARGET_NR_exit_group (TARGET_NR_Linux + 205) -#define TARGET_NR_lookup_dcookie (TARGET_NR_Linux + 206) -#define TARGET_NR_epoll_create (TARGET_NR_Linux + 207) -#define TARGET_NR_epoll_ctl (TARGET_NR_Linux + 208) -#define TARGET_NR_epoll_wait (TARGET_NR_Linux + 209) -#define TARGET_NR_remap_file_pages (TARGET_NR_Linux + 210) -#define TARGET_NR_rt_sigreturn (TARGET_NR_Linux + 211) -#define TARGET_NR_set_tid_address (TARGET_NR_Linux + 212) -#define TARGET_NR_restart_syscall (TARGET_NR_Linux + 213) -#define TARGET_NR_semtimedop (TARGET_NR_Linux + 214) -#define TARGET_NR_fadvise64 (TARGET_NR_Linux + 215) -#define TARGET_NR_timer_create (TARGET_NR_Linux + 216) -#define TARGET_NR_timer_settime (TARGET_NR_Linux + 217) -#define TARGET_NR_timer_gettime (TARGET_NR_Linux + 218) -#define TARGET_NR_timer_getoverrun (TARGET_NR_Linux + 219) -#define TARGET_NR_timer_delete (TARGET_NR_Linux + 220) -#define TARGET_NR_clock_settime (TARGET_NR_Linux + 221) -#define TARGET_NR_clock_gettime (TARGET_NR_Linux + 222) -#define TARGET_NR_clock_getres (TARGET_NR_Linux + 223) -#define TARGET_NR_clock_nanosleep (TARGET_NR_Linux + 224) -#define TARGET_NR_tgkill (TARGET_NR_Linux + 225) -#define TARGET_NR_utimes (TARGET_NR_Linux + 226) -#define TARGET_NR_mbind (TARGET_NR_Linux + 227) -#define TARGET_NR_get_mempolicy (TARGET_NR_Linux + 228) -#define TARGET_NR_set_mempolicy (TARGET_NR_Linux + 229) -#define TARGET_NR_mq_open (TARGET_NR_Linux + 230) -#define TARGET_NR_mq_unlink (TARGET_NR_Linux + 231) -#define TARGET_NR_mq_timedsend (TARGET_NR_Linux + 232) -#define TARGET_NR_mq_timedreceive (TARGET_NR_Linux + 233) -#define TARGET_NR_mq_notify (TARGET_NR_Linux + 234) -#define TARGET_NR_mq_getsetattr (TARGET_NR_Linux + 235) -#define TARGET_NR_vserver (TARGET_NR_Linux + 236) -#define TARGET_NR_waitid (TARGET_NR_Linux + 237) -/* #define TARGET_NR_sys_setaltroot (TARGET_NR_Linux + 238) */ -#define TARGET_NR_add_key (TARGET_NR_Linux + 239) -#define TARGET_NR_request_key (TARGET_NR_Linux + 240) -#define TARGET_NR_keyctl (TARGET_NR_Linux + 241) -#define TARGET_NR_set_thread_area (TARGET_NR_Linux + 242) -#define TARGET_NR_inotify_init (TARGET_NR_Linux + 243) -#define TARGET_NR_inotify_add_watch (TARGET_NR_Linux + 244) -#define TARGET_NR_inotify_rm_watch (TARGET_NR_Linux + 245) -#define TARGET_NR_migrate_pages (TARGET_NR_Linux + 246) -#define TARGET_NR_openat (TARGET_NR_Linux + 247) -#define TARGET_NR_mkdirat (TARGET_NR_Linux + 248) -#define TARGET_NR_mknodat (TARGET_NR_Linux + 249) -#define TARGET_NR_fchownat (TARGET_NR_Linux + 250) -#define TARGET_NR_futimesat (TARGET_NR_Linux + 251) -#define TARGET_NR_newfstatat (TARGET_NR_Linux + 252) -#define TARGET_NR_unlinkat (TARGET_NR_Linux + 253) -#define TARGET_NR_renameat (TARGET_NR_Linux + 254) -#define TARGET_NR_linkat (TARGET_NR_Linux + 255) -#define TARGET_NR_symlinkat (TARGET_NR_Linux + 256) -#define TARGET_NR_readlinkat (TARGET_NR_Linux + 257) -#define TARGET_NR_fchmodat (TARGET_NR_Linux + 258) -#define TARGET_NR_faccessat (TARGET_NR_Linux + 259) -#define TARGET_NR_pselect6 (TARGET_NR_Linux + 260) -#define TARGET_NR_ppoll (TARGET_NR_Linux + 261) -#define TARGET_NR_unshare (TARGET_NR_Linux + 262) -#define TARGET_NR_splice (TARGET_NR_Linux + 263) -#define TARGET_NR_sync_file_range (TARGET_NR_Linux + 264) -#define TARGET_NR_tee (TARGET_NR_Linux + 265) -#define TARGET_NR_vmsplice (TARGET_NR_Linux + 266) -#define TARGET_NR_move_pages (TARGET_NR_Linux + 267) -#define TARGET_NR_set_robust_list (TARGET_NR_Linux + 268) -#define TARGET_NR_get_robust_list (TARGET_NR_Linux + 269) -#define TARGET_NR_kexec_load (TARGET_NR_Linux + 270) -#define TARGET_NR_getcpu (TARGET_NR_Linux + 271) -#define TARGET_NR_epoll_pwait (TARGET_NR_Linux + 272) -#define TARGET_NR_ioprio_set (TARGET_NR_Linux + 273) -#define TARGET_NR_ioprio_get (TARGET_NR_Linux + 274) -#define TARGET_NR_utimensat (TARGET_NR_Linux + 275) -#define TARGET_NR_signalfd (TARGET_NR_Linux + 276) -#define TARGET_NR_timerfd (TARGET_NR_Linux + 277) -#define TARGET_NR_eventfd (TARGET_NR_Linux + 278) -#define TARGET_NR_fallocate (TARGET_NR_Linux + 279) -#define TARGET_NR_timerfd_create (TARGET_NR_Linux + 280) -#define TARGET_NR_timerfd_gettime (TARGET_NR_Linux + 281) -#define TARGET_NR_timerfd_settime (TARGET_NR_Linux + 282) -#define TARGET_NR_signalfd4 (TARGET_NR_Linux + 283) -#define TARGET_NR_eventfd2 (TARGET_NR_Linux + 284) -#define TARGET_NR_epoll_create1 (TARGET_NR_Linux + 285) -#define TARGET_NR_dup3 (TARGET_NR_Linux + 286) -#define TARGET_NR_pipe2 (TARGET_NR_Linux + 287) -#define TARGET_NR_inotify_init1 (TARGET_NR_Linux + 288) -#define TARGET_NR_preadv (TARGET_NR_Linux + 289) -#define TARGET_NR_pwritev (TARGET_NR_Linux + 290) -#define TARGET_NR_rt_tgsigqueueinfo (TARGET_NR_Linux + 291) -#define TARGET_NR_perf_event_open (TARGET_NR_Linux + 292) -#define TARGET_NR_accept4 (TARGET_NR_Linux + 293) -#define TARGET_NR_recvmmsg (TARGET_NR_Linux + 294) -#define TARGET_NR_fanotify_init (TARGET_NR_Linux + 295) -#define TARGET_NR_fanotify_mark (TARGET_NR_Linux + 296) -#define TARGET_NR_prlimit64 (TARGET_NR_Linux + 297) -#define TARGET_NR_name_to_handle_at (TARGET_NR_Linux + 298) -#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 299) -#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 300) -#define TARGET_NR_syncfs (TARGET_NR_Linux + 301) -#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 302) -#define TARGET_NR_setns (TARGET_NR_Linux + 303) -#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 304) -#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 305) -#define TARGET_NR_kcmp (TARGET_NR_Linux + 306) -#define TARGET_NR_finit_module (TARGET_NR_Linux + 307) -#define TARGET_NR_getdents64 (TARGET_NR_Linux + 308) -#define TARGET_NR_sched_setattr (TARGET_NR_Linux + 309) -#define TARGET_NR_sched_getattr (TARGET_NR_Linux + 310) -#define TARGET_NR_renameat2 (TARGET_NR_Linux + 311) -#define TARGET_NR_seccomp (TARGET_NR_Linux + 312) -#define TARGET_NR_getrandom (TARGET_NR_Linux + 313) -#define TARGET_NR_memfd_create (TARGET_NR_Linux + 314) -#define TARGET_NR_bpf (TARGET_NR_Linux + 315) -#define TARGET_NR_execveat (TARGET_NR_Linux + 316) -#define TARGET_NR_userfaultfd (TARGET_NR_Linux + 317) -#define TARGET_NR_membarrier (TARGET_NR_Linux + 318) -#define TARGET_NR_mlock2 (TARGET_NR_Linux + 319) -#endif diff --git a/qemu/linux-user/mips64/target_cpu.h b/qemu/linux-user/mips64/target_cpu.h deleted file mode 100644 index f16991b4e..000000000 --- a/qemu/linux-user/mips64/target_cpu.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * MIPS64 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#include "../mips/target_cpu.h" diff --git a/qemu/linux-user/mips64/target_signal.h b/qemu/linux-user/mips64/target_signal.h deleted file mode 100644 index 5fb6a2ccf..000000000 --- a/qemu/linux-user/mips64/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_long ss_sp; - abi_ulong ss_size; - abi_int ss_flags; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUMIPSState *state) -{ - return state->active_tc.gpr[29]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/mips64/target_structs.h b/qemu/linux-user/mips64/target_structs.h deleted file mode 100644 index a4f619e73..000000000 --- a/qemu/linux-user/mips64/target_structs.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "../mips/target_structs.h" - diff --git a/qemu/linux-user/mips64/target_syscall.h b/qemu/linux-user/mips64/target_syscall.h deleted file mode 100644 index 0e0c2d232..000000000 --- a/qemu/linux-user/mips64/target_syscall.h +++ /dev/null @@ -1,234 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* this struct defines the way the registers are stored on the - stack during a system call. */ - -struct target_pt_regs { - /* Saved main processor registers. */ - target_ulong regs[32]; - - /* Saved special registers. */ - target_ulong cp0_status; - target_ulong lo; - target_ulong hi; - target_ulong cp0_badvaddr; - target_ulong cp0_cause; - target_ulong cp0_epc; -}; - -/* Target errno definitions taken from asm-mips/errno.h */ -#undef TARGET_ENOMSG -#define TARGET_ENOMSG 35 /* Identifier removed */ -#undef TARGET_EIDRM -#define TARGET_EIDRM 36 /* Identifier removed */ -#undef TARGET_ECHRNG -#define TARGET_ECHRNG 37 /* Channel number out of range */ -#undef TARGET_EL2NSYNC -#define TARGET_EL2NSYNC 38 /* Level 2 not synchronized */ -#undef TARGET_EL3HLT -#define TARGET_EL3HLT 39 /* Level 3 halted */ -#undef TARGET_EL3RST -#define TARGET_EL3RST 40 /* Level 3 reset */ -#undef TARGET_ELNRNG -#define TARGET_ELNRNG 41 /* Link number out of range */ -#undef TARGET_EUNATCH -#define TARGET_EUNATCH 42 /* Protocol driver not attached */ -#undef TARGET_ENOCSI -#define TARGET_ENOCSI 43 /* No CSI structure available */ -#undef TARGET_EL2HLT -#define TARGET_EL2HLT 44 /* Level 2 halted */ -#undef TARGET_EDEADLK -#define TARGET_EDEADLK 45 /* Resource deadlock would occur */ -#undef TARGET_ENOLCK -#define TARGET_ENOLCK 46 /* No record locks available */ -#undef TARGET_EBADE -#define TARGET_EBADE 50 /* Invalid exchange */ -#undef TARGET_EBADR -#define TARGET_EBADR 51 /* Invalid request descriptor */ -#undef TARGET_EXFULL -#define TARGET_EXFULL 52 /* TARGET_Exchange full */ -#undef TARGET_ENOANO -#define TARGET_ENOANO 53 /* No anode */ -#undef TARGET_EBADRQC -#define TARGET_EBADRQC 54 /* Invalid request code */ -#undef TARGET_EBADSLT -#define TARGET_EBADSLT 55 /* Invalid slot */ -#undef TARGET_EDEADLOCK -#define TARGET_EDEADLOCK 56 /* File locking deadlock error */ -#undef TARGET_EBFONT -#define TARGET_EBFONT 59 /* Bad font file format */ -#undef TARGET_ENOSTR -#define TARGET_ENOSTR 60 /* Device not a stream */ -#undef TARGET_ENODATA -#define TARGET_ENODATA 61 /* No data available */ -#undef TARGET_ETIME -#define TARGET_ETIME 62 /* Timer expired */ -#undef TARGET_ENOSR -#define TARGET_ENOSR 63 /* Out of streams resources */ -#undef TARGET_ENONET -#define TARGET_ENONET 64 /* Machine is not on the network */ -#undef TARGET_ENOPKG -#define TARGET_ENOPKG 65 /* Package not installed */ -#undef TARGET_EREMOTE -#define TARGET_EREMOTE 66 /* Object is remote */ -#undef TARGET_ENOLINK -#define TARGET_ENOLINK 67 /* Link has been severed */ -#undef TARGET_EADV -#define TARGET_EADV 68 /* Advertise error */ -#undef TARGET_ESRMNT -#define TARGET_ESRMNT 69 /* Srmount error */ -#undef TARGET_ECOMM -#define TARGET_ECOMM 70 /* Communication error on send */ -#undef TARGET_EPROTO -#define TARGET_EPROTO 71 /* Protocol error */ -#undef TARGET_EDOTDOT -#define TARGET_EDOTDOT 73 /* RFS specific error */ -#undef TARGET_EMULTIHOP -#define TARGET_EMULTIHOP 74 /* Multihop attempted */ -#undef TARGET_EBADMSG -#define TARGET_EBADMSG 77 /* Not a data message */ -#undef TARGET_ENAMETOOLONG -#define TARGET_ENAMETOOLONG 78 /* File name too long */ -#undef TARGET_EOVERFLOW -#define TARGET_EOVERFLOW 79 /* Value too large for defined data type */ -#undef TARGET_ENOTUNIQ -#define TARGET_ENOTUNIQ 80 /* Name not unique on network */ -#undef TARGET_EBADFD -#define TARGET_EBADFD 81 /* File descriptor in bad state */ -#undef TARGET_EREMCHG -#define TARGET_EREMCHG 82 /* Remote address changed */ -#undef TARGET_ELIBACC -#define TARGET_ELIBACC 83 /* Can not access a needed shared library */ -#undef TARGET_ELIBBAD -#define TARGET_ELIBBAD 84 /* Accessing a corrupted shared library */ -#undef TARGET_ELIBSCN -#define TARGET_ELIBSCN 85 /* .lib section in a.out corrupted */ -#undef TARGET_ELIBMAX -#define TARGET_ELIBMAX 86 /* Attempting to link in too many shared libraries */ -#undef TARGET_ELIBEXEC -#define TARGET_ELIBEXEC 87 /* Cannot exec a shared library directly */ -#undef TARGET_EILSEQ -#define TARGET_EILSEQ 88 /* Illegal byte sequence */ -#undef TARGET_ENOSYS -#define TARGET_ENOSYS 89 /* Function not implemented */ -#undef TARGET_ELOOP -#define TARGET_ELOOP 90 /* Too many symbolic links encountered */ -#undef TARGET_ERESTART -#define TARGET_ERESTART 91 /* Interrupted system call should be restarted */ -#undef TARGET_ESTRPIPE -#define TARGET_ESTRPIPE 92 /* Streams pipe error */ -#undef TARGET_ENOTEMPTY -#define TARGET_ENOTEMPTY 93 /* Directory not empty */ -#undef TARGET_EUSERS -#define TARGET_EUSERS 94 /* Too many users */ -#undef TARGET_ENOTSOCK -#define TARGET_ENOTSOCK 95 /* Socket operation on non-socket */ -#undef TARGET_EDESTADDRREQ -#define TARGET_EDESTADDRREQ 96 /* Destination address required */ -#undef TARGET_EMSGSIZE -#define TARGET_EMSGSIZE 97 /* Message too long */ -#undef TARGET_EPROTOTYPE -#define TARGET_EPROTOTYPE 98 /* Protocol wrong type for socket */ -#undef TARGET_ENOPROTOOPT -#define TARGET_ENOPROTOOPT 99 /* Protocol not available */ -#undef TARGET_EPROTONOSUPPORT -#define TARGET_EPROTONOSUPPORT 120 /* Protocol not supported */ -#undef TARGET_ESOCKTNOSUPPORT -#define TARGET_ESOCKTNOSUPPORT 121 /* Socket type not supported */ -#undef TARGET_EOPNOTSUPP -#define TARGET_EOPNOTSUPP 122 /* Operation not supported on transport endpoint */ -#undef TARGET_EPFNOSUPPORT -#define TARGET_EPFNOSUPPORT 123 /* Protocol family not supported */ -#undef TARGET_EAFNOSUPPORT -#define TARGET_EAFNOSUPPORT 124 /* Address family not supported by protocol */ -#undef TARGET_EADDRINUSE -#define TARGET_EADDRINUSE 125 /* Address already in use */ -#undef TARGET_EADDRNOTAVAIL -#define TARGET_EADDRNOTAVAIL 126 /* Cannot assign requested address */ -#undef TARGET_ENETDOWN -#define TARGET_ENETDOWN 127 /* Network is down */ -#undef TARGET_ENETUNREACH -#define TARGET_ENETUNREACH 128 /* Network is unreachable */ -#undef TARGET_ENETRESET -#define TARGET_ENETRESET 129 /* Network dropped connection because of reset */ -#undef TARGET_ECONNABORTED -#define TARGET_ECONNABORTED 130 /* Software caused connection abort */ -#undef TARGET_ECONNRESET -#define TARGET_ECONNRESET 131 /* Connection reset by peer */ -#undef TARGET_ENOBUFS -#define TARGET_ENOBUFS 132 /* No buffer space available */ -#undef TARGET_EISCONN -#define TARGET_EISCONN 133 /* Transport endpoint is already connected */ -#undef TARGET_ENOTCONN -#define TARGET_ENOTCONN 134 /* Transport endpoint is not connected */ -#undef TARGET_EUCLEAN -#define TARGET_EUCLEAN 135 /* Structure needs cleaning */ -#undef TARGET_ENOTNAM -#define TARGET_ENOTNAM 137 /* Not a XENIX named type file */ -#undef TARGET_ENAVAIL -#define TARGET_ENAVAIL 138 /* No XENIX semaphores available */ -#undef TARGET_EISNAM -#define TARGET_EISNAM 139 /* Is a named type file */ -#undef TARGET_EREMOTEIO -#define TARGET_EREMOTEIO 140 /* Remote I/O error */ -#undef TARGET_EINIT -#define TARGET_EINIT 141 /* Reserved */ -#undef TARGET_EREMDEV -#define TARGET_EREMDEV 142 /* TARGET_Error 142 */ -#undef TARGET_ESHUTDOWN -#define TARGET_ESHUTDOWN 143 /* Cannot send after transport endpoint shutdown */ -#undef TARGET_ETOOMANYREFS -#define TARGET_ETOOMANYREFS 144 /* Too many references: cannot splice */ -#undef TARGET_ETIMEDOUT -#define TARGET_ETIMEDOUT 145 /* Connection timed out */ -#undef TARGET_ECONNREFUSED -#define TARGET_ECONNREFUSED 146 /* Connection refused */ -#undef TARGET_EHOSTDOWN -#define TARGET_EHOSTDOWN 147 /* Host is down */ -#undef TARGET_EHOSTUNREACH -#define TARGET_EHOSTUNREACH 148 /* No route to host */ -#undef TARGET_EALREADY -#define TARGET_EALREADY 149 /* Operation already in progress */ -#undef TARGET_EINPROGRESS -#define TARGET_EINPROGRESS 150 /* Operation now in progress */ -#undef TARGET_ESTALE -#define TARGET_ESTALE 151 /* Stale NFS file handle */ -#undef TARGET_ECANCELED -#define TARGET_ECANCELED 158 /* AIO operation canceled */ -/* - * These error are Linux extensions. - */ -#undef TARGET_ENOMEDIUM -#define TARGET_ENOMEDIUM 159 /* No medium found */ -#undef TARGET_EMEDIUMTYPE -#define TARGET_EMEDIUMTYPE 160 /* Wrong medium type */ -#undef TARGET_ENOKEY -#define TARGET_ENOKEY 161 /* Required key not available */ -#undef TARGET_EKEYEXPIRED -#define TARGET_EKEYEXPIRED 162 /* Key has expired */ -#undef TARGET_EKEYREVOKED -#define TARGET_EKEYREVOKED 163 /* Key has been revoked */ -#undef TARGET_EKEYREJECTED -#define TARGET_EKEYREJECTED 164 /* Key was rejected by service */ - -/* for robust mutexes */ -#undef TARGET_EOWNERDEAD -#define TARGET_EOWNERDEAD 165 /* Owner died */ -#undef TARGET_ENOTRECOVERABLE -#define TARGET_ENOTRECOVERABLE 166 /* State not recoverable */ - - - -/* Nasty hack: define a fake errno value for use by sigreturn. */ -#define TARGET_QEMU_ESIGRETURN 255 - -#define UNAME_MACHINE "mips64" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/mips64/termbits.h b/qemu/linux-user/mips64/termbits.h deleted file mode 100644 index d3a6cf8f9..000000000 --- a/qemu/linux-user/mips64/termbits.h +++ /dev/null @@ -1,245 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 23 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_IEXTEN 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_TOSTOP 0100000 -#define TARGET_ITOSTOP TARGET_TOSTOP - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VMIN 4 -#define TARGET_VTIME 5 -#define TARGET_VEOL2 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -/* VDSUSP not supported */ -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOF 16 -#define TARGET_VEOL 17 - -/* ioctls */ - -#define TARGET_TCGETA 0x5401 -#define TARGET_TCSETA 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */ -#define TARGET_TCSETAW 0x5403 -#define TARGET_TCSETAF 0x5404 - -#define TARGET_TCSBRK 0x5405 -#define TARGET_TCXONC 0x5406 -#define TARGET_TCFLSH 0x5407 - -#define TARGET_TCGETS 0x540d -#define TARGET_TCSETS 0x540e -#define TARGET_TCSETSW 0x540f -#define TARGET_TCSETSF 0x5410 - -#define TARGET_TIOCEXCL 0x740d /* set exclusive use of tty */ -#define TARGET_TIOCNXCL 0x740e /* reset exclusive use of tty */ -#define TARGET_TIOCOUTQ 0x7472 /* output queue size */ -#define TARGET_TIOCSTI 0x5472 /* simulate terminal input */ -#define TARGET_TIOCMGET 0x741d /* get all modem bits */ -#define TARGET_TIOCMBIS 0x741b /* bis modem bits */ -#define TARGET_TIOCMBIC 0x741c /* bic modem bits */ -#define TARGET_TIOCMSET 0x741a /* set all modem bits */ -#define TARGET_TIOCPKT 0x5470 /* pty: set/clear packet mode */ -#define TARGET_TIOCPKT_DATA 0x00 /* data packet */ -#define TARGET_TIOCPKT_FLUSHREAD 0x01 /* flush packet */ -#define TARGET_TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ -#define TARGET_TIOCPKT_STOP 0x04 /* stop output */ -#define TARGET_TIOCPKT_START 0x08 /* start output */ -#define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ -#define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ -/* #define TIOCPKT_IOCTL 0x40 state change of pty driver */ -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) /* set window size */ -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) /* get window size */ -#define TARGET_TIOCNOTTY 0x5471 /* void tty association */ -#define TARGET_TIOCSETD 0x7401 -#define TARGET_TIOCGETD 0x7400 - -#define TARGET_FIOCLEX 0x6601 -#define TARGET_FIONCLEX 0x6602 -#define TARGET_FIOASYNC 0x667d -#define TARGET_FIONBIO 0x667e -#define TARGET_FIOQSIZE 0x667f - -#define TARGET_TIOCGLTC 0x7474 /* get special local chars */ -#define TARGET_TIOCSLTC 0x7475 /* set special local chars */ -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) /* set pgrp of tty */ -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) /* get pgrp of tty */ -#define TARGET_TIOCCONS TARGET_IOW('t', 120, int) /* become virtual console */ - -#define TARGET_FIONREAD 0x467f -#define TARGET_TIOCINQ TARGET_FIONREAD - -#define TARGET_TIOCGETP 0x7408 -#define TARGET_TIOCSETP 0x7409 -#define TARGET_TIOCSETN 0x740a /* TIOCSETP wo flush */ - -/* #define TARGET_TIOCSETA TARGET_IOW('t', 20, struct termios) set termios struct */ -/* #define TARGET_TIOCSETAW TARGET_IOW('t', 21, struct termios) drain output, set */ -/* #define TARGET_TIOCSETAF TARGET_IOW('t', 22, struct termios) drn out, fls in, set */ -/* #define TARGET_TIOCGETD TARGET_IOR('t', 26, int) get line discipline */ -/* #define TARGET_TIOCSETD TARGET_IOW('t', 27, int) set line discipline */ - /* 127-124 compat */ - -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x7416 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -/* I hope the range from 0x5480 on is free ... */ -#define TARGET_TIOCSCTTY 0x5480 /* become controlling tty */ -#define TARGET_TIOCGSOFTCAR 0x5481 -#define TARGET_TIOCSSOFTCAR 0x5482 -#define TARGET_TIOCLINUX 0x5483 -#define TARGET_TIOCGSERIAL 0x5484 -#define TARGET_TIOCSSERIAL 0x5485 -#define TARGET_TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSERCONFIG 0x5488 -#define TARGET_TIOCSERGWILD 0x5489 -#define TARGET_TIOCSERSWILD 0x548a -#define TARGET_TIOCGLCKTRMIOS 0x548b -#define TARGET_TIOCSLCKTRMIOS 0x548c -#define TARGET_TIOCSERGSTRUCT 0x548d /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x548e /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x548f /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x5490 /* Set multiport config */ -#define TARGET_TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */ diff --git a/qemu/linux-user/mmap.c b/qemu/linux-user/mmap.c deleted file mode 100644 index 3519147bc..000000000 --- a/qemu/linux-user/mmap.c +++ /dev/null @@ -1,768 +0,0 @@ -/* - * mmap support for qemu - * - * Copyright (c) 2003 Fabrice Bellard - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#include "qemu/osdep.h" -#include <sys/mman.h> -#include <linux/mman.h> -#include <linux/unistd.h> - -#include "qemu.h" -#include "qemu-common.h" -#include "translate-all.h" - -//#define DEBUG_MMAP - -static pthread_mutex_t mmap_mutex = PTHREAD_MUTEX_INITIALIZER; -static __thread int mmap_lock_count; - -void mmap_lock(void) -{ - if (mmap_lock_count++ == 0) { - pthread_mutex_lock(&mmap_mutex); - } -} - -void mmap_unlock(void) -{ - if (--mmap_lock_count == 0) { - pthread_mutex_unlock(&mmap_mutex); - } -} - -/* Grab lock to make sure things are in a consistent state after fork(). */ -void mmap_fork_start(void) -{ - if (mmap_lock_count) - abort(); - pthread_mutex_lock(&mmap_mutex); -} - -void mmap_fork_end(int child) -{ - if (child) - pthread_mutex_init(&mmap_mutex, NULL); - else - pthread_mutex_unlock(&mmap_mutex); -} - -/* NOTE: all the constants are the HOST ones, but addresses are target. */ -int target_mprotect(abi_ulong start, abi_ulong len, int prot) -{ - abi_ulong end, host_start, host_end, addr; - int prot1, ret; - -#ifdef DEBUG_MMAP - printf("mprotect: start=0x" TARGET_ABI_FMT_lx - "len=0x" TARGET_ABI_FMT_lx " prot=%c%c%c\n", start, len, - prot & PROT_READ ? 'r' : '-', - prot & PROT_WRITE ? 'w' : '-', - prot & PROT_EXEC ? 'x' : '-'); -#endif - - if ((start & ~TARGET_PAGE_MASK) != 0) - return -EINVAL; - len = TARGET_PAGE_ALIGN(len); - end = start + len; - if (end < start) - return -EINVAL; - prot &= PROT_READ | PROT_WRITE | PROT_EXEC; - if (len == 0) - return 0; - - mmap_lock(); - host_start = start & qemu_host_page_mask; - host_end = HOST_PAGE_ALIGN(end); - if (start > host_start) { - /* handle host page containing start */ - prot1 = prot; - for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) { - prot1 |= page_get_flags(addr); - } - if (host_end == host_start + qemu_host_page_size) { - for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) { - prot1 |= page_get_flags(addr); - } - end = host_end; - } - ret = mprotect(g2h(host_start), qemu_host_page_size, prot1 & PAGE_BITS); - if (ret != 0) - goto error; - host_start += qemu_host_page_size; - } - if (end < host_end) { - prot1 = prot; - for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) { - prot1 |= page_get_flags(addr); - } - ret = mprotect(g2h(host_end - qemu_host_page_size), qemu_host_page_size, - prot1 & PAGE_BITS); - if (ret != 0) - goto error; - host_end -= qemu_host_page_size; - } - - /* handle the pages in the middle */ - if (host_start < host_end) { - ret = mprotect(g2h(host_start), host_end - host_start, prot); - if (ret != 0) - goto error; - } - page_set_flags(start, start + len, prot | PAGE_VALID); - mmap_unlock(); - return 0; -error: - mmap_unlock(); - return ret; -} - -/* map an incomplete host page */ -static int mmap_frag(abi_ulong real_start, - abi_ulong start, abi_ulong end, - int prot, int flags, int fd, abi_ulong offset) -{ - abi_ulong real_end, addr; - void *host_start; - int prot1, prot_new; - - real_end = real_start + qemu_host_page_size; - host_start = g2h(real_start); - - /* get the protection of the target pages outside the mapping */ - prot1 = 0; - for(addr = real_start; addr < real_end; addr++) { - if (addr < start || addr >= end) - prot1 |= page_get_flags(addr); - } - - if (prot1 == 0) { - /* no page was there, so we allocate one */ - void *p = mmap(host_start, qemu_host_page_size, prot, - flags | MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED) - return -1; - prot1 = prot; - } - prot1 &= PAGE_BITS; - - prot_new = prot | prot1; - if (!(flags & MAP_ANONYMOUS)) { - /* msync() won't work here, so we return an error if write is - possible while it is a shared mapping */ - if ((flags & MAP_TYPE) == MAP_SHARED && - (prot & PROT_WRITE)) - return -1; - - /* adjust protection to be able to read */ - if (!(prot1 & PROT_WRITE)) - mprotect(host_start, qemu_host_page_size, prot1 | PROT_WRITE); - - /* read the corresponding file data */ - if (pread(fd, g2h(start), end - start, offset) == -1) - return -1; - - /* put final protection */ - if (prot_new != (prot1 | PROT_WRITE)) - mprotect(host_start, qemu_host_page_size, prot_new); - } else { - if (prot_new != prot1) { - mprotect(host_start, qemu_host_page_size, prot_new); - } - if (prot_new & PROT_WRITE) { - memset(g2h(start), 0, end - start); - } - } - return 0; -} - -#if HOST_LONG_BITS == 64 && TARGET_ABI_BITS == 64 -# define TASK_UNMAPPED_BASE (1ul << 38) -#elif defined(__CYGWIN__) -/* Cygwin doesn't have a whole lot of address space. */ -# define TASK_UNMAPPED_BASE 0x18000000 -#else -# define TASK_UNMAPPED_BASE 0x40000000 -#endif -abi_ulong mmap_next_start = TASK_UNMAPPED_BASE; - -unsigned long last_brk; - -/* Subroutine of mmap_find_vma, used when we have pre-allocated a chunk - of guest address space. */ -static abi_ulong mmap_find_vma_reserved(abi_ulong start, abi_ulong size) -{ - abi_ulong addr; - abi_ulong end_addr; - int prot; - int looped = 0; - - if (size > reserved_va) { - return (abi_ulong)-1; - } - - size = HOST_PAGE_ALIGN(size); - end_addr = start + size; - if (end_addr > reserved_va) { - end_addr = reserved_va; - } - addr = end_addr - qemu_host_page_size; - - while (1) { - if (addr > end_addr) { - if (looped) { - return (abi_ulong)-1; - } - end_addr = reserved_va; - addr = end_addr - qemu_host_page_size; - looped = 1; - continue; - } - prot = page_get_flags(addr); - if (prot) { - end_addr = addr; - } - if (addr + size == end_addr) { - break; - } - addr -= qemu_host_page_size; - } - - if (start == mmap_next_start) { - mmap_next_start = addr; - } - - return addr; -} - -/* - * Find and reserve a free memory area of size 'size'. The search - * starts at 'start'. - * It must be called with mmap_lock() held. - * Return -1 if error. - */ -abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size) -{ - void *ptr, *prev; - abi_ulong addr; - int wrapped, repeat; - - /* If 'start' == 0, then a default start address is used. */ - if (start == 0) { - start = mmap_next_start; - } else { - start &= qemu_host_page_mask; - } - - size = HOST_PAGE_ALIGN(size); - - if (reserved_va) { - return mmap_find_vma_reserved(start, size); - } - - addr = start; - wrapped = repeat = 0; - prev = 0; - - for (;; prev = ptr) { - /* - * Reserve needed memory area to avoid a race. - * It should be discarded using: - * - mmap() with MAP_FIXED flag - * - mremap() with MREMAP_FIXED flag - * - shmat() with SHM_REMAP flag - */ - ptr = mmap(g2h(addr), size, PROT_NONE, - MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0); - - /* ENOMEM, if host address space has no memory */ - if (ptr == MAP_FAILED) { - return (abi_ulong)-1; - } - - /* Count the number of sequential returns of the same address. - This is used to modify the search algorithm below. */ - repeat = (ptr == prev ? repeat + 1 : 0); - - if (h2g_valid(ptr + size - 1)) { - addr = h2g(ptr); - - if ((addr & ~TARGET_PAGE_MASK) == 0) { - /* Success. */ - if (start == mmap_next_start && addr >= TASK_UNMAPPED_BASE) { - mmap_next_start = addr + size; - } - return addr; - } - - /* The address is not properly aligned for the target. */ - switch (repeat) { - case 0: - /* Assume the result that the kernel gave us is the - first with enough free space, so start again at the - next higher target page. */ - addr = TARGET_PAGE_ALIGN(addr); - break; - case 1: - /* Sometimes the kernel decides to perform the allocation - at the top end of memory instead. */ - addr &= TARGET_PAGE_MASK; - break; - case 2: - /* Start over at low memory. */ - addr = 0; - break; - default: - /* Fail. This unaligned block must the last. */ - addr = -1; - break; - } - } else { - /* Since the result the kernel gave didn't fit, start - again at low memory. If any repetition, fail. */ - addr = (repeat ? -1 : 0); - } - - /* Unmap and try again. */ - munmap(ptr, size); - - /* ENOMEM if we checked the whole of the target address space. */ - if (addr == (abi_ulong)-1) { - return (abi_ulong)-1; - } else if (addr == 0) { - if (wrapped) { - return (abi_ulong)-1; - } - wrapped = 1; - /* Don't actually use 0 when wrapping, instead indicate - that we'd truly like an allocation in low memory. */ - addr = (mmap_min_addr > TARGET_PAGE_SIZE - ? TARGET_PAGE_ALIGN(mmap_min_addr) - : TARGET_PAGE_SIZE); - } else if (wrapped && addr >= start) { - return (abi_ulong)-1; - } - } -} - -/* NOTE: all the constants are the HOST ones */ -abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, - int flags, int fd, abi_ulong offset) -{ - abi_ulong ret, end, real_start, real_end, retaddr, host_offset, host_len; - - mmap_lock(); -#ifdef DEBUG_MMAP - { - printf("mmap: start=0x" TARGET_ABI_FMT_lx - " len=0x" TARGET_ABI_FMT_lx " prot=%c%c%c flags=", - start, len, - prot & PROT_READ ? 'r' : '-', - prot & PROT_WRITE ? 'w' : '-', - prot & PROT_EXEC ? 'x' : '-'); - if (flags & MAP_FIXED) - printf("MAP_FIXED "); - if (flags & MAP_ANONYMOUS) - printf("MAP_ANON "); - switch(flags & MAP_TYPE) { - case MAP_PRIVATE: - printf("MAP_PRIVATE "); - break; - case MAP_SHARED: - printf("MAP_SHARED "); - break; - default: - printf("[MAP_TYPE=0x%x] ", flags & MAP_TYPE); - break; - } - printf("fd=%d offset=" TARGET_ABI_FMT_lx "\n", fd, offset); - } -#endif - - if (offset & ~TARGET_PAGE_MASK) { - errno = EINVAL; - goto fail; - } - - len = TARGET_PAGE_ALIGN(len); - if (len == 0) - goto the_end; - real_start = start & qemu_host_page_mask; - host_offset = offset & qemu_host_page_mask; - - /* If the user is asking for the kernel to find a location, do that - before we truncate the length for mapping files below. */ - if (!(flags & MAP_FIXED)) { - host_len = len + offset - host_offset; - host_len = HOST_PAGE_ALIGN(host_len); - start = mmap_find_vma(real_start, host_len); - if (start == (abi_ulong)-1) { - errno = ENOMEM; - goto fail; - } - } - - /* When mapping files into a memory area larger than the file, accesses - to pages beyond the file size will cause a SIGBUS. - - For example, if mmaping a file of 100 bytes on a host with 4K pages - emulating a target with 8K pages, the target expects to be able to - access the first 8K. But the host will trap us on any access beyond - 4K. - - When emulating a target with a larger page-size than the hosts, we - may need to truncate file maps at EOF and add extra anonymous pages - up to the targets page boundary. */ - - if ((qemu_real_host_page_size < TARGET_PAGE_SIZE) - && !(flags & MAP_ANONYMOUS)) { - struct stat sb; - - if (fstat (fd, &sb) == -1) - goto fail; - - /* Are we trying to create a map beyond EOF?. */ - if (offset + len > sb.st_size) { - /* If so, truncate the file map at eof aligned with - the hosts real pagesize. Additional anonymous maps - will be created beyond EOF. */ - len = REAL_HOST_PAGE_ALIGN(sb.st_size - offset); - } - } - - if (!(flags & MAP_FIXED)) { - unsigned long host_start; - void *p; - - host_len = len + offset - host_offset; - host_len = HOST_PAGE_ALIGN(host_len); - - /* Note: we prefer to control the mapping address. It is - especially important if qemu_host_page_size > - qemu_real_host_page_size */ - p = mmap(g2h(start), host_len, prot, - flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED) - goto fail; - /* update start so that it points to the file position at 'offset' */ - host_start = (unsigned long)p; - if (!(flags & MAP_ANONYMOUS)) { - p = mmap(g2h(start), len, prot, - flags | MAP_FIXED, fd, host_offset); - if (p == MAP_FAILED) { - munmap(g2h(start), host_len); - goto fail; - } - host_start += offset - host_offset; - } - start = h2g(host_start); - } else { - if (start & ~TARGET_PAGE_MASK) { - errno = EINVAL; - goto fail; - } - end = start + len; - real_end = HOST_PAGE_ALIGN(end); - - /* - * Test if requested memory area fits target address space - * It can fail only on 64-bit host with 32-bit target. - * On any other target/host host mmap() handles this error correctly. - */ - if ((unsigned long)start + len - 1 > (abi_ulong) -1) { - errno = EINVAL; - goto fail; - } - - /* worst case: we cannot map the file because the offset is not - aligned, so we read it */ - if (!(flags & MAP_ANONYMOUS) && - (offset & ~qemu_host_page_mask) != (start & ~qemu_host_page_mask)) { - /* msync() won't work here, so we return an error if write is - possible while it is a shared mapping */ - if ((flags & MAP_TYPE) == MAP_SHARED && - (prot & PROT_WRITE)) { - errno = EINVAL; - goto fail; - } - retaddr = target_mmap(start, len, prot | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, - -1, 0); - if (retaddr == -1) - goto fail; - if (pread(fd, g2h(start), len, offset) == -1) - goto fail; - if (!(prot & PROT_WRITE)) { - ret = target_mprotect(start, len, prot); - assert(ret == 0); - } - goto the_end; - } - - /* handle the start of the mapping */ - if (start > real_start) { - if (real_end == real_start + qemu_host_page_size) { - /* one single host page */ - ret = mmap_frag(real_start, start, end, - prot, flags, fd, offset); - if (ret == -1) - goto fail; - goto the_end1; - } - ret = mmap_frag(real_start, start, real_start + qemu_host_page_size, - prot, flags, fd, offset); - if (ret == -1) - goto fail; - real_start += qemu_host_page_size; - } - /* handle the end of the mapping */ - if (end < real_end) { - ret = mmap_frag(real_end - qemu_host_page_size, - real_end - qemu_host_page_size, end, - prot, flags, fd, - offset + real_end - qemu_host_page_size - start); - if (ret == -1) - goto fail; - real_end -= qemu_host_page_size; - } - - /* map the middle (easier) */ - if (real_start < real_end) { - void *p; - unsigned long offset1; - if (flags & MAP_ANONYMOUS) - offset1 = 0; - else - offset1 = offset + real_start - start; - p = mmap(g2h(real_start), real_end - real_start, - prot, flags, fd, offset1); - if (p == MAP_FAILED) - goto fail; - } - } - the_end1: - page_set_flags(start, start + len, prot | PAGE_VALID); - the_end: -#ifdef DEBUG_MMAP - printf("ret=0x" TARGET_ABI_FMT_lx "\n", start); - page_dump(stdout); - printf("\n"); -#endif - tb_invalidate_phys_range(start, start + len); - mmap_unlock(); - return start; -fail: - mmap_unlock(); - return -1; -} - -static void mmap_reserve(abi_ulong start, abi_ulong size) -{ - abi_ulong real_start; - abi_ulong real_end; - abi_ulong addr; - abi_ulong end; - int prot; - - real_start = start & qemu_host_page_mask; - real_end = HOST_PAGE_ALIGN(start + size); - end = start + size; - if (start > real_start) { - /* handle host page containing start */ - prot = 0; - for (addr = real_start; addr < start; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - if (real_end == real_start + qemu_host_page_size) { - for (addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - end = real_end; - } - if (prot != 0) - real_start += qemu_host_page_size; - } - if (end < real_end) { - prot = 0; - for (addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - if (prot != 0) - real_end -= qemu_host_page_size; - } - if (real_start != real_end) { - mmap(g2h(real_start), real_end - real_start, PROT_NONE, - MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, - -1, 0); - } -} - -int target_munmap(abi_ulong start, abi_ulong len) -{ - abi_ulong end, real_start, real_end, addr; - int prot, ret; - -#ifdef DEBUG_MMAP - printf("munmap: start=0x" TARGET_ABI_FMT_lx " len=0x" - TARGET_ABI_FMT_lx "\n", - start, len); -#endif - if (start & ~TARGET_PAGE_MASK) - return -EINVAL; - len = TARGET_PAGE_ALIGN(len); - if (len == 0) - return -EINVAL; - mmap_lock(); - end = start + len; - real_start = start & qemu_host_page_mask; - real_end = HOST_PAGE_ALIGN(end); - - if (start > real_start) { - /* handle host page containing start */ - prot = 0; - for(addr = real_start; addr < start; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - if (real_end == real_start + qemu_host_page_size) { - for(addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - end = real_end; - } - if (prot != 0) - real_start += qemu_host_page_size; - } - if (end < real_end) { - prot = 0; - for(addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) { - prot |= page_get_flags(addr); - } - if (prot != 0) - real_end -= qemu_host_page_size; - } - - ret = 0; - /* unmap what we can */ - if (real_start < real_end) { - if (reserved_va) { - mmap_reserve(real_start, real_end - real_start); - } else { - ret = munmap(g2h(real_start), real_end - real_start); - } - } - - if (ret == 0) { - page_set_flags(start, start + len, 0); - tb_invalidate_phys_range(start, start + len); - } - mmap_unlock(); - return ret; -} - -abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, - abi_ulong new_size, unsigned long flags, - abi_ulong new_addr) -{ - int prot; - void *host_addr; - - mmap_lock(); - - if (flags & MREMAP_FIXED) { - host_addr = (void *) syscall(__NR_mremap, g2h(old_addr), - old_size, new_size, - flags, - g2h(new_addr)); - - if (reserved_va && host_addr != MAP_FAILED) { - /* If new and old addresses overlap then the above mremap will - already have failed with EINVAL. */ - mmap_reserve(old_addr, old_size); - } - } else if (flags & MREMAP_MAYMOVE) { - abi_ulong mmap_start; - - mmap_start = mmap_find_vma(0, new_size); - - if (mmap_start == -1) { - errno = ENOMEM; - host_addr = MAP_FAILED; - } else { - host_addr = (void *) syscall(__NR_mremap, g2h(old_addr), - old_size, new_size, - flags | MREMAP_FIXED, - g2h(mmap_start)); - if (reserved_va) { - mmap_reserve(old_addr, old_size); - } - } - } else { - int prot = 0; - if (reserved_va && old_size < new_size) { - abi_ulong addr; - for (addr = old_addr + old_size; - addr < old_addr + new_size; - addr++) { - prot |= page_get_flags(addr); - } - } - if (prot == 0) { - host_addr = mremap(g2h(old_addr), old_size, new_size, flags); - if (host_addr != MAP_FAILED && reserved_va && old_size > new_size) { - mmap_reserve(old_addr + old_size, new_size - old_size); - } - } else { - errno = ENOMEM; - host_addr = MAP_FAILED; - } - /* Check if address fits target address space */ - if ((unsigned long)host_addr + new_size > (abi_ulong)-1) { - /* Revert mremap() changes */ - host_addr = mremap(g2h(old_addr), new_size, old_size, flags); - errno = ENOMEM; - host_addr = MAP_FAILED; - } - } - - if (host_addr == MAP_FAILED) { - new_addr = -1; - } else { - new_addr = h2g(host_addr); - prot = page_get_flags(old_addr); - page_set_flags(old_addr, old_addr + old_size, 0); - page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID); - } - tb_invalidate_phys_range(new_addr, new_addr + new_size); - mmap_unlock(); - return new_addr; -} - -int target_msync(abi_ulong start, abi_ulong len, int flags) -{ - abi_ulong end; - - if (start & ~TARGET_PAGE_MASK) - return -EINVAL; - len = TARGET_PAGE_ALIGN(len); - end = start + len; - if (end < start) - return -EINVAL; - if (end == start) - return 0; - - start &= qemu_host_page_mask; - return msync(g2h(start), end - start, flags); -} diff --git a/qemu/linux-user/openrisc/syscall_nr.h b/qemu/linux-user/openrisc/syscall_nr.h deleted file mode 100644 index 6b1c7d265..000000000 --- a/qemu/linux-user/openrisc/syscall_nr.h +++ /dev/null @@ -1,506 +0,0 @@ -#define TARGET_NR_io_setup 0 -#define TARGET_NR_io_destroy 1 -#define TARGET_NR_io_submit 2 -#define TARGET_NR_io_cancel 3 -#define TARGET_NR_io_getevents 4 - -/* fs/xattr.c */ -#define TARGET_NR_setxattr 5 -#define TARGET_NR_lsetxattr 6 -#define TARGET_NR_fsetxattr 7 -#define TARGET_NR_getxattr 8 -#define TARGET_NR_lgetxattr 9 -#define TARGET_NR_fgetxattr 10 -#define TARGET_NR_listxattr 11 -#define TARGET_NR_llistxattr 12 -#define TARGET_NR_flistxattr 13 -#define TARGET_NR_removexattr 14 -#define TARGET_NR_lremovexattr 15 -#define TARGET_NR_fremovexattr 16 - -/* fs/dcache.c */ -#define TARGET_NR_getcwd 17 - -/* fs/cookies.c */ -#define TARGET_NR_lookup_dcookie 18 - -/* fs/eventfd.c */ -#define TARGET_NR_eventfd2 19 - -/* fs/eventpoll.c */ -#define TARGET_NR_epoll_create1 20 -#define TARGET_NR_epoll_ctl 21 -#define TARGET_NR_epoll_pwait 22 - -/* fs/fcntl.c */ -#define TARGET_NR_dup 23 -#define TARGET_NR_dup3 24 -#define TARGET_NR_3264_fcntl 25 - -/* fs/inotify_user.c */ -#define TARGET_NR_inotify_init1 26 -#define TARGET_NR_inotify_add_watch 27 -#define TARGET_NR_inotify_rm_watch 28 - -/* fs/ioctl.c */ -#define TARGET_NR_ioctl 29 - -/* fs/ioprio.c */ -#define TARGET_NR_ioprio_set 30 -#define TARGET_NR_ioprio_get 31 - -/* fs/locks.c */ -#define TARGET_NR_flock 32 - -/* fs/namei.c */ -#define TARGET_NR_mknodat 33 -#define TARGET_NR_mkdirat 34 -#define TARGET_NR_unlinkat 35 -#define TARGET_NR_symlinkat 36 -#define TARGET_NR_linkat 37 -#define TARGET_NR_renameat 38 - -/* fs/namespace.c */ -#define TARGET_NR_umount2 39 -#define TARGET_NR_mount 40 -#define TARGET_NR_pivot_root 41 - -/* fs/nfsctl.c */ -#define TARGET_NR_nfsservctl 42 - -/* fs/open.c */ -#define TARGET_NR_3264_statfs 43 -#define TARGET_NR_3264_fstatfs 44 -#define TARGET_NR_3264_truncate 45 -#define TARGET_NR_3264_ftruncate 46 - -#define TARGET_NR_fallocate 47 -#define TARGET_NR_faccessat 48 -#define TARGET_NR_chdir 49 -#define TARGET_NR_fchdir 50 -#define TARGET_NR_chroot 51 -#define TARGET_NR_fchmod 52 -#define TARGET_NR_fchmodat 53 -#define TARGET_NR_fchownat 54 -#define TARGET_NR_fchown 55 -#define TARGET_NR_openat 56 -#define TARGET_NR_close 57 -#define TARGET_NR_vhangup 58 - -/* fs/pipe.c */ -#define TARGET_NR_pipe2 59 - -/* fs/quota.c */ -#define TARGET_NR_quotactl 60 - -/* fs/readdir.c */ -#define TARGET_NR_getdents64 61 - -/* fs/read_write.c */ -#define TARGET_NR_3264_lseek 62 -#define TARGET_NR_read 63 -#define TARGET_NR_write 64 -#define TARGET_NR_readv 65 -#define TARGET_NR_writev 66 -#define TARGET_NR_pread64 67 -#define TARGET_NR_pwrite64 68 -#define TARGET_NR_preadv 69 -#define TARGET_NR_pwritev 70 - -/* fs/sendfile.c */ -#define TARGET_NR_3264_sendfile 71 - -/* fs/select.c */ -#define TARGET_NR_pselect6 72 -#define TARGET_NR_ppoll 73 - -/* fs/signalfd.c */ -#define TARGET_NR_signalfd4 74 - -/* fs/splice.c */ -#define TARGET_NR_vmsplice 75 -#define TARGET_NR_splice 76 -#define TARGET_NR_tee 77 - -/* fs/stat.c */ -#define TARGET_NR_readlinkat 78 -#define TARGET_NR_3264_fstatat 79 -#define TARGET_NR_3264_fstat 80 - -/* fs/sync.c */ -#define TARGET_NR_sync 81 -#define TARGET_NR_fsync 82 -#define TARGET_NR_fdatasync 83 - -#ifdef __ARCH_WANT_SYNC_FILE_RANGE2 -#define TARGET_NR_sync_file_range2 84 -#else -#define TARGET_NR_sync_file_range 84 -#endif - -/* fs/timerfd.c */ -#define TARGET_NR_timerfd_create 85 -#define TARGET_NR_timerfd_settime 86 -#define TARGET_NR_timerfd_gettime 87 - -/* fs/utimes.c */ -#define TARGET_NR_utimensat 88 - -/* kernel/acct.c */ -#define TARGET_NR_acct 89 - -/* kernel/capability.c */ -#define TARGET_NR_capget 90 -#define TARGET_NR_capset 91 - -/* kernel/exec_domain.c */ -#define TARGET_NR_personality 92 - -/* kernel/exit.c */ -#define TARGET_NR_exit 93 -#define TARGET_NR_exit_group 94 -#define TARGET_NR_waitid 95 - -/* kernel/fork.c */ -#define TARGET_NR_set_tid_address 96 -#define TARGET_NR_unshare 97 - -/* kernel/futex.c */ -#define TARGET_NR_futex 98 -#define TARGET_NR_set_robust_list 99 -#define TARGET_NR_get_robust_list 100 - -/* kernel/hrtimer.c */ -#define TARGET_NR_nanosleep 101 - -/* kernel/itimer.c */ -#define TARGET_NR_getitimer 102 -#define TARGET_NR_setitimer 103 - -/* kernel/kexec.c */ -#define TARGET_NR_kexec_load 104 - -/* kernel/module.c */ -#define TARGET_NR_init_module 105 -#define TARGET_NR_delete_module 106 - -/* kernel/posix-timers.c */ -#define TARGET_NR_timer_create 107 -#define TARGET_NR_timer_gettime 108 -#define TARGET_NR_timer_getoverrun 109 -#define TARGET_NR_timer_settime 110 -#define TARGET_NR_timer_delete 111 -#define TARGET_NR_clock_settime 112 -#define TARGET_NR_clock_gettime 113 -#define TARGET_NR_clock_getres 114 -#define TARGET_NR_clock_nanosleep 115 - -/* kernel/printk.c */ -#define TARGET_NR_syslog 116 - -/* kernel/ptrace.c */ -#define TARGET_NR_ptrace 117 - -/* kernel/sched.c */ -#define TARGET_NR_sched_setparam 118 -#define TARGET_NR_sched_setscheduler 119 -#define TARGET_NR_sched_getscheduler 120 -#define TARGET_NR_sched_getparam 121 -#define TARGET_NR_sched_setaffinity 122 -#define TARGET_NR_sched_getaffinity 123 -#define TARGET_NR_sched_yield 124 -#define TARGET_NR_sched_get_priority_max 125 -#define TARGET_NR_sched_get_priority_min 126 -#define TARGET_NR_sched_rr_get_interval 127 - -/* kernel/signal.c */ -#define TARGET_NR_restart_syscall 128 -#define TARGET_NR_kill 129 -#define TARGET_NR_tkill 130 -#define TARGET_NR_tgkill 131 -#define TARGET_NR_sigaltstack 132 -#define TARGET_NR_rt_sigsuspend 133 -#define TARGET_NR_rt_sigaction 134 -#define TARGET_NR_rt_sigprocmask 135 -#define TARGET_NR_rt_sigpending 136 -#define TARGET_NR_rt_sigtimedwait 137 -#define TARGET_NR_rt_sigqueueinfo 138 -#define TARGET_NR_rt_sigreturn 139 - -/* kernel/sys.c */ -#define TARGET_NR_setpriority 140 -#define TARGET_NR_getpriority 141 -#define TARGET_NR_reboot 142 -#define TARGET_NR_setregid 143 -#define TARGET_NR_setgid 144 -#define TARGET_NR_setreuid 145 -#define TARGET_NR_setuid 146 -#define TARGET_NR_setresuid 147 -#define TARGET_NR_getresuid 148 -#define TARGET_NR_setresgid 149 -#define TARGET_NR_getresgid 150 -#define TARGET_NR_setfsuid 151 -#define TARGET_NR_setfsgid 152 -#define TARGET_NR_times 153 -#define TARGET_NR_setpgid 154 -#define TARGET_NR_getpgid 155 -#define TARGET_NR_getsid 156 -#define TARGET_NR_setsid 157 -#define TARGET_NR_getgroups 158 -#define TARGET_NR_setgroups 159 -#define TARGET_NR_uname 160 -#define TARGET_NR_sethostname 161 -#define TARGET_NR_setdomainname 162 -#define TARGET_NR_getrlimit 163 -#define TARGET_NR_setrlimit 164 -#define TARGET_NR_getrusage 165 -#define TARGET_NR_umask 166 -#define TARGET_NR_prctl 167 -#define TARGET_NR_getcpu 168 - -/* kernel/time.c */ -#define TARGET_NR_gettimeofday 169 -#define TARGET_NR_settimeofday 170 -#define TARGET_NR_adjtimex 171 - -/* kernel/timer.c */ -#define TARGET_NR_getpid 172 -#define TARGET_NR_getppid 173 -#define TARGET_NR_getuid 174 -#define TARGET_NR_geteuid 175 -#define TARGET_NR_getgid 176 -#define TARGET_NR_getegid 177 -#define TARGET_NR_gettid 178 -#define TARGET_NR_sysinfo 179 - -/* ipc/mqueue.c */ -#define TARGET_NR_mq_open 180 -#define TARGET_NR_mq_unlink 181 -#define TARGET_NR_mq_timedsend 182 -#define TARGET_NR_mq_timedreceive 183 -#define TARGET_NR_mq_notify 184 -#define TARGET_NR_mq_getsetattr 185 - -/* ipc/msg.c */ -#define TARGET_NR_msgget 186 -#define TARGET_NR_msgctl 187 -#define TARGET_NR_msgrcv 188 -#define TARGET_NR_msgsnd 189 - -/* ipc/sem.c */ -#define TARGET_NR_semget 190 -#define TARGET_NR_semctl 191 -#define TARGET_NR_semtimedop 192 -#define TARGET_NR_semop 193 - -/* ipc/shm.c */ -#define TARGET_NR_shmget 194 -#define TARGET_NR_shmctl 195 -#define TARGET_NR_shmat 196 -#define TARGET_NR_shmdt 197 - -/* net/socket.c */ -#define TARGET_NR_socket 198 -#define TARGET_NR_socketpair 199 -#define TARGET_NR_bind 200 -#define TARGET_NR_listen 201 -#define TARGET_NR_accept 202 -#define TARGET_NR_connect 203 -#define TARGET_NR_getsockname 204 -#define TARGET_NR_getpeername 205 -#define TARGET_NR_sendto 206 -#define TARGET_NR_recvfrom 207 -#define TARGET_NR_setsockopt 208 -#define TARGET_NR_getsockopt 209 -#define TARGET_NR_shutdown 210 -#define TARGET_NR_sendmsg 211 -#define TARGET_NR_recvmsg 212 - -/* mm/filemap.c */ -#define TARGET_NR_readahead 213 - -/* mm/nommu.c, also with MMU */ -#define TARGET_NR_brk 214 -#define TARGET_NR_munmap 215 -#define TARGET_NR_mremap 216 - -/* security/keys/keyctl.c */ -#define TARGET_NR_add_key 217 -#define TARGET_NR_request_key 218 -#define TARGET_NR_keyctl 219 - -/* arch/example/kernel/sys_example.c */ -#define TARGET_NR_clone 220 -#define TARGET_NR_execve 221 - -#define TARGET_NR_3264_mmap 222 -/* mm/fadvise.c */ -#define TARGET_NR_3264_fadvise64 223 - -/* mm/, CONFIG_MMU only */ -#ifndef __ARCH_NOMMU -#define TARGET_NR_swapon 224 -#define TARGET_NR_swapoff 225 -#define TARGET_NR_mprotect 226 -#define TARGET_NR_msync 227 -#define TARGET_NR_mlock 228 -#define TARGET_NR_munlock 229 -#define TARGET_NR_mlockall 230 -#define TARGET_NR_munlockall 231 -#define TARGET_NR_mincore 232 -#define TARGET_NR_madvise 233 -#define TARGET_NR_remap_file_pages 234 -#define TARGET_NR_mbind 235 -#define TARGET_NR_get_mempolicy 236 -#define TARGET_NR_set_mempolicy 237 -#define TARGET_NR_migrate_pages 238 -#define TARGET_NR_move_pages 239 -#endif - -#define TARGET_NR_rt_tgsigqueueinfo 240 -#define TARGET_NR_perf_event_open 241 -#define TARGET_NR_accept4 242 -#define TARGET_NR_recvmmsg 243 - -/* - * Architectures may provide up to 16 syscalls of their own - * starting with this value. - */ -#define TARGET_NR_arch_specific_syscall 244 - -#define TARGET_NR_wait4 260 -#define TARGET_NR_prlimit64 261 -#define TARGET_NR_fanotify_init 262 -#define TARGET_NR_fanotify_mark 263 -#define TARGET_NR_name_to_handle_at 264 -#define TARGET_NR_open_by_handle_at 265 -#define TARGET_NR_clock_adjtime 266 -#define TARGET_NR_syncfs 267 -#define TARGET_NR_setns 268 -#define TARGET_NR_sendmmsg 269 -#define TARGET_NR_process_vm_readv 270 -#define TARGET_NR_process_vm_writev 271 -#define TARGET_NR_kcmp 272 -#define TARGET_NR_finit_module 273 -#define TARGET_NR_sched_setattr 274 -#define TARGET_NR_sched_getattr 275 -#define TARGET_NR_renameat2 276 -#define TARGET_NR_seccomp 277 -#define TARGET_NR_getrandom 278 -#define TARGET_NR_memfd_create 279 -#define TARGET_NR_bpf 280 -#define TARGET_NR_execveat 281 -#define TARGET_NR_userfaultfd 282 -#define TARGET_NR_membarrier 283 -#define TARGET_NR_mlock2 284 -#define TARGET_NR_copy_file_range 285 - -/* - * All syscalls below here should go away really, - * these are provided for both review and as a porting - * help for the C library version. -* - * Last chance: are any of these important enough to - * enable by default? - */ -#define TARGET_NR_open 1024 -#define TARGET_NR_link 1025 -#define TARGET_NR_unlink 1026 -#define TARGET_NR_mknod 1027 -#define TARGET_NR_chmod 1028 -#define TARGET_NR_chown 1029 -#define TARGET_NR_mkdir 1030 -#define TARGET_NR_rmdir 1031 -#define TARGET_NR_lchown 1032 -#define TARGET_NR_access 1033 -#define TARGET_NR_rename 1034 -#define TARGET_NR_readlink 1035 -#define TARGET_NR_symlink 1036 -#define TARGET_NR_utimes 1037 -#define TARGET_NR_3264_stat 1038 -#define TARGET_NR_3264_lstat 1039 - -#define TARGET_NR_pipe 1040 -#define TARGET_NR_dup2 1041 -#define TARGET_NR_epoll_create 1042 -#define TARGET_NR_inotify_init 1043 -#define TARGET_NR_eventfd 1044 -#define TARGET_NR_signalfd 1045 - -#define TARGET_NR_sendfile 1046 -#define TARGET_NR_ftruncate 1047 -#define TARGET_NR_truncate 1048 -#define TARGET_NR_stat 1049 -#define TARGET_NR_lstat 1050 -#define TARGET_NR_fstat 1051 -#define TARGET_NR_fcntl 1052 -#define TARGET_NR_fadvise64 1053 -#define __ARCH_WANT_SYS_FADVISE64 -#define TARGET_NR_newfstatat 1054 -#define __ARCH_WANT_SYS_NEWFSTATAT -#define TARGET_NR_fstatfs 1055 -#define TARGET_NR_statfs 1056 -#define TARGET_NR_lseek 1057 -#define TARGET_NR_mmap 1058 - -#define TARGET_NR_alarm 1059 -#define __ARCH_WANT_SYS_ALARM -#define TARGET_NR_getpgrp 1060 -#define __ARCH_WANT_SYS_GETPGRP -#define TARGET_NR_pause 1061 -#define __ARCH_WANT_SYS_PAUSE -#define TARGET_NR_time 1062 -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_COMPAT_SYS_TIME -#define TARGET_NR_utime 1063 -#define __ARCH_WANT_SYS_UTIME - -#define TARGET_NR_creat 1064 -#define TARGET_NR_getdents 1065 -#define __ARCH_WANT_SYS_GETDENTS -#define TARGET_NR_futimesat 1066 -#define TARGET_NR_select 1067 -#define __ARCH_WANT_SYS_SELECT -#define TARGET_NR_poll 1068 -#define TARGET_NR_epoll_wait 1069 -#define TARGET_NR_ustat 1070 -#define TARGET_NR_vfork 1071 -#define TARGET_NR_oldwait4 1072 -#define TARGET_NR_recv 1073 -#define TARGET_NR_send 1074 -#define TARGET_NR_bdflush 1075 -#define TARGET_NR_umount 1076 -#define __ARCH_WANT_SYS_OLDUMOUNT -#define TARGET_NR_uselib 1077 -#define TARGET_NR__sysctl 1078 - -#define TARGET_NR_fork 1079 - - -/* - * 32 bit systems traditionally used different - * syscalls for off_t and loff_t arguments, while - * 64 bit systems only need the off_t version. - * For new 32 bit platforms, there is no need to - * implement the old 32 bit off_t syscalls, so - * they take different names. - * Here we map the numbers so that both versions - * use the same syscall table layout. - */ - -#define TARGET_NR_fcntl64 TARGET_NR_3264_fcntl -#define TARGET_NR_statfs64 TARGET_NR_3264_statfs -#define TARGET_NR_fstatfs64 TARGET_NR_3264_fstatfs -#define TARGET_NR_truncate64 TARGET_NR_3264_truncate -#define TARGET_NR_ftruncate64 TARGET_NR_3264_ftruncate -#define TARGET_NR_llseek TARGET_NR_3264_lseek -#define TARGET_NR_sendfile64 TARGET_NR_3264_sendfile -#define TARGET_NR_fstatat64 TARGET_NR_3264_fstatat -#define TARGET_NR_fstat64 TARGET_NR_3264_fstat -#define TARGET_NR_mmap2 TARGET_NR_3264_mmap -#define TARGET_NR_fadvise64_64 TARGET_NR_3264_fadvise64 - -#ifdef TARGET_NR_3264_stat -#define TARGET_NR_stat64 TARGET_NR_3264_stat -#define TARGET_NR_lstat64 TARGET_NR_3264_lstat -#endif diff --git a/qemu/linux-user/openrisc/target_cpu.h b/qemu/linux-user/openrisc/target_cpu.h deleted file mode 100644 index 32a46ac84..000000000 --- a/qemu/linux-user/openrisc/target_cpu.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * OpenRISC specific CPU ABI and functions for linux-user - * - * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUOpenRISCState *env, target_ulong newsp) -{ - if (newsp) { - env->gpr[1] = newsp; - } - env->gpr[11] = 0; -} - -static inline void cpu_set_tls(CPUOpenRISCState *env, target_ulong newtls) -{ - /* Linux kernel 3.10 does not pay any attention to CLONE_SETTLS - * in copy_thread(), so QEMU need not do so either. - */ -} - -#endif diff --git a/qemu/linux-user/openrisc/target_signal.h b/qemu/linux-user/openrisc/target_signal.h deleted file mode 100644 index 964aed69f..000000000 --- a/qemu/linux-user/openrisc/target_signal.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_long ss_sp; - abi_ulong ss_size; - abi_long ss_flags; -} target_stack_t; - -/* sigaltstack controls */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUOpenRISCState *state) -{ - return state->gpr[1]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/openrisc/target_structs.h b/qemu/linux-user/openrisc/target_structs.h deleted file mode 100644 index f4d560f57..000000000 --- a/qemu/linux-user/openrisc/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * OpenRISC specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/openrisc/target_syscall.h b/qemu/linux-user/openrisc/target_syscall.h deleted file mode 100644 index 19aeffc95..000000000 --- a/qemu/linux-user/openrisc/target_syscall.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -struct target_pt_regs { - union { - struct { - /* Named registers */ - uint32_t sr; /* Stored in place of r0 */ - target_ulong sp; /* r1 */ - }; - struct { - /* Old style */ - target_ulong offset[2]; - target_ulong gprs[30]; - }; - struct { - /* New style */ - target_ulong gpr[32]; - }; - }; - target_ulong pc; - target_ulong orig_gpr11; /* For restarting system calls */ - uint32_t syscallno; /* Syscall number (used by strace) */ - target_ulong dummy; /* Cheap alignment fix */ -}; - -#define UNAME_MACHINE "openrisc" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/openrisc/termbits.h b/qemu/linux-user/openrisc/termbits.h deleted file mode 100644 index 373af7721..000000000 --- a/qemu/linux-user/openrisc/termbits.h +++ /dev/null @@ -1,294 +0,0 @@ -typedef unsigned char target_openrisc_cc; /*cc_t*/ -typedef unsigned int target_openrisc_speed; /*speed_t*/ -typedef unsigned int target_openrisc_tcflag; /*tcflag_t*/ - -#define TARGET_NCCS 19 -struct target_termios { - target_openrisc_tcflag c_iflag; /* input mode flags */ - target_openrisc_tcflag c_oflag; /* output mode flags */ - target_openrisc_tcflag c_cflag; /* control mode flags */ - target_openrisc_tcflag c_lflag; /* local mode flags */ - target_openrisc_cc c_line; /* line discipline */ - target_openrisc_cc c_cc[TARGET_NCCS]; /* control characters */ -}; - -struct target_termios2 { - target_openrisc_tcflag c_iflag; /* input mode flags */ - target_openrisc_tcflag c_oflag; /* output mode flags */ - target_openrisc_tcflag c_cflag; /* control mode flags */ - target_openrisc_tcflag c_lflag; /* local mode flags */ - target_openrisc_cc c_line; /* line discipline */ - target_openrisc_cc c_cc[TARGET_NCCS]; /* control characters */ - target_openrisc_speed c_ispeed; /* input speed */ - target_openrisc_speed c_ospeed; /* output speed */ -}; - -struct target_termios3 { - target_openrisc_tcflag c_iflag; /* input mode flags */ - target_openrisc_tcflag c_oflag; /* output mode flags */ - target_openrisc_tcflag c_cflag; /* control mode flags */ - target_openrisc_tcflag c_lflag; /* local mode flags */ - target_openrisc_cc c_line; /* line discipline */ - target_openrisc_cc c_cc[TARGET_NCCS]; /* control characters */ - target_openrisc_speed c_ispeed; /* input speed */ - target_openrisc_speed c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -#define TARGET_IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 -#define TARGET_EXTPROC 0200000 - -/* tcflow() and TCXONC use these */ -#define TARGET_TCOOFF 0 -#define TARGET_TCOON 1 -#define TARGET_TCIOFF 2 -#define TARGET_TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TARGET_TCIFLUSH 0 -#define TARGET_TCOFLUSH 1 -#define TARGET_TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TARGET_TCSANOW 0 -#define TARGET_TCSADRAIN 1 -#define TARGET_TCSAFLUSH 2 - -/* ioctls */ -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TCGETS2 TARGET_IOR('T', 0x2A, struct termios2) -#define TARGET_TCSETS2 TARGET_IOW('T', 0x2B, struct termios2) -#define TARGET_TCSETSW2 TARGET_IOW('T', 0x2C, struct termios2) -#define TARGET_TCSETSF2 TARGET_IOW('T', 0x2D, struct termios2) -#define TARGET_TIOCGRS485 0x542E -#ifndef TARGET_TIOCSRS485 -#define TARGET_TIOCSRS485 0x542F -#endif -/* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCGPTN TARGET_IOR('T', 0x30, unsigned int) -/* Lock/unlock Pty */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T', 0x31, int) -/* Get primary device node of /dev/console */ -#define TARGET_TIOCGDEV TARGET_IOR('T', 0x32, unsigned int) -#define TARGET_TCGETX 0x5432 /* SYS5 TCGETX compatibility */ -#define TARGET_TCSETX 0x5433 -#define TARGET_TCSETXF 0x5434 -#define TARGET_TCSETXW 0x5435 -/* pty: generate signal */ -#define TARGET_TIOCSIG TARGET_IOW('T', 0x36, int) -#define TARGET_TIOCVHANGUP 0x5437 - -#define TARGET_FIONCLEX 0x5450 -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -/* wait for a change on serial input line(s) */ -#define TARGET_TIOCMIWAIT 0x545C -/* read serial port inline interrupt counts */ -#define TARGET_TIOCGICOUNT 0x545D - -/* - * Some arches already define TARGET_FIOQSIZE due to a historical - * conflict with a Hayes modem-specific ioctl value. - */ -#ifndef TARGET_FIOQSIZE -#define TARGET_FIOQSIZE 0x5460 -#endif - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 -#define TARGET_TIOCPKT_IOCTL 64 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ diff --git a/qemu/linux-user/ppc/syscall_nr.h b/qemu/linux-user/ppc/syscall_nr.h deleted file mode 100644 index 46ed8a68c..000000000 --- a/qemu/linux-user/ppc/syscall_nr.h +++ /dev/null @@ -1,394 +0,0 @@ -/* - * This file contains the system call numbers. - */ -#define TARGET_NR_restart_syscall 0 -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lchown 16 -#define TARGET_NR_break 17 -#define TARGET_NR_oldstat 18 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_oldfstat 28 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 -#define TARGET_NR_oldolduname 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 -#define TARGET_NR_oldlstat 84 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_olduname 109 -#define TARGET_NR_iopl 110 -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_vm86 113 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_modify_ldt 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid32 164 -#define TARGET_NR_getresuid32 165 -#define TARGET_NR_query_module 166 -#define TARGET_NR_poll 167 -#define TARGET_NR_nfsservctl 168 -#define TARGET_NR_setresgid32 169 -#define TARGET_NR_getresgid32 170 -#define TARGET_NR_prctl 171 -#define TARGET_NR_rt_sigreturn 172 -#define TARGET_NR_rt_sigaction 173 -#define TARGET_NR_rt_sigprocmask 174 -#define TARGET_NR_rt_sigpending 175 -#define TARGET_NR_rt_sigtimedwait 176 -#define TARGET_NR_rt_sigqueueinfo 177 -#define TARGET_NR_rt_sigsuspend 178 -#define TARGET_NR_pread64 179 -#define TARGET_NR_pwrite64 180 -#define TARGET_NR_chown 181 -#define TARGET_NR_getcwd 182 -#define TARGET_NR_capget 183 -#define TARGET_NR_capset 184 -#define TARGET_NR_sigaltstack 185 -#define TARGET_NR_sendfile 186 -#define TARGET_NR_getpmsg 187 /* some people actually want streams */ -#define TARGET_NR_putpmsg 188 /* some people actually want streams */ -#define TARGET_NR_vfork 189 -#define TARGET_NR_ugetrlimit 190 /* SuS compliant getrlimit */ -#define TARGET_NR_readahead 191 -#if !defined(TARGET_PPC64) || defined(TARGET_ABI32) -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#endif -#define TARGET_NR_pciconfig_read 198 -#define TARGET_NR_pciconfig_write 199 -#define TARGET_NR_pciconfig_iobase 200 -#define TARGET_NR_multiplexer 201 -#define TARGET_NR_getdents64 202 -#define TARGET_NR_pivot_root 203 -#if !defined(TARGET_PPC64) || defined(TARGET_ABI32) -#define TARGET_NR_fcntl64 204 -#endif -#define TARGET_NR_madvise 205 -#define TARGET_NR_mincore 206 -#define TARGET_NR_gettid 207 -#define TARGET_NR_tkill 208 -#define TARGET_NR_setxattr 209 -#define TARGET_NR_lsetxattr 210 -#define TARGET_NR_fsetxattr 211 -#define TARGET_NR_getxattr 212 -#define TARGET_NR_lgetxattr 213 -#define TARGET_NR_fgetxattr 214 -#define TARGET_NR_listxattr 215 -#define TARGET_NR_llistxattr 216 -#define TARGET_NR_flistxattr 217 -#define TARGET_NR_removexattr 218 -#define TARGET_NR_lremovexattr 219 -#define TARGET_NR_fremovexattr 220 -#define TARGET_NR_futex 221 -#define TARGET_NR_sched_setaffinity 222 -#define TARGET_NR_sched_getaffinity 223 -/* 224 currently unused */ -#define TARGET_NR_tuxcall 225 -#if !defined(TARGET_PPC64) || defined(TARGET_ABI32) -#define TARGET_NR_sendfile64 226 -#endif -#define TARGET_NR_io_setup 227 -#define TARGET_NR_io_destroy 228 -#define TARGET_NR_io_getevents 229 -#define TARGET_NR_io_submit 230 -#define TARGET_NR_io_cancel 231 -#define TARGET_NR_set_tid_address 232 -#define TARGET_NR_fadvise64 233 -#define TARGET_NR_exit_group 234 -#define TARGET_NR_lookup_dcookie 235 -#define TARGET_NR_epoll_create 236 -#define TARGET_NR_epoll_ctl 237 -#define TARGET_NR_epoll_wait 238 -#define TARGET_NR_remap_file_pages 239 -#define TARGET_NR_timer_create 240 -#define TARGET_NR_timer_settime 241 -#define TARGET_NR_timer_gettime 242 -#define TARGET_NR_timer_getoverrun 243 -#define TARGET_NR_timer_delete 244 -#define TARGET_NR_clock_settime 245 -#define TARGET_NR_clock_gettime 246 -#define TARGET_NR_clock_getres 247 -#define TARGET_NR_clock_nanosleep 248 -#define TARGET_NR_swapcontext 249 -#define TARGET_NR_tgkill 250 -#define TARGET_NR_utimes 251 -#define TARGET_NR_statfs64 252 -#define TARGET_NR_fstatfs64 253 -#if !defined(TARGET_PPC64) || defined(TARGET_ABI32) -#define TARGET_NR_fadvise64_64 254 -#endif -#define TARGET_NR_rtas 255 -#define TARGET_NR_sys_debug_setcontext 256 -/* Number 257 is reserved for vserver */ -#define TARGET_NR_migrate_pages 258 -#define TARGET_NR_mbind 259 -#define TARGET_NR_get_mempolicy 260 -#define TARGET_NR_set_mempolicy 261 -#define TARGET_NR_mq_open 262 -#define TARGET_NR_mq_unlink 263 -#define TARGET_NR_mq_timedsend 264 -#define TARGET_NR_mq_timedreceive 265 -#define TARGET_NR_mq_notify 266 -#define TARGET_NR_mq_getsetattr 267 -#define TARGET_NR_kexec_load 268 -#define TARGET_NR_add_key 269 -#define TARGET_NR_request_key 270 -#define TARGET_NR_keyctl 271 -#define TARGET_NR_waitid 272 -#define TARGET_NR_ioprio_set 273 -#define TARGET_NR_ioprio_get 274 -#define TARGET_NR_inotify_init 275 -#define TARGET_NR_inotify_add_watch 276 -#define TARGET_NR_inotify_rm_watch 277 -#define TARGET_NR_spu_run 278 -#define TARGET_NR_spu_create 279 -#define TARGET_NR_pselect6 280 -#define TARGET_NR_ppoll 281 -#define TARGET_NR_unshare 282 -#define TARGET_NR_splice 283 -#define TARGET_NR_tee 284 -#define TARGET_NR_vmsplice 285 -#define TARGET_NR_openat 286 -#define TARGET_NR_mkdirat 287 -#define TARGET_NR_mknodat 288 -#define TARGET_NR_fchownat 289 -#define TARGET_NR_futimesat 290 -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) -#define TARGET_NR_newfstatat 291 -#else -#define TARGET_NR_fstatat64 291 -#endif -#define TARGET_NR_unlinkat 292 -#define TARGET_NR_renameat 293 -#define TARGET_NR_linkat 294 -#define TARGET_NR_symlinkat 295 -#define TARGET_NR_readlinkat 296 -#define TARGET_NR_fchmodat 297 -#define TARGET_NR_faccessat 298 -#define TARGET_NR_get_robust_list 299 -#define TARGET_NR_set_robust_list 300 -#define TARGET_NR_move_pages 301 -#define TARGET_NR_getcpu 302 -#define TARGET_NR_epoll_pwait 303 -#define TARGET_NR_utimensat 304 -#define TARGET_NR_signalfd 305 -#define TARGET_NR_timerfd_create 306 -#define TARGET_NR_eventfd 307 -#define TARGET_NR_sync_file_range2 308 -#define TARGET_NR_fallocate 309 -#define TARGET_NR_subpage_prot 310 -#define TARGET_NR_timerfd_settime 311 -#define TARGET_NR_timerfd_gettime 312 -#define TARGET_NR_signalfd4 313 -#define TARGET_NR_eventfd2 314 -#define TARGET_NR_epoll_create1 315 -#define TARGET_NR_dup3 316 -#define TARGET_NR_pipe2 317 -#define TARGET_NR_inotify_init1 318 -#define TARGET_NR_perf_event_open 319 -#define TARGET_NR_preadv 320 -#define TARGET_NR_pwritev 321 -#define TARGET_NR_rt_tgsigqueueinfo 322 -#define TARGET_NR_fanotify_init 323 -#define TARGET_NR_fanotify_mark 324 -#define TARGET_NR_prlimit64 325 -#define TARGET_NR_socket 326 -#define TARGET_NR_bind 327 -#define TARGET_NR_connect 328 -#define TARGET_NR_listen 329 -#define TARGET_NR_accept 330 -#define TARGET_NR_getsockname 331 -#define TARGET_NR_getpeername 332 -#define TARGET_NR_socketpair 333 -#define TARGET_NR_send 334 -#define TARGET_NR_sendto 335 -#define TARGET_NR_recv 336 -#define TARGET_NR_recvfrom 337 -#define TARGET_NR_shutdown 338 -#define TARGET_NR_setsockopt 339 -#define TARGET_NR_getsockopt 340 -#define TARGET_NR_sendmsg 341 -#define TARGET_NR_recvmsg 342 -#define TARGET_NR_recvmmsg 343 -#define TARGET_NR_accept4 344 -#define TARGET_NR_name_to_handle_at 345 -#define TARGET_NR_open_by_handle_at 346 -#define TARGET_NR_clock_adjtime 347 -#define TARGET_NR_syncfs 348 -#define TARGET_NR_sendmmsg 349 -#define TARGET_NR_setns 350 -#define TARGET_NR_process_vm_readv 351 -#define TARGET_NR_process_vm_writev 352 -#define TARGET_NR_finit_module 353 -#define TARGET_NR_kcmp 354 -#define TARGET_NR_sched_setattr 355 -#define TARGET_NR_sched_getattr 356 -#define TARGET_NR_renameat2 357 -#define TARGET_NR_seccomp 358 -#define TARGET_NR_getrandom 359 -#define TARGET_NR_memfd_create 360 -#define TARGET_NR_bpf 361 -#define TARGET_NR_execveat 362 -#define TARGET_NR_switch_endian 363 -#define TARGET_NR_userfaultfd 364 -#define TARGET_NR_membarrier 365 -#define TARGET_NR_semop 366 -#define TARGET_NR_semget 367 -#define TARGET_NR_semctl 368 -#define TARGET_NR_semtimedop 369 -#define TARGET_NR_msgsnd 370 -#define TARGET_NR_msgrcv 371 -#define TARGET_NR_msgget 372 -#define TARGET_NR_msgctl 373 -#define TARGET_NR_shmat 374 -#define TARGET_NR_shmdt 375 -#define TARGET_NR_shmget 376 -#define TARGET_NR_shmctl 377 -#define TARGET_NR_mlock2 378 diff --git a/qemu/linux-user/ppc/target_cpu.h b/qemu/linux-user/ppc/target_cpu.h deleted file mode 100644 index 26f4ba297..000000000 --- a/qemu/linux-user/ppc/target_cpu.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * PowerPC specific CPU ABI and functions for linux-user - * - * Copyright (c) 2003-2007 Jocelyn Mayer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUPPCState *env, target_ulong newsp) -{ - if (newsp) { - env->gpr[1] = newsp; - } - env->gpr[3] = 0; -} - -static inline void cpu_set_tls(CPUPPCState *env, target_ulong newtls) -{ -#if defined(TARGET_PPC64) - /* The kernel checks TIF_32BIT here; we don't support loading 32-bit - binaries on PPC64 yet. */ - env->gpr[13] = newtls; -#else - env->gpr[2] = newtls; -#endif -} - -#ifndef EF_PPC64_ABI -#define EF_PPC64_ABI 0x3 -#endif - -static inline uint32_t get_ppc64_abi(struct image_info *infop) -{ - return infop->elf_flags & EF_PPC64_ABI; -} - - -#endif diff --git a/qemu/linux-user/ppc/target_signal.h b/qemu/linux-user/ppc/target_signal.h deleted file mode 100644 index a93b5cf1d..000000000 --- a/qemu/linux-user/ppc/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - int ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUPPCState *state) -{ - return state->gpr[1]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/ppc/target_structs.h b/qemu/linux-user/ppc/target_structs.h deleted file mode 100644 index 2b8761310..000000000 --- a/qemu/linux-user/ppc/target_structs.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * PowerPC specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_uint mode; /* Read/write permission. */ - uint32_t __seq; /* Sequence number. */ - uint32_t __pad1; - uint64_t __unused1; - uint64_t __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ -#if TARGET_ABI_BITS == 32 - abi_uint __unused1; -#endif - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_uint __unused2; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_uint __unused3; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_uint __unused4; -#endif - abi_long shm_segsz; /* size of segment in bytes */ - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused5; - abi_ulong __unused6; -}; - -#endif diff --git a/qemu/linux-user/ppc/target_syscall.h b/qemu/linux-user/ppc/target_syscall.h deleted file mode 100644 index 35cab5946..000000000 --- a/qemu/linux-user/ppc/target_syscall.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * PPC emulation for qemu: syscall definitions. - * - * Copyright (c) 2003 Jocelyn Mayer - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* XXX: ABSOLUTELY BUGGY: - * for now, this is quite just a cut-and-paste from i386 target... - */ - -/* default linux values for the selectors */ -#define __USER_DS (1) - -struct target_pt_regs { - abi_ulong gpr[32]; - abi_ulong nip; - abi_ulong msr; - abi_ulong orig_gpr3; /* Used for restarting system calls */ - abi_ulong ctr; - abi_ulong link; - abi_ulong xer; - abi_ulong ccr; -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) - abi_ulong softe; -#else - abi_ulong mq; /* 601 only (not used at present) */ -#endif - /* Used on APUS to hold IPL value. */ - abi_ulong trap; /* Reason for being here */ - abi_ulong dar; /* Fault registers */ - abi_ulong dsisr; - abi_ulong result; /* Result of a system call */ -}; - -/* ioctls */ -struct target_revectored_struct { - abi_ulong __map[8]; /* 256 bits */ -}; - -/* Nasty hack: define a fake errno value for use by sigreturn. */ -#define TARGET_QEMU_ESIGRETURN 255 - -/* - * flags masks - */ - -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) -#ifdef TARGET_WORDS_BIGENDIAN -#define UNAME_MACHINE "ppc64" -#else -#define UNAME_MACHINE "ppc64le" -#endif -#else -#define UNAME_MACHINE "ppc" -#endif -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 0x2000 -#define TARGET_MLOCKALL_MCL_FUTURE 0x4000 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/ppc/termbits.h b/qemu/linux-user/ppc/termbits.h deleted file mode 100644 index 73e715175..000000000 --- a/qemu/linux-user/ppc/termbits.h +++ /dev/null @@ -1,236 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ - unsigned char c_line; /* line discipline */ - unsigned int c_ispeed; /* input speed */ - unsigned int c_ospeed; /* output speed */ -}; - -/* c_cc character offsets */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VMIN 5 -#define TARGET_VEOL 6 -#define TARGET_VTIME 7 -#define TARGET_VEOL2 8 -#define TARGET_VSWTC 9 - -#define TARGET_VWERASE 10 -#define TARGET_VREPRINT 11 -#define TARGET_VSUSP 12 -#define TARGET_VSTART 13 -#define TARGET_VSTOP 14 -#define TARGET_VLNEXT 15 -#define TARGET_VDISCARD 16 - -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IXON 0001000 -#define TARGET_IXOFF 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IUCLC 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_ONLCR 0000002 -#define TARGET_OLCUC 0000004 - -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 - -#define TARGET_OFILL 00000100 -#define TARGET_OFDEL 00000200 -#define TARGET_NLDLY 00001400 -#define TARGET_NL0 00000000 -#define TARGET_NL1 00000400 -#define TARGET_NL2 00001000 -#define TARGET_NL3 00001400 -#define TARGET_TABDLY 00006000 -#define TARGET_TAB0 00000000 -#define TARGET_TAB1 00002000 -#define TARGET_TAB2 00004000 -#define TARGET_TAB3 00006000 -#define TARGET_XTABS 00006000 /* required by POSIX to == TAB3 */ -#define TARGET_CRDLY 00030000 -#define TARGET_CR0 00000000 -#define TARGET_CR1 00010000 -#define TARGET_CR2 00020000 -#define TARGET_CR3 00030000 -#define TARGET_FFDLY 00040000 -#define TARGET_FF0 00000000 -#define TARGET_FF1 00040000 -#define TARGET_BSDLY 00100000 -#define TARGET_BS0 00000000 -#define TARGET_BS1 00100000 -#define TARGET_VTDLY 00200000 -#define TARGET_VT0 00000000 -#define TARGET_VT1 00200000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0000377 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CBAUDEX 0000000 -#define TARGET_B57600 00020 -#define TARGET_B115200 00021 -#define TARGET_B230400 00022 -#define TARGET_B460800 00023 -#define TARGET_B500000 00024 -#define TARGET_B576000 00025 -#define TARGET_B921600 00026 -#define TARGET_B1000000 00027 -#define TARGET_B1152000 00030 -#define TARGET_B1500000 00031 -#define TARGET_B2000000 00032 -#define TARGET_B2500000 00033 -#define TARGET_B3000000 00034 -#define TARGET_B3500000 00035 -#define TARGET_B4000000 00036 - -#define TARGET_CSIZE 00001400 -#define TARGET_CS5 00000000 -#define TARGET_CS6 00000400 -#define TARGET_CS7 00001000 -#define TARGET_CS8 00001400 - -#define TARGET_CSTOPB 00002000 -#define TARGET_CREAD 00004000 -#define TARGET_PARENB 00010000 -#define TARGET_PARODD 00020000 -#define TARGET_HUPCL 00040000 - -#define TARGET_CLOCAL 00100000 -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0x00000080 -#define TARGET_ICANON 0x00000100 -#define TARGET_XCASE 0x00004000 -#define TARGET_ECHO 0x00000008 -#define TARGET_ECHOE 0x00000002 -#define TARGET_ECHOK 0x00000004 -#define TARGET_ECHONL 0x00000010 -#define TARGET_NOFLSH 0x80000000 -#define TARGET_TOSTOP 0x00400000 -#define TARGET_ECHOCTL 0x00000040 -#define TARGET_ECHOPRT 0x00000020 -#define TARGET_ECHOKE 0x00000001 -#define TARGET_FLUSHO 0x00800000 -#define TARGET_PENDIN 0x20000000 -#define TARGET_IEXTEN 0x00000400 - -/* ioctls */ - -#define TARGET_FIOCLEX TARGET_IO('f', 1) -#define TARGET_FIONCLEX TARGET_IO('f', 2) -#define TARGET_FIOASYNC TARGET_IOW('f', 125, int) -#define TARGET_FIONBIO TARGET_IOW('f', 126, int) -#define TARGET_FIONREAD TARGET_IOR('f', 127, int) -#define TARGET_TIOCINQ TARGET_FIONREAD -//#define TARGET_FIOQSIZE TARGET_IOR('f', 128, loff_t) - -#define TARGET_TCGETS TARGET_IOR('t', 19, struct target_termios) -#define TARGET_TCSETS TARGET_IOW('t', 20, struct target_termios) -#define TARGET_TCSETSW TARGET_IOW('t', 21, struct target_termios) -#define TARGET_TCSETSF TARGET_IOW('t', 22, struct target_termios) - -#define TARGET_TCGETA TARGET_IOR('t', 23, struct target_termio) -#define TARGET_TCSETA TARGET_IOW('t', 24, struct target_termio) -#define TARGET_TCSETAW TARGET_IOW('t', 25, struct target_termio) -#define TARGET_TCSETAF TARGET_IOW('t', 28, struct target_termio) - -#define TARGET_TCSBRK TARGET_IO('t', 29) -#define TARGET_TCXONC TARGET_IO('t', 30) -#define TARGET_TCFLSH TARGET_IO('t', 31) - -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct target_winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct target_winsize) -#define TARGET_TIOCSTART TARGET_IO('t', 110) /* start output, like ^Q */ -#define TARGET_TIOCSTOP TARGET_IO('t', 111) /* stop output, like ^S */ -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) /* output queue size */ - -#define TARGET_TIOCGLTC TARGET_IOR('t', 116, struct target_ltchars) -#define TARGET_TIOCSLTC TARGET_IOW('t', 117, struct target_ltchars) -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) - -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E - -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 - -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 - -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ - /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ -# define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ diff --git a/qemu/linux-user/qemu.h b/qemu/linux-user/qemu.h deleted file mode 100644 index 26b0ba273..000000000 --- a/qemu/linux-user/qemu.h +++ /dev/null @@ -1,444 +0,0 @@ -#ifndef QEMU_H -#define QEMU_H - - -#include "cpu.h" -#include "exec/cpu_ldst.h" - -#undef DEBUG_REMAP -#ifdef DEBUG_REMAP -#endif /* DEBUG_REMAP */ - -#include "exec/user/abitypes.h" - -#include "exec/user/thunk.h" -#include "syscall_defs.h" -#include "target_syscall.h" -#include "exec/gdbstub.h" -#include "qemu/queue.h" - -#define THREAD __thread - -/* This struct is used to hold certain information about the image. - * Basically, it replicates in user space what would be certain - * task_struct fields in the kernel - */ -struct image_info { - abi_ulong load_bias; - abi_ulong load_addr; - abi_ulong start_code; - abi_ulong end_code; - abi_ulong start_data; - abi_ulong end_data; - abi_ulong start_brk; - abi_ulong brk; - abi_ulong start_mmap; - abi_ulong start_stack; - abi_ulong stack_limit; - abi_ulong entry; - abi_ulong code_offset; - abi_ulong data_offset; - abi_ulong saved_auxv; - abi_ulong auxv_len; - abi_ulong arg_start; - abi_ulong arg_end; - uint32_t elf_flags; - int personality; -#ifdef CONFIG_USE_FDPIC - abi_ulong loadmap_addr; - uint16_t nsegs; - void *loadsegs; - abi_ulong pt_dynamic_addr; - struct image_info *other_info; -#endif -}; - -#ifdef TARGET_I386 -/* Information about the current linux thread */ -struct vm86_saved_state { - uint32_t eax; /* return code */ - uint32_t ebx; - uint32_t ecx; - uint32_t edx; - uint32_t esi; - uint32_t edi; - uint32_t ebp; - uint32_t esp; - uint32_t eflags; - uint32_t eip; - uint16_t cs, ss, ds, es, fs, gs; -}; -#endif - -#if defined(TARGET_ARM) && defined(TARGET_ABI32) -/* FPU emulator */ -#include "nwfpe/fpa11.h" -#endif - -#define MAX_SIGQUEUE_SIZE 1024 - -struct sigqueue { - struct sigqueue *next; - target_siginfo_t info; -}; - -struct emulated_sigtable { - int pending; /* true if signal is pending */ - struct sigqueue *first; - struct sigqueue info; /* in order to always have memory for the - first signal, we put it here */ -}; - -/* NOTE: we force a big alignment so that the stack stored after is - aligned too */ -typedef struct TaskState { - pid_t ts_tid; /* tid (or pid) of this task */ -#ifdef TARGET_ARM -# ifdef TARGET_ABI32 - /* FPA state */ - FPA11 fpa; -# endif - int swi_errno; -#endif -#ifdef TARGET_UNICORE32 - int swi_errno; -#endif -#if defined(TARGET_I386) && !defined(TARGET_X86_64) - abi_ulong target_v86; - struct vm86_saved_state vm86_saved_regs; - struct target_vm86plus_struct vm86plus; - uint32_t v86flags; - uint32_t v86mask; -#endif - abi_ulong child_tidptr; -#ifdef TARGET_M68K - int sim_syscalls; - abi_ulong tp_value; -#endif -#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32) - /* Extra fields for semihosted binaries. */ - uint32_t heap_base; - uint32_t heap_limit; -#endif - uint32_t stack_base; - int used; /* non zero if used */ - bool sigsegv_blocked; /* SIGSEGV blocked by guest */ - struct image_info *info; - struct linux_binprm *bprm; - - struct emulated_sigtable sigtab[TARGET_NSIG]; - struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */ - struct sigqueue *first_free; /* first free siginfo queue entry */ - int signal_pending; /* non zero if a signal may be pending */ -} __attribute__((aligned(16))) TaskState; - -extern char *exec_path; -void init_task_state(TaskState *ts); -void task_settid(TaskState *); -void stop_all_tasks(void); -extern const char *qemu_uname_release; -extern unsigned long mmap_min_addr; - -/* ??? See if we can avoid exposing so much of the loader internals. */ - -/* Read a good amount of data initially, to hopefully get all the - program headers loaded. */ -#define BPRM_BUF_SIZE 1024 - -/* - * This structure is used to hold the arguments that are - * used when loading binaries. - */ -struct linux_binprm { - char buf[BPRM_BUF_SIZE] __attribute__((aligned)); - abi_ulong p; - int fd; - int e_uid, e_gid; - int argc, envc; - char **argv; - char **envp; - char * filename; /* Name of binary */ - int (*core_dump)(int, const CPUArchState *); /* coredump routine */ -}; - -void do_init_thread(struct target_pt_regs *regs, struct image_info *infop); -abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, - abi_ulong stringp, int push_ptr); -int loader_exec(int fdexec, const char *filename, char **argv, char **envp, - struct target_pt_regs * regs, struct image_info *infop, - struct linux_binprm *); - -int load_elf_binary(struct linux_binprm *bprm, struct image_info *info); -int load_flt_binary(struct linux_binprm *bprm, struct image_info *info); - -abi_long memcpy_to_target(abi_ulong dest, const void *src, - unsigned long len); -void target_set_brk(abi_ulong new_brk); -abi_long do_brk(abi_ulong new_brk); -void syscall_init(void); -abi_long do_syscall(void *cpu_env, int num, abi_long arg1, - abi_long arg2, abi_long arg3, abi_long arg4, - abi_long arg5, abi_long arg6, abi_long arg7, - abi_long arg8); -void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2); -extern THREAD CPUState *thread_cpu; -void cpu_loop(CPUArchState *env); -char *target_strerror(int err); -int get_osversion(void); -void init_qemu_uname_release(void); -void fork_start(void); -void fork_end(int child); - -/* Creates the initial guest address space in the host memory space using - * the given host start address hint and size. The guest_start parameter - * specifies the start address of the guest space. guest_base will be the - * difference between the host start address computed by this function and - * guest_start. If fixed is specified, then the mapped address space must - * start at host_start. The real start address of the mapped memory space is - * returned or -1 if there was an error. - */ -unsigned long init_guest_space(unsigned long host_start, - unsigned long host_size, - unsigned long guest_start, - bool fixed); - -#include "qemu/log.h" - -/* syscall.c */ -int host_to_target_waitstatus(int status); - -/* strace.c */ -void print_syscall(int num, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6); -void print_syscall_ret(int num, abi_long arg1); -extern int do_strace; - -/* signal.c */ -void process_pending_signals(CPUArchState *cpu_env); -void signal_init(void); -int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info); -void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info); -void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); -int target_to_host_signal(int sig); -int host_to_target_signal(int sig); -long do_sigreturn(CPUArchState *env); -long do_rt_sigreturn(CPUArchState *env); -abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp); -int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset); - -#ifdef TARGET_I386 -/* vm86.c */ -void save_v86_state(CPUX86State *env); -void handle_vm86_trap(CPUX86State *env, int trapno); -void handle_vm86_fault(CPUX86State *env); -int do_vm86(CPUX86State *env, long subfunction, abi_ulong v86_addr); -#elif defined(TARGET_SPARC64) -void sparc64_set_context(CPUSPARCState *env); -void sparc64_get_context(CPUSPARCState *env); -#endif - -/* mmap.c */ -int target_mprotect(abi_ulong start, abi_ulong len, int prot); -abi_long target_mmap(abi_ulong start, abi_ulong len, int prot, - int flags, int fd, abi_ulong offset); -int target_munmap(abi_ulong start, abi_ulong len); -abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size, - abi_ulong new_size, unsigned long flags, - abi_ulong new_addr); -int target_msync(abi_ulong start, abi_ulong len, int flags); -extern unsigned long last_brk; -extern abi_ulong mmap_next_start; -abi_ulong mmap_find_vma(abi_ulong, abi_ulong); -void cpu_list_lock(void); -void cpu_list_unlock(void); -void mmap_fork_start(void); -void mmap_fork_end(int child); - -/* main.c */ -extern unsigned long guest_stack_size; - -/* user access */ - -#define VERIFY_READ 0 -#define VERIFY_WRITE 1 /* implies read access */ - -static inline int access_ok(int type, abi_ulong addr, abi_ulong size) -{ - return page_check_range((target_ulong)addr, size, - (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0; -} - -/* NOTE __get_user and __put_user use host pointers and don't check access. - These are usually used to access struct data members once the struct has - been locked - usually with lock_user_struct. */ - -/* Tricky points: - - Use __builtin_choose_expr to avoid type promotion from ?:, - - Invalid sizes result in a compile time error stemming from - the fact that abort has no parameters. - - It's easier to use the endian-specific unaligned load/store - functions than host-endian unaligned load/store plus tswapN. */ - -#define __put_user_e(x, hptr, e) \ - (__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \ - ((hptr), (x)), (void)0) - -#define __get_user_e(x, hptr, e) \ - ((x) = (typeof(*hptr))( \ - __builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \ - __builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \ - (hptr)), (void)0) - -#ifdef TARGET_WORDS_BIGENDIAN -# define __put_user(x, hptr) __put_user_e(x, hptr, be) -# define __get_user(x, hptr) __get_user_e(x, hptr, be) -#else -# define __put_user(x, hptr) __put_user_e(x, hptr, le) -# define __get_user(x, hptr) __get_user_e(x, hptr, le) -#endif - -/* put_user()/get_user() take a guest address and check access */ -/* These are usually used to access an atomic data type, such as an int, - * that has been passed by address. These internally perform locking - * and unlocking on the data type. - */ -#define put_user(x, gaddr, target_type) \ -({ \ - abi_ulong __gaddr = (gaddr); \ - target_type *__hptr; \ - abi_long __ret = 0; \ - if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \ - __put_user((x), __hptr); \ - unlock_user(__hptr, __gaddr, sizeof(target_type)); \ - } else \ - __ret = -TARGET_EFAULT; \ - __ret; \ -}) - -#define get_user(x, gaddr, target_type) \ -({ \ - abi_ulong __gaddr = (gaddr); \ - target_type *__hptr; \ - abi_long __ret = 0; \ - if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \ - __get_user((x), __hptr); \ - unlock_user(__hptr, __gaddr, 0); \ - } else { \ - /* avoid warning */ \ - (x) = 0; \ - __ret = -TARGET_EFAULT; \ - } \ - __ret; \ -}) - -#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong) -#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long) -#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t) -#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t) -#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t) -#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t) -#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t) -#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t) -#define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t) -#define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t) - -#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong) -#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long) -#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t) -#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t) -#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t) -#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t) -#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t) -#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t) -#define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t) -#define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t) - -/* copy_from_user() and copy_to_user() are usually used to copy data - * buffers between the target and host. These internally perform - * locking/unlocking of the memory. - */ -abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len); -abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len); - -/* Functions for accessing guest memory. The tget and tput functions - read/write single values, byteswapping as necessary. The lock_user function - gets a pointer to a contiguous area of guest memory, but does not perform - any byteswapping. lock_user may return either a pointer to the guest - memory, or a temporary buffer. */ - -/* Lock an area of guest memory into the host. If copy is true then the - host area will have the same contents as the guest. */ -static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy) -{ - if (!access_ok(type, guest_addr, len)) - return NULL; -#ifdef DEBUG_REMAP - { - void *addr; - addr = malloc(len); - if (copy) - memcpy(addr, g2h(guest_addr), len); - else - memset(addr, 0, len); - return addr; - } -#else - return g2h(guest_addr); -#endif -} - -/* Unlock an area of guest memory. The first LEN bytes must be - flushed back to guest memory. host_ptr = NULL is explicitly - allowed and does nothing. */ -static inline void unlock_user(void *host_ptr, abi_ulong guest_addr, - long len) -{ - -#ifdef DEBUG_REMAP - if (!host_ptr) - return; - if (host_ptr == g2h(guest_addr)) - return; - if (len > 0) - memcpy(g2h(guest_addr), host_ptr, len); - free(host_ptr); -#endif -} - -/* Return the length of a string in target memory or -TARGET_EFAULT if - access error. */ -abi_long target_strlen(abi_ulong gaddr); - -/* Like lock_user but for null terminated strings. */ -static inline void *lock_user_string(abi_ulong guest_addr) -{ - abi_long len; - len = target_strlen(guest_addr); - if (len < 0) - return NULL; - return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1); -} - -/* Helper macros for locking/unlocking a target struct. */ -#define lock_user_struct(type, host_ptr, guest_addr, copy) \ - (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy)) -#define unlock_user_struct(host_ptr, guest_addr, copy) \ - unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0) - -#include <pthread.h> - -/* Include target-specific struct and function definitions; - * they may need access to the target-independent structures - * above, so include them last. - */ -#include "target_cpu.h" -#include "target_signal.h" -#include "target_structs.h" - -#endif /* QEMU_H */ diff --git a/qemu/linux-user/s390x/syscall_nr.h b/qemu/linux-user/s390x/syscall_nr.h deleted file mode 100644 index 1a66c5561..000000000 --- a/qemu/linux-user/s390x/syscall_nr.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_restart_syscall 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_brk 45 -#define TARGET_NR_signal 48 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_symlink 83 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_lookup_dcookie 110 -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_getdents 141 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 -#define TARGET_NR_getpmsg 188 -#define TARGET_NR_putpmsg 189 -#define TARGET_NR_vfork 190 -#define TARGET_NR_pivot_root 217 -#define TARGET_NR_mincore 218 -#define TARGET_NR_madvise 219 -#define TARGET_NR_getdents64 220 -#define TARGET_NR_readahead 222 -#define TARGET_NR_setxattr 224 -#define TARGET_NR_lsetxattr 225 -#define TARGET_NR_fsetxattr 226 -#define TARGET_NR_getxattr 227 -#define TARGET_NR_lgetxattr 228 -#define TARGET_NR_fgetxattr 229 -#define TARGET_NR_listxattr 230 -#define TARGET_NR_llistxattr 231 -#define TARGET_NR_flistxattr 232 -#define TARGET_NR_removexattr 233 -#define TARGET_NR_lremovexattr 234 -#define TARGET_NR_fremovexattr 235 -#define TARGET_NR_gettid 236 -#define TARGET_NR_tkill 237 -#define TARGET_NR_futex 238 -#define TARGET_NR_sched_setaffinity 239 -#define TARGET_NR_sched_getaffinity 240 -#define TARGET_NR_tgkill 241 -/* Number 242 is reserved for tux */ -#define TARGET_NR_io_setup 243 -#define TARGET_NR_io_destroy 244 -#define TARGET_NR_io_getevents 245 -#define TARGET_NR_io_submit 246 -#define TARGET_NR_io_cancel 247 -#define TARGET_NR_exit_group 248 -#define TARGET_NR_epoll_create 249 -#define TARGET_NR_epoll_ctl 250 -#define TARGET_NR_epoll_wait 251 -#define TARGET_NR_set_tid_address 252 -#define TARGET_NR_fadvise64 253 -#define TARGET_NR_timer_create 254 -#define TARGET_NR_timer_settime (TARGET_NR_timer_create+1) -#define TARGET_NR_timer_gettime (TARGET_NR_timer_create+2) -#define TARGET_NR_timer_getoverrun (TARGET_NR_timer_create+3) -#define TARGET_NR_timer_delete (TARGET_NR_timer_create+4) -#define TARGET_NR_clock_settime (TARGET_NR_timer_create+5) -#define TARGET_NR_clock_gettime (TARGET_NR_timer_create+6) -#define TARGET_NR_clock_getres (TARGET_NR_timer_create+7) -#define TARGET_NR_clock_nanosleep (TARGET_NR_timer_create+8) -/* Number 263 is reserved for vserver */ -#define TARGET_NR_statfs64 265 -#define TARGET_NR_fstatfs64 266 -#define TARGET_NR_remap_file_pages 267 -/* Number 268 is reserved for new sys_mbind */ -/* Number 269 is reserved for new sys_get_mempolicy */ -/* Number 270 is reserved for new sys_set_mempolicy */ -#define TARGET_NR_mq_open 271 -#define TARGET_NR_mq_unlink 272 -#define TARGET_NR_mq_timedsend 273 -#define TARGET_NR_mq_timedreceive 274 -#define TARGET_NR_mq_notify 275 -#define TARGET_NR_mq_getsetattr 276 -#define TARGET_NR_kexec_load 277 -#define TARGET_NR_add_key 278 -#define TARGET_NR_request_key 279 -#define TARGET_NR_keyctl 280 -#define TARGET_NR_waitid 281 -#define TARGET_NR_ioprio_set 282 -#define TARGET_NR_ioprio_get 283 -#define TARGET_NR_inotify_init 284 -#define TARGET_NR_inotify_add_watch 285 -#define TARGET_NR_inotify_rm_watch 286 -/* Number 287 is reserved for new sys_migrate_pages */ -#define TARGET_NR_openat 288 -#define TARGET_NR_mkdirat 289 -#define TARGET_NR_mknodat 290 -#define TARGET_NR_fchownat 291 -#define TARGET_NR_futimesat 292 -#define TARGET_NR_unlinkat 294 -#define TARGET_NR_renameat 295 -#define TARGET_NR_linkat 296 -#define TARGET_NR_symlinkat 297 -#define TARGET_NR_readlinkat 298 -#define TARGET_NR_fchmodat 299 -#define TARGET_NR_faccessat 300 -#define TARGET_NR_pselect6 301 -#define TARGET_NR_ppoll 302 -#define TARGET_NR_unshare 303 -#define TARGET_NR_set_robust_list 304 -#define TARGET_NR_get_robust_list 305 -#define TARGET_NR_splice 306 -#define TARGET_NR_sync_file_range 307 -#define TARGET_NR_tee 308 -#define TARGET_NR_vmsplice 309 -/* Number 310 is reserved for new sys_move_pages */ -#define TARGET_NR_getcpu 311 -#define TARGET_NR_epoll_pwait 312 -#define TARGET_NR_utimes 313 -#define TARGET_NR_fallocate 314 -#define TARGET_NR_utimensat 315 -#define TARGET_NR_signalfd 316 -#define TARGET_NR_timerfd 317 -#define TARGET_NR_eventfd 318 -#define TARGET_NR_timerfd_create 319 -#define TARGET_NR_timerfd_settime 320 -#define TARGET_NR_timerfd_gettime 321 -#define TARGET_NR_signalfd4 322 -#define TARGET_NR_eventfd2 323 -#define TARGET_NR_inotify_init1 324 -#define TARGET_NR_pipe2 325 -#define TARGET_NR_dup3 326 -#define TARGET_NR_epoll_create1 327 -#define TARGET_NR_preadv 328 -#define TARGET_NR_pwritev 329 -#define TARGET_NR_rt_tgsigqueueinfo 330 -#define TARGET_NR_perf_event_open 331 -#define TARGET_NR_fanotify_init 332 -#define TARGET_NR_fanotify_mark 333 -#define TARGET_NR_prlimit64 334 -#define TARGET_NR_name_to_handle_at 335 -#define TARGET_NR_open_by_handle_at 336 -#define TARGET_NR_clock_adjtime 337 -#define TARGET_NR_syncfs 338 -#define TARGET_NR_setns 339 -#define TARGET_NR_process_vm_readv 340 -#define TARGET_NR_process_vm_writev 341 -#define TARGET_NR_s390_runtime_instr 342 -#define TARGET_NR_kcmp 343 -#define TARGET_NR_finit_module 344 -#define TARGET_NR_sched_setattr 345 -#define TARGET_NR_sched_getattr 346 -#define TARGET_NR_renameat2 347 -#define TARGET_NR_seccomp 348 -#define TARGET_NR_getrandom 349 -#define TARGET_NR_memfd_create 350 -#define TARGET_NR_bpf 351 -#define TARGET_NR_s390_pci_mmio_write 352 -#define TARGET_NR_s390_pci_mmio_read 353 -#define TARGET_NR_execveat 354 -#define TARGET_NR_userfaultfd 355 -#define TARGET_NR_membarrier 356 -#define TARGET_NR_recvmmsg 357 -#define TARGET_NR_sendmmsg 358 -#define TARGET_NR_socket 359 -#define TARGET_NR_socketpair 360 -#define TARGET_NR_bind 361 -#define TARGET_NR_connect 362 -#define TARGET_NR_listen 363 -#define TARGET_NR_accept4 364 -#define TARGET_NR_getsockopt 365 -#define TARGET_NR_setsockopt 366 -#define TARGET_NR_getsockname 367 -#define TARGET_NR_getpeername 368 -#define TARGET_NR_sendto 369 -#define TARGET_NR_sendmsg 370 -#define TARGET_NR_recvfrom 371 -#define TARGET_NR_recvmsg 372 -#define TARGET_NR_shutdown 373 -#define TARGET_NR_mlock2 374 - -/* - * There are some system calls that are not present on 64 bit, some - * have a different name although they do the same (e.g. TARGET_NR_chown32 - * is TARGET_NR_chown on 64 bit). - */ -#ifndef TARGET_S390X - -#define TARGET_NR_time 13 -#define TARGET_NR_lchown 16 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_getrlimit 76 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_fchown 95 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR__newselect 142 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_chown 182 -#define TARGET_NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_lchown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_chown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_fcntl64 221 -#define TARGET_NR_sendfile64 223 -#define TARGET_NR_fadvise64_64 264 -#define TARGET_NR_fstatat64 293 - -#else - -#define TARGET_NR_select 142 -#define TARGET_NR_getrlimit 191 /* SuS compliant getrlimit */ -#define TARGET_NR_lchown 198 -#define TARGET_NR_getuid 199 -#define TARGET_NR_getgid 200 -#define TARGET_NR_geteuid 201 -#define TARGET_NR_getegid 202 -#define TARGET_NR_setreuid 203 -#define TARGET_NR_setregid 204 -#define TARGET_NR_getgroups 205 -#define TARGET_NR_setgroups 206 -#define TARGET_NR_fchown 207 -#define TARGET_NR_setresuid 208 -#define TARGET_NR_getresuid 209 -#define TARGET_NR_setresgid 210 -#define TARGET_NR_getresgid 211 -#define TARGET_NR_chown 212 -#define TARGET_NR_setuid 213 -#define TARGET_NR_setgid 214 -#define TARGET_NR_setfsuid 215 -#define TARGET_NR_setfsgid 216 -#define TARGET_NR_newfstatat 293 - -#endif diff --git a/qemu/linux-user/s390x/target_cpu.h b/qemu/linux-user/s390x/target_cpu.h deleted file mode 100644 index f10abe8e5..000000000 --- a/qemu/linux-user/s390x/target_cpu.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * S/390 specific CPU ABI and functions for linux-user - * - * Copyright (c) 2009 Ulrich Hecht - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * Contributions after 2012-10-29 are licensed under the terms of the - * GNU GPL, version 2 or (at your option) any later version. - * - * You should have received a copy of the GNU (Lesser) General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUS390XState *env, target_ulong newsp) -{ - if (newsp) { - env->regs[15] = newsp; - } - env->regs[2] = 0; -} - -static inline void cpu_set_tls(CPUS390XState *env, target_ulong newtls) -{ - env->aregs[0] = newtls >> 32; - env->aregs[1] = newtls & 0xffffffffULL; -} - -#endif diff --git a/qemu/linux-user/s390x/target_signal.h b/qemu/linux-user/s390x/target_signal.h deleted file mode 100644 index b4816b040..000000000 --- a/qemu/linux-user/s390x/target_signal.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - int ss_flags; - abi_ulong ss_size; -} target_stack_t; - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUS390XState *state) -{ - return state->regs[15]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/s390x/target_structs.h b/qemu/linux-user/s390x/target_structs.h deleted file mode 100644 index 6b6f5b521..000000000 --- a/qemu/linux-user/s390x/target_structs.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * S/390 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ -#if TARGET_ABI_BITS == 64 - abi_uint mode; /* Read/write permission. */ -#else - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; -#endif - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/s390x/target_syscall.h b/qemu/linux-user/s390x/target_syscall.h deleted file mode 100644 index 02061efc7..000000000 --- a/qemu/linux-user/s390x/target_syscall.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -/* this typedef defines how a Program Status Word looks like */ -typedef struct { - abi_ulong mask; - abi_ulong addr; -} __attribute__ ((aligned(8))) target_psw_t; - -/* - * The pt_regs struct defines the way the registers are stored on - * the stack during a system call. - */ - -#define TARGET_NUM_GPRS 16 - -struct target_pt_regs { - abi_ulong args[1]; - target_psw_t psw; - abi_ulong gprs[TARGET_NUM_GPRS]; - abi_ulong orig_gpr2; - unsigned short ilen; - unsigned short trap; -}; - -#define UNAME_MACHINE "s390x" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_CLONE_BACKWARDS2 -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/s390x/termbits.h b/qemu/linux-user/s390x/termbits.h deleted file mode 100644 index 2a78a0559..000000000 --- a/qemu/linux-user/s390x/termbits.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - * include/asm-s390/termbits.h - * - * S390 version - * - * Derived from "include/asm-i386/termbits.h" - */ - -#define TARGET_NCCS 19 -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -struct target_termios2 { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ - unsigned int c_ispeed; /* input speed */ - unsigned int c_ospeed; /* output speed */ -}; - -struct target_ktermios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ - unsigned int c_ispeed; /* input speed */ - unsigned int c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -#define TARGET_IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* tcflow() and TCXONC use these */ -#define TARGET_TCOOFF 0 -#define TARGET_TCOON 1 -#define TARGET_TCIOFF 2 -#define TARGET_TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TARGET_TCIFLUSH 0 -#define TARGET_TCOFLUSH 1 -#define TARGET_TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TARGET_TCSANOW 0 -#define TARGET_TCSADRAIN 1 -#define TARGET_TCSAFLUSH 2 - -/* - * include/asm-s390/ioctls.h - * - * S390 version - * - * Derived from "include/asm-i386/ioctls.h" - */ - -/* 0x54 is just a magic number to make these relatively unique ('T') */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TCGETS2 _IOR('T',0x2A, struct termios2) -#define TARGET_TCSETS2 _IOW('T',0x2B, struct termios2) -#define TARGET_TCSETSW2 _IOW('T',0x2C, struct termios2) -#define TARGET_TCSETSF2 _IOW('T',0x2D, struct termios2) -#define TARGET_TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ -#define TARGET_TIOCGDEV _IOR('T',0x32, unsigned int) /* Get real dev no below /dev/console */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_FIOQSIZE 0x545E - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ - diff --git a/qemu/linux-user/sh4/syscall_nr.h b/qemu/linux-user/sh4/syscall_nr.h deleted file mode 100644 index 50099846d..000000000 --- a/qemu/linux-user/sh4/syscall_nr.h +++ /dev/null @@ -1,374 +0,0 @@ -/* - * This file contains the system call numbers. - */ - -#define TARGET_NR_restart_syscall 0 -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lchown 16 -#define TARGET_NR_break 17 -#define TARGET_NR_oldstat 18 -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 -#define TARGET_NR_oldfstat 28 -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 -#define TARGET_NR_oldolduname 59 -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 -#define TARGET_NR_oldlstat 84 -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 -#define TARGET_NR_olduname 109 -#define TARGET_NR_iopl 110 -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_vm86old 113 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_cacheflush 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 /* Syscall for Andrew File System */ -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 -#define TARGET_NR_vm86 166 -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_chown 182 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 -#define TARGET_NR_streams1 188 /* some people actually want it */ -#define TARGET_NR_streams2 189 /* some people actually want it */ -#define TARGET_NR_vfork 190 -#define TARGET_NR_ugetrlimit 191 /* SuS compliant getrlimit */ -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_lchown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_chown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_pivot_root 217 -#define TARGET_NR_mincore 218 -#define TARGET_NR_madvise 219 -#define TARGET_NR_getdents64 220 -#define TARGET_NR_fcntl64 221 -/* 223 is unused */ -#define TARGET_NR_gettid 224 -#define TARGET_NR_readahead 225 -#define TARGET_NR_setxattr 226 -#define TARGET_NR_lsetxattr 227 -#define TARGET_NR_fsetxattr 228 -#define TARGET_NR_getxattr 229 -#define TARGET_NR_lgetxattr 230 -#define TARGET_NR_fgetxattr 231 -#define TARGET_NR_listxattr 232 -#define TARGET_NR_llistxattr 233 -#define TARGET_NR_flistxattr 234 -#define TARGET_NR_removexattr 235 -#define TARGET_NR_lremovexattr 236 -#define TARGET_NR_fremovexattr 237 -#define TARGET_NR_tkill 238 -#define TARGET_NR_sendfile64 239 -#define TARGET_NR_futex 240 -#define TARGET_NR_sched_setaffinity 241 -#define TARGET_NR_sched_getaffinity 242 -#define TARGET_NR_set_thread_area 243 -#define TARGET_NR_get_thread_area 244 -#define TARGET_NR_io_setup 245 -#define TARGET_NR_io_destroy 246 -#define TARGET_NR_io_getevents 247 -#define TARGET_NR_io_submit 248 -#define TARGET_NR_io_cancel 249 -#define TARGET_NR_fadvise64 250 - -#define TARGET_NR_exit_group 252 -#define TARGET_NR_lookup_dcookie 253 -#define TARGET_NR_epoll_create 254 -#define TARGET_NR_epoll_ctl 255 -#define TARGET_NR_epoll_wait 256 -#define TARGET_NR_remap_file_pages 257 -#define TARGET_NR_set_tid_address 258 -#define TARGET_NR_timer_create 259 -#define TARGET_NR_timer_settime (TARGET_NR_timer_create+1) -#define TARGET_NR_timer_gettime (TARGET_NR_timer_create+2) -#define TARGET_NR_timer_getoverrun (TARGET_NR_timer_create+3) -#define TARGET_NR_timer_delete (TARGET_NR_timer_create+4) -#define TARGET_NR_clock_settime (TARGET_NR_timer_create+5) -#define TARGET_NR_clock_gettime (TARGET_NR_timer_create+6) -#define TARGET_NR_clock_getres (TARGET_NR_timer_create+7) -#define TARGET_NR_clock_nanosleep (TARGET_NR_timer_create+8) -#define TARGET_NR_statfs64 268 -#define TARGET_NR_fstatfs64 269 -#define TARGET_NR_tgkill 270 -#define TARGET_NR_utimes 271 -#define TARGET_NR_fadvise64_64 272 -#define TARGET_NR_vserver 273 -#define TARGET_NR_mbind 274 -#define TARGET_NR_get_mempolicy 275 -#define TARGET_NR_set_mempolicy 276 -#define TARGET_NR_mq_open 277 -#define TARGET_NR_mq_unlink (TARGET_NR_mq_open+1) -#define TARGET_NR_mq_timedsend (TARGET_NR_mq_open+2) -#define TARGET_NR_mq_timedreceive (TARGET_NR_mq_open+3) -#define TARGET_NR_mq_notify (TARGET_NR_mq_open+4) -#define TARGET_NR_mq_getsetattr (TARGET_NR_mq_open+5) -#define TARGET_NR_sys_kexec_load 283 -#define TARGET_NR_waitid 284 -#define TARGET_NR_add_key 285 -#define TARGET_NR_request_key 286 -#define TARGET_NR_keyctl 287 -#define TARGET_NR_ioprio_set 288 -#define TARGET_NR_ioprio_get 289 -#define TARGET_NR_inotify_init 290 -#define TARGET_NR_inotify_add_watch 291 -#define TARGET_NR_inotify_rm_watch 292 -/* 293 is unused */ -#define TARGET_NR_migrate_pages 294 -#define TARGET_NR_openat 295 -#define TARGET_NR_mkdirat 296 -#define TARGET_NR_mknodat 297 -#define TARGET_NR_fchownat 298 -#define TARGET_NR_futimesat 299 -#define TARGET_NR_fstatat64 300 -#define TARGET_NR_unlinkat 301 -#define TARGET_NR_renameat 302 -#define TARGET_NR_linkat 303 -#define TARGET_NR_symlinkat 304 -#define TARGET_NR_readlinkat 305 -#define TARGET_NR_fchmodat 306 -#define TARGET_NR_faccessat 307 -#define TARGET_NR_pselect6 308 -#define TARGET_NR_ppoll 309 -#define TARGET_NR_unshare 310 -#define TARGET_NR_set_robust_list 311 -#define TARGET_NR_get_robust_list 312 -#define TARGET_NR_splice 313 -#define TARGET_NR_sync_file_range 314 -#define TARGET_NR_tee 315 -#define TARGET_NR_vmsplice 316 -#define TARGET_NR_move_pages 317 -#define TARGET_NR_getcpu 318 -#define TARGET_NR_epoll_pwait 319 -#define TARGET_NR_utimensat 320 -#define TARGET_NR_signalfd 321 -#define TARGET_NR_timerfd_create 322 -#define TARGET_NR_eventfd 323 -#define TARGET_NR_fallocate 324 -#define TARGET_NR_timerfd_settime 325 -#define TARGET_NR_timerfd_gettime 326 -#define TARGET_NR_signalfd4 327 -#define TARGET_NR_eventfd2 328 -#define TARGET_NR_epoll_create1 329 -#define TARGET_NR_dup3 330 -#define TARGET_NR_pipe2 331 -#define TARGET_NR_inotify_init1 332 -#define TARGET_NR_preadv 333 -#define TARGET_NR_pwritev 334 -#define TARGET_NR_rt_tgsigqueueinfo 335 -#define TARGET_NR_perf_event_open 336 -#define TARGET_NR_fanotify_init 337 -#define TARGET_NR_fanotify_mark 338 -#define TARGET_NR_prlimit64 339 - -/* Non-multiplexed socket family */ -#define TARGET_NR_socket 340 -#define TARGET_NR_bind 341 -#define TARGET_NR_connect 342 -#define TARGET_NR_listen 343 -#define TARGET_NR_accept 344 -#define TARGET_NR_getsockname 345 -#define TARGET_NR_getpeername 346 -#define TARGET_NR_socketpair 347 -#define TARGET_NR_send 348 -#define TARGET_NR_sendto 349 -#define TARGET_NR_recv 350 -#define TARGET_NR_recvfrom 351 -#define TARGET_NR_shutdown 352 -#define TARGET_NR_setsockopt 353 -#define TARGET_NR_getsockopt 354 -#define TARGET_NR_sendmsg 355 -#define TARGET_NR_recvmsg 356 -#define TARGET_NR_recvmmsg 357 -#define TARGET_NR_accept4 358 -#define TARGET_NR_name_to_handle_at 359 -#define TARGET_NR_open_by_handle_at 360 -#define TARGET_NR_clock_adjtime 361 -#define TARGET_NR_syncfs 362 -#define TARGET_NR_sendmmsg 363 -#define TARGET_NR_setns 364 -#define TARGET_NR_process_vm_readv 365 -#define TARGET_NR_process_vm_writev 366 -#define TARGET_NR_kcmp 367 -#define TARGET_NR_finit_module 368 diff --git a/qemu/linux-user/sh4/target_cpu.h b/qemu/linux-user/sh4/target_cpu.h deleted file mode 100644 index 141856f84..000000000 --- a/qemu/linux-user/sh4/target_cpu.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SH4 specific CPU ABI and functions for linux-user - * - * Copyright (c) 2005 Samuel Tardieu - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUSH4State *env, target_ulong newsp) -{ - if (newsp) { - env->gregs[15] = newsp; - } - env->gregs[0] = 0; -} - -static inline void cpu_set_tls(CPUSH4State *env, target_ulong newtls) -{ - env->gbr = newtls; -} - -#endif diff --git a/qemu/linux-user/sh4/target_signal.h b/qemu/linux-user/sh4/target_signal.h deleted file mode 100644 index e148da092..000000000 --- a/qemu/linux-user/sh4/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUSH4State *state) -{ - return state->gregs[15]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/sh4/target_structs.h b/qemu/linux-user/sh4/target_structs.h deleted file mode 100644 index 32b235e0b..000000000 --- a/qemu/linux-user/sh4/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * SH4 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/sh4/target_syscall.h b/qemu/linux-user/sh4/target_syscall.h deleted file mode 100644 index 9f3381bc9..000000000 --- a/qemu/linux-user/sh4/target_syscall.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -struct target_pt_regs { - unsigned long regs[16]; - unsigned long pc; - unsigned long pr; - unsigned long sr; - unsigned long gbr; - unsigned long mach; - unsigned long macl; - long tra; -}; - -#define UNAME_MACHINE "sh4" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/sh4/termbits.h b/qemu/linux-user/sh4/termbits.h deleted file mode 100644 index 2ff774f6b..000000000 --- a/qemu/linux-user/sh4/termbits.h +++ /dev/null @@ -1,274 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* tcflow() and TCXONC use these */ -#define TARGET_TCOOFF 0 -#define TARGET_TCOON 1 -#define TARGET_TCIOFF 2 -#define TARGET_TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TARGET_TCIFLUSH 0 -#define TARGET_TCOFLUSH 1 -#define TARGET_TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TARGET_TCSANOW 0 -#define TARGET_TCSADRAIN 1 -#define TARGET_TARGET_TCSAFLUSH 2 - -/* ioctl */ -#define TARGET_FIOCLEX TARGET_IO('f', 1) -#define TARGET_FIONCLEX TARGET_IO('f', 2) -#define TARGET_FIOASYNC TARGET_IOW('f', 125, int) -#define TARGET_FIONBIO TARGET_IOW('f', 126, int) -#define TARGET_FIONREAD TARGET_IOR('f', 127, int) -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_FIOQSIZE TARGET_IOR('f', 128, loff_t) -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA TARGET_IOR('t', 23, struct termio) -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) -#define TARGET_TIOCSTART TARGET_IO('t', 110) /* start output, like ^Q */ -#define TARGET_TIOCSTOP TARGET_IO('t', 111) /* stop output, like ^S */ -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) /* output queue size */ - -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) - -#define TARGET_TCSETA TARGET_IOW('t', 24, struct termio) -#define TARGET_TCSETAW TARGET_IOW('t', 25, struct termio) -#define TARGET_TCSETAF TARGET_IOW('t', 28, struct termio) -#define TARGET_TCSBRK TARGET_IO('t', 29) -#define TARGET_TCXONC TARGET_IO('t', 30) -#define TARGET_TCFLSH TARGET_IO('t', 31) - -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) -#define TARGET_TIOCSTART TARGET_IO('t', 110) /* start output, like ^Q */ -#define TARGET_TIOCSTOP TARGET_IO('t', 111) /* stop output, like ^S */ -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) /* output queue size */ - -#define TARGET_TIOCSPGRP TARGET_IOW('t', 118, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 119, int) -#define TARGET_TIOCEXCL TARGET_IO('T', 12) /* 0x540C */ -#define TARGET_TIOCNXCL TARGET_IO('T', 13) /* 0x540D */ -#define TARGET_TIOCSCTTY TARGET_IO('T', 14) /* 0x540E */ - -#define TARGET_TIOCSTI TARGET_IOW('T', 18, char) /* 0x5412 */ -#define TARGET_TIOCMGET TARGET_IOR('T', 21, unsigned int) /* 0x5415 */ -#define TARGET_TIOCMBIS TARGET_IOW('T', 22, unsigned int) /* 0x5416 */ -#define TARGET_TIOCMBIC TARGET_IOW('T', 23, unsigned int) /* 0x5417 */ -#define TARGET_TIOCMSET TARGET_IOW('T', 24, unsigned int) /* 0x5418 */ -#define TARGET_TIOCM_LE 0x001 -#define TARGET_TIOCM_DTR 0x002 -#define TARGET_TIOCM_RTS 0x004 -#define TARGET_TIOCM_ST 0x008 -#define TARGET_TIOCM_SR 0x010 -#define TARGET_TIOCM_CTS 0x020 -#define TARGET_TIOCM_CAR 0x040 -#define TARGET_TIOCM_RNG 0x080 -#define TARGET_TIOCM_DSR 0x100 -#define TARGET_TIOCM_CD TARGET_TIOCM_CAR -#define TARGET_TIOCM_RI TARGET_TIOCM_RNG - -#define TARGET_TIOCGSOFTCAR TARGET_IOR('T', 25, unsigned int) /* 0x5419 */ -#define TARGET_TIOCSSOFTCAR TARGET_IOW('T', 26, unsigned int) /* 0x541A */ -#define TARGET_TIOCLINUX TARGET_IOW('T', 28, char) /* 0x541C */ -#define TARGET_TIOCCONS TARGET_IO('T', 29) /* 0x541D */ -#define TARGET_TIOCGSERIAL TARGET_IOR('T', 30, int) /* 0x541E */ -#define TARGET_TIOCSSERIAL TARGET_IOW('T', 31, int) /* 0x541F */ -#define TARGET_TIOCPKT TARGET_IOW('T', 32, int) /* 0x5420 */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - - -#define TARGET_TIOCNOTTY TARGET_IO('T', 34) /* 0x5422 */ -#define TARGET_TIOCSETD TARGET_IOW('T', 35, int) /* 0x5423 */ -#define TARGET_TIOCGETD TARGET_IOR('T', 36, int) /* 0x5424 */ -#define TARGET_TCSBRKP TARGET_IOW('T', 37, int) /* 0x5425 */ /* Needed for POSIX tcse -ndbreak() */ -#define TARGET_TIOCSBRK TARGET_IO('T', 39) /* 0x5427 */ /* BSD compatibility */ -#define TARGET_TIOCCBRK TARGET_IO('T', 40) /* 0x5428 */ /* BSD compatibility */ -#define TARGET_TIOCGSID TARGET_IOR('T', 41, pid_t) /* 0x5429 */ /* Return the session -ID of FD */ -#define TARGET_TIOCGPTN TARGET_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-m -ux device) */ -#define TARGET_TIOCSPTLCK TARGET_IOW('T',0x31, int) /* Lock/unlock Pty */ - - -#define TARGET_TIOCSERCONFIG TARGET_IO('T', 83) /* 0x5453 */ -#define TARGET_TIOCSERGWILD TARGET_IOR('T', 84, int) /* 0x5454 */ -#define TARGET_TIOCSERSWILD TARGET_IOW('T', 85, int) /* 0x5455 */ -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT TARGET_IOR('T', 88, int) /* 0x5458 */ /* For d -ebugging only */ -#define TARGET_TIOCSERGETLSR TARGET_IOR('T', 89, unsigned int) /* 0x5459 */ /* Get line sta -tus register */ - /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ -# define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ -#define TARGET_TIOCSERGETMULTI TARGET_IOR('T', 90, int) /* 0x545A -*/ /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI TARGET_IOW('T', 91, int) /* 0x545B -*/ /* Set multiport config */ - -#define TARGET_TIOCMIWAIT TARGET_IO('T', 92) /* 0x545C */ /* wait for a change on -serial input line(s) */ -#define TARGET_TIOCGICOUNT TARGET_IOR('T', 93, int) /* 0x545D */ /* read -serial port inline interrupt counts */ diff --git a/qemu/linux-user/signal.c b/qemu/linux-user/signal.c deleted file mode 100644 index 96e86c0a2..000000000 --- a/qemu/linux-user/signal.c +++ /dev/null @@ -1,5822 +0,0 @@ -/* - * Emulation of Linux signals - * - * Copyright (c) 2003 Fabrice Bellard - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#include "qemu/osdep.h" -#include <sys/ucontext.h> -#include <sys/resource.h> - -#include "qemu.h" -#include "qemu-common.h" -#include "target_signal.h" -#include "trace.h" - -static struct target_sigaltstack target_sigaltstack_used = { - .ss_sp = 0, - .ss_size = 0, - .ss_flags = TARGET_SS_DISABLE, -}; - -static struct target_sigaction sigact_table[TARGET_NSIG]; - -static void host_signal_handler(int host_signum, siginfo_t *info, - void *puc); - -static uint8_t host_to_target_signal_table[_NSIG] = { - [SIGHUP] = TARGET_SIGHUP, - [SIGINT] = TARGET_SIGINT, - [SIGQUIT] = TARGET_SIGQUIT, - [SIGILL] = TARGET_SIGILL, - [SIGTRAP] = TARGET_SIGTRAP, - [SIGABRT] = TARGET_SIGABRT, -/* [SIGIOT] = TARGET_SIGIOT,*/ - [SIGBUS] = TARGET_SIGBUS, - [SIGFPE] = TARGET_SIGFPE, - [SIGKILL] = TARGET_SIGKILL, - [SIGUSR1] = TARGET_SIGUSR1, - [SIGSEGV] = TARGET_SIGSEGV, - [SIGUSR2] = TARGET_SIGUSR2, - [SIGPIPE] = TARGET_SIGPIPE, - [SIGALRM] = TARGET_SIGALRM, - [SIGTERM] = TARGET_SIGTERM, -#ifdef SIGSTKFLT - [SIGSTKFLT] = TARGET_SIGSTKFLT, -#endif - [SIGCHLD] = TARGET_SIGCHLD, - [SIGCONT] = TARGET_SIGCONT, - [SIGSTOP] = TARGET_SIGSTOP, - [SIGTSTP] = TARGET_SIGTSTP, - [SIGTTIN] = TARGET_SIGTTIN, - [SIGTTOU] = TARGET_SIGTTOU, - [SIGURG] = TARGET_SIGURG, - [SIGXCPU] = TARGET_SIGXCPU, - [SIGXFSZ] = TARGET_SIGXFSZ, - [SIGVTALRM] = TARGET_SIGVTALRM, - [SIGPROF] = TARGET_SIGPROF, - [SIGWINCH] = TARGET_SIGWINCH, - [SIGIO] = TARGET_SIGIO, - [SIGPWR] = TARGET_SIGPWR, - [SIGSYS] = TARGET_SIGSYS, - /* next signals stay the same */ - /* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with - host libpthread signals. This assumes no one actually uses SIGRTMAX :-/ - To fix this properly we need to do manual signal delivery multiplexed - over a single host signal. */ - [__SIGRTMIN] = __SIGRTMAX, - [__SIGRTMAX] = __SIGRTMIN, -}; -static uint8_t target_to_host_signal_table[_NSIG]; - -static inline int on_sig_stack(unsigned long sp) -{ - return (sp - target_sigaltstack_used.ss_sp - < target_sigaltstack_used.ss_size); -} - -static inline int sas_ss_flags(unsigned long sp) -{ - return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE - : on_sig_stack(sp) ? SS_ONSTACK : 0); -} - -int host_to_target_signal(int sig) -{ - if (sig < 0 || sig >= _NSIG) - return sig; - return host_to_target_signal_table[sig]; -} - -int target_to_host_signal(int sig) -{ - if (sig < 0 || sig >= _NSIG) - return sig; - return target_to_host_signal_table[sig]; -} - -static inline void target_sigemptyset(target_sigset_t *set) -{ - memset(set, 0, sizeof(*set)); -} - -static inline void target_sigaddset(target_sigset_t *set, int signum) -{ - signum--; - abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW); - set->sig[signum / TARGET_NSIG_BPW] |= mask; -} - -static inline int target_sigismember(const target_sigset_t *set, int signum) -{ - signum--; - abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW); - return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0); -} - -static void host_to_target_sigset_internal(target_sigset_t *d, - const sigset_t *s) -{ - int i; - target_sigemptyset(d); - for (i = 1; i <= TARGET_NSIG; i++) { - if (sigismember(s, i)) { - target_sigaddset(d, host_to_target_signal(i)); - } - } -} - -void host_to_target_sigset(target_sigset_t *d, const sigset_t *s) -{ - target_sigset_t d1; - int i; - - host_to_target_sigset_internal(&d1, s); - for(i = 0;i < TARGET_NSIG_WORDS; i++) - d->sig[i] = tswapal(d1.sig[i]); -} - -static void target_to_host_sigset_internal(sigset_t *d, - const target_sigset_t *s) -{ - int i; - sigemptyset(d); - for (i = 1; i <= TARGET_NSIG; i++) { - if (target_sigismember(s, i)) { - sigaddset(d, target_to_host_signal(i)); - } - } -} - -void target_to_host_sigset(sigset_t *d, const target_sigset_t *s) -{ - target_sigset_t s1; - int i; - - for(i = 0;i < TARGET_NSIG_WORDS; i++) - s1.sig[i] = tswapal(s->sig[i]); - target_to_host_sigset_internal(d, &s1); -} - -void host_to_target_old_sigset(abi_ulong *old_sigset, - const sigset_t *sigset) -{ - target_sigset_t d; - host_to_target_sigset(&d, sigset); - *old_sigset = d.sig[0]; -} - -void target_to_host_old_sigset(sigset_t *sigset, - const abi_ulong *old_sigset) -{ - target_sigset_t d; - int i; - - d.sig[0] = *old_sigset; - for(i = 1;i < TARGET_NSIG_WORDS; i++) - d.sig[i] = 0; - target_to_host_sigset(sigset, &d); -} - -/* Wrapper for sigprocmask function - * Emulates a sigprocmask in a safe way for the guest. Note that set and oldset - * are host signal set, not guest ones. This wraps the sigprocmask host calls - * that should be protected (calls originated from guest) - */ -int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset) -{ - int ret; - sigset_t val; - sigset_t *temp = NULL; - CPUState *cpu = thread_cpu; - TaskState *ts = (TaskState *)cpu->opaque; - bool segv_was_blocked = ts->sigsegv_blocked; - - if (set) { - bool has_sigsegv = sigismember(set, SIGSEGV); - val = *set; - temp = &val; - - sigdelset(temp, SIGSEGV); - - switch (how) { - case SIG_BLOCK: - if (has_sigsegv) { - ts->sigsegv_blocked = true; - } - break; - case SIG_UNBLOCK: - if (has_sigsegv) { - ts->sigsegv_blocked = false; - } - break; - case SIG_SETMASK: - ts->sigsegv_blocked = has_sigsegv; - break; - default: - g_assert_not_reached(); - } - } - - ret = sigprocmask(how, temp, oldset); - - if (oldset && segv_was_blocked) { - sigaddset(oldset, SIGSEGV); - } - - return ret; -} - -/* siginfo conversion */ - -static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo, - const siginfo_t *info) -{ - int sig = host_to_target_signal(info->si_signo); - tinfo->si_signo = sig; - tinfo->si_errno = 0; - tinfo->si_code = info->si_code; - - if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV - || sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) { - /* Should never come here, but who knows. The information for - the target is irrelevant. */ - tinfo->_sifields._sigfault._addr = 0; - } else if (sig == TARGET_SIGIO) { - tinfo->_sifields._sigpoll._band = info->si_band; - tinfo->_sifields._sigpoll._fd = info->si_fd; - } else if (sig == TARGET_SIGCHLD) { - tinfo->_sifields._sigchld._pid = info->si_pid; - tinfo->_sifields._sigchld._uid = info->si_uid; - tinfo->_sifields._sigchld._status - = host_to_target_waitstatus(info->si_status); - tinfo->_sifields._sigchld._utime = info->si_utime; - tinfo->_sifields._sigchld._stime = info->si_stime; - } else if (sig >= TARGET_SIGRTMIN) { - tinfo->_sifields._rt._pid = info->si_pid; - tinfo->_sifields._rt._uid = info->si_uid; - /* XXX: potential problem if 64 bit */ - tinfo->_sifields._rt._sigval.sival_ptr - = (abi_ulong)(unsigned long)info->si_value.sival_ptr; - } -} - -static void tswap_siginfo(target_siginfo_t *tinfo, - const target_siginfo_t *info) -{ - int sig = info->si_signo; - tinfo->si_signo = tswap32(sig); - tinfo->si_errno = tswap32(info->si_errno); - tinfo->si_code = tswap32(info->si_code); - - if (sig == TARGET_SIGILL || sig == TARGET_SIGFPE || sig == TARGET_SIGSEGV - || sig == TARGET_SIGBUS || sig == TARGET_SIGTRAP) { - tinfo->_sifields._sigfault._addr - = tswapal(info->_sifields._sigfault._addr); - } else if (sig == TARGET_SIGIO) { - tinfo->_sifields._sigpoll._band - = tswap32(info->_sifields._sigpoll._band); - tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd); - } else if (sig == TARGET_SIGCHLD) { - tinfo->_sifields._sigchld._pid - = tswap32(info->_sifields._sigchld._pid); - tinfo->_sifields._sigchld._uid - = tswap32(info->_sifields._sigchld._uid); - tinfo->_sifields._sigchld._status - = tswap32(info->_sifields._sigchld._status); - tinfo->_sifields._sigchld._utime - = tswapal(info->_sifields._sigchld._utime); - tinfo->_sifields._sigchld._stime - = tswapal(info->_sifields._sigchld._stime); - } else if (sig >= TARGET_SIGRTMIN) { - tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid); - tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid); - tinfo->_sifields._rt._sigval.sival_ptr - = tswapal(info->_sifields._rt._sigval.sival_ptr); - } -} - - -void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info) -{ - host_to_target_siginfo_noswap(tinfo, info); - tswap_siginfo(tinfo, tinfo); -} - -/* XXX: we support only POSIX RT signals are used. */ -/* XXX: find a solution for 64 bit (additional malloced data is needed) */ -void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo) -{ - info->si_signo = tswap32(tinfo->si_signo); - info->si_errno = tswap32(tinfo->si_errno); - info->si_code = tswap32(tinfo->si_code); - info->si_pid = tswap32(tinfo->_sifields._rt._pid); - info->si_uid = tswap32(tinfo->_sifields._rt._uid); - info->si_value.sival_ptr = - (void *)(long)tswapal(tinfo->_sifields._rt._sigval.sival_ptr); -} - -static int fatal_signal (int sig) -{ - switch (sig) { - case TARGET_SIGCHLD: - case TARGET_SIGURG: - case TARGET_SIGWINCH: - /* Ignored by default. */ - return 0; - case TARGET_SIGCONT: - case TARGET_SIGSTOP: - case TARGET_SIGTSTP: - case TARGET_SIGTTIN: - case TARGET_SIGTTOU: - /* Job control signals. */ - return 0; - default: - return 1; - } -} - -/* returns 1 if given signal should dump core if not handled */ -static int core_dump_signal(int sig) -{ - switch (sig) { - case TARGET_SIGABRT: - case TARGET_SIGFPE: - case TARGET_SIGILL: - case TARGET_SIGQUIT: - case TARGET_SIGSEGV: - case TARGET_SIGTRAP: - case TARGET_SIGBUS: - return (1); - default: - return (0); - } -} - -void signal_init(void) -{ - struct sigaction act; - struct sigaction oact; - int i, j; - int host_sig; - - /* generate signal conversion tables */ - for(i = 1; i < _NSIG; i++) { - if (host_to_target_signal_table[i] == 0) - host_to_target_signal_table[i] = i; - } - for(i = 1; i < _NSIG; i++) { - j = host_to_target_signal_table[i]; - target_to_host_signal_table[j] = i; - } - - /* set all host signal handlers. ALL signals are blocked during - the handlers to serialize them. */ - memset(sigact_table, 0, sizeof(sigact_table)); - - sigfillset(&act.sa_mask); - act.sa_flags = SA_SIGINFO; - act.sa_sigaction = host_signal_handler; - for(i = 1; i <= TARGET_NSIG; i++) { - host_sig = target_to_host_signal(i); - sigaction(host_sig, NULL, &oact); - if (oact.sa_sigaction == (void *)SIG_IGN) { - sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN; - } else if (oact.sa_sigaction == (void *)SIG_DFL) { - sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL; - } - /* If there's already a handler installed then something has - gone horribly wrong, so don't even try to handle that case. */ - /* Install some handlers for our own use. We need at least - SIGSEGV and SIGBUS, to detect exceptions. We can not just - trap all signals because it affects syscall interrupt - behavior. But do trap all default-fatal signals. */ - if (fatal_signal (i)) - sigaction(host_sig, &act, NULL); - } -} - -/* signal queue handling */ - -static inline struct sigqueue *alloc_sigqueue(CPUArchState *env) -{ - CPUState *cpu = ENV_GET_CPU(env); - TaskState *ts = cpu->opaque; - struct sigqueue *q = ts->first_free; - if (!q) - return NULL; - ts->first_free = q->next; - return q; -} - -static inline void free_sigqueue(CPUArchState *env, struct sigqueue *q) -{ - CPUState *cpu = ENV_GET_CPU(env); - TaskState *ts = cpu->opaque; - - q->next = ts->first_free; - ts->first_free = q; -} - -/* abort execution with signal */ -static void QEMU_NORETURN force_sig(int target_sig) -{ - CPUState *cpu = thread_cpu; - CPUArchState *env = cpu->env_ptr; - TaskState *ts = (TaskState *)cpu->opaque; - int host_sig, core_dumped = 0; - struct sigaction act; - - host_sig = target_to_host_signal(target_sig); - trace_user_force_sig(env, target_sig, host_sig); - gdb_signalled(env, target_sig); - - /* dump core if supported by target binary format */ - if (core_dump_signal(target_sig) && (ts->bprm->core_dump != NULL)) { - stop_all_tasks(); - core_dumped = - ((*ts->bprm->core_dump)(target_sig, env) == 0); - } - if (core_dumped) { - /* we already dumped the core of target process, we don't want - * a coredump of qemu itself */ - struct rlimit nodump; - getrlimit(RLIMIT_CORE, &nodump); - nodump.rlim_cur=0; - setrlimit(RLIMIT_CORE, &nodump); - (void) fprintf(stderr, "qemu: uncaught target signal %d (%s) - %s\n", - target_sig, strsignal(host_sig), "core dumped" ); - } - - /* The proper exit code for dying from an uncaught signal is - * -<signal>. The kernel doesn't allow exit() or _exit() to pass - * a negative value. To get the proper exit code we need to - * actually die from an uncaught signal. Here the default signal - * handler is installed, we send ourself a signal and we wait for - * it to arrive. */ - sigfillset(&act.sa_mask); - act.sa_handler = SIG_DFL; - act.sa_flags = 0; - sigaction(host_sig, &act, NULL); - - /* For some reason raise(host_sig) doesn't send the signal when - * statically linked on x86-64. */ - kill(getpid(), host_sig); - - /* Make sure the signal isn't masked (just reuse the mask inside - of act) */ - sigdelset(&act.sa_mask, host_sig); - sigsuspend(&act.sa_mask); - - /* unreachable */ - abort(); -} - -/* queue a signal so that it will be send to the virtual CPU as soon - as possible */ -int queue_signal(CPUArchState *env, int sig, target_siginfo_t *info) -{ - CPUState *cpu = ENV_GET_CPU(env); - TaskState *ts = cpu->opaque; - struct emulated_sigtable *k; - struct sigqueue *q, **pq; - abi_ulong handler; - int queue; - - trace_user_queue_signal(env, sig); - k = &ts->sigtab[sig - 1]; - queue = gdb_queuesig (); - handler = sigact_table[sig - 1]._sa_handler; - - if (ts->sigsegv_blocked && sig == TARGET_SIGSEGV) { - /* Guest has blocked SIGSEGV but we got one anyway. Assume this - * is a forced SIGSEGV (ie one the kernel handles via force_sig_info - * because it got a real MMU fault). A blocked SIGSEGV in that - * situation is treated as if using the default handler. This is - * not correct if some other process has randomly sent us a SIGSEGV - * via kill(), but that is not easy to distinguish at this point, - * so we assume it doesn't happen. - */ - handler = TARGET_SIG_DFL; - } - - if (!queue && handler == TARGET_SIG_DFL) { - if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) { - kill(getpid(),SIGSTOP); - return 0; - } else - /* default handler : ignore some signal. The other are fatal */ - if (sig != TARGET_SIGCHLD && - sig != TARGET_SIGURG && - sig != TARGET_SIGWINCH && - sig != TARGET_SIGCONT) { - force_sig(sig); - } else { - return 0; /* indicate ignored */ - } - } else if (!queue && handler == TARGET_SIG_IGN) { - /* ignore signal */ - return 0; - } else if (!queue && handler == TARGET_SIG_ERR) { - force_sig(sig); - } else { - pq = &k->first; - if (sig < TARGET_SIGRTMIN) { - /* if non real time signal, we queue exactly one signal */ - if (!k->pending) - q = &k->info; - else - return 0; - } else { - if (!k->pending) { - /* first signal */ - q = &k->info; - } else { - q = alloc_sigqueue(env); - if (!q) - return -EAGAIN; - while (*pq != NULL) - pq = &(*pq)->next; - } - } - *pq = q; - q->info = *info; - q->next = NULL; - k->pending = 1; - /* signal that a new signal is pending */ - ts->signal_pending = 1; - return 1; /* indicates that the signal was queued */ - } -} - -static void host_signal_handler(int host_signum, siginfo_t *info, - void *puc) -{ - CPUArchState *env = thread_cpu->env_ptr; - int sig; - target_siginfo_t tinfo; - - /* the CPU emulator uses some host signals to detect exceptions, - we forward to it some signals */ - if ((host_signum == SIGSEGV || host_signum == SIGBUS) - && info->si_code > 0) { - if (cpu_signal_handler(host_signum, info, puc)) - return; - } - - /* get target signal number */ - sig = host_to_target_signal(host_signum); - if (sig < 1 || sig > TARGET_NSIG) - return; - trace_user_host_signal(env, host_signum, sig); - host_to_target_siginfo_noswap(&tinfo, info); - if (queue_signal(env, sig, &tinfo) == 1) { - /* interrupt the virtual CPU as soon as possible */ - cpu_exit(thread_cpu); - } -} - -/* do_sigaltstack() returns target values and errnos. */ -/* compare linux/kernel/signal.c:do_sigaltstack() */ -abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp) -{ - int ret; - struct target_sigaltstack oss; - - /* XXX: test errors */ - if(uoss_addr) - { - __put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &oss.ss_size); - __put_user(sas_ss_flags(sp), &oss.ss_flags); - } - - if(uss_addr) - { - struct target_sigaltstack *uss; - struct target_sigaltstack ss; - size_t minstacksize = TARGET_MINSIGSTKSZ; - -#if defined(TARGET_PPC64) - /* ELF V2 for PPC64 has a 4K minimum stack size for signal handlers */ - struct image_info *image = ((TaskState *)thread_cpu->opaque)->info; - if (get_ppc64_abi(image) > 1) { - minstacksize = 4096; - } -#endif - - ret = -TARGET_EFAULT; - if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1)) { - goto out; - } - __get_user(ss.ss_sp, &uss->ss_sp); - __get_user(ss.ss_size, &uss->ss_size); - __get_user(ss.ss_flags, &uss->ss_flags); - unlock_user_struct(uss, uss_addr, 0); - - ret = -TARGET_EPERM; - if (on_sig_stack(sp)) - goto out; - - ret = -TARGET_EINVAL; - if (ss.ss_flags != TARGET_SS_DISABLE - && ss.ss_flags != TARGET_SS_ONSTACK - && ss.ss_flags != 0) - goto out; - - if (ss.ss_flags == TARGET_SS_DISABLE) { - ss.ss_size = 0; - ss.ss_sp = 0; - } else { - ret = -TARGET_ENOMEM; - if (ss.ss_size < minstacksize) { - goto out; - } - } - - target_sigaltstack_used.ss_sp = ss.ss_sp; - target_sigaltstack_used.ss_size = ss.ss_size; - } - - if (uoss_addr) { - ret = -TARGET_EFAULT; - if (copy_to_user(uoss_addr, &oss, sizeof(oss))) - goto out; - } - - ret = 0; -out: - return ret; -} - -/* do_sigaction() return host values and errnos */ -int do_sigaction(int sig, const struct target_sigaction *act, - struct target_sigaction *oact) -{ - struct target_sigaction *k; - struct sigaction act1; - int host_sig; - int ret = 0; - - if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) - return -EINVAL; - k = &sigact_table[sig - 1]; - if (oact) { - __put_user(k->_sa_handler, &oact->_sa_handler); - __put_user(k->sa_flags, &oact->sa_flags); -#if !defined(TARGET_MIPS) - __put_user(k->sa_restorer, &oact->sa_restorer); -#endif - /* Not swapped. */ - oact->sa_mask = k->sa_mask; - } - if (act) { - /* FIXME: This is not threadsafe. */ - __get_user(k->_sa_handler, &act->_sa_handler); - __get_user(k->sa_flags, &act->sa_flags); -#if !defined(TARGET_MIPS) - __get_user(k->sa_restorer, &act->sa_restorer); -#endif - /* To be swapped in target_to_host_sigset. */ - k->sa_mask = act->sa_mask; - - /* we update the host linux signal state */ - host_sig = target_to_host_signal(sig); - if (host_sig != SIGSEGV && host_sig != SIGBUS) { - sigfillset(&act1.sa_mask); - act1.sa_flags = SA_SIGINFO; - if (k->sa_flags & TARGET_SA_RESTART) - act1.sa_flags |= SA_RESTART; - /* NOTE: it is important to update the host kernel signal - ignore state to avoid getting unexpected interrupted - syscalls */ - if (k->_sa_handler == TARGET_SIG_IGN) { - act1.sa_sigaction = (void *)SIG_IGN; - } else if (k->_sa_handler == TARGET_SIG_DFL) { - if (fatal_signal (sig)) - act1.sa_sigaction = host_signal_handler; - else - act1.sa_sigaction = (void *)SIG_DFL; - } else { - act1.sa_sigaction = host_signal_handler; - } - ret = sigaction(host_sig, &act1, NULL); - } - } - return ret; -} - -#if defined(TARGET_I386) && TARGET_ABI_BITS == 32 - -/* from the Linux kernel */ - -struct target_fpreg { - uint16_t significand[4]; - uint16_t exponent; -}; - -struct target_fpxreg { - uint16_t significand[4]; - uint16_t exponent; - uint16_t padding[3]; -}; - -struct target_xmmreg { - abi_ulong element[4]; -}; - -struct target_fpstate { - /* Regular FPU environment */ - abi_ulong cw; - abi_ulong sw; - abi_ulong tag; - abi_ulong ipoff; - abi_ulong cssel; - abi_ulong dataoff; - abi_ulong datasel; - struct target_fpreg _st[8]; - uint16_t status; - uint16_t magic; /* 0xffff = regular FPU data only */ - - /* FXSR FPU environment */ - abi_ulong _fxsr_env[6]; /* FXSR FPU env is ignored */ - abi_ulong mxcsr; - abi_ulong reserved; - struct target_fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ - struct target_xmmreg _xmm[8]; - abi_ulong padding[56]; -}; - -#define X86_FXSR_MAGIC 0x0000 - -struct target_sigcontext { - uint16_t gs, __gsh; - uint16_t fs, __fsh; - uint16_t es, __esh; - uint16_t ds, __dsh; - abi_ulong edi; - abi_ulong esi; - abi_ulong ebp; - abi_ulong esp; - abi_ulong ebx; - abi_ulong edx; - abi_ulong ecx; - abi_ulong eax; - abi_ulong trapno; - abi_ulong err; - abi_ulong eip; - uint16_t cs, __csh; - abi_ulong eflags; - abi_ulong esp_at_signal; - uint16_t ss, __ssh; - abi_ulong fpstate; /* pointer */ - abi_ulong oldmask; - abi_ulong cr2; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct sigframe -{ - abi_ulong pretcode; - int sig; - struct target_sigcontext sc; - struct target_fpstate fpstate; - abi_ulong extramask[TARGET_NSIG_WORDS-1]; - char retcode[8]; -}; - -struct rt_sigframe -{ - abi_ulong pretcode; - int sig; - abi_ulong pinfo; - abi_ulong puc; - struct target_siginfo info; - struct target_ucontext uc; - struct target_fpstate fpstate; - char retcode[8]; -}; - -/* - * Set up a signal frame. - */ - -/* XXX: save x87 state */ -static void setup_sigcontext(struct target_sigcontext *sc, - struct target_fpstate *fpstate, CPUX86State *env, abi_ulong mask, - abi_ulong fpstate_addr) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - uint16_t magic; - - /* already locked in setup_frame() */ - __put_user(env->segs[R_GS].selector, (unsigned int *)&sc->gs); - __put_user(env->segs[R_FS].selector, (unsigned int *)&sc->fs); - __put_user(env->segs[R_ES].selector, (unsigned int *)&sc->es); - __put_user(env->segs[R_DS].selector, (unsigned int *)&sc->ds); - __put_user(env->regs[R_EDI], &sc->edi); - __put_user(env->regs[R_ESI], &sc->esi); - __put_user(env->regs[R_EBP], &sc->ebp); - __put_user(env->regs[R_ESP], &sc->esp); - __put_user(env->regs[R_EBX], &sc->ebx); - __put_user(env->regs[R_EDX], &sc->edx); - __put_user(env->regs[R_ECX], &sc->ecx); - __put_user(env->regs[R_EAX], &sc->eax); - __put_user(cs->exception_index, &sc->trapno); - __put_user(env->error_code, &sc->err); - __put_user(env->eip, &sc->eip); - __put_user(env->segs[R_CS].selector, (unsigned int *)&sc->cs); - __put_user(env->eflags, &sc->eflags); - __put_user(env->regs[R_ESP], &sc->esp_at_signal); - __put_user(env->segs[R_SS].selector, (unsigned int *)&sc->ss); - - cpu_x86_fsave(env, fpstate_addr, 1); - fpstate->status = fpstate->sw; - magic = 0xffff; - __put_user(magic, &fpstate->magic); - __put_user(fpstate_addr, &sc->fpstate); - - /* non-iBCS2 extensions.. */ - __put_user(mask, &sc->oldmask); - __put_user(env->cr[2], &sc->cr2); -} - -/* - * Determine which stack to use.. - */ - -static inline abi_ulong -get_sigframe(struct target_sigaction *ka, CPUX86State *env, size_t frame_size) -{ - unsigned long esp; - - /* Default to using normal stack */ - esp = env->regs[R_ESP]; - /* This is the X/Open sanctioned signal stack switching. */ - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (sas_ss_flags(esp) == 0) - esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - /* This is the legacy signal stack switching. */ - else - if ((env->segs[R_SS].selector & 0xffff) != __USER_DS && - !(ka->sa_flags & TARGET_SA_RESTORER) && - ka->sa_restorer) { - esp = (unsigned long) ka->sa_restorer; - } - return (esp - frame_size) & -8ul; -} - -/* compare linux/arch/i386/kernel/signal.c:setup_frame() */ -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUX86State *env) -{ - abi_ulong frame_addr; - struct sigframe *frame; - int i; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_frame(env, frame_addr); - - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - __put_user(sig, &frame->sig); - - setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0], - frame_addr + offsetof(struct sigframe, fpstate)); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->extramask[i - 1]); - } - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - __put_user(ka->sa_restorer, &frame->pretcode); - } else { - uint16_t val16; - abi_ulong retcode_addr; - retcode_addr = frame_addr + offsetof(struct sigframe, retcode); - __put_user(retcode_addr, &frame->pretcode); - /* This is popl %eax ; movl $,%eax ; int $0x80 */ - val16 = 0xb858; - __put_user(val16, (uint16_t *)(frame->retcode+0)); - __put_user(TARGET_NR_sigreturn, (int *)(frame->retcode+2)); - val16 = 0x80cd; - __put_user(val16, (uint16_t *)(frame->retcode+6)); - } - - - /* Set up registers for signal handler */ - env->regs[R_ESP] = frame_addr; - env->eip = ka->_sa_handler; - - cpu_x86_load_seg(env, R_DS, __USER_DS); - cpu_x86_load_seg(env, R_ES, __USER_DS); - cpu_x86_load_seg(env, R_SS, __USER_DS); - cpu_x86_load_seg(env, R_CS, __USER_CS); - env->eflags &= ~TF_MASK; - - unlock_user_struct(frame, frame_addr, 1); - - return; - -give_sigsegv: - if (sig == TARGET_SIGSEGV) - ka->_sa_handler = TARGET_SIG_DFL; - force_sig(TARGET_SIGSEGV /* , current */); -} - -/* compare linux/arch/i386/kernel/signal.c:setup_rt_frame() */ -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUX86State *env) -{ - abi_ulong frame_addr, addr; - struct rt_sigframe *frame; - int i; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - __put_user(sig, &frame->sig); - addr = frame_addr + offsetof(struct rt_sigframe, info); - __put_user(addr, &frame->pinfo); - addr = frame_addr + offsetof(struct rt_sigframe, uc); - __put_user(addr, &frame->puc); - tswap_siginfo(&frame->info, info); - - /* Create the ucontext. */ - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, env, - set->sig[0], frame_addr + offsetof(struct rt_sigframe, fpstate)); - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - __put_user(ka->sa_restorer, &frame->pretcode); - } else { - uint16_t val16; - addr = frame_addr + offsetof(struct rt_sigframe, retcode); - __put_user(addr, &frame->pretcode); - /* This is movl $,%eax ; int $0x80 */ - __put_user(0xb8, (char *)(frame->retcode+0)); - __put_user(TARGET_NR_rt_sigreturn, (int *)(frame->retcode+1)); - val16 = 0x80cd; - __put_user(val16, (uint16_t *)(frame->retcode+5)); - } - - /* Set up registers for signal handler */ - env->regs[R_ESP] = frame_addr; - env->eip = ka->_sa_handler; - - cpu_x86_load_seg(env, R_DS, __USER_DS); - cpu_x86_load_seg(env, R_ES, __USER_DS); - cpu_x86_load_seg(env, R_SS, __USER_DS); - cpu_x86_load_seg(env, R_CS, __USER_CS); - env->eflags &= ~TF_MASK; - - unlock_user_struct(frame, frame_addr, 1); - - return; - -give_sigsegv: - if (sig == TARGET_SIGSEGV) - ka->_sa_handler = TARGET_SIG_DFL; - force_sig(TARGET_SIGSEGV /* , current */); -} - -static int -restore_sigcontext(CPUX86State *env, struct target_sigcontext *sc, int *peax) -{ - unsigned int err = 0; - abi_ulong fpstate_addr; - unsigned int tmpflags; - - cpu_x86_load_seg(env, R_GS, tswap16(sc->gs)); - cpu_x86_load_seg(env, R_FS, tswap16(sc->fs)); - cpu_x86_load_seg(env, R_ES, tswap16(sc->es)); - cpu_x86_load_seg(env, R_DS, tswap16(sc->ds)); - - env->regs[R_EDI] = tswapl(sc->edi); - env->regs[R_ESI] = tswapl(sc->esi); - env->regs[R_EBP] = tswapl(sc->ebp); - env->regs[R_ESP] = tswapl(sc->esp); - env->regs[R_EBX] = tswapl(sc->ebx); - env->regs[R_EDX] = tswapl(sc->edx); - env->regs[R_ECX] = tswapl(sc->ecx); - env->eip = tswapl(sc->eip); - - cpu_x86_load_seg(env, R_CS, lduw_p(&sc->cs) | 3); - cpu_x86_load_seg(env, R_SS, lduw_p(&sc->ss) | 3); - - tmpflags = tswapl(sc->eflags); - env->eflags = (env->eflags & ~0x40DD5) | (tmpflags & 0x40DD5); - // regs->orig_eax = -1; /* disable syscall checks */ - - fpstate_addr = tswapl(sc->fpstate); - if (fpstate_addr != 0) { - if (!access_ok(VERIFY_READ, fpstate_addr, - sizeof(struct target_fpstate))) - goto badframe; - cpu_x86_frstor(env, fpstate_addr, 1); - } - - *peax = tswapl(sc->eax); - return err; -badframe: - return 1; -} - -long do_sigreturn(CPUX86State *env) -{ - struct sigframe *frame; - abi_ulong frame_addr = env->regs[R_ESP] - 8; - target_sigset_t target_set; - sigset_t set; - int eax, i; - - trace_user_do_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - /* set blocked signals */ - __get_user(target_set.sig[0], &frame->sc.oldmask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->extramask[i - 1]); - } - - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - /* restore registers */ - if (restore_sigcontext(env, &frame->sc, &eax)) - goto badframe; - unlock_user_struct(frame, frame_addr, 0); - return eax; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -long do_rt_sigreturn(CPUX86State *env) -{ - abi_ulong frame_addr; - struct rt_sigframe *frame; - sigset_t set; - int eax; - - frame_addr = env->regs[R_ESP] - 4; - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - target_to_host_sigset(&set, &frame->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax)) - goto badframe; - - if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe, uc.tuc_stack), 0, - get_sp_from_cpustate(env)) == -EFAULT) - goto badframe; - - unlock_user_struct(frame, frame_addr, 0); - return eax; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -#elif defined(TARGET_AARCH64) - -struct target_sigcontext { - uint64_t fault_address; - /* AArch64 registers */ - uint64_t regs[31]; - uint64_t sp; - uint64_t pc; - uint64_t pstate; - /* 4K reserved for FP/SIMD state and future expansion */ - char __reserved[4096] __attribute__((__aligned__(16))); -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - target_sigset_t tuc_sigmask; - /* glibc uses a 1024-bit sigset_t */ - char __unused[1024 / 8 - sizeof(target_sigset_t)]; - /* last for future expansion */ - struct target_sigcontext tuc_mcontext; -}; - -/* - * Header to be used at the beginning of structures extending the user - * context. Such structures must be placed after the rt_sigframe on the stack - * and be 16-byte aligned. The last structure must be a dummy one with the - * magic and size set to 0. - */ -struct target_aarch64_ctx { - uint32_t magic; - uint32_t size; -}; - -#define TARGET_FPSIMD_MAGIC 0x46508001 - -struct target_fpsimd_context { - struct target_aarch64_ctx head; - uint32_t fpsr; - uint32_t fpcr; - uint64_t vregs[32 * 2]; /* really uint128_t vregs[32] */ -}; - -/* - * Auxiliary context saved in the sigcontext.__reserved array. Not exported to - * user space as it will change with the addition of new context. User space - * should check the magic/size information. - */ -struct target_aux_context { - struct target_fpsimd_context fpsimd; - /* additional context to be added before "end" */ - struct target_aarch64_ctx end; -}; - -struct target_rt_sigframe { - struct target_siginfo info; - struct target_ucontext uc; - uint64_t fp; - uint64_t lr; - uint32_t tramp[2]; -}; - -static int target_setup_sigframe(struct target_rt_sigframe *sf, - CPUARMState *env, target_sigset_t *set) -{ - int i; - struct target_aux_context *aux = - (struct target_aux_context *)sf->uc.tuc_mcontext.__reserved; - - /* set up the stack frame for unwinding */ - __put_user(env->xregs[29], &sf->fp); - __put_user(env->xregs[30], &sf->lr); - - for (i = 0; i < 31; i++) { - __put_user(env->xregs[i], &sf->uc.tuc_mcontext.regs[i]); - } - __put_user(env->xregs[31], &sf->uc.tuc_mcontext.sp); - __put_user(env->pc, &sf->uc.tuc_mcontext.pc); - __put_user(pstate_read(env), &sf->uc.tuc_mcontext.pstate); - - __put_user(env->exception.vaddress, &sf->uc.tuc_mcontext.fault_address); - - for (i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &sf->uc.tuc_sigmask.sig[i]); - } - - for (i = 0; i < 32; i++) { -#ifdef TARGET_WORDS_BIGENDIAN - __put_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2 + 1]); - __put_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2]); -#else - __put_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2]); - __put_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2 + 1]); -#endif - } - __put_user(vfp_get_fpsr(env), &aux->fpsimd.fpsr); - __put_user(vfp_get_fpcr(env), &aux->fpsimd.fpcr); - __put_user(TARGET_FPSIMD_MAGIC, &aux->fpsimd.head.magic); - __put_user(sizeof(struct target_fpsimd_context), - &aux->fpsimd.head.size); - - /* set the "end" magic */ - __put_user(0, &aux->end.magic); - __put_user(0, &aux->end.size); - - return 0; -} - -static int target_restore_sigframe(CPUARMState *env, - struct target_rt_sigframe *sf) -{ - sigset_t set; - int i; - struct target_aux_context *aux = - (struct target_aux_context *)sf->uc.tuc_mcontext.__reserved; - uint32_t magic, size, fpsr, fpcr; - uint64_t pstate; - - target_to_host_sigset(&set, &sf->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - for (i = 0; i < 31; i++) { - __get_user(env->xregs[i], &sf->uc.tuc_mcontext.regs[i]); - } - - __get_user(env->xregs[31], &sf->uc.tuc_mcontext.sp); - __get_user(env->pc, &sf->uc.tuc_mcontext.pc); - __get_user(pstate, &sf->uc.tuc_mcontext.pstate); - pstate_write(env, pstate); - - __get_user(magic, &aux->fpsimd.head.magic); - __get_user(size, &aux->fpsimd.head.size); - - if (magic != TARGET_FPSIMD_MAGIC - || size != sizeof(struct target_fpsimd_context)) { - return 1; - } - - for (i = 0; i < 32; i++) { -#ifdef TARGET_WORDS_BIGENDIAN - __get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2 + 1]); - __get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2]); -#else - __get_user(env->vfp.regs[i * 2], &aux->fpsimd.vregs[i * 2]); - __get_user(env->vfp.regs[i * 2 + 1], &aux->fpsimd.vregs[i * 2 + 1]); -#endif - } - __get_user(fpsr, &aux->fpsimd.fpsr); - vfp_set_fpsr(env, fpsr); - __get_user(fpcr, &aux->fpsimd.fpcr); - vfp_set_fpcr(env, fpcr); - - return 0; -} - -static abi_ulong get_sigframe(struct target_sigaction *ka, CPUARMState *env) -{ - abi_ulong sp; - - sp = env->xregs[31]; - - /* - * This is the X/Open sanctioned signal stack switching. - */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - sp = (sp - sizeof(struct target_rt_sigframe)) & ~15; - - return sp; -} - -static void target_setup_frame(int usig, struct target_sigaction *ka, - target_siginfo_t *info, target_sigset_t *set, - CPUARMState *env) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr, return_addr; - - frame_addr = get_sigframe(ka, env); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->xregs[31]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - target_setup_sigframe(frame, env, set); - if (ka->sa_flags & TARGET_SA_RESTORER) { - return_addr = ka->sa_restorer; - } else { - /* mov x8,#__NR_rt_sigreturn; svc #0 */ - __put_user(0xd2801168, &frame->tramp[0]); - __put_user(0xd4000001, &frame->tramp[1]); - return_addr = frame_addr + offsetof(struct target_rt_sigframe, tramp); - } - env->xregs[0] = usig; - env->xregs[31] = frame_addr; - env->xregs[29] = env->xregs[31] + offsetof(struct target_rt_sigframe, fp); - env->pc = ka->_sa_handler; - env->xregs[30] = return_addr; - if (info) { - tswap_siginfo(&frame->info, info); - env->xregs[1] = frame_addr + offsetof(struct target_rt_sigframe, info); - env->xregs[2] = frame_addr + offsetof(struct target_rt_sigframe, uc); - } - - unlock_user_struct(frame, frame_addr, 1); - return; - - give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, target_sigset_t *set, - CPUARMState *env) -{ - target_setup_frame(sig, ka, info, set, env); -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUARMState *env) -{ - target_setup_frame(sig, ka, 0, set, env); -} - -long do_rt_sigreturn(CPUARMState *env) -{ - struct target_rt_sigframe *frame = NULL; - abi_ulong frame_addr = env->xregs[31]; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (frame_addr & 15) { - goto badframe; - } - - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - - if (target_restore_sigframe(env, frame)) { - goto badframe; - } - - if (do_sigaltstack(frame_addr + - offsetof(struct target_rt_sigframe, uc.tuc_stack), - 0, get_sp_from_cpustate(env)) == -EFAULT) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return env->xregs[0]; - - badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -long do_sigreturn(CPUARMState *env) -{ - return do_rt_sigreturn(env); -} - -#elif defined(TARGET_ARM) - -struct target_sigcontext { - abi_ulong trap_no; - abi_ulong error_code; - abi_ulong oldmask; - abi_ulong arm_r0; - abi_ulong arm_r1; - abi_ulong arm_r2; - abi_ulong arm_r3; - abi_ulong arm_r4; - abi_ulong arm_r5; - abi_ulong arm_r6; - abi_ulong arm_r7; - abi_ulong arm_r8; - abi_ulong arm_r9; - abi_ulong arm_r10; - abi_ulong arm_fp; - abi_ulong arm_ip; - abi_ulong arm_sp; - abi_ulong arm_lr; - abi_ulong arm_pc; - abi_ulong arm_cpsr; - abi_ulong fault_address; -}; - -struct target_ucontext_v1 { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct target_ucontext_v2 { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ - char __unused[128 - sizeof(target_sigset_t)]; - abi_ulong tuc_regspace[128] __attribute__((__aligned__(8))); -}; - -struct target_user_vfp { - uint64_t fpregs[32]; - abi_ulong fpscr; -}; - -struct target_user_vfp_exc { - abi_ulong fpexc; - abi_ulong fpinst; - abi_ulong fpinst2; -}; - -struct target_vfp_sigframe { - abi_ulong magic; - abi_ulong size; - struct target_user_vfp ufp; - struct target_user_vfp_exc ufp_exc; -} __attribute__((__aligned__(8))); - -struct target_iwmmxt_sigframe { - abi_ulong magic; - abi_ulong size; - uint64_t regs[16]; - /* Note that not all the coprocessor control registers are stored here */ - uint32_t wcssf; - uint32_t wcasf; - uint32_t wcgr0; - uint32_t wcgr1; - uint32_t wcgr2; - uint32_t wcgr3; -} __attribute__((__aligned__(8))); - -#define TARGET_VFP_MAGIC 0x56465001 -#define TARGET_IWMMXT_MAGIC 0x12ef842a - -struct sigframe_v1 -{ - struct target_sigcontext sc; - abi_ulong extramask[TARGET_NSIG_WORDS-1]; - abi_ulong retcode; -}; - -struct sigframe_v2 -{ - struct target_ucontext_v2 uc; - abi_ulong retcode; -}; - -struct rt_sigframe_v1 -{ - abi_ulong pinfo; - abi_ulong puc; - struct target_siginfo info; - struct target_ucontext_v1 uc; - abi_ulong retcode; -}; - -struct rt_sigframe_v2 -{ - struct target_siginfo info; - struct target_ucontext_v2 uc; - abi_ulong retcode; -}; - -#define TARGET_CONFIG_CPU_32 1 - -/* - * For ARM syscalls, we encode the syscall number into the instruction. - */ -#define SWI_SYS_SIGRETURN (0xef000000|(TARGET_NR_sigreturn + ARM_SYSCALL_BASE)) -#define SWI_SYS_RT_SIGRETURN (0xef000000|(TARGET_NR_rt_sigreturn + ARM_SYSCALL_BASE)) - -/* - * For Thumb syscalls, we pass the syscall number via r7. We therefore - * need two 16-bit instructions. - */ -#define SWI_THUMB_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_sigreturn)) -#define SWI_THUMB_RT_SIGRETURN (0xdf00 << 16 | 0x2700 | (TARGET_NR_rt_sigreturn)) - -static const abi_ulong retcodes[4] = { - SWI_SYS_SIGRETURN, SWI_THUMB_SIGRETURN, - SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN -}; - - -static inline int valid_user_regs(CPUARMState *regs) -{ - return 1; -} - -static void -setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ - CPUARMState *env, abi_ulong mask) -{ - __put_user(env->regs[0], &sc->arm_r0); - __put_user(env->regs[1], &sc->arm_r1); - __put_user(env->regs[2], &sc->arm_r2); - __put_user(env->regs[3], &sc->arm_r3); - __put_user(env->regs[4], &sc->arm_r4); - __put_user(env->regs[5], &sc->arm_r5); - __put_user(env->regs[6], &sc->arm_r6); - __put_user(env->regs[7], &sc->arm_r7); - __put_user(env->regs[8], &sc->arm_r8); - __put_user(env->regs[9], &sc->arm_r9); - __put_user(env->regs[10], &sc->arm_r10); - __put_user(env->regs[11], &sc->arm_fp); - __put_user(env->regs[12], &sc->arm_ip); - __put_user(env->regs[13], &sc->arm_sp); - __put_user(env->regs[14], &sc->arm_lr); - __put_user(env->regs[15], &sc->arm_pc); -#ifdef TARGET_CONFIG_CPU_32 - __put_user(cpsr_read(env), &sc->arm_cpsr); -#endif - - __put_user(/* current->thread.trap_no */ 0, &sc->trap_no); - __put_user(/* current->thread.error_code */ 0, &sc->error_code); - __put_user(/* current->thread.address */ 0, &sc->fault_address); - __put_user(mask, &sc->oldmask); -} - -static inline abi_ulong -get_sigframe(struct target_sigaction *ka, CPUARMState *regs, int framesize) -{ - unsigned long sp = regs->regs[13]; - - /* - * This is the X/Open sanctioned signal stack switching. - */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - /* - * ATPCS B01 mandates 8-byte alignment - */ - return (sp - framesize) & ~7; -} - -static void -setup_return(CPUARMState *env, struct target_sigaction *ka, - abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr) -{ - abi_ulong handler = ka->_sa_handler; - abi_ulong retcode; - int thumb = handler & 1; - uint32_t cpsr = cpsr_read(env); - - cpsr &= ~CPSR_IT; - if (thumb) { - cpsr |= CPSR_T; - } else { - cpsr &= ~CPSR_T; - } - - if (ka->sa_flags & TARGET_SA_RESTORER) { - retcode = ka->sa_restorer; - } else { - unsigned int idx = thumb; - - if (ka->sa_flags & TARGET_SA_SIGINFO) { - idx += 2; - } - - __put_user(retcodes[idx], rc); - - retcode = rc_addr + thumb; - } - - env->regs[0] = usig; - env->regs[13] = frame_addr; - env->regs[14] = retcode; - env->regs[15] = handler & (thumb ? ~1 : ~3); - cpsr_write(env, cpsr, CPSR_IT | CPSR_T, CPSRWriteByInstr); -} - -static abi_ulong *setup_sigframe_v2_vfp(abi_ulong *regspace, CPUARMState *env) -{ - int i; - struct target_vfp_sigframe *vfpframe; - vfpframe = (struct target_vfp_sigframe *)regspace; - __put_user(TARGET_VFP_MAGIC, &vfpframe->magic); - __put_user(sizeof(*vfpframe), &vfpframe->size); - for (i = 0; i < 32; i++) { - __put_user(float64_val(env->vfp.regs[i]), &vfpframe->ufp.fpregs[i]); - } - __put_user(vfp_get_fpscr(env), &vfpframe->ufp.fpscr); - __put_user(env->vfp.xregs[ARM_VFP_FPEXC], &vfpframe->ufp_exc.fpexc); - __put_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst); - __put_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2); - return (abi_ulong*)(vfpframe+1); -} - -static abi_ulong *setup_sigframe_v2_iwmmxt(abi_ulong *regspace, - CPUARMState *env) -{ - int i; - struct target_iwmmxt_sigframe *iwmmxtframe; - iwmmxtframe = (struct target_iwmmxt_sigframe *)regspace; - __put_user(TARGET_IWMMXT_MAGIC, &iwmmxtframe->magic); - __put_user(sizeof(*iwmmxtframe), &iwmmxtframe->size); - for (i = 0; i < 16; i++) { - __put_user(env->iwmmxt.regs[i], &iwmmxtframe->regs[i]); - } - __put_user(env->vfp.xregs[ARM_IWMMXT_wCSSF], &iwmmxtframe->wcssf); - __put_user(env->vfp.xregs[ARM_IWMMXT_wCASF], &iwmmxtframe->wcssf); - __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR0], &iwmmxtframe->wcgr0); - __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR1], &iwmmxtframe->wcgr1); - __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR2], &iwmmxtframe->wcgr2); - __put_user(env->vfp.xregs[ARM_IWMMXT_wCGR3], &iwmmxtframe->wcgr3); - return (abi_ulong*)(iwmmxtframe+1); -} - -static void setup_sigframe_v2(struct target_ucontext_v2 *uc, - target_sigset_t *set, CPUARMState *env) -{ - struct target_sigaltstack stack; - int i; - abi_ulong *regspace; - - /* Clear all the bits of the ucontext we don't use. */ - memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext)); - - memset(&stack, 0, sizeof(stack)); - __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); - memcpy(&uc->tuc_stack, &stack, sizeof(stack)); - - setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]); - /* Save coprocessor signal frame. */ - regspace = uc->tuc_regspace; - if (arm_feature(env, ARM_FEATURE_VFP)) { - regspace = setup_sigframe_v2_vfp(regspace, env); - } - if (arm_feature(env, ARM_FEATURE_IWMMXT)) { - regspace = setup_sigframe_v2_iwmmxt(regspace, env); - } - - /* Write terminating magic word */ - __put_user(0, regspace); - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &uc->tuc_sigmask.sig[i]); - } -} - -/* compare linux/arch/arm/kernel/signal.c:setup_frame() */ -static void setup_frame_v1(int usig, struct target_sigaction *ka, - target_sigset_t *set, CPUARMState *regs) -{ - struct sigframe_v1 *frame; - abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame)); - int i; - - trace_user_setup_frame(regs, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - return; - - setup_sigcontext(&frame->sc, regs, set->sig[0]); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->extramask[i - 1]); - } - - setup_return(regs, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct sigframe_v1, retcode)); - - unlock_user_struct(frame, frame_addr, 1); -} - -static void setup_frame_v2(int usig, struct target_sigaction *ka, - target_sigset_t *set, CPUARMState *regs) -{ - struct sigframe_v2 *frame; - abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame)); - - trace_user_setup_frame(regs, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - return; - - setup_sigframe_v2(&frame->uc, set, regs); - - setup_return(regs, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct sigframe_v2, retcode)); - - unlock_user_struct(frame, frame_addr, 1); -} - -static void setup_frame(int usig, struct target_sigaction *ka, - target_sigset_t *set, CPUARMState *regs) -{ - if (get_osversion() >= 0x020612) { - setup_frame_v2(usig, ka, set, regs); - } else { - setup_frame_v1(usig, ka, set, regs); - } -} - -/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */ -static void setup_rt_frame_v1(int usig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUARMState *env) -{ - struct rt_sigframe_v1 *frame; - abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame)); - struct target_sigaltstack stack; - int i; - abi_ulong info_addr, uc_addr; - - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - return /* 1 */; - - info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info); - __put_user(info_addr, &frame->pinfo); - uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc); - __put_user(uc_addr, &frame->puc); - tswap_siginfo(&frame->info, info); - - /* Clear all the bits of the ucontext we don't use. */ - memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext)); - - memset(&stack, 0, sizeof(stack)); - __put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &stack.ss_size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); - memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack)); - - setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]); - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - setup_return(env, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct rt_sigframe_v1, retcode)); - - env->regs[1] = info_addr; - env->regs[2] = uc_addr; - - unlock_user_struct(frame, frame_addr, 1); -} - -static void setup_rt_frame_v2(int usig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUARMState *env) -{ - struct rt_sigframe_v2 *frame; - abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame)); - abi_ulong info_addr, uc_addr; - - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - return /* 1 */; - - info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info); - uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc); - tswap_siginfo(&frame->info, info); - - setup_sigframe_v2(&frame->uc, set, env); - - setup_return(env, ka, &frame->retcode, frame_addr, usig, - frame_addr + offsetof(struct rt_sigframe_v2, retcode)); - - env->regs[1] = info_addr; - env->regs[2] = uc_addr; - - unlock_user_struct(frame, frame_addr, 1); -} - -static void setup_rt_frame(int usig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUARMState *env) -{ - if (get_osversion() >= 0x020612) { - setup_rt_frame_v2(usig, ka, info, set, env); - } else { - setup_rt_frame_v1(usig, ka, info, set, env); - } -} - -static int -restore_sigcontext(CPUARMState *env, struct target_sigcontext *sc) -{ - int err = 0; - uint32_t cpsr; - - __get_user(env->regs[0], &sc->arm_r0); - __get_user(env->regs[1], &sc->arm_r1); - __get_user(env->regs[2], &sc->arm_r2); - __get_user(env->regs[3], &sc->arm_r3); - __get_user(env->regs[4], &sc->arm_r4); - __get_user(env->regs[5], &sc->arm_r5); - __get_user(env->regs[6], &sc->arm_r6); - __get_user(env->regs[7], &sc->arm_r7); - __get_user(env->regs[8], &sc->arm_r8); - __get_user(env->regs[9], &sc->arm_r9); - __get_user(env->regs[10], &sc->arm_r10); - __get_user(env->regs[11], &sc->arm_fp); - __get_user(env->regs[12], &sc->arm_ip); - __get_user(env->regs[13], &sc->arm_sp); - __get_user(env->regs[14], &sc->arm_lr); - __get_user(env->regs[15], &sc->arm_pc); -#ifdef TARGET_CONFIG_CPU_32 - __get_user(cpsr, &sc->arm_cpsr); - cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC, CPSRWriteByInstr); -#endif - - err |= !valid_user_regs(env); - - return err; -} - -static long do_sigreturn_v1(CPUARMState *env) -{ - abi_ulong frame_addr; - struct sigframe_v1 *frame = NULL; - target_sigset_t set; - sigset_t host_set; - int i; - - /* - * Since we stacked the signal on a 64-bit boundary, - * then 'sp' should be word aligned here. If it's - * not, then the user is trying to mess with us. - */ - frame_addr = env->regs[13]; - trace_user_do_sigreturn(env, frame_addr); - if (frame_addr & 7) { - goto badframe; - } - - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - __get_user(set.sig[0], &frame->sc.oldmask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(set.sig[i], &frame->extramask[i - 1]); - } - - target_to_host_sigset_internal(&host_set, &set); - do_sigprocmask(SIG_SETMASK, &host_set, NULL); - - if (restore_sigcontext(env, &frame->sc)) - goto badframe; - -#if 0 - /* Send SIGTRAP if we're single-stepping */ - if (ptrace_cancel_bpt(current)) - send_sig(SIGTRAP, current, 1); -#endif - unlock_user_struct(frame, frame_addr, 0); - return env->regs[0]; - -badframe: - force_sig(TARGET_SIGSEGV /* , current */); - return 0; -} - -static abi_ulong *restore_sigframe_v2_vfp(CPUARMState *env, abi_ulong *regspace) -{ - int i; - abi_ulong magic, sz; - uint32_t fpscr, fpexc; - struct target_vfp_sigframe *vfpframe; - vfpframe = (struct target_vfp_sigframe *)regspace; - - __get_user(magic, &vfpframe->magic); - __get_user(sz, &vfpframe->size); - if (magic != TARGET_VFP_MAGIC || sz != sizeof(*vfpframe)) { - return 0; - } - for (i = 0; i < 32; i++) { - __get_user(float64_val(env->vfp.regs[i]), &vfpframe->ufp.fpregs[i]); - } - __get_user(fpscr, &vfpframe->ufp.fpscr); - vfp_set_fpscr(env, fpscr); - __get_user(fpexc, &vfpframe->ufp_exc.fpexc); - /* Sanitise FPEXC: ensure VFP is enabled, FPINST2 is invalid - * and the exception flag is cleared - */ - fpexc |= (1 << 30); - fpexc &= ~((1 << 31) | (1 << 28)); - env->vfp.xregs[ARM_VFP_FPEXC] = fpexc; - __get_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst); - __get_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2); - return (abi_ulong*)(vfpframe + 1); -} - -static abi_ulong *restore_sigframe_v2_iwmmxt(CPUARMState *env, - abi_ulong *regspace) -{ - int i; - abi_ulong magic, sz; - struct target_iwmmxt_sigframe *iwmmxtframe; - iwmmxtframe = (struct target_iwmmxt_sigframe *)regspace; - - __get_user(magic, &iwmmxtframe->magic); - __get_user(sz, &iwmmxtframe->size); - if (magic != TARGET_IWMMXT_MAGIC || sz != sizeof(*iwmmxtframe)) { - return 0; - } - for (i = 0; i < 16; i++) { - __get_user(env->iwmmxt.regs[i], &iwmmxtframe->regs[i]); - } - __get_user(env->vfp.xregs[ARM_IWMMXT_wCSSF], &iwmmxtframe->wcssf); - __get_user(env->vfp.xregs[ARM_IWMMXT_wCASF], &iwmmxtframe->wcssf); - __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR0], &iwmmxtframe->wcgr0); - __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR1], &iwmmxtframe->wcgr1); - __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR2], &iwmmxtframe->wcgr2); - __get_user(env->vfp.xregs[ARM_IWMMXT_wCGR3], &iwmmxtframe->wcgr3); - return (abi_ulong*)(iwmmxtframe + 1); -} - -static int do_sigframe_return_v2(CPUARMState *env, target_ulong frame_addr, - struct target_ucontext_v2 *uc) -{ - sigset_t host_set; - abi_ulong *regspace; - - target_to_host_sigset(&host_set, &uc->tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &host_set, NULL); - - if (restore_sigcontext(env, &uc->tuc_mcontext)) - return 1; - - /* Restore coprocessor signal frame */ - regspace = uc->tuc_regspace; - if (arm_feature(env, ARM_FEATURE_VFP)) { - regspace = restore_sigframe_v2_vfp(env, regspace); - if (!regspace) { - return 1; - } - } - if (arm_feature(env, ARM_FEATURE_IWMMXT)) { - regspace = restore_sigframe_v2_iwmmxt(env, regspace); - if (!regspace) { - return 1; - } - } - - if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) - return 1; - -#if 0 - /* Send SIGTRAP if we're single-stepping */ - if (ptrace_cancel_bpt(current)) - send_sig(SIGTRAP, current, 1); -#endif - - return 0; -} - -static long do_sigreturn_v2(CPUARMState *env) -{ - abi_ulong frame_addr; - struct sigframe_v2 *frame = NULL; - - /* - * Since we stacked the signal on a 64-bit boundary, - * then 'sp' should be word aligned here. If it's - * not, then the user is trying to mess with us. - */ - frame_addr = env->regs[13]; - trace_user_do_sigreturn(env, frame_addr); - if (frame_addr & 7) { - goto badframe; - } - - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - if (do_sigframe_return_v2(env, frame_addr, &frame->uc)) - goto badframe; - - unlock_user_struct(frame, frame_addr, 0); - return env->regs[0]; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV /* , current */); - return 0; -} - -long do_sigreturn(CPUARMState *env) -{ - if (get_osversion() >= 0x020612) { - return do_sigreturn_v2(env); - } else { - return do_sigreturn_v1(env); - } -} - -static long do_rt_sigreturn_v1(CPUARMState *env) -{ - abi_ulong frame_addr; - struct rt_sigframe_v1 *frame = NULL; - sigset_t host_set; - - /* - * Since we stacked the signal on a 64-bit boundary, - * then 'sp' should be word aligned here. If it's - * not, then the user is trying to mess with us. - */ - frame_addr = env->regs[13]; - trace_user_do_rt_sigreturn(env, frame_addr); - if (frame_addr & 7) { - goto badframe; - } - - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - target_to_host_sigset(&host_set, &frame->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &host_set, NULL); - - if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) - goto badframe; - - if (do_sigaltstack(frame_addr + offsetof(struct rt_sigframe_v1, uc.tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT) - goto badframe; - -#if 0 - /* Send SIGTRAP if we're single-stepping */ - if (ptrace_cancel_bpt(current)) - send_sig(SIGTRAP, current, 1); -#endif - unlock_user_struct(frame, frame_addr, 0); - return env->regs[0]; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV /* , current */); - return 0; -} - -static long do_rt_sigreturn_v2(CPUARMState *env) -{ - abi_ulong frame_addr; - struct rt_sigframe_v2 *frame = NULL; - - /* - * Since we stacked the signal on a 64-bit boundary, - * then 'sp' should be word aligned here. If it's - * not, then the user is trying to mess with us. - */ - frame_addr = env->regs[13]; - trace_user_do_rt_sigreturn(env, frame_addr); - if (frame_addr & 7) { - goto badframe; - } - - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - if (do_sigframe_return_v2(env, frame_addr, &frame->uc)) - goto badframe; - - unlock_user_struct(frame, frame_addr, 0); - return env->regs[0]; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV /* , current */); - return 0; -} - -long do_rt_sigreturn(CPUARMState *env) -{ - if (get_osversion() >= 0x020612) { - return do_rt_sigreturn_v2(env); - } else { - return do_rt_sigreturn_v1(env); - } -} - -#elif defined(TARGET_SPARC) - -#define __SUNOS_MAXWIN 31 - -/* This is what SunOS does, so shall I. */ -struct target_sigcontext { - abi_ulong sigc_onstack; /* state to restore */ - - abi_ulong sigc_mask; /* sigmask to restore */ - abi_ulong sigc_sp; /* stack pointer */ - abi_ulong sigc_pc; /* program counter */ - abi_ulong sigc_npc; /* next program counter */ - abi_ulong sigc_psr; /* for condition codes etc */ - abi_ulong sigc_g1; /* User uses these two registers */ - abi_ulong sigc_o0; /* within the trampoline code. */ - - /* Now comes information regarding the users window set - * at the time of the signal. - */ - abi_ulong sigc_oswins; /* outstanding windows */ - - /* stack ptrs for each regwin buf */ - char *sigc_spbuf[__SUNOS_MAXWIN]; - - /* Windows to restore after signal */ - struct { - abi_ulong locals[8]; - abi_ulong ins[8]; - } sigc_wbuf[__SUNOS_MAXWIN]; -}; -/* A Sparc stack frame */ -struct sparc_stackf { - abi_ulong locals[8]; - abi_ulong ins[8]; - /* It's simpler to treat fp and callers_pc as elements of ins[] - * since we never need to access them ourselves. - */ - char *structptr; - abi_ulong xargs[6]; - abi_ulong xxargs[1]; -}; - -typedef struct { - struct { - abi_ulong psr; - abi_ulong pc; - abi_ulong npc; - abi_ulong y; - abi_ulong u_regs[16]; /* globals and ins */ - } si_regs; - int si_mask; -} __siginfo_t; - -typedef struct { - abi_ulong si_float_regs[32]; - unsigned long si_fsr; - unsigned long si_fpqdepth; - struct { - unsigned long *insn_addr; - unsigned long insn; - } si_fpqueue [16]; -} qemu_siginfo_fpu_t; - - -struct target_signal_frame { - struct sparc_stackf ss; - __siginfo_t info; - abi_ulong fpu_save; - abi_ulong insns[2] __attribute__ ((aligned (8))); - abi_ulong extramask[TARGET_NSIG_WORDS - 1]; - abi_ulong extra_size; /* Should be 0 */ - qemu_siginfo_fpu_t fpu_state; -}; -struct target_rt_signal_frame { - struct sparc_stackf ss; - siginfo_t info; - abi_ulong regs[20]; - sigset_t mask; - abi_ulong fpu_save; - unsigned int insns[2]; - stack_t stack; - unsigned int extra_size; /* Should be 0 */ - qemu_siginfo_fpu_t fpu_state; -}; - -#define UREG_O0 16 -#define UREG_O6 22 -#define UREG_I0 0 -#define UREG_I1 1 -#define UREG_I2 2 -#define UREG_I3 3 -#define UREG_I4 4 -#define UREG_I5 5 -#define UREG_I6 6 -#define UREG_I7 7 -#define UREG_L0 8 -#define UREG_FP UREG_I6 -#define UREG_SP UREG_O6 - -static inline abi_ulong get_sigframe(struct target_sigaction *sa, - CPUSPARCState *env, - unsigned long framesize) -{ - abi_ulong sp; - - sp = env->regwptr[UREG_FP]; - - /* This is the X/Open sanctioned signal stack switching. */ - if (sa->sa_flags & TARGET_SA_ONSTACK) { - if (!on_sig_stack(sp) - && !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7)) - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - return sp - framesize; -} - -static int -setup___siginfo(__siginfo_t *si, CPUSPARCState *env, abi_ulong mask) -{ - int err = 0, i; - - __put_user(env->psr, &si->si_regs.psr); - __put_user(env->pc, &si->si_regs.pc); - __put_user(env->npc, &si->si_regs.npc); - __put_user(env->y, &si->si_regs.y); - for (i=0; i < 8; i++) { - __put_user(env->gregs[i], &si->si_regs.u_regs[i]); - } - for (i=0; i < 8; i++) { - __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]); - } - __put_user(mask, &si->si_mask); - return err; -} - -#if 0 -static int -setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ - CPUSPARCState *env, unsigned long mask) -{ - int err = 0; - - __put_user(mask, &sc->sigc_mask); - __put_user(env->regwptr[UREG_SP], &sc->sigc_sp); - __put_user(env->pc, &sc->sigc_pc); - __put_user(env->npc, &sc->sigc_npc); - __put_user(env->psr, &sc->sigc_psr); - __put_user(env->gregs[1], &sc->sigc_g1); - __put_user(env->regwptr[UREG_O0], &sc->sigc_o0); - - return err; -} -#endif -#define NF_ALIGNEDSZ (((sizeof(struct target_signal_frame) + 7) & (~7))) - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUSPARCState *env) -{ - abi_ulong sf_addr; - struct target_signal_frame *sf; - int sigframe_size, err, i; - - /* 1. Make sure everything is clean */ - //synchronize_user_stack(); - - sigframe_size = NF_ALIGNEDSZ; - sf_addr = get_sigframe(ka, env, sigframe_size); - trace_user_setup_frame(env, sf_addr); - - sf = lock_user(VERIFY_WRITE, sf_addr, - sizeof(struct target_signal_frame), 0); - if (!sf) - goto sigsegv; - -#if 0 - if (invalid_frame_pointer(sf, sigframe_size)) - goto sigill_and_return; -#endif - /* 2. Save the current process state */ - err = setup___siginfo(&sf->info, env, set->sig[0]); - __put_user(0, &sf->extra_size); - - //save_fpu_state(regs, &sf->fpu_state); - //__put_user(&sf->fpu_state, &sf->fpu_save); - - __put_user(set->sig[0], &sf->info.si_mask); - for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { - __put_user(set->sig[i + 1], &sf->extramask[i]); - } - - for (i = 0; i < 8; i++) { - __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]); - } - for (i = 0; i < 8; i++) { - __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]); - } - if (err) - goto sigsegv; - - /* 3. signal handler back-trampoline and parameters */ - env->regwptr[UREG_FP] = sf_addr; - env->regwptr[UREG_I0] = sig; - env->regwptr[UREG_I1] = sf_addr + - offsetof(struct target_signal_frame, info); - env->regwptr[UREG_I2] = sf_addr + - offsetof(struct target_signal_frame, info); - - /* 4. signal handler */ - env->pc = ka->_sa_handler; - env->npc = (env->pc + 4); - /* 5. return to kernel instructions */ - if (ka->sa_restorer) - env->regwptr[UREG_I7] = ka->sa_restorer; - else { - uint32_t val32; - - env->regwptr[UREG_I7] = sf_addr + - offsetof(struct target_signal_frame, insns) - 2 * 4; - - /* mov __NR_sigreturn, %g1 */ - val32 = 0x821020d8; - __put_user(val32, &sf->insns[0]); - - /* t 0x10 */ - val32 = 0x91d02010; - __put_user(val32, &sf->insns[1]); - if (err) - goto sigsegv; - - /* Flush instruction space. */ - //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); - // tb_flush(CPU(sparc_env_get_cpu(env))); - } - unlock_user(sf, sf_addr, sizeof(struct target_signal_frame)); - return; -#if 0 -sigill_and_return: - force_sig(TARGET_SIGILL); -#endif -sigsegv: - unlock_user(sf, sf_addr, sizeof(struct target_signal_frame)); - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUSPARCState *env) -{ - fprintf(stderr, "setup_rt_frame: not implemented\n"); -} - -long do_sigreturn(CPUSPARCState *env) -{ - abi_ulong sf_addr; - struct target_signal_frame *sf; - uint32_t up_psr, pc, npc; - target_sigset_t set; - sigset_t host_set; - int err=0, i; - - sf_addr = env->regwptr[UREG_FP]; - trace_user_do_sigreturn(env, sf_addr); - if (!lock_user_struct(VERIFY_READ, sf, sf_addr, 1)) - goto segv_and_exit; - - /* 1. Make sure we are not getting garbage from the user */ - - if (sf_addr & 3) - goto segv_and_exit; - - __get_user(pc, &sf->info.si_regs.pc); - __get_user(npc, &sf->info.si_regs.npc); - - if ((pc | npc) & 3) - goto segv_and_exit; - - /* 2. Restore the state */ - __get_user(up_psr, &sf->info.si_regs.psr); - - /* User can only change condition codes and FPU enabling in %psr. */ - env->psr = (up_psr & (PSR_ICC /* | PSR_EF */)) - | (env->psr & ~(PSR_ICC /* | PSR_EF */)); - - env->pc = pc; - env->npc = npc; - __get_user(env->y, &sf->info.si_regs.y); - for (i=0; i < 8; i++) { - __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]); - } - for (i=0; i < 8; i++) { - __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]); - } - - /* FIXME: implement FPU save/restore: - * __get_user(fpu_save, &sf->fpu_save); - * if (fpu_save) - * err |= restore_fpu_state(env, fpu_save); - */ - - /* This is pretty much atomic, no amount locking would prevent - * the races which exist anyways. - */ - __get_user(set.sig[0], &sf->info.si_mask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(set.sig[i], &sf->extramask[i - 1]); - } - - target_to_host_sigset_internal(&host_set, &set); - do_sigprocmask(SIG_SETMASK, &host_set, NULL); - - if (err) - goto segv_and_exit; - unlock_user_struct(sf, sf_addr, 0); - return env->regwptr[0]; - -segv_and_exit: - unlock_user_struct(sf, sf_addr, 0); - force_sig(TARGET_SIGSEGV); -} - -long do_rt_sigreturn(CPUSPARCState *env) -{ - trace_user_do_rt_sigreturn(env, 0); - fprintf(stderr, "do_rt_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) -#define MC_TSTATE 0 -#define MC_PC 1 -#define MC_NPC 2 -#define MC_Y 3 -#define MC_G1 4 -#define MC_G2 5 -#define MC_G3 6 -#define MC_G4 7 -#define MC_G5 8 -#define MC_G6 9 -#define MC_G7 10 -#define MC_O0 11 -#define MC_O1 12 -#define MC_O2 13 -#define MC_O3 14 -#define MC_O4 15 -#define MC_O5 16 -#define MC_O6 17 -#define MC_O7 18 -#define MC_NGREG 19 - -typedef abi_ulong target_mc_greg_t; -typedef target_mc_greg_t target_mc_gregset_t[MC_NGREG]; - -struct target_mc_fq { - abi_ulong *mcfq_addr; - uint32_t mcfq_insn; -}; - -struct target_mc_fpu { - union { - uint32_t sregs[32]; - uint64_t dregs[32]; - //uint128_t qregs[16]; - } mcfpu_fregs; - abi_ulong mcfpu_fsr; - abi_ulong mcfpu_fprs; - abi_ulong mcfpu_gsr; - struct target_mc_fq *mcfpu_fq; - unsigned char mcfpu_qcnt; - unsigned char mcfpu_qentsz; - unsigned char mcfpu_enab; -}; -typedef struct target_mc_fpu target_mc_fpu_t; - -typedef struct { - target_mc_gregset_t mc_gregs; - target_mc_greg_t mc_fp; - target_mc_greg_t mc_i7; - target_mc_fpu_t mc_fpregs; -} target_mcontext_t; - -struct target_ucontext { - struct target_ucontext *tuc_link; - abi_ulong tuc_flags; - target_sigset_t tuc_sigmask; - target_mcontext_t tuc_mcontext; -}; - -/* A V9 register window */ -struct target_reg_window { - abi_ulong locals[8]; - abi_ulong ins[8]; -}; - -#define TARGET_STACK_BIAS 2047 - -/* {set, get}context() needed for 64-bit SparcLinux userland. */ -void sparc64_set_context(CPUSPARCState *env) -{ - abi_ulong ucp_addr; - struct target_ucontext *ucp; - target_mc_gregset_t *grp; - abi_ulong pc, npc, tstate; - abi_ulong fp, i7, w_addr; - unsigned int i; - - ucp_addr = env->regwptr[UREG_I0]; - if (!lock_user_struct(VERIFY_READ, ucp, ucp_addr, 1)) - goto do_sigsegv; - grp = &ucp->tuc_mcontext.mc_gregs; - __get_user(pc, &((*grp)[MC_PC])); - __get_user(npc, &((*grp)[MC_NPC])); - if ((pc | npc) & 3) - goto do_sigsegv; - if (env->regwptr[UREG_I1]) { - target_sigset_t target_set; - sigset_t set; - - if (TARGET_NSIG_WORDS == 1) { - __get_user(target_set.sig[0], &ucp->tuc_sigmask.sig[0]); - } else { - abi_ulong *src, *dst; - src = ucp->tuc_sigmask.sig; - dst = target_set.sig; - for (i = 0; i < TARGET_NSIG_WORDS; i++, dst++, src++) { - __get_user(*dst, src); - } - } - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - } - env->pc = pc; - env->npc = npc; - __get_user(env->y, &((*grp)[MC_Y])); - __get_user(tstate, &((*grp)[MC_TSTATE])); - env->asi = (tstate >> 24) & 0xff; - cpu_put_ccr(env, tstate >> 32); - cpu_put_cwp64(env, tstate & 0x1f); - __get_user(env->gregs[1], (&(*grp)[MC_G1])); - __get_user(env->gregs[2], (&(*grp)[MC_G2])); - __get_user(env->gregs[3], (&(*grp)[MC_G3])); - __get_user(env->gregs[4], (&(*grp)[MC_G4])); - __get_user(env->gregs[5], (&(*grp)[MC_G5])); - __get_user(env->gregs[6], (&(*grp)[MC_G6])); - __get_user(env->gregs[7], (&(*grp)[MC_G7])); - __get_user(env->regwptr[UREG_I0], (&(*grp)[MC_O0])); - __get_user(env->regwptr[UREG_I1], (&(*grp)[MC_O1])); - __get_user(env->regwptr[UREG_I2], (&(*grp)[MC_O2])); - __get_user(env->regwptr[UREG_I3], (&(*grp)[MC_O3])); - __get_user(env->regwptr[UREG_I4], (&(*grp)[MC_O4])); - __get_user(env->regwptr[UREG_I5], (&(*grp)[MC_O5])); - __get_user(env->regwptr[UREG_I6], (&(*grp)[MC_O6])); - __get_user(env->regwptr[UREG_I7], (&(*grp)[MC_O7])); - - __get_user(fp, &(ucp->tuc_mcontext.mc_fp)); - __get_user(i7, &(ucp->tuc_mcontext.mc_i7)); - - w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6]; - if (put_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), - abi_ulong) != 0) - goto do_sigsegv; - if (put_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), - abi_ulong) != 0) - goto do_sigsegv; - /* FIXME this does not match how the kernel handles the FPU in - * its sparc64_set_context implementation. In particular the FPU - * is only restored if fenab is non-zero in: - * __get_user(fenab, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_enab)); - */ - __get_user(env->fprs, &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fprs)); - { - uint32_t *src = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs; - for (i = 0; i < 64; i++, src++) { - if (i & 1) { - __get_user(env->fpr[i/2].l.lower, src); - } else { - __get_user(env->fpr[i/2].l.upper, src); - } - } - } - __get_user(env->fsr, - &(ucp->tuc_mcontext.mc_fpregs.mcfpu_fsr)); - __get_user(env->gsr, - &(ucp->tuc_mcontext.mc_fpregs.mcfpu_gsr)); - unlock_user_struct(ucp, ucp_addr, 0); - return; - do_sigsegv: - unlock_user_struct(ucp, ucp_addr, 0); - force_sig(TARGET_SIGSEGV); -} - -void sparc64_get_context(CPUSPARCState *env) -{ - abi_ulong ucp_addr; - struct target_ucontext *ucp; - target_mc_gregset_t *grp; - target_mcontext_t *mcp; - abi_ulong fp, i7, w_addr; - int err; - unsigned int i; - target_sigset_t target_set; - sigset_t set; - - ucp_addr = env->regwptr[UREG_I0]; - if (!lock_user_struct(VERIFY_WRITE, ucp, ucp_addr, 0)) - goto do_sigsegv; - - mcp = &ucp->tuc_mcontext; - grp = &mcp->mc_gregs; - - /* Skip over the trap instruction, first. */ - env->pc = env->npc; - env->npc += 4; - - err = 0; - - do_sigprocmask(0, NULL, &set); - host_to_target_sigset_internal(&target_set, &set); - if (TARGET_NSIG_WORDS == 1) { - __put_user(target_set.sig[0], - (abi_ulong *)&ucp->tuc_sigmask); - } else { - abi_ulong *src, *dst; - src = target_set.sig; - dst = ucp->tuc_sigmask.sig; - for (i = 0; i < TARGET_NSIG_WORDS; i++, dst++, src++) { - __put_user(*src, dst); - } - if (err) - goto do_sigsegv; - } - - /* XXX: tstate must be saved properly */ - // __put_user(env->tstate, &((*grp)[MC_TSTATE])); - __put_user(env->pc, &((*grp)[MC_PC])); - __put_user(env->npc, &((*grp)[MC_NPC])); - __put_user(env->y, &((*grp)[MC_Y])); - __put_user(env->gregs[1], &((*grp)[MC_G1])); - __put_user(env->gregs[2], &((*grp)[MC_G2])); - __put_user(env->gregs[3], &((*grp)[MC_G3])); - __put_user(env->gregs[4], &((*grp)[MC_G4])); - __put_user(env->gregs[5], &((*grp)[MC_G5])); - __put_user(env->gregs[6], &((*grp)[MC_G6])); - __put_user(env->gregs[7], &((*grp)[MC_G7])); - __put_user(env->regwptr[UREG_I0], &((*grp)[MC_O0])); - __put_user(env->regwptr[UREG_I1], &((*grp)[MC_O1])); - __put_user(env->regwptr[UREG_I2], &((*grp)[MC_O2])); - __put_user(env->regwptr[UREG_I3], &((*grp)[MC_O3])); - __put_user(env->regwptr[UREG_I4], &((*grp)[MC_O4])); - __put_user(env->regwptr[UREG_I5], &((*grp)[MC_O5])); - __put_user(env->regwptr[UREG_I6], &((*grp)[MC_O6])); - __put_user(env->regwptr[UREG_I7], &((*grp)[MC_O7])); - - w_addr = TARGET_STACK_BIAS+env->regwptr[UREG_I6]; - fp = i7 = 0; - if (get_user(fp, w_addr + offsetof(struct target_reg_window, ins[6]), - abi_ulong) != 0) - goto do_sigsegv; - if (get_user(i7, w_addr + offsetof(struct target_reg_window, ins[7]), - abi_ulong) != 0) - goto do_sigsegv; - __put_user(fp, &(mcp->mc_fp)); - __put_user(i7, &(mcp->mc_i7)); - - { - uint32_t *dst = ucp->tuc_mcontext.mc_fpregs.mcfpu_fregs.sregs; - for (i = 0; i < 64; i++, dst++) { - if (i & 1) { - __put_user(env->fpr[i/2].l.lower, dst); - } else { - __put_user(env->fpr[i/2].l.upper, dst); - } - } - } - __put_user(env->fsr, &(mcp->mc_fpregs.mcfpu_fsr)); - __put_user(env->gsr, &(mcp->mc_fpregs.mcfpu_gsr)); - __put_user(env->fprs, &(mcp->mc_fpregs.mcfpu_fprs)); - - if (err) - goto do_sigsegv; - unlock_user_struct(ucp, ucp_addr, 1); - return; - do_sigsegv: - unlock_user_struct(ucp, ucp_addr, 1); - force_sig(TARGET_SIGSEGV); -} -#endif -#elif defined(TARGET_MIPS) || defined(TARGET_MIPS64) - -# if defined(TARGET_ABI_MIPSO32) -struct target_sigcontext { - uint32_t sc_regmask; /* Unused */ - uint32_t sc_status; - uint64_t sc_pc; - uint64_t sc_regs[32]; - uint64_t sc_fpregs[32]; - uint32_t sc_ownedfp; /* Unused */ - uint32_t sc_fpc_csr; - uint32_t sc_fpc_eir; /* Unused */ - uint32_t sc_used_math; - uint32_t sc_dsp; /* dsp status, was sc_ssflags */ - uint32_t pad0; - uint64_t sc_mdhi; - uint64_t sc_mdlo; - target_ulong sc_hi1; /* Was sc_cause */ - target_ulong sc_lo1; /* Was sc_badvaddr */ - target_ulong sc_hi2; /* Was sc_sigset[4] */ - target_ulong sc_lo2; - target_ulong sc_hi3; - target_ulong sc_lo3; -}; -# else /* N32 || N64 */ -struct target_sigcontext { - uint64_t sc_regs[32]; - uint64_t sc_fpregs[32]; - uint64_t sc_mdhi; - uint64_t sc_hi1; - uint64_t sc_hi2; - uint64_t sc_hi3; - uint64_t sc_mdlo; - uint64_t sc_lo1; - uint64_t sc_lo2; - uint64_t sc_lo3; - uint64_t sc_pc; - uint32_t sc_fpc_csr; - uint32_t sc_used_math; - uint32_t sc_dsp; - uint32_t sc_reserved; -}; -# endif /* O32 */ - -struct sigframe { - uint32_t sf_ass[4]; /* argument save space for o32 */ - uint32_t sf_code[2]; /* signal trampoline */ - struct target_sigcontext sf_sc; - target_sigset_t sf_mask; -}; - -struct target_ucontext { - target_ulong tuc_flags; - target_ulong tuc_link; - target_stack_t tuc_stack; - target_ulong pad0; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; -}; - -struct target_rt_sigframe { - uint32_t rs_ass[4]; /* argument save space for o32 */ - uint32_t rs_code[2]; /* signal trampoline */ - struct target_siginfo rs_info; - struct target_ucontext rs_uc; -}; - -/* Install trampoline to jump back from signal handler */ -static inline int install_sigtramp(unsigned int *tramp, unsigned int syscall) -{ - int err = 0; - - /* - * Set up the return code ... - * - * li v0, __NR__foo_sigreturn - * syscall - */ - - __put_user(0x24020000 + syscall, tramp + 0); - __put_user(0x0000000c , tramp + 1); - return err; -} - -static inline void setup_sigcontext(CPUMIPSState *regs, - struct target_sigcontext *sc) -{ - int i; - - __put_user(exception_resume_pc(regs), &sc->sc_pc); - regs->hflags &= ~MIPS_HFLAG_BMASK; - - __put_user(0, &sc->sc_regs[0]); - for (i = 1; i < 32; ++i) { - __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]); - } - - __put_user(regs->active_tc.HI[0], &sc->sc_mdhi); - __put_user(regs->active_tc.LO[0], &sc->sc_mdlo); - - /* Rather than checking for dsp existence, always copy. The storage - would just be garbage otherwise. */ - __put_user(regs->active_tc.HI[1], &sc->sc_hi1); - __put_user(regs->active_tc.HI[2], &sc->sc_hi2); - __put_user(regs->active_tc.HI[3], &sc->sc_hi3); - __put_user(regs->active_tc.LO[1], &sc->sc_lo1); - __put_user(regs->active_tc.LO[2], &sc->sc_lo2); - __put_user(regs->active_tc.LO[3], &sc->sc_lo3); - { - uint32_t dsp = cpu_rddsp(0x3ff, regs); - __put_user(dsp, &sc->sc_dsp); - } - - __put_user(1, &sc->sc_used_math); - - for (i = 0; i < 32; ++i) { - __put_user(regs->active_fpu.fpr[i].d, &sc->sc_fpregs[i]); - } -} - -static inline void -restore_sigcontext(CPUMIPSState *regs, struct target_sigcontext *sc) -{ - int i; - - __get_user(regs->CP0_EPC, &sc->sc_pc); - - __get_user(regs->active_tc.HI[0], &sc->sc_mdhi); - __get_user(regs->active_tc.LO[0], &sc->sc_mdlo); - - for (i = 1; i < 32; ++i) { - __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]); - } - - __get_user(regs->active_tc.HI[1], &sc->sc_hi1); - __get_user(regs->active_tc.HI[2], &sc->sc_hi2); - __get_user(regs->active_tc.HI[3], &sc->sc_hi3); - __get_user(regs->active_tc.LO[1], &sc->sc_lo1); - __get_user(regs->active_tc.LO[2], &sc->sc_lo2); - __get_user(regs->active_tc.LO[3], &sc->sc_lo3); - { - uint32_t dsp; - __get_user(dsp, &sc->sc_dsp); - cpu_wrdsp(dsp, 0x3ff, regs); - } - - for (i = 0; i < 32; ++i) { - __get_user(regs->active_fpu.fpr[i].d, &sc->sc_fpregs[i]); - } -} - -/* - * Determine which stack to use.. - */ -static inline abi_ulong -get_sigframe(struct target_sigaction *ka, CPUMIPSState *regs, size_t frame_size) -{ - unsigned long sp; - - /* Default to using normal stack */ - sp = regs->active_tc.gpr[29]; - - /* - * FPU emulator may have its own trampoline active just - * above the user stack, 16-bytes before the next lowest - * 16 byte boundary. Try to avoid trashing it. - */ - sp -= 32; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - return (sp - frame_size) & ~7; -} - -static void mips_set_hflags_isa_mode_from_pc(CPUMIPSState *env) -{ - if (env->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) { - env->hflags &= ~MIPS_HFLAG_M16; - env->hflags |= (env->active_tc.PC & 1) << MIPS_HFLAG_M16_SHIFT; - env->active_tc.PC &= ~(target_ulong) 1; - } -} - -# if defined(TARGET_ABI_MIPSO32) -/* compare linux/arch/mips/kernel/signal.c:setup_frame() */ -static void setup_frame(int sig, struct target_sigaction * ka, - target_sigset_t *set, CPUMIPSState *regs) -{ - struct sigframe *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(ka, regs, sizeof(*frame)); - trace_user_setup_frame(regs, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - install_sigtramp(frame->sf_code, TARGET_NR_sigreturn); - - setup_sigcontext(regs, &frame->sf_sc); - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->sf_mask.sig[i]); - } - - /* - * Arguments to signal handler: - * - * a0 = signal number - * a1 = 0 (should be cause) - * a2 = pointer to struct sigcontext - * - * $25 and PC point to the signal handler, $29 points to the - * struct sigframe. - */ - regs->active_tc.gpr[ 4] = sig; - regs->active_tc.gpr[ 5] = 0; - regs->active_tc.gpr[ 6] = frame_addr + offsetof(struct sigframe, sf_sc); - regs->active_tc.gpr[29] = frame_addr; - regs->active_tc.gpr[31] = frame_addr + offsetof(struct sigframe, sf_code); - /* The original kernel code sets CP0_EPC to the handler - * since it returns to userland using eret - * we cannot do this here, and we must set PC directly */ - regs->active_tc.PC = regs->active_tc.gpr[25] = ka->_sa_handler; - mips_set_hflags_isa_mode_from_pc(regs); - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - force_sig(TARGET_SIGSEGV/*, current*/); -} - -long do_sigreturn(CPUMIPSState *regs) -{ - struct sigframe *frame; - abi_ulong frame_addr; - sigset_t blocked; - target_sigset_t target_set; - int i; - - frame_addr = regs->active_tc.gpr[29]; - trace_user_do_sigreturn(regs, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->sf_mask.sig[i]); - } - - target_to_host_sigset_internal(&blocked, &target_set); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - - restore_sigcontext(regs, &frame->sf_sc); - -#if 0 - /* - * Don't let your children do this ... - */ - __asm__ __volatile__( - "move\t$29, %0\n\t" - "j\tsyscall_exit" - :/* no outputs */ - :"r" (®s)); - /* Unreached */ -#endif - - regs->active_tc.PC = regs->CP0_EPC; - mips_set_hflags_isa_mode_from_pc(regs); - /* I am not sure this is right, but it seems to work - * maybe a problem with nested signals ? */ - regs->CP0_EPC = 0; - return -TARGET_QEMU_ESIGRETURN; - -badframe: - force_sig(TARGET_SIGSEGV/*, current*/); - return 0; -} -# endif /* O32 */ - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUMIPSState *env) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - install_sigtramp(frame->rs_code, TARGET_NR_rt_sigreturn); - - tswap_siginfo(&frame->rs_info, info); - - __put_user(0, &frame->rs_uc.tuc_flags); - __put_user(0, &frame->rs_uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->rs_uc.tuc_stack.ss_sp); - __put_user(target_sigaltstack_used.ss_size, &frame->rs_uc.tuc_stack.ss_size); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->rs_uc.tuc_stack.ss_flags); - - setup_sigcontext(env, &frame->rs_uc.tuc_mcontext); - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]); - } - - /* - * Arguments to signal handler: - * - * a0 = signal number - * a1 = pointer to siginfo_t - * a2 = pointer to struct ucontext - * - * $25 and PC point to the signal handler, $29 points to the - * struct sigframe. - */ - env->active_tc.gpr[ 4] = sig; - env->active_tc.gpr[ 5] = frame_addr - + offsetof(struct target_rt_sigframe, rs_info); - env->active_tc.gpr[ 6] = frame_addr - + offsetof(struct target_rt_sigframe, rs_uc); - env->active_tc.gpr[29] = frame_addr; - env->active_tc.gpr[31] = frame_addr - + offsetof(struct target_rt_sigframe, rs_code); - /* The original kernel code sets CP0_EPC to the handler - * since it returns to userland using eret - * we cannot do this here, and we must set PC directly */ - env->active_tc.PC = env->active_tc.gpr[25] = ka->_sa_handler; - mips_set_hflags_isa_mode_from_pc(env); - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV/*, current*/); -} - -long do_rt_sigreturn(CPUMIPSState *env) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr; - sigset_t blocked; - - frame_addr = env->active_tc.gpr[29]; - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - - restore_sigcontext(env, &frame->rs_uc.tuc_mcontext); - - if (do_sigaltstack(frame_addr + - offsetof(struct target_rt_sigframe, rs_uc.tuc_stack), - 0, get_sp_from_cpustate(env)) == -EFAULT) - goto badframe; - - env->active_tc.PC = env->CP0_EPC; - mips_set_hflags_isa_mode_from_pc(env); - /* I am not sure this is right, but it seems to work - * maybe a problem with nested signals ? */ - env->CP0_EPC = 0; - return -TARGET_QEMU_ESIGRETURN; - -badframe: - force_sig(TARGET_SIGSEGV/*, current*/); - return 0; -} - -#elif defined(TARGET_SH4) - -/* - * code and data structures from linux kernel: - * include/asm-sh/sigcontext.h - * arch/sh/kernel/signal.c - */ - -struct target_sigcontext { - target_ulong oldmask; - - /* CPU registers */ - target_ulong sc_gregs[16]; - target_ulong sc_pc; - target_ulong sc_pr; - target_ulong sc_sr; - target_ulong sc_gbr; - target_ulong sc_mach; - target_ulong sc_macl; - - /* FPU registers */ - target_ulong sc_fpregs[16]; - target_ulong sc_xfpregs[16]; - unsigned int sc_fpscr; - unsigned int sc_fpul; - unsigned int sc_ownedfp; -}; - -struct target_sigframe -{ - struct target_sigcontext sc; - target_ulong extramask[TARGET_NSIG_WORDS-1]; - uint16_t retcode[3]; -}; - - -struct target_ucontext { - target_ulong tuc_flags; - struct target_ucontext *tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct target_rt_sigframe -{ - struct target_siginfo info; - struct target_ucontext uc; - uint16_t retcode[3]; -}; - - -#define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */ -#define TRAP_NOARG 0xc310 /* Syscall w/no args (NR in R3) SH3/4 */ - -static abi_ulong get_sigframe(struct target_sigaction *ka, - unsigned long sp, size_t frame_size) -{ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags(sp) == 0)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - return (sp - frame_size) & -8ul; -} - -static void setup_sigcontext(struct target_sigcontext *sc, - CPUSH4State *regs, unsigned long mask) -{ - int i; - -#define COPY(x) __put_user(regs->x, &sc->sc_##x) - COPY(gregs[0]); COPY(gregs[1]); - COPY(gregs[2]); COPY(gregs[3]); - COPY(gregs[4]); COPY(gregs[5]); - COPY(gregs[6]); COPY(gregs[7]); - COPY(gregs[8]); COPY(gregs[9]); - COPY(gregs[10]); COPY(gregs[11]); - COPY(gregs[12]); COPY(gregs[13]); - COPY(gregs[14]); COPY(gregs[15]); - COPY(gbr); COPY(mach); - COPY(macl); COPY(pr); - COPY(sr); COPY(pc); -#undef COPY - - for (i=0; i<16; i++) { - __put_user(regs->fregs[i], &sc->sc_fpregs[i]); - } - __put_user(regs->fpscr, &sc->sc_fpscr); - __put_user(regs->fpul, &sc->sc_fpul); - - /* non-iBCS2 extensions.. */ - __put_user(mask, &sc->oldmask); -} - -static void restore_sigcontext(CPUSH4State *regs, struct target_sigcontext *sc, - target_ulong *r0_p) -{ - int i; - -#define COPY(x) __get_user(regs->x, &sc->sc_##x) - COPY(gregs[1]); - COPY(gregs[2]); COPY(gregs[3]); - COPY(gregs[4]); COPY(gregs[5]); - COPY(gregs[6]); COPY(gregs[7]); - COPY(gregs[8]); COPY(gregs[9]); - COPY(gregs[10]); COPY(gregs[11]); - COPY(gregs[12]); COPY(gregs[13]); - COPY(gregs[14]); COPY(gregs[15]); - COPY(gbr); COPY(mach); - COPY(macl); COPY(pr); - COPY(sr); COPY(pc); -#undef COPY - - for (i=0; i<16; i++) { - __get_user(regs->fregs[i], &sc->sc_fpregs[i]); - } - __get_user(regs->fpscr, &sc->sc_fpscr); - __get_user(regs->fpul, &sc->sc_fpul); - - regs->tra = -1; /* disable syscall checks */ - __get_user(*r0_p, &sc->sc_gregs[0]); -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUSH4State *regs) -{ - struct target_sigframe *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame)); - trace_user_setup_frame(regs, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - setup_sigcontext(&frame->sc, regs, set->sig[0]); - - for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { - __put_user(set->sig[i + 1], &frame->extramask[i]); - } - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - regs->pr = (unsigned long) ka->sa_restorer; - } else { - /* Generate return code (system call to sigreturn) */ - abi_ulong retcode_addr = frame_addr + - offsetof(struct target_sigframe, retcode); - __put_user(MOVW(2), &frame->retcode[0]); - __put_user(TRAP_NOARG, &frame->retcode[1]); - __put_user((TARGET_NR_sigreturn), &frame->retcode[2]); - regs->pr = (unsigned long) retcode_addr; - } - - /* Set up registers for signal handler */ - regs->gregs[15] = frame_addr; - regs->gregs[4] = sig; /* Arg for signal handler */ - regs->gregs[5] = 0; - regs->gregs[6] = frame_addr += offsetof(typeof(*frame), sc); - regs->pc = (unsigned long) ka->_sa_handler; - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUSH4State *regs) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame)); - trace_user_setup_rt_frame(regs, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - tswap_siginfo(&frame->info, info); - - /* Create the ucontext. */ - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, (unsigned long *)&frame->uc.tuc_link); - __put_user((unsigned long)target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(regs->gregs[15]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - setup_sigcontext(&frame->uc.tuc_mcontext, - regs, set->sig[0]); - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - regs->pr = (unsigned long) ka->sa_restorer; - } else { - /* Generate return code (system call to sigreturn) */ - abi_ulong retcode_addr = frame_addr + - offsetof(struct target_rt_sigframe, retcode); - __put_user(MOVW(2), &frame->retcode[0]); - __put_user(TRAP_NOARG, &frame->retcode[1]); - __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]); - regs->pr = (unsigned long) retcode_addr; - } - - /* Set up registers for signal handler */ - regs->gregs[15] = frame_addr; - regs->gregs[4] = sig; /* Arg for signal handler */ - regs->gregs[5] = frame_addr + offsetof(typeof(*frame), info); - regs->gregs[6] = frame_addr + offsetof(typeof(*frame), uc); - regs->pc = (unsigned long) ka->_sa_handler; - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV); -} - -long do_sigreturn(CPUSH4State *regs) -{ - struct target_sigframe *frame; - abi_ulong frame_addr; - sigset_t blocked; - target_sigset_t target_set; - target_ulong r0; - int i; - int err = 0; - - frame_addr = regs->gregs[15]; - trace_user_do_sigreturn(regs, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - __get_user(target_set.sig[0], &frame->sc.oldmask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->extramask[i - 1]); - } - - if (err) - goto badframe; - - target_to_host_sigset_internal(&blocked, &target_set); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - - restore_sigcontext(regs, &frame->sc, &r0); - - unlock_user_struct(frame, frame_addr, 0); - return r0; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -long do_rt_sigreturn(CPUSH4State *regs) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr; - sigset_t blocked; - target_ulong r0; - - frame_addr = regs->gregs[15]; - trace_user_do_rt_sigreturn(regs, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - - restore_sigcontext(regs, &frame->uc.tuc_mcontext, &r0); - - if (do_sigaltstack(frame_addr + - offsetof(struct target_rt_sigframe, uc.tuc_stack), - 0, get_sp_from_cpustate(regs)) == -EFAULT) - goto badframe; - - unlock_user_struct(frame, frame_addr, 0); - return r0; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} -#elif defined(TARGET_MICROBLAZE) - -struct target_sigcontext { - struct target_pt_regs regs; /* needs to be first */ - uint32_t oldmask; -}; - -struct target_stack_t { - abi_ulong ss_sp; - int ss_flags; - unsigned int ss_size; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - struct target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - uint32_t tuc_extramask[TARGET_NSIG_WORDS - 1]; -}; - -/* Signal frames. */ -struct target_signal_frame { - struct target_ucontext uc; - uint32_t extramask[TARGET_NSIG_WORDS - 1]; - uint32_t tramp[2]; -}; - -struct rt_signal_frame { - siginfo_t info; - struct ucontext uc; - uint32_t tramp[2]; -}; - -static void setup_sigcontext(struct target_sigcontext *sc, CPUMBState *env) -{ - __put_user(env->regs[0], &sc->regs.r0); - __put_user(env->regs[1], &sc->regs.r1); - __put_user(env->regs[2], &sc->regs.r2); - __put_user(env->regs[3], &sc->regs.r3); - __put_user(env->regs[4], &sc->regs.r4); - __put_user(env->regs[5], &sc->regs.r5); - __put_user(env->regs[6], &sc->regs.r6); - __put_user(env->regs[7], &sc->regs.r7); - __put_user(env->regs[8], &sc->regs.r8); - __put_user(env->regs[9], &sc->regs.r9); - __put_user(env->regs[10], &sc->regs.r10); - __put_user(env->regs[11], &sc->regs.r11); - __put_user(env->regs[12], &sc->regs.r12); - __put_user(env->regs[13], &sc->regs.r13); - __put_user(env->regs[14], &sc->regs.r14); - __put_user(env->regs[15], &sc->regs.r15); - __put_user(env->regs[16], &sc->regs.r16); - __put_user(env->regs[17], &sc->regs.r17); - __put_user(env->regs[18], &sc->regs.r18); - __put_user(env->regs[19], &sc->regs.r19); - __put_user(env->regs[20], &sc->regs.r20); - __put_user(env->regs[21], &sc->regs.r21); - __put_user(env->regs[22], &sc->regs.r22); - __put_user(env->regs[23], &sc->regs.r23); - __put_user(env->regs[24], &sc->regs.r24); - __put_user(env->regs[25], &sc->regs.r25); - __put_user(env->regs[26], &sc->regs.r26); - __put_user(env->regs[27], &sc->regs.r27); - __put_user(env->regs[28], &sc->regs.r28); - __put_user(env->regs[29], &sc->regs.r29); - __put_user(env->regs[30], &sc->regs.r30); - __put_user(env->regs[31], &sc->regs.r31); - __put_user(env->sregs[SR_PC], &sc->regs.pc); -} - -static void restore_sigcontext(struct target_sigcontext *sc, CPUMBState *env) -{ - __get_user(env->regs[0], &sc->regs.r0); - __get_user(env->regs[1], &sc->regs.r1); - __get_user(env->regs[2], &sc->regs.r2); - __get_user(env->regs[3], &sc->regs.r3); - __get_user(env->regs[4], &sc->regs.r4); - __get_user(env->regs[5], &sc->regs.r5); - __get_user(env->regs[6], &sc->regs.r6); - __get_user(env->regs[7], &sc->regs.r7); - __get_user(env->regs[8], &sc->regs.r8); - __get_user(env->regs[9], &sc->regs.r9); - __get_user(env->regs[10], &sc->regs.r10); - __get_user(env->regs[11], &sc->regs.r11); - __get_user(env->regs[12], &sc->regs.r12); - __get_user(env->regs[13], &sc->regs.r13); - __get_user(env->regs[14], &sc->regs.r14); - __get_user(env->regs[15], &sc->regs.r15); - __get_user(env->regs[16], &sc->regs.r16); - __get_user(env->regs[17], &sc->regs.r17); - __get_user(env->regs[18], &sc->regs.r18); - __get_user(env->regs[19], &sc->regs.r19); - __get_user(env->regs[20], &sc->regs.r20); - __get_user(env->regs[21], &sc->regs.r21); - __get_user(env->regs[22], &sc->regs.r22); - __get_user(env->regs[23], &sc->regs.r23); - __get_user(env->regs[24], &sc->regs.r24); - __get_user(env->regs[25], &sc->regs.r25); - __get_user(env->regs[26], &sc->regs.r26); - __get_user(env->regs[27], &sc->regs.r27); - __get_user(env->regs[28], &sc->regs.r28); - __get_user(env->regs[29], &sc->regs.r29); - __get_user(env->regs[30], &sc->regs.r30); - __get_user(env->regs[31], &sc->regs.r31); - __get_user(env->sregs[SR_PC], &sc->regs.pc); -} - -static abi_ulong get_sigframe(struct target_sigaction *ka, - CPUMBState *env, int frame_size) -{ - abi_ulong sp = env->regs[1]; - - if ((ka->sa_flags & TARGET_SA_ONSTACK) != 0 && !on_sig_stack(sp)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - return ((sp - frame_size) & -8UL); -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUMBState *env) -{ - struct target_signal_frame *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(ka, env, sizeof *frame); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto badframe; - - /* Save the mask. */ - __put_user(set->sig[0], &frame->uc.tuc_mcontext.oldmask); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->extramask[i - 1]); - } - - setup_sigcontext(&frame->uc.tuc_mcontext, env); - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - /* minus 8 is offset to cater for "rtsd r15,8" offset */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - env->regs[15] = ((unsigned long)ka->sa_restorer)-8; - } else { - uint32_t t; - /* Note, these encodings are _big endian_! */ - /* addi r12, r0, __NR_sigreturn */ - t = 0x31800000UL | TARGET_NR_sigreturn; - __put_user(t, frame->tramp + 0); - /* brki r14, 0x8 */ - t = 0xb9cc0008UL; - __put_user(t, frame->tramp + 1); - - /* Return from sighandler will jump to the tramp. - Negative 8 offset because return is rtsd r15, 8 */ - env->regs[15] = ((unsigned long)frame->tramp) - 8; - } - - /* Set up registers for signal handler */ - env->regs[1] = frame_addr; - /* Signal handler args: */ - env->regs[5] = sig; /* Arg 0: signum */ - env->regs[6] = 0; - /* arg 1: sigcontext */ - env->regs[7] = frame_addr += offsetof(typeof(*frame), uc); - - /* Offset of 4 to handle microblaze rtid r14, 0 */ - env->sregs[SR_PC] = (unsigned long)ka->_sa_handler; - - unlock_user_struct(frame, frame_addr, 1); - return; - badframe: - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUMBState *env) -{ - fprintf(stderr, "Microblaze setup_rt_frame: not implemented\n"); -} - -long do_sigreturn(CPUMBState *env) -{ - struct target_signal_frame *frame; - abi_ulong frame_addr; - target_sigset_t target_set; - sigset_t set; - int i; - - frame_addr = env->regs[R_SP]; - trace_user_do_sigreturn(env, frame_addr); - /* Make sure the guest isn't playing games. */ - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1)) - goto badframe; - - /* Restore blocked signals */ - __get_user(target_set.sig[0], &frame->uc.tuc_mcontext.oldmask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->extramask[i - 1]); - } - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - restore_sigcontext(&frame->uc.tuc_mcontext, env); - /* We got here through a sigreturn syscall, our path back is via an - rtb insn so setup r14 for that. */ - env->regs[14] = env->sregs[SR_PC]; - - unlock_user_struct(frame, frame_addr, 0); - return env->regs[10]; - badframe: - force_sig(TARGET_SIGSEGV); -} - -long do_rt_sigreturn(CPUMBState *env) -{ - trace_user_do_rt_sigreturn(env, 0); - fprintf(stderr, "Microblaze do_rt_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -#elif defined(TARGET_CRIS) - -struct target_sigcontext { - struct target_pt_regs regs; /* needs to be first */ - uint32_t oldmask; - uint32_t usp; /* usp before stacking this gunk on it */ -}; - -/* Signal frames. */ -struct target_signal_frame { - struct target_sigcontext sc; - uint32_t extramask[TARGET_NSIG_WORDS - 1]; - uint16_t retcode[4]; /* Trampoline code. */ -}; - -struct rt_signal_frame { - siginfo_t *pinfo; - void *puc; - siginfo_t info; - struct ucontext uc; - uint16_t retcode[4]; /* Trampoline code. */ -}; - -static void setup_sigcontext(struct target_sigcontext *sc, CPUCRISState *env) -{ - __put_user(env->regs[0], &sc->regs.r0); - __put_user(env->regs[1], &sc->regs.r1); - __put_user(env->regs[2], &sc->regs.r2); - __put_user(env->regs[3], &sc->regs.r3); - __put_user(env->regs[4], &sc->regs.r4); - __put_user(env->regs[5], &sc->regs.r5); - __put_user(env->regs[6], &sc->regs.r6); - __put_user(env->regs[7], &sc->regs.r7); - __put_user(env->regs[8], &sc->regs.r8); - __put_user(env->regs[9], &sc->regs.r9); - __put_user(env->regs[10], &sc->regs.r10); - __put_user(env->regs[11], &sc->regs.r11); - __put_user(env->regs[12], &sc->regs.r12); - __put_user(env->regs[13], &sc->regs.r13); - __put_user(env->regs[14], &sc->usp); - __put_user(env->regs[15], &sc->regs.acr); - __put_user(env->pregs[PR_MOF], &sc->regs.mof); - __put_user(env->pregs[PR_SRP], &sc->regs.srp); - __put_user(env->pc, &sc->regs.erp); -} - -static void restore_sigcontext(struct target_sigcontext *sc, CPUCRISState *env) -{ - __get_user(env->regs[0], &sc->regs.r0); - __get_user(env->regs[1], &sc->regs.r1); - __get_user(env->regs[2], &sc->regs.r2); - __get_user(env->regs[3], &sc->regs.r3); - __get_user(env->regs[4], &sc->regs.r4); - __get_user(env->regs[5], &sc->regs.r5); - __get_user(env->regs[6], &sc->regs.r6); - __get_user(env->regs[7], &sc->regs.r7); - __get_user(env->regs[8], &sc->regs.r8); - __get_user(env->regs[9], &sc->regs.r9); - __get_user(env->regs[10], &sc->regs.r10); - __get_user(env->regs[11], &sc->regs.r11); - __get_user(env->regs[12], &sc->regs.r12); - __get_user(env->regs[13], &sc->regs.r13); - __get_user(env->regs[14], &sc->usp); - __get_user(env->regs[15], &sc->regs.acr); - __get_user(env->pregs[PR_MOF], &sc->regs.mof); - __get_user(env->pregs[PR_SRP], &sc->regs.srp); - __get_user(env->pc, &sc->regs.erp); -} - -static abi_ulong get_sigframe(CPUCRISState *env, int framesize) -{ - abi_ulong sp; - /* Align the stack downwards to 4. */ - sp = (env->regs[R_SP] & ~3); - return sp - framesize; -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUCRISState *env) -{ - struct target_signal_frame *frame; - abi_ulong frame_addr; - int i; - - frame_addr = get_sigframe(env, sizeof *frame); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto badframe; - - /* - * The CRIS signal return trampoline. A real linux/CRIS kernel doesn't - * use this trampoline anymore but it sets it up for GDB. - * In QEMU, using the trampoline simplifies things a bit so we use it. - * - * This is movu.w __NR_sigreturn, r9; break 13; - */ - __put_user(0x9c5f, frame->retcode+0); - __put_user(TARGET_NR_sigreturn, - frame->retcode + 1); - __put_user(0xe93d, frame->retcode + 2); - - /* Save the mask. */ - __put_user(set->sig[0], &frame->sc.oldmask); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->extramask[i - 1]); - } - - setup_sigcontext(&frame->sc, env); - - /* Move the stack and setup the arguments for the handler. */ - env->regs[R_SP] = frame_addr; - env->regs[10] = sig; - env->pc = (unsigned long) ka->_sa_handler; - /* Link SRP so the guest returns through the trampoline. */ - env->pregs[PR_SRP] = frame_addr + offsetof(typeof(*frame), retcode); - - unlock_user_struct(frame, frame_addr, 1); - return; - badframe: - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUCRISState *env) -{ - fprintf(stderr, "CRIS setup_rt_frame: not implemented\n"); -} - -long do_sigreturn(CPUCRISState *env) -{ - struct target_signal_frame *frame; - abi_ulong frame_addr; - target_sigset_t target_set; - sigset_t set; - int i; - - frame_addr = env->regs[R_SP]; - trace_user_do_sigreturn(env, frame_addr); - /* Make sure the guest isn't playing games. */ - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1)) - goto badframe; - - /* Restore blocked signals */ - __get_user(target_set.sig[0], &frame->sc.oldmask); - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->extramask[i - 1]); - } - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - restore_sigcontext(&frame->sc, env); - unlock_user_struct(frame, frame_addr, 0); - return env->regs[10]; - badframe: - force_sig(TARGET_SIGSEGV); -} - -long do_rt_sigreturn(CPUCRISState *env) -{ - trace_user_do_rt_sigreturn(env, 0); - fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -#elif defined(TARGET_OPENRISC) - -struct target_sigcontext { - struct target_pt_regs regs; - abi_ulong oldmask; - abi_ulong usp; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct target_rt_sigframe { - abi_ulong pinfo; - uint64_t puc; - struct target_siginfo info; - struct target_sigcontext sc; - struct target_ucontext uc; - unsigned char retcode[16]; /* trampoline code */ -}; - -/* This is the asm-generic/ucontext.h version */ -#if 0 -static int restore_sigcontext(CPUOpenRISCState *regs, - struct target_sigcontext *sc) -{ - unsigned int err = 0; - unsigned long old_usp; - - /* Alwys make any pending restarted system call return -EINTR */ - current_thread_info()->restart_block.fn = do_no_restart_syscall; - - /* restore the regs from &sc->regs (same as sc, since regs is first) - * (sc is already checked for VERIFY_READ since the sigframe was - * checked in sys_sigreturn previously) - */ - - if (copy_from_user(regs, &sc, sizeof(struct target_pt_regs))) { - goto badframe; - } - - /* make sure the U-flag is set so user-mode cannot fool us */ - - regs->sr &= ~SR_SM; - - /* restore the old USP as it was before we stacked the sc etc. - * (we cannot just pop the sigcontext since we aligned the sp and - * stuff after pushing it) - */ - - __get_user(old_usp, &sc->usp); - phx_signal("old_usp 0x%lx", old_usp); - - __PHX__ REALLY /* ??? */ - wrusp(old_usp); - regs->gpr[1] = old_usp; - - /* TODO: the other ports use regs->orig_XX to disable syscall checks - * after this completes, but we don't use that mechanism. maybe we can - * use it now ? - */ - - return err; - -badframe: - return 1; -} -#endif - -/* Set up a signal frame. */ - -static void setup_sigcontext(struct target_sigcontext *sc, - CPUOpenRISCState *regs, - unsigned long mask) -{ - unsigned long usp = regs->gpr[1]; - - /* copy the regs. they are first in sc so we can use sc directly */ - - /*copy_to_user(&sc, regs, sizeof(struct target_pt_regs));*/ - - /* Set the frametype to CRIS_FRAME_NORMAL for the execution of - the signal handler. The frametype will be restored to its previous - value in restore_sigcontext. */ - /*regs->frametype = CRIS_FRAME_NORMAL;*/ - - /* then some other stuff */ - __put_user(mask, &sc->oldmask); - __put_user(usp, &sc->usp); -} - -static inline unsigned long align_sigframe(unsigned long sp) -{ - unsigned long i; - i = sp & ~3UL; - return i; -} - -static inline abi_ulong get_sigframe(struct target_sigaction *ka, - CPUOpenRISCState *regs, - size_t frame_size) -{ - unsigned long sp = regs->gpr[1]; - int onsigstack = on_sig_stack(sp); - - /* redzone */ - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) != 0 && !onsigstack) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - sp = align_sigframe(sp - frame_size); - - /* - * If we are on the alternate signal stack and would overflow it, don't. - * Return an always-bogus address instead so we will die with SIGSEGV. - */ - - if (onsigstack && !likely(on_sig_stack(sp))) { - return -1L; - } - - return sp; -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUOpenRISCState *env) -{ - int err = 0; - abi_ulong frame_addr; - unsigned long return_ip; - struct target_rt_sigframe *frame; - abi_ulong info_addr, uc_addr; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - info_addr = frame_addr + offsetof(struct target_rt_sigframe, info); - __put_user(info_addr, &frame->pinfo); - uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc); - __put_user(uc_addr, &frame->puc); - - if (ka->sa_flags & SA_SIGINFO) { - tswap_siginfo(&frame->info, info); - } - - /*err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));*/ - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->gpr[1]), &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - setup_sigcontext(&frame->sc, env, set->sig[0]); - - /*err |= copy_to_user(frame->uc.tuc_sigmask, set, sizeof(*set));*/ - - /* trampoline - the desired return ip is the retcode itself */ - return_ip = (unsigned long)&frame->retcode; - /* This is l.ori r11,r0,__NR_sigreturn, l.sys 1 */ - __put_user(0xa960, (short *)(frame->retcode + 0)); - __put_user(TARGET_NR_rt_sigreturn, (short *)(frame->retcode + 2)); - __put_user(0x20000001, (unsigned long *)(frame->retcode + 4)); - __put_user(0x15000000, (unsigned long *)(frame->retcode + 8)); - - if (err) { - goto give_sigsegv; - } - - /* TODO what is the current->exec_domain stuff and invmap ? */ - - /* Set up registers for signal handler */ - env->pc = (unsigned long)ka->_sa_handler; /* what we enter NOW */ - env->gpr[9] = (unsigned long)return_ip; /* what we enter LATER */ - env->gpr[3] = (unsigned long)sig; /* arg 1: signo */ - env->gpr[4] = (unsigned long)&frame->info; /* arg 2: (siginfo_t*) */ - env->gpr[5] = (unsigned long)&frame->uc; /* arg 3: ucontext */ - - /* actually move the usp to reflect the stacked frame */ - env->gpr[1] = (unsigned long)frame; - - return; - -give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - if (sig == TARGET_SIGSEGV) { - ka->_sa_handler = TARGET_SIG_DFL; - } - force_sig(TARGET_SIGSEGV); -} - -long do_sigreturn(CPUOpenRISCState *env) -{ - trace_user_do_sigreturn(env, 0); - fprintf(stderr, "do_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -long do_rt_sigreturn(CPUOpenRISCState *env) -{ - trace_user_do_rt_sigreturn(env, 0); - fprintf(stderr, "do_rt_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} -/* TARGET_OPENRISC */ - -#elif defined(TARGET_S390X) - -#define __NUM_GPRS 16 -#define __NUM_FPRS 16 -#define __NUM_ACRS 16 - -#define S390_SYSCALL_SIZE 2 -#define __SIGNAL_FRAMESIZE 160 /* FIXME: 31-bit mode -> 96 */ - -#define _SIGCONTEXT_NSIG 64 -#define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */ -#define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW) -#define _SIGMASK_COPY_SIZE (sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS) -#define PSW_ADDR_AMODE 0x0000000000000000UL /* 0x80000000UL for 31-bit */ -#define S390_SYSCALL_OPCODE ((uint16_t)0x0a00) - -typedef struct { - target_psw_t psw; - target_ulong gprs[__NUM_GPRS]; - unsigned int acrs[__NUM_ACRS]; -} target_s390_regs_common; - -typedef struct { - unsigned int fpc; - double fprs[__NUM_FPRS]; -} target_s390_fp_regs; - -typedef struct { - target_s390_regs_common regs; - target_s390_fp_regs fpregs; -} target_sigregs; - -struct target_sigcontext { - target_ulong oldmask[_SIGCONTEXT_NSIG_WORDS]; - target_sigregs *sregs; -}; - -typedef struct { - uint8_t callee_used_stack[__SIGNAL_FRAMESIZE]; - struct target_sigcontext sc; - target_sigregs sregs; - int signo; - uint8_t retcode[S390_SYSCALL_SIZE]; -} sigframe; - -struct target_ucontext { - target_ulong tuc_flags; - struct target_ucontext *tuc_link; - target_stack_t tuc_stack; - target_sigregs tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -typedef struct { - uint8_t callee_used_stack[__SIGNAL_FRAMESIZE]; - uint8_t retcode[S390_SYSCALL_SIZE]; - struct target_siginfo info; - struct target_ucontext uc; -} rt_sigframe; - -static inline abi_ulong -get_sigframe(struct target_sigaction *ka, CPUS390XState *env, size_t frame_size) -{ - abi_ulong sp; - - /* Default to using normal stack */ - sp = env->regs[15]; - - /* This is the X/Open sanctioned signal stack switching. */ - if (ka->sa_flags & TARGET_SA_ONSTACK) { - if (!sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + - target_sigaltstack_used.ss_size; - } - } - - /* This is the legacy signal stack switching. */ - else if (/* FIXME !user_mode(regs) */ 0 && - !(ka->sa_flags & TARGET_SA_RESTORER) && - ka->sa_restorer) { - sp = (abi_ulong) ka->sa_restorer; - } - - return (sp - frame_size) & -8ul; -} - -static void save_sigregs(CPUS390XState *env, target_sigregs *sregs) -{ - int i; - //save_access_regs(current->thread.acrs); FIXME - - /* Copy a 'clean' PSW mask to the user to avoid leaking - information about whether PER is currently on. */ - __put_user(env->psw.mask, &sregs->regs.psw.mask); - __put_user(env->psw.addr, &sregs->regs.psw.addr); - for (i = 0; i < 16; i++) { - __put_user(env->regs[i], &sregs->regs.gprs[i]); - } - for (i = 0; i < 16; i++) { - __put_user(env->aregs[i], &sregs->regs.acrs[i]); - } - /* - * We have to store the fp registers to current->thread.fp_regs - * to merge them with the emulated registers. - */ - //save_fp_regs(¤t->thread.fp_regs); FIXME - for (i = 0; i < 16; i++) { - __put_user(get_freg(env, i)->ll, &sregs->fpregs.fprs[i]); - } -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUS390XState *env) -{ - sigframe *frame; - abi_ulong frame_addr; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - __put_user(set->sig[0], &frame->sc.oldmask[0]); - - save_sigregs(env, &frame->sregs); - - __put_user((abi_ulong)(unsigned long)&frame->sregs, - (abi_ulong *)&frame->sc.sregs); - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - env->regs[14] = (unsigned long) - ka->sa_restorer | PSW_ADDR_AMODE; - } else { - env->regs[14] = (unsigned long) - frame->retcode | PSW_ADDR_AMODE; - __put_user(S390_SYSCALL_OPCODE | TARGET_NR_sigreturn, - (uint16_t *)(frame->retcode)); - } - - /* Set up backchain. */ - __put_user(env->regs[15], (abi_ulong *) frame); - - /* Set up registers for signal handler */ - env->regs[15] = frame_addr; - env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE; - - env->regs[2] = sig; //map_signal(sig); - env->regs[3] = frame_addr += offsetof(typeof(*frame), sc); - - /* We forgot to include these in the sigcontext. - To avoid breaking binary compatibility, they are passed as args. */ - env->regs[4] = 0; // FIXME: no clue... current->thread.trap_no; - env->regs[5] = 0; // FIXME: no clue... current->thread.prot_addr; - - /* Place signal number on stack to allow backtrace from handler. */ - __put_user(env->regs[2], (int *) &frame->signo); - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUS390XState *env) -{ - int i; - rt_sigframe *frame; - abi_ulong frame_addr; - - frame_addr = get_sigframe(ka, env, sizeof *frame); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - tswap_siginfo(&frame->info, info); - - /* Create the ucontext. */ - __put_user(0, &frame->uc.tuc_flags); - __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(get_sp_from_cpustate(env)), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size); - save_sigregs(env, &frame->uc.tuc_mcontext); - for (i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user((abi_ulong)set->sig[i], - (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]); - } - - /* Set up to return from userspace. If provided, use a stub - already in userspace. */ - if (ka->sa_flags & TARGET_SA_RESTORER) { - env->regs[14] = (unsigned long) ka->sa_restorer | PSW_ADDR_AMODE; - } else { - env->regs[14] = (unsigned long) frame->retcode | PSW_ADDR_AMODE; - __put_user(S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn, - (uint16_t *)(frame->retcode)); - } - - /* Set up backchain. */ - __put_user(env->regs[15], (abi_ulong *) frame); - - /* Set up registers for signal handler */ - env->regs[15] = frame_addr; - env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE; - - env->regs[2] = sig; //map_signal(sig); - env->regs[3] = frame_addr + offsetof(typeof(*frame), info); - env->regs[4] = frame_addr + offsetof(typeof(*frame), uc); - return; - -give_sigsegv: - force_sig(TARGET_SIGSEGV); -} - -static int -restore_sigregs(CPUS390XState *env, target_sigregs *sc) -{ - int err = 0; - int i; - - for (i = 0; i < 16; i++) { - __get_user(env->regs[i], &sc->regs.gprs[i]); - } - - __get_user(env->psw.mask, &sc->regs.psw.mask); - trace_user_s390x_restore_sigregs(env, (unsigned long long)sc->regs.psw.addr, - (unsigned long long)env->psw.addr); - __get_user(env->psw.addr, &sc->regs.psw.addr); - /* FIXME: 31-bit -> | PSW_ADDR_AMODE */ - - for (i = 0; i < 16; i++) { - __get_user(env->aregs[i], &sc->regs.acrs[i]); - } - for (i = 0; i < 16; i++) { - __get_user(get_freg(env, i)->ll, &sc->fpregs.fprs[i]); - } - - return err; -} - -long do_sigreturn(CPUS390XState *env) -{ - sigframe *frame; - abi_ulong frame_addr = env->regs[15]; - target_sigset_t target_set; - sigset_t set; - - trace_user_do_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - __get_user(target_set.sig[0], &frame->sc.oldmask[0]); - - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */ - - if (restore_sigregs(env, &frame->sregs)) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return env->regs[2]; - -badframe: - force_sig(TARGET_SIGSEGV); - return 0; -} - -long do_rt_sigreturn(CPUS390XState *env) -{ - rt_sigframe *frame; - abi_ulong frame_addr = env->regs[15]; - sigset_t set; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - target_to_host_sigset(&set, &frame->uc.tuc_sigmask); - - do_sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */ - - if (restore_sigregs(env, &frame->uc.tuc_mcontext)) { - goto badframe; - } - - if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0, - get_sp_from_cpustate(env)) == -EFAULT) { - goto badframe; - } - unlock_user_struct(frame, frame_addr, 0); - return env->regs[2]; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -#elif defined(TARGET_PPC) - -/* Size of dummy stack frame allocated when calling signal handler. - See arch/powerpc/include/asm/ptrace.h. */ -#if defined(TARGET_PPC64) -#define SIGNAL_FRAMESIZE 128 -#else -#define SIGNAL_FRAMESIZE 64 -#endif - -/* See arch/powerpc/include/asm/ucontext.h. Only used for 32-bit PPC; - on 64-bit PPC, sigcontext and mcontext are one and the same. */ -struct target_mcontext { - target_ulong mc_gregs[48]; - /* Includes fpscr. */ - uint64_t mc_fregs[33]; - target_ulong mc_pad[2]; - /* We need to handle Altivec and SPE at the same time, which no - kernel needs to do. Fortunately, the kernel defines this bit to - be Altivec-register-large all the time, rather than trying to - twiddle it based on the specific platform. */ - union { - /* SPE vector registers. One extra for SPEFSCR. */ - uint32_t spe[33]; - /* Altivec vector registers. The packing of VSCR and VRSAVE - varies depending on whether we're PPC64 or not: PPC64 splits - them apart; PPC32 stuffs them together. */ -#if defined(TARGET_PPC64) -#define QEMU_NVRREG 34 -#else -#define QEMU_NVRREG 33 -#endif - ppc_avr_t altivec[QEMU_NVRREG]; -#undef QEMU_NVRREG - } mc_vregs __attribute__((__aligned__(16))); -}; - -/* See arch/powerpc/include/asm/sigcontext.h. */ -struct target_sigcontext { - target_ulong _unused[4]; - int32_t signal; -#if defined(TARGET_PPC64) - int32_t pad0; -#endif - target_ulong handler; - target_ulong oldmask; - target_ulong regs; /* struct pt_regs __user * */ -#if defined(TARGET_PPC64) - struct target_mcontext mcontext; -#endif -}; - -/* Indices for target_mcontext.mc_gregs, below. - See arch/powerpc/include/asm/ptrace.h for details. */ -enum { - TARGET_PT_R0 = 0, - TARGET_PT_R1 = 1, - TARGET_PT_R2 = 2, - TARGET_PT_R3 = 3, - TARGET_PT_R4 = 4, - TARGET_PT_R5 = 5, - TARGET_PT_R6 = 6, - TARGET_PT_R7 = 7, - TARGET_PT_R8 = 8, - TARGET_PT_R9 = 9, - TARGET_PT_R10 = 10, - TARGET_PT_R11 = 11, - TARGET_PT_R12 = 12, - TARGET_PT_R13 = 13, - TARGET_PT_R14 = 14, - TARGET_PT_R15 = 15, - TARGET_PT_R16 = 16, - TARGET_PT_R17 = 17, - TARGET_PT_R18 = 18, - TARGET_PT_R19 = 19, - TARGET_PT_R20 = 20, - TARGET_PT_R21 = 21, - TARGET_PT_R22 = 22, - TARGET_PT_R23 = 23, - TARGET_PT_R24 = 24, - TARGET_PT_R25 = 25, - TARGET_PT_R26 = 26, - TARGET_PT_R27 = 27, - TARGET_PT_R28 = 28, - TARGET_PT_R29 = 29, - TARGET_PT_R30 = 30, - TARGET_PT_R31 = 31, - TARGET_PT_NIP = 32, - TARGET_PT_MSR = 33, - TARGET_PT_ORIG_R3 = 34, - TARGET_PT_CTR = 35, - TARGET_PT_LNK = 36, - TARGET_PT_XER = 37, - TARGET_PT_CCR = 38, - /* Yes, there are two registers with #39. One is 64-bit only. */ - TARGET_PT_MQ = 39, - TARGET_PT_SOFTE = 39, - TARGET_PT_TRAP = 40, - TARGET_PT_DAR = 41, - TARGET_PT_DSISR = 42, - TARGET_PT_RESULT = 43, - TARGET_PT_REGS_COUNT = 44 -}; - - -struct target_ucontext { - target_ulong tuc_flags; - target_ulong tuc_link; /* struct ucontext __user * */ - struct target_sigaltstack tuc_stack; -#if !defined(TARGET_PPC64) - int32_t tuc_pad[7]; - target_ulong tuc_regs; /* struct mcontext __user * - points to uc_mcontext field */ -#endif - target_sigset_t tuc_sigmask; -#if defined(TARGET_PPC64) - target_sigset_t unused[15]; /* Allow for uc_sigmask growth */ - struct target_sigcontext tuc_sigcontext; -#else - int32_t tuc_maskext[30]; - int32_t tuc_pad2[3]; - struct target_mcontext tuc_mcontext; -#endif -}; - -/* See arch/powerpc/kernel/signal_32.c. */ -struct target_sigframe { - struct target_sigcontext sctx; - struct target_mcontext mctx; - int32_t abigap[56]; -}; - -#if defined(TARGET_PPC64) - -#define TARGET_TRAMP_SIZE 6 - -struct target_rt_sigframe { - /* sys_rt_sigreturn requires the ucontext be the first field */ - struct target_ucontext uc; - target_ulong _unused[2]; - uint32_t trampoline[TARGET_TRAMP_SIZE]; - target_ulong pinfo; /* struct siginfo __user * */ - target_ulong puc; /* void __user * */ - struct target_siginfo info; - /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */ - char abigap[288]; -} __attribute__((aligned(16))); - -#else - -struct target_rt_sigframe { - struct target_siginfo info; - struct target_ucontext uc; - int32_t abigap[56]; -}; - -#endif - -#if defined(TARGET_PPC64) - -struct target_func_ptr { - target_ulong entry; - target_ulong toc; -}; - -#endif - -/* We use the mc_pad field for the signal return trampoline. */ -#define tramp mc_pad - -/* See arch/powerpc/kernel/signal.c. */ -static target_ulong get_sigframe(struct target_sigaction *ka, - CPUPPCState *env, - int frame_size) -{ - target_ulong oldsp, newsp; - - oldsp = env->gpr[1]; - - if ((ka->sa_flags & TARGET_SA_ONSTACK) && - (sas_ss_flags(oldsp) == 0)) { - oldsp = (target_sigaltstack_used.ss_sp - + target_sigaltstack_used.ss_size); - } - - newsp = (oldsp - frame_size) & ~0xFUL; - - return newsp; -} - -static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame) -{ - target_ulong msr = env->msr; - int i; - target_ulong ccr = 0; - - /* In general, the kernel attempts to be intelligent about what it - needs to save for Altivec/FP/SPE registers. We don't care that - much, so we just go ahead and save everything. */ - - /* Save general registers. */ - for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { - __put_user(env->gpr[i], &frame->mc_gregs[i]); - } - __put_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP]); - __put_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR]); - __put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK]); - __put_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]); - - for (i = 0; i < ARRAY_SIZE(env->crf); i++) { - ccr |= env->crf[i] << (32 - ((i + 1) * 4)); - } - __put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]); - - /* Save Altivec registers if necessary. */ - if (env->insns_flags & PPC_ALTIVEC) { - for (i = 0; i < ARRAY_SIZE(env->avr); i++) { - ppc_avr_t *avr = &env->avr[i]; - ppc_avr_t *vreg = &frame->mc_vregs.altivec[i]; - - __put_user(avr->u64[0], &vreg->u64[0]); - __put_user(avr->u64[1], &vreg->u64[1]); - } - /* Set MSR_VR in the saved MSR value to indicate that - frame->mc_vregs contains valid data. */ - msr |= MSR_VR; - __put_user((uint32_t)env->spr[SPR_VRSAVE], - &frame->mc_vregs.altivec[32].u32[3]); - } - - /* Save floating point registers. */ - if (env->insns_flags & PPC_FLOAT) { - for (i = 0; i < ARRAY_SIZE(env->fpr); i++) { - __put_user(env->fpr[i], &frame->mc_fregs[i]); - } - __put_user((uint64_t) env->fpscr, &frame->mc_fregs[32]); - } - - /* Save SPE registers. The kernel only saves the high half. */ - if (env->insns_flags & PPC_SPE) { -#if defined(TARGET_PPC64) - for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { - __put_user(env->gpr[i] >> 32, &frame->mc_vregs.spe[i]); - } -#else - for (i = 0; i < ARRAY_SIZE(env->gprh); i++) { - __put_user(env->gprh[i], &frame->mc_vregs.spe[i]); - } -#endif - /* Set MSR_SPE in the saved MSR value to indicate that - frame->mc_vregs contains valid data. */ - msr |= MSR_SPE; - __put_user(env->spe_fscr, &frame->mc_vregs.spe[32]); - } - - /* Store MSR. */ - __put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]); -} - -static void encode_trampoline(int sigret, uint32_t *tramp) -{ - /* Set up the sigreturn trampoline: li r0,sigret; sc. */ - if (sigret) { - __put_user(0x38000000 | sigret, &tramp[0]); - __put_user(0x44000002, &tramp[1]); - } -} - -static void restore_user_regs(CPUPPCState *env, - struct target_mcontext *frame, int sig) -{ - target_ulong save_r2 = 0; - target_ulong msr; - target_ulong ccr; - - int i; - - if (!sig) { - save_r2 = env->gpr[2]; - } - - /* Restore general registers. */ - for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { - __get_user(env->gpr[i], &frame->mc_gregs[i]); - } - __get_user(env->nip, &frame->mc_gregs[TARGET_PT_NIP]); - __get_user(env->ctr, &frame->mc_gregs[TARGET_PT_CTR]); - __get_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK]); - __get_user(env->xer, &frame->mc_gregs[TARGET_PT_XER]); - __get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]); - - for (i = 0; i < ARRAY_SIZE(env->crf); i++) { - env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf; - } - - if (!sig) { - env->gpr[2] = save_r2; - } - /* Restore MSR. */ - __get_user(msr, &frame->mc_gregs[TARGET_PT_MSR]); - - /* If doing signal return, restore the previous little-endian mode. */ - if (sig) - env->msr = (env->msr & ~MSR_LE) | (msr & MSR_LE); - - /* Restore Altivec registers if necessary. */ - if (env->insns_flags & PPC_ALTIVEC) { - for (i = 0; i < ARRAY_SIZE(env->avr); i++) { - ppc_avr_t *avr = &env->avr[i]; - ppc_avr_t *vreg = &frame->mc_vregs.altivec[i]; - - __get_user(avr->u64[0], &vreg->u64[0]); - __get_user(avr->u64[1], &vreg->u64[1]); - } - /* Set MSR_VEC in the saved MSR value to indicate that - frame->mc_vregs contains valid data. */ - __get_user(env->spr[SPR_VRSAVE], - (target_ulong *)(&frame->mc_vregs.altivec[32].u32[3])); - } - - /* Restore floating point registers. */ - if (env->insns_flags & PPC_FLOAT) { - uint64_t fpscr; - for (i = 0; i < ARRAY_SIZE(env->fpr); i++) { - __get_user(env->fpr[i], &frame->mc_fregs[i]); - } - __get_user(fpscr, &frame->mc_fregs[32]); - env->fpscr = (uint32_t) fpscr; - } - - /* Save SPE registers. The kernel only saves the high half. */ - if (env->insns_flags & PPC_SPE) { -#if defined(TARGET_PPC64) - for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { - uint32_t hi; - - __get_user(hi, &frame->mc_vregs.spe[i]); - env->gpr[i] = ((uint64_t)hi << 32) | ((uint32_t) env->gpr[i]); - } -#else - for (i = 0; i < ARRAY_SIZE(env->gprh); i++) { - __get_user(env->gprh[i], &frame->mc_vregs.spe[i]); - } -#endif - __get_user(env->spe_fscr, &frame->mc_vregs.spe[32]); - } -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUPPCState *env) -{ - struct target_sigframe *frame; - struct target_sigcontext *sc; - target_ulong frame_addr, newsp; - int err = 0; -#if defined(TARGET_PPC64) - struct image_info *image = ((TaskState *)thread_cpu->opaque)->info; -#endif - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1)) - goto sigsegv; - sc = &frame->sctx; - - __put_user(ka->_sa_handler, &sc->handler); - __put_user(set->sig[0], &sc->oldmask); -#if TARGET_ABI_BITS == 64 - __put_user(set->sig[0] >> 32, &sc->_unused[3]); -#else - __put_user(set->sig[1], &sc->_unused[3]); -#endif - __put_user(h2g(&frame->mctx), &sc->regs); - __put_user(sig, &sc->signal); - - /* Save user regs. */ - save_user_regs(env, &frame->mctx); - - /* Construct the trampoline code on the stack. */ - encode_trampoline(TARGET_NR_sigreturn, (uint32_t *)&frame->mctx.tramp); - - /* The kernel checks for the presence of a VDSO here. We don't - emulate a vdso, so use a sigreturn system call. */ - env->lr = (target_ulong) h2g(frame->mctx.tramp); - - /* Turn off all fp exceptions. */ - env->fpscr = 0; - - /* Create a stack frame for the caller of the handler. */ - newsp = frame_addr - SIGNAL_FRAMESIZE; - err |= put_user(env->gpr[1], newsp, target_ulong); - - if (err) - goto sigsegv; - - /* Set up registers for signal handler. */ - env->gpr[1] = newsp; - env->gpr[3] = sig; - env->gpr[4] = frame_addr + offsetof(struct target_sigframe, sctx); - -#if defined(TARGET_PPC64) - if (get_ppc64_abi(image) < 2) { - /* ELFv1 PPC64 function pointers are pointers to OPD entries. */ - struct target_func_ptr *handler = - (struct target_func_ptr *)g2h(ka->_sa_handler); - env->nip = tswapl(handler->entry); - env->gpr[2] = tswapl(handler->toc); - } else { - /* ELFv2 PPC64 function pointers are entry points, but R12 - * must also be set */ - env->nip = tswapl((target_ulong) ka->_sa_handler); - env->gpr[12] = env->nip; - } -#else - env->nip = (target_ulong) ka->_sa_handler; -#endif - - /* Signal handlers are entered in big-endian mode. */ - env->msr &= ~MSR_LE; - - unlock_user_struct(frame, frame_addr, 1); - return; - -sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUPPCState *env) -{ - struct target_rt_sigframe *rt_sf; - uint32_t *trampptr = 0; - struct target_mcontext *mctx = 0; - target_ulong rt_sf_addr, newsp = 0; - int i, err = 0; -#if defined(TARGET_PPC64) - struct image_info *image = ((TaskState *)thread_cpu->opaque)->info; -#endif - - rt_sf_addr = get_sigframe(ka, env, sizeof(*rt_sf)); - if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1)) - goto sigsegv; - - tswap_siginfo(&rt_sf->info, info); - - __put_user(0, &rt_sf->uc.tuc_flags); - __put_user(0, &rt_sf->uc.tuc_link); - __put_user((target_ulong)target_sigaltstack_used.ss_sp, - &rt_sf->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->gpr[1]), - &rt_sf->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &rt_sf->uc.tuc_stack.ss_size); -#if !defined(TARGET_PPC64) - __put_user(h2g (&rt_sf->uc.tuc_mcontext), - &rt_sf->uc.tuc_regs); -#endif - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]); - } - -#if defined(TARGET_PPC64) - mctx = &rt_sf->uc.tuc_sigcontext.mcontext; - trampptr = &rt_sf->trampoline[0]; -#else - mctx = &rt_sf->uc.tuc_mcontext; - trampptr = (uint32_t *)&rt_sf->uc.tuc_mcontext.tramp; -#endif - - save_user_regs(env, mctx); - encode_trampoline(TARGET_NR_rt_sigreturn, trampptr); - - /* The kernel checks for the presence of a VDSO here. We don't - emulate a vdso, so use a sigreturn system call. */ - env->lr = (target_ulong) h2g(trampptr); - - /* Turn off all fp exceptions. */ - env->fpscr = 0; - - /* Create a stack frame for the caller of the handler. */ - newsp = rt_sf_addr - (SIGNAL_FRAMESIZE + 16); - err |= put_user(env->gpr[1], newsp, target_ulong); - - if (err) - goto sigsegv; - - /* Set up registers for signal handler. */ - env->gpr[1] = newsp; - env->gpr[3] = (target_ulong) sig; - env->gpr[4] = (target_ulong) h2g(&rt_sf->info); - env->gpr[5] = (target_ulong) h2g(&rt_sf->uc); - env->gpr[6] = (target_ulong) h2g(rt_sf); - -#if defined(TARGET_PPC64) - if (get_ppc64_abi(image) < 2) { - /* ELFv1 PPC64 function pointers are pointers to OPD entries. */ - struct target_func_ptr *handler = - (struct target_func_ptr *)g2h(ka->_sa_handler); - env->nip = tswapl(handler->entry); - env->gpr[2] = tswapl(handler->toc); - } else { - /* ELFv2 PPC64 function pointers are entry points, but R12 - * must also be set */ - env->nip = tswapl((target_ulong) ka->_sa_handler); - env->gpr[12] = env->nip; - } -#else - env->nip = (target_ulong) ka->_sa_handler; -#endif - - /* Signal handlers are entered in big-endian mode. */ - env->msr &= ~MSR_LE; - - unlock_user_struct(rt_sf, rt_sf_addr, 1); - return; - -sigsegv: - unlock_user_struct(rt_sf, rt_sf_addr, 1); - force_sig(TARGET_SIGSEGV); - -} - -long do_sigreturn(CPUPPCState *env) -{ - struct target_sigcontext *sc = NULL; - struct target_mcontext *sr = NULL; - target_ulong sr_addr = 0, sc_addr; - sigset_t blocked; - target_sigset_t set; - - sc_addr = env->gpr[1] + SIGNAL_FRAMESIZE; - if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) - goto sigsegv; - -#if defined(TARGET_PPC64) - set.sig[0] = sc->oldmask + ((uint64_t)(sc->_unused[3]) << 32); -#else - __get_user(set.sig[0], &sc->oldmask); - __get_user(set.sig[1], &sc->_unused[3]); -#endif - target_to_host_sigset_internal(&blocked, &set); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - - __get_user(sr_addr, &sc->regs); - if (!lock_user_struct(VERIFY_READ, sr, sr_addr, 1)) - goto sigsegv; - restore_user_regs(env, sr, 1); - - unlock_user_struct(sr, sr_addr, 1); - unlock_user_struct(sc, sc_addr, 1); - return -TARGET_QEMU_ESIGRETURN; - -sigsegv: - unlock_user_struct(sr, sr_addr, 1); - unlock_user_struct(sc, sc_addr, 1); - force_sig(TARGET_SIGSEGV); - return 0; -} - -/* See arch/powerpc/kernel/signal_32.c. */ -static int do_setcontext(struct target_ucontext *ucp, CPUPPCState *env, int sig) -{ - struct target_mcontext *mcp; - target_ulong mcp_addr; - sigset_t blocked; - target_sigset_t set; - - if (copy_from_user(&set, h2g(ucp) + offsetof(struct target_ucontext, tuc_sigmask), - sizeof (set))) - return 1; - -#if defined(TARGET_PPC64) - mcp_addr = h2g(ucp) + - offsetof(struct target_ucontext, tuc_sigcontext.mcontext); -#else - __get_user(mcp_addr, &ucp->tuc_regs); -#endif - - if (!lock_user_struct(VERIFY_READ, mcp, mcp_addr, 1)) - return 1; - - target_to_host_sigset_internal(&blocked, &set); - do_sigprocmask(SIG_SETMASK, &blocked, NULL); - restore_user_regs(env, mcp, sig); - - unlock_user_struct(mcp, mcp_addr, 1); - return 0; -} - -long do_rt_sigreturn(CPUPPCState *env) -{ - struct target_rt_sigframe *rt_sf = NULL; - target_ulong rt_sf_addr; - - rt_sf_addr = env->gpr[1] + SIGNAL_FRAMESIZE + 16; - if (!lock_user_struct(VERIFY_READ, rt_sf, rt_sf_addr, 1)) - goto sigsegv; - - if (do_setcontext(&rt_sf->uc, env, 1)) - goto sigsegv; - - do_sigaltstack(rt_sf_addr - + offsetof(struct target_rt_sigframe, uc.tuc_stack), - 0, env->gpr[1]); - - unlock_user_struct(rt_sf, rt_sf_addr, 1); - return -TARGET_QEMU_ESIGRETURN; - -sigsegv: - unlock_user_struct(rt_sf, rt_sf_addr, 1); - force_sig(TARGET_SIGSEGV); - return 0; -} - -#elif defined(TARGET_M68K) - -struct target_sigcontext { - abi_ulong sc_mask; - abi_ulong sc_usp; - abi_ulong sc_d0; - abi_ulong sc_d1; - abi_ulong sc_a0; - abi_ulong sc_a1; - unsigned short sc_sr; - abi_ulong sc_pc; -}; - -struct target_sigframe -{ - abi_ulong pretcode; - int sig; - int code; - abi_ulong psc; - char retcode[8]; - abi_ulong extramask[TARGET_NSIG_WORDS-1]; - struct target_sigcontext sc; -}; - -typedef int target_greg_t; -#define TARGET_NGREG 18 -typedef target_greg_t target_gregset_t[TARGET_NGREG]; - -typedef struct target_fpregset { - int f_fpcntl[3]; - int f_fpregs[8*3]; -} target_fpregset_t; - -struct target_mcontext { - int version; - target_gregset_t gregs; - target_fpregset_t fpregs; -}; - -#define TARGET_MCONTEXT_VERSION 2 - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_mcontext tuc_mcontext; - abi_long tuc_filler[80]; - target_sigset_t tuc_sigmask; -}; - -struct target_rt_sigframe -{ - abi_ulong pretcode; - int sig; - abi_ulong pinfo; - abi_ulong puc; - char retcode[8]; - struct target_siginfo info; - struct target_ucontext uc; -}; - -static void setup_sigcontext(struct target_sigcontext *sc, CPUM68KState *env, - abi_ulong mask) -{ - __put_user(mask, &sc->sc_mask); - __put_user(env->aregs[7], &sc->sc_usp); - __put_user(env->dregs[0], &sc->sc_d0); - __put_user(env->dregs[1], &sc->sc_d1); - __put_user(env->aregs[0], &sc->sc_a0); - __put_user(env->aregs[1], &sc->sc_a1); - __put_user(env->sr, &sc->sc_sr); - __put_user(env->pc, &sc->sc_pc); -} - -static void -restore_sigcontext(CPUM68KState *env, struct target_sigcontext *sc, int *pd0) -{ - int temp; - - __get_user(env->aregs[7], &sc->sc_usp); - __get_user(env->dregs[1], &sc->sc_d1); - __get_user(env->aregs[0], &sc->sc_a0); - __get_user(env->aregs[1], &sc->sc_a1); - __get_user(env->pc, &sc->sc_pc); - __get_user(temp, &sc->sc_sr); - env->sr = (env->sr & 0xff00) | (temp & 0xff); - - *pd0 = tswapl(sc->sc_d0); -} - -/* - * Determine which stack to use.. - */ -static inline abi_ulong -get_sigframe(struct target_sigaction *ka, CPUM68KState *regs, - size_t frame_size) -{ - unsigned long sp; - - sp = regs->aregs[7]; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((ka->sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - return ((sp - frame_size) & -8UL); -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUM68KState *env) -{ - struct target_sigframe *frame; - abi_ulong frame_addr; - abi_ulong retcode_addr; - abi_ulong sc_addr; - int i; - - frame_addr = get_sigframe(ka, env, sizeof *frame); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - __put_user(sig, &frame->sig); - - sc_addr = frame_addr + offsetof(struct target_sigframe, sc); - __put_user(sc_addr, &frame->psc); - - setup_sigcontext(&frame->sc, env, set->sig[0]); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->extramask[i - 1]); - } - - /* Set up to return from userspace. */ - - retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode); - __put_user(retcode_addr, &frame->pretcode); - - /* moveq #,d0; trap #0 */ - - __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16), - (uint32_t *)(frame->retcode)); - - /* Set up to return from userspace */ - - env->aregs[7] = frame_addr; - env->pc = ka->_sa_handler; - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - force_sig(TARGET_SIGSEGV); -} - -static inline int target_rt_setup_ucontext(struct target_ucontext *uc, - CPUM68KState *env) -{ - target_greg_t *gregs = uc->tuc_mcontext.gregs; - - __put_user(TARGET_MCONTEXT_VERSION, &uc->tuc_mcontext.version); - __put_user(env->dregs[0], &gregs[0]); - __put_user(env->dregs[1], &gregs[1]); - __put_user(env->dregs[2], &gregs[2]); - __put_user(env->dregs[3], &gregs[3]); - __put_user(env->dregs[4], &gregs[4]); - __put_user(env->dregs[5], &gregs[5]); - __put_user(env->dregs[6], &gregs[6]); - __put_user(env->dregs[7], &gregs[7]); - __put_user(env->aregs[0], &gregs[8]); - __put_user(env->aregs[1], &gregs[9]); - __put_user(env->aregs[2], &gregs[10]); - __put_user(env->aregs[3], &gregs[11]); - __put_user(env->aregs[4], &gregs[12]); - __put_user(env->aregs[5], &gregs[13]); - __put_user(env->aregs[6], &gregs[14]); - __put_user(env->aregs[7], &gregs[15]); - __put_user(env->pc, &gregs[16]); - __put_user(env->sr, &gregs[17]); - - return 0; -} - -static inline int target_rt_restore_ucontext(CPUM68KState *env, - struct target_ucontext *uc, - int *pd0) -{ - int temp; - target_greg_t *gregs = uc->tuc_mcontext.gregs; - - __get_user(temp, &uc->tuc_mcontext.version); - if (temp != TARGET_MCONTEXT_VERSION) - goto badframe; - - /* restore passed registers */ - __get_user(env->dregs[0], &gregs[0]); - __get_user(env->dregs[1], &gregs[1]); - __get_user(env->dregs[2], &gregs[2]); - __get_user(env->dregs[3], &gregs[3]); - __get_user(env->dregs[4], &gregs[4]); - __get_user(env->dregs[5], &gregs[5]); - __get_user(env->dregs[6], &gregs[6]); - __get_user(env->dregs[7], &gregs[7]); - __get_user(env->aregs[0], &gregs[8]); - __get_user(env->aregs[1], &gregs[9]); - __get_user(env->aregs[2], &gregs[10]); - __get_user(env->aregs[3], &gregs[11]); - __get_user(env->aregs[4], &gregs[12]); - __get_user(env->aregs[5], &gregs[13]); - __get_user(env->aregs[6], &gregs[14]); - __get_user(env->aregs[7], &gregs[15]); - __get_user(env->pc, &gregs[16]); - __get_user(temp, &gregs[17]); - env->sr = (env->sr & 0xff00) | (temp & 0xff); - - *pd0 = env->dregs[0]; - return 0; - -badframe: - return 1; -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUM68KState *env) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr; - abi_ulong retcode_addr; - abi_ulong info_addr; - abi_ulong uc_addr; - int err = 0; - int i; - - frame_addr = get_sigframe(ka, env, sizeof *frame); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) - goto give_sigsegv; - - __put_user(sig, &frame->sig); - - info_addr = frame_addr + offsetof(struct target_rt_sigframe, info); - __put_user(info_addr, &frame->pinfo); - - uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc); - __put_user(uc_addr, &frame->puc); - - tswap_siginfo(&frame->info, info); - - /* Create the ucontext */ - - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->aregs[7]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - err |= target_rt_setup_ucontext(&frame->uc, env); - - if (err) - goto give_sigsegv; - - for(i = 0; i < TARGET_NSIG_WORDS; i++) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - /* Set up to return from userspace. */ - - retcode_addr = frame_addr + offsetof(struct target_sigframe, retcode); - __put_user(retcode_addr, &frame->pretcode); - - /* moveq #,d0; notb d0; trap #0 */ - - __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16), - (uint32_t *)(frame->retcode + 0)); - __put_user(0x4e40, (uint16_t *)(frame->retcode + 4)); - - if (err) - goto give_sigsegv; - - /* Set up to return from userspace */ - - env->aregs[7] = frame_addr; - env->pc = ka->_sa_handler; - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - unlock_user_struct(frame, frame_addr, 1); - force_sig(TARGET_SIGSEGV); -} - -long do_sigreturn(CPUM68KState *env) -{ - struct target_sigframe *frame; - abi_ulong frame_addr = env->aregs[7] - 4; - target_sigset_t target_set; - sigset_t set; - int d0, i; - - trace_user_do_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - /* set blocked signals */ - - __get_user(target_set.sig[0], &frame->sc.sc_mask); - - for(i = 1; i < TARGET_NSIG_WORDS; i++) { - __get_user(target_set.sig[i], &frame->extramask[i - 1]); - } - - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - /* restore registers */ - - restore_sigcontext(env, &frame->sc, &d0); - - unlock_user_struct(frame, frame_addr, 0); - return d0; - -badframe: - force_sig(TARGET_SIGSEGV); - return 0; -} - -long do_rt_sigreturn(CPUM68KState *env) -{ - struct target_rt_sigframe *frame; - abi_ulong frame_addr = env->aregs[7] - 4; - target_sigset_t target_set; - sigset_t set; - int d0; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) - goto badframe; - - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - /* restore registers */ - - if (target_rt_restore_ucontext(env, &frame->uc, &d0)) - goto badframe; - - if (do_sigaltstack(frame_addr + - offsetof(struct target_rt_sigframe, uc.tuc_stack), - 0, get_sp_from_cpustate(env)) == -EFAULT) - goto badframe; - - unlock_user_struct(frame, frame_addr, 0); - return d0; - -badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); - return 0; -} - -#elif defined(TARGET_ALPHA) - -struct target_sigcontext { - abi_long sc_onstack; - abi_long sc_mask; - abi_long sc_pc; - abi_long sc_ps; - abi_long sc_regs[32]; - abi_long sc_ownedfp; - abi_long sc_fpregs[32]; - abi_ulong sc_fpcr; - abi_ulong sc_fp_control; - abi_ulong sc_reserved1; - abi_ulong sc_reserved2; - abi_ulong sc_ssize; - abi_ulong sc_sbase; - abi_ulong sc_traparg_a0; - abi_ulong sc_traparg_a1; - abi_ulong sc_traparg_a2; - abi_ulong sc_fp_trap_pc; - abi_ulong sc_fp_trigger_sum; - abi_ulong sc_fp_trigger_inst; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - abi_ulong tuc_osf_sigmask; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; -}; - -struct target_sigframe { - struct target_sigcontext sc; - unsigned int retcode[3]; -}; - -struct target_rt_sigframe { - target_siginfo_t info; - struct target_ucontext uc; - unsigned int retcode[3]; -}; - -#define INSN_MOV_R30_R16 0x47fe0410 -#define INSN_LDI_R0 0x201f0000 -#define INSN_CALLSYS 0x00000083 - -static void setup_sigcontext(struct target_sigcontext *sc, CPUAlphaState *env, - abi_ulong frame_addr, target_sigset_t *set) -{ - int i; - - __put_user(on_sig_stack(frame_addr), &sc->sc_onstack); - __put_user(set->sig[0], &sc->sc_mask); - __put_user(env->pc, &sc->sc_pc); - __put_user(8, &sc->sc_ps); - - for (i = 0; i < 31; ++i) { - __put_user(env->ir[i], &sc->sc_regs[i]); - } - __put_user(0, &sc->sc_regs[31]); - - for (i = 0; i < 31; ++i) { - __put_user(env->fir[i], &sc->sc_fpregs[i]); - } - __put_user(0, &sc->sc_fpregs[31]); - __put_user(cpu_alpha_load_fpcr(env), &sc->sc_fpcr); - - __put_user(0, &sc->sc_traparg_a0); /* FIXME */ - __put_user(0, &sc->sc_traparg_a1); /* FIXME */ - __put_user(0, &sc->sc_traparg_a2); /* FIXME */ -} - -static void restore_sigcontext(CPUAlphaState *env, - struct target_sigcontext *sc) -{ - uint64_t fpcr; - int i; - - __get_user(env->pc, &sc->sc_pc); - - for (i = 0; i < 31; ++i) { - __get_user(env->ir[i], &sc->sc_regs[i]); - } - for (i = 0; i < 31; ++i) { - __get_user(env->fir[i], &sc->sc_fpregs[i]); - } - - __get_user(fpcr, &sc->sc_fpcr); - cpu_alpha_store_fpcr(env, fpcr); -} - -static inline abi_ulong get_sigframe(struct target_sigaction *sa, - CPUAlphaState *env, - unsigned long framesize) -{ - abi_ulong sp = env->ir[IR_SP]; - - /* This is the X/Open sanctioned signal stack switching. */ - if ((sa->sa_flags & TARGET_SA_ONSTACK) != 0 && !sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - return (sp - framesize) & -32; -} - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUAlphaState *env) -{ - abi_ulong frame_addr, r26; - struct target_sigframe *frame; - int err = 0; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - setup_sigcontext(&frame->sc, env, frame_addr, set); - - if (ka->sa_restorer) { - r26 = ka->sa_restorer; - } else { - __put_user(INSN_MOV_R30_R16, &frame->retcode[0]); - __put_user(INSN_LDI_R0 + TARGET_NR_sigreturn, - &frame->retcode[1]); - __put_user(INSN_CALLSYS, &frame->retcode[2]); - /* imb() */ - r26 = frame_addr; - } - - unlock_user_struct(frame, frame_addr, 1); - - if (err) { - give_sigsegv: - if (sig == TARGET_SIGSEGV) { - ka->_sa_handler = TARGET_SIG_DFL; - } - force_sig(TARGET_SIGSEGV); - } - - env->ir[IR_RA] = r26; - env->ir[IR_PV] = env->pc = ka->_sa_handler; - env->ir[IR_A0] = sig; - env->ir[IR_A1] = 0; - env->ir[IR_A2] = frame_addr + offsetof(struct target_sigframe, sc); - env->ir[IR_SP] = frame_addr; -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUAlphaState *env) -{ - abi_ulong frame_addr, r26; - struct target_rt_sigframe *frame; - int i, err = 0; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - tswap_siginfo(&frame->info, info); - - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(set->sig[0], &frame->uc.tuc_osf_sigmask); - __put_user(target_sigaltstack_used.ss_sp, - &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->ir[IR_SP]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, - &frame->uc.tuc_stack.ss_size); - setup_sigcontext(&frame->uc.tuc_mcontext, env, frame_addr, set); - for (i = 0; i < TARGET_NSIG_WORDS; ++i) { - __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); - } - - if (ka->sa_restorer) { - r26 = ka->sa_restorer; - } else { - __put_user(INSN_MOV_R30_R16, &frame->retcode[0]); - __put_user(INSN_LDI_R0 + TARGET_NR_rt_sigreturn, - &frame->retcode[1]); - __put_user(INSN_CALLSYS, &frame->retcode[2]); - /* imb(); */ - r26 = frame_addr; - } - - if (err) { - give_sigsegv: - if (sig == TARGET_SIGSEGV) { - ka->_sa_handler = TARGET_SIG_DFL; - } - force_sig(TARGET_SIGSEGV); - } - - env->ir[IR_RA] = r26; - env->ir[IR_PV] = env->pc = ka->_sa_handler; - env->ir[IR_A0] = sig; - env->ir[IR_A1] = frame_addr + offsetof(struct target_rt_sigframe, info); - env->ir[IR_A2] = frame_addr + offsetof(struct target_rt_sigframe, uc); - env->ir[IR_SP] = frame_addr; -} - -long do_sigreturn(CPUAlphaState *env) -{ - struct target_sigcontext *sc; - abi_ulong sc_addr = env->ir[IR_A0]; - target_sigset_t target_set; - sigset_t set; - - if (!lock_user_struct(VERIFY_READ, sc, sc_addr, 1)) { - goto badframe; - } - - target_sigemptyset(&target_set); - __get_user(target_set.sig[0], &sc->sc_mask); - - target_to_host_sigset_internal(&set, &target_set); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - restore_sigcontext(env, sc); - unlock_user_struct(sc, sc_addr, 0); - return env->ir[IR_V0]; - - badframe: - force_sig(TARGET_SIGSEGV); -} - -long do_rt_sigreturn(CPUAlphaState *env) -{ - abi_ulong frame_addr = env->ir[IR_A0]; - struct target_rt_sigframe *frame; - sigset_t set; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - target_to_host_sigset(&set, &frame->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - restore_sigcontext(env, &frame->uc.tuc_mcontext); - if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, - uc.tuc_stack), - 0, env->ir[IR_SP]) == -EFAULT) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return env->ir[IR_V0]; - - - badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); -} - -#elif defined(TARGET_TILEGX) - -struct target_sigcontext { - union { - /* General-purpose registers. */ - abi_ulong gregs[56]; - struct { - abi_ulong __gregs[53]; - abi_ulong tp; /* Aliases gregs[TREG_TP]. */ - abi_ulong sp; /* Aliases gregs[TREG_SP]. */ - abi_ulong lr; /* Aliases gregs[TREG_LR]. */ - }; - }; - abi_ulong pc; /* Program counter. */ - abi_ulong ics; /* In Interrupt Critical Section? */ - abi_ulong faultnum; /* Fault number. */ - abi_ulong pad[5]; -}; - -struct target_ucontext { - abi_ulong tuc_flags; - abi_ulong tuc_link; - target_stack_t tuc_stack; - struct target_sigcontext tuc_mcontext; - target_sigset_t tuc_sigmask; /* mask last for extensibility */ -}; - -struct target_rt_sigframe { - unsigned char save_area[16]; /* caller save area */ - struct target_siginfo info; - struct target_ucontext uc; -}; - -static void setup_sigcontext(struct target_sigcontext *sc, - CPUArchState *env, int signo) -{ - int i; - - for (i = 0; i < TILEGX_R_COUNT; ++i) { - __put_user(env->regs[i], &sc->gregs[i]); - } - - __put_user(env->pc, &sc->pc); - __put_user(0, &sc->ics); - __put_user(signo, &sc->faultnum); -} - -static void restore_sigcontext(CPUTLGState *env, struct target_sigcontext *sc) -{ - int i; - - for (i = 0; i < TILEGX_R_COUNT; ++i) { - __get_user(env->regs[i], &sc->gregs[i]); - } - - __get_user(env->pc, &sc->pc); -} - -static abi_ulong get_sigframe(struct target_sigaction *ka, CPUArchState *env, - size_t frame_size) -{ - unsigned long sp = env->regs[TILEGX_R_SP]; - - if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) { - return -1UL; - } - - if ((ka->sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) { - sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; - } - - sp -= frame_size; - sp &= -16UL; - return sp; -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUArchState *env) -{ - abi_ulong frame_addr; - struct target_rt_sigframe *frame; - unsigned long restorer; - - frame_addr = get_sigframe(ka, env, sizeof(*frame)); - trace_user_setup_rt_frame(env, frame_addr); - if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { - goto give_sigsegv; - } - - /* Always write at least the signal number for the stack backtracer. */ - if (ka->sa_flags & TARGET_SA_SIGINFO) { - /* At sigreturn time, restore the callee-save registers too. */ - tswap_siginfo(&frame->info, info); - /* regs->flags |= PT_FLAGS_RESTORE_REGS; FIXME: we can skip it? */ - } else { - __put_user(info->si_signo, &frame->info.si_signo); - } - - /* Create the ucontext. */ - __put_user(0, &frame->uc.tuc_flags); - __put_user(0, &frame->uc.tuc_link); - __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp); - __put_user(sas_ss_flags(env->regs[TILEGX_R_SP]), - &frame->uc.tuc_stack.ss_flags); - __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size); - setup_sigcontext(&frame->uc.tuc_mcontext, env, info->si_signo); - - restorer = (unsigned long) do_rt_sigreturn; - if (ka->sa_flags & TARGET_SA_RESTORER) { - restorer = (unsigned long) ka->sa_restorer; - } - env->pc = (unsigned long) ka->_sa_handler; - env->regs[TILEGX_R_SP] = (unsigned long) frame; - env->regs[TILEGX_R_LR] = restorer; - env->regs[0] = (unsigned long) sig; - env->regs[1] = (unsigned long) &frame->info; - env->regs[2] = (unsigned long) &frame->uc; - /* regs->flags |= PT_FLAGS_CALLER_SAVES; FIXME: we can skip it? */ - - unlock_user_struct(frame, frame_addr, 1); - return; - -give_sigsegv: - if (sig == TARGET_SIGSEGV) { - ka->_sa_handler = TARGET_SIG_DFL; - } - force_sig(TARGET_SIGSEGV /* , current */); -} - -long do_rt_sigreturn(CPUTLGState *env) -{ - abi_ulong frame_addr = env->regs[TILEGX_R_SP]; - struct target_rt_sigframe *frame; - sigset_t set; - - trace_user_do_rt_sigreturn(env, frame_addr); - if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { - goto badframe; - } - target_to_host_sigset(&set, &frame->uc.tuc_sigmask); - do_sigprocmask(SIG_SETMASK, &set, NULL); - - restore_sigcontext(env, &frame->uc.tuc_mcontext); - if (do_sigaltstack(frame_addr + offsetof(struct target_rt_sigframe, - uc.tuc_stack), - 0, env->regs[TILEGX_R_SP]) == -EFAULT) { - goto badframe; - } - - unlock_user_struct(frame, frame_addr, 0); - return env->regs[TILEGX_R_RE]; - - - badframe: - unlock_user_struct(frame, frame_addr, 0); - force_sig(TARGET_SIGSEGV); -} - -#else - -static void setup_frame(int sig, struct target_sigaction *ka, - target_sigset_t *set, CPUArchState *env) -{ - fprintf(stderr, "setup_frame: not implemented\n"); -} - -static void setup_rt_frame(int sig, struct target_sigaction *ka, - target_siginfo_t *info, - target_sigset_t *set, CPUArchState *env) -{ - fprintf(stderr, "setup_rt_frame: not implemented\n"); -} - -long do_sigreturn(CPUArchState *env) -{ - fprintf(stderr, "do_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -long do_rt_sigreturn(CPUArchState *env) -{ - fprintf(stderr, "do_rt_sigreturn: not implemented\n"); - return -TARGET_ENOSYS; -} - -#endif - -void process_pending_signals(CPUArchState *cpu_env) -{ - CPUState *cpu = ENV_GET_CPU(cpu_env); - int sig; - abi_ulong handler; - sigset_t set, old_set; - target_sigset_t target_old_set; - struct emulated_sigtable *k; - struct target_sigaction *sa; - struct sigqueue *q; - TaskState *ts = cpu->opaque; - - if (!ts->signal_pending) - return; - - /* FIXME: This is not threadsafe. */ - k = ts->sigtab; - for(sig = 1; sig <= TARGET_NSIG; sig++) { - if (k->pending) - goto handle_signal; - k++; - } - /* if no signal is pending, just return */ - ts->signal_pending = 0; - return; - - handle_signal: - trace_user_handle_signal(cpu_env, sig); - /* dequeue signal */ - q = k->first; - k->first = q->next; - if (!k->first) - k->pending = 0; - - sig = gdb_handlesig(cpu, sig); - if (!sig) { - sa = NULL; - handler = TARGET_SIG_IGN; - } else { - sa = &sigact_table[sig - 1]; - handler = sa->_sa_handler; - } - - if (ts->sigsegv_blocked && sig == TARGET_SIGSEGV) { - /* Guest has blocked SIGSEGV but we got one anyway. Assume this - * is a forced SIGSEGV (ie one the kernel handles via force_sig_info - * because it got a real MMU fault), and treat as if default handler. - */ - handler = TARGET_SIG_DFL; - } - - if (handler == TARGET_SIG_DFL) { - /* default handler : ignore some signal. The other are job control or fatal */ - if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) { - kill(getpid(),SIGSTOP); - } else if (sig != TARGET_SIGCHLD && - sig != TARGET_SIGURG && - sig != TARGET_SIGWINCH && - sig != TARGET_SIGCONT) { - force_sig(sig); - } - } else if (handler == TARGET_SIG_IGN) { - /* ignore sig */ - } else if (handler == TARGET_SIG_ERR) { - force_sig(sig); - } else { - /* compute the blocked signals during the handler execution */ - target_to_host_sigset(&set, &sa->sa_mask); - /* SA_NODEFER indicates that the current signal should not be - blocked during the handler */ - if (!(sa->sa_flags & TARGET_SA_NODEFER)) - sigaddset(&set, target_to_host_signal(sig)); - - /* block signals in the handler using Linux */ - do_sigprocmask(SIG_BLOCK, &set, &old_set); - /* save the previous blocked signal state to restore it at the - end of the signal execution (see do_sigreturn) */ - host_to_target_sigset_internal(&target_old_set, &old_set); - - /* if the CPU is in VM86 mode, we restore the 32 bit values */ -#if defined(TARGET_I386) && !defined(TARGET_X86_64) - { - CPUX86State *env = cpu_env; - if (env->eflags & VM_MASK) - save_v86_state(env); - } -#endif - /* prepare the stack frame of the virtual CPU */ -#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) \ - || defined(TARGET_OPENRISC) || defined(TARGET_TILEGX) - /* These targets do not have traditional signals. */ - setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env); -#else - if (sa->sa_flags & TARGET_SA_SIGINFO) - setup_rt_frame(sig, sa, &q->info, &target_old_set, cpu_env); - else - setup_frame(sig, sa, &target_old_set, cpu_env); -#endif - if (sa->sa_flags & TARGET_SA_RESETHAND) - sa->_sa_handler = TARGET_SIG_DFL; - } - if (q != &k->info) - free_sigqueue(cpu_env, q); -} diff --git a/qemu/linux-user/socket.h b/qemu/linux-user/socket.h deleted file mode 100644 index 4dacae612..000000000 --- a/qemu/linux-user/socket.h +++ /dev/null @@ -1,340 +0,0 @@ - -#if defined(TARGET_MIPS) - /* MIPS special values for constants */ - - /* - * For setsockopt(2) - * - * This defines are ABI conformant as far as Linux supports these ... - */ - #define TARGET_SOL_SOCKET 0xffff - - #define TARGET_SO_DEBUG 0x0001 /* Record debugging information. */ - #define TARGET_SO_REUSEADDR 0x0004 /* Allow reuse of local addresses. */ - #define TARGET_SO_KEEPALIVE 0x0008 /* Keep connections alive and send - SIGPIPE when they die. */ - #define TARGET_SO_DONTROUTE 0x0010 /* Don't do local routing. */ - #define TARGET_SO_BROADCAST 0x0020 /* Allow transmission of - broadcast messages. */ - #define TARGET_SO_LINGER 0x0080 /* Block on close of a reliable - * socket to transmit pending data. - */ - #define TARGET_SO_OOBINLINE 0x0100 /* Receive out-of-band data in-band. - */ - #if 0 - /* To add: Allow local address and port reuse. */ - #define TARGET_SO_REUSEPORT 0x0200 - #endif - - #define TARGET_SO_TYPE 0x1008 /* Compatible name for SO_STYLE. */ - #define TARGET_SO_STYLE SO_TYPE /* Synonym */ - #define TARGET_SO_ERROR 0x1007 /* get error status and clear */ - #define TARGET_SO_SNDBUF 0x1001 /* Send buffer size. */ - #define TARGET_SO_RCVBUF 0x1002 /* Receive buffer. */ - #define TARGET_SO_SNDLOWAT 0x1003 /* send low-water mark */ - #define TARGET_SO_RCVLOWAT 0x1004 /* receive low-water mark */ - #define TARGET_SO_SNDTIMEO 0x1005 /* send timeout */ - #define TARGET_SO_RCVTIMEO 0x1006 /* receive timeout */ - #define TARGET_SO_ACCEPTCONN 0x1009 - - /* linux-specific, might as well be the same as on i386 */ - #define TARGET_SO_NO_CHECK 11 - #define TARGET_SO_PRIORITY 12 - #define TARGET_SO_BSDCOMPAT 14 - - #define TARGET_SO_PASSCRED 17 - #define TARGET_SO_PEERCRED 18 - - /* Security levels - as per NRL IPv6 - don't actually do anything */ - #define TARGET_SO_SECURITY_AUTHENTICATION 22 - #define TARGET_SO_SECURITY_ENCRYPTION_TRANSPORT 23 - #define TARGET_SO_SECURITY_ENCRYPTION_NETWORK 24 - - #define TARGET_SO_BINDTODEVICE 25 - - /* Socket filtering */ - #define TARGET_SO_ATTACH_FILTER 26 - #define TARGET_SO_DETACH_FILTER 27 - - #define TARGET_SO_PEERNAME 28 - #define TARGET_SO_TIMESTAMP 29 - #define SCM_TIMESTAMP SO_TIMESTAMP - - #define TARGET_SO_PEERSEC 30 - #define TARGET_SO_SNDBUFFORCE 31 - #define TARGET_SO_RCVBUFFORCE 33 - #define TARGET_SO_PASSSEC 34 - - /** sock_type - Socket types - * - * Please notice that for binary compat reasons MIPS has to - * override the enum sock_type in include/linux/net.h, so - * we define ARCH_HAS_SOCKET_TYPES here. - * - * @SOCK_DGRAM - datagram (conn.less) socket - * @SOCK_STREAM - stream (connection) socket - * @SOCK_RAW - raw socket - * @SOCK_RDM - reliably-delivered message - * @SOCK_SEQPACKET - sequential packet socket - * @SOCK_DCCP - Datagram Congestion Control Protocol socket - * @SOCK_PACKET - linux specific way of getting packets at the dev level. - * For writing rarp and other similar things on the user - * level. - * @SOCK_CLOEXEC - sets the close-on-exec (FD_CLOEXEC) flag. - * @SOCK_NONBLOCK - sets the O_NONBLOCK file status flag. - */ - - #define ARCH_HAS_SOCKET_TYPES 1 - - enum sock_type { - TARGET_SOCK_DGRAM = 1, - TARGET_SOCK_STREAM = 2, - TARGET_SOCK_RAW = 3, - TARGET_SOCK_RDM = 4, - TARGET_SOCK_SEQPACKET = 5, - TARGET_SOCK_DCCP = 6, - TARGET_SOCK_PACKET = 10, - TARGET_SOCK_CLOEXEC = 02000000, - TARGET_SOCK_NONBLOCK = 0200, - }; - - #define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1) - #define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */ - -#elif defined(TARGET_ALPHA) - - /* For setsockopt(2) */ - #define TARGET_SOL_SOCKET 0xffff - - #define TARGET_SO_DEBUG 0x0001 - #define TARGET_SO_REUSEADDR 0x0004 - #define TARGET_SO_KEEPALIVE 0x0008 - #define TARGET_SO_DONTROUTE 0x0010 - #define TARGET_SO_BROADCAST 0x0020 - #define TARGET_SO_LINGER 0x0080 - #define TARGET_SO_OOBINLINE 0x0100 - /* To add :#define TARGET_SO_REUSEPORT 0x0200 */ - - #define TARGET_SO_TYPE 0x1008 - #define TARGET_SO_ERROR 0x1007 - #define TARGET_SO_SNDBUF 0x1001 - #define TARGET_SO_RCVBUF 0x1002 - #define TARGET_SO_SNDBUFFORCE 0x100a - #define TARGET_SO_RCVBUFFORCE 0x100b - #define TARGET_SO_RCVLOWAT 0x1010 - #define TARGET_SO_SNDLOWAT 0x1011 - #define TARGET_SO_RCVTIMEO 0x1012 - #define TARGET_SO_SNDTIMEO 0x1013 - #define TARGET_SO_ACCEPTCONN 0x1014 - #define TARGET_SO_PROTOCOL 0x1028 - #define TARGET_SO_DOMAIN 0x1029 - - /* linux-specific, might as well be the same as on i386 */ - #define TARGET_SO_NO_CHECK 11 - #define TARGET_SO_PRIORITY 12 - #define TARGET_SO_BSDCOMPAT 14 - - #define TARGET_SO_PASSCRED 17 - #define TARGET_SO_PEERCRED 18 - #define TARGET_SO_BINDTODEVICE 25 - - /* Socket filtering */ - #define TARGET_SO_ATTACH_FILTER 26 - #define TARGET_SO_DETACH_FILTER 27 - - #define TARGET_SO_PEERNAME 28 - #define TARGET_SO_TIMESTAMP 29 - #define TARGET_SCM_TIMESTAMP TARGET_SO_TIMESTAMP - - #define TARGET_SO_PEERSEC 30 - #define TARGET_SO_PASSSEC 34 - #define TARGET_SO_TIMESTAMPNS 35 - #define TARGET_SCM_TIMESTAMPNS TARGET_SO_TIMESTAMPNS - - /* Security levels - as per NRL IPv6 - don't actually do anything */ - #define TARGET_SO_SECURITY_AUTHENTICATION 19 - #define TARGET_SO_SECURITY_ENCRYPTION_TRANSPORT 20 - #define TARGET_SO_SECURITY_ENCRYPTION_NETWORK 21 - - #define TARGET_SO_MARK 36 - - #define TARGET_SO_TIMESTAMPING 37 - #define TARGET_SCM_TIMESTAMPING TARGET_SO_TIMESTAMPING - - #define TARGET_SO_RXQ_OVFL 40 - - #define TARGET_SO_WIFI_STATUS 41 - #define TARGET_SCM_WIFI_STATUS TARGET_SO_WIFI_STATUS - #define TARGET_SO_PEEK_OFF 42 - - /* Instruct lower device to use last 4-bytes of skb data as FCS */ - #define TARGET_SO_NOFCS 43 - - /** sock_type - Socket types - * - * Please notice that for binary compat reasons ALPHA has to - * override the enum sock_type in include/linux/net.h, so - * we define ARCH_HAS_SOCKET_TYPES here. - * - * @SOCK_DGRAM - datagram (conn.less) socket - * @SOCK_STREAM - stream (connection) socket - * @SOCK_RAW - raw socket - * @SOCK_RDM - reliably-delivered message - * @SOCK_SEQPACKET - sequential packet socket - * @SOCK_DCCP - Datagram Congestion Control Protocol socket - * @SOCK_PACKET - linux specific way of getting packets at the dev level. - * For writing rarp and other similar things on the user - * level. - * @SOCK_CLOEXEC - sets the close-on-exec (FD_CLOEXEC) flag. - * @SOCK_NONBLOCK - sets the O_NONBLOCK file status flag. - */ - - #define ARCH_HAS_SOCKET_TYPES 1 - - enum sock_type { - TARGET_SOCK_STREAM = 1, - TARGET_SOCK_DGRAM = 2, - TARGET_SOCK_RAW = 3, - TARGET_SOCK_RDM = 4, - TARGET_SOCK_SEQPACKET = 5, - TARGET_SOCK_DCCP = 6, - TARGET_SOCK_PACKET = 10, - TARGET_SOCK_CLOEXEC = 010000000, - TARGET_SOCK_NONBLOCK = 010000000000, - }; - - #define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1) - #define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */ -#else - -#if defined(TARGET_SPARC) - /** sock_type - Socket types - * - * Please notice that for binary compat reasons SPARC has to - * override the enum sock_type in include/linux/net.h, so - * we define ARCH_HAS_SOCKET_TYPES here. - * - * @SOCK_DGRAM - datagram (conn.less) socket - * @SOCK_STREAM - stream (connection) socket - * @SOCK_RAW - raw socket - * @SOCK_RDM - reliably-delivered message - * @SOCK_SEQPACKET - sequential packet socket - * @SOCK_DCCP - Datagram Congestion Control Protocol socket - * @SOCK_PACKET - linux specific way of getting packets at the dev level. - * For writing rarp and other similar things on the user - * level. - * @SOCK_CLOEXEC - sets the close-on-exec (FD_CLOEXEC) flag. - * @SOCK_NONBLOCK - sets the O_NONBLOCK file status flag. - */ - - #define ARCH_HAS_SOCKET_TYPES 1 - - enum sock_type { - TARGET_SOCK_STREAM = 1, - TARGET_SOCK_DGRAM = 2, - TARGET_SOCK_RAW = 3, - TARGET_SOCK_RDM = 4, - TARGET_SOCK_SEQPACKET = 5, - TARGET_SOCK_DCCP = 6, - TARGET_SOCK_PACKET = 10, - TARGET_SOCK_CLOEXEC = 020000000, - TARGET_SOCK_NONBLOCK = 040000, - }; - - #define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1) - #define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */ - - #define TARGET_SO_PASSSEC 31 -#else - #define TARGET_SO_PASSSEC 34 -#endif - - /* For setsockopt(2) */ - #define TARGET_SOL_SOCKET 1 - - #define TARGET_SO_DEBUG 1 - #define TARGET_SO_REUSEADDR 2 - #define TARGET_SO_TYPE 3 - #define TARGET_SO_ERROR 4 - #define TARGET_SO_DONTROUTE 5 - #define TARGET_SO_BROADCAST 6 - #define TARGET_SO_SNDBUF 7 - #define TARGET_SO_RCVBUF 8 - #define TARGET_SO_SNDBUFFORCE 32 - #define TARGET_SO_RCVBUFFORCE 33 - #define TARGET_SO_KEEPALIVE 9 - #define TARGET_SO_OOBINLINE 10 - #define TARGET_SO_NO_CHECK 11 - #define TARGET_SO_PRIORITY 12 - #define TARGET_SO_LINGER 13 - #define TARGET_SO_BSDCOMPAT 14 - /* To add :#define TARGET_SO_REUSEPORT 15 */ -#if defined(TARGET_PPC) - #define TARGET_SO_RCVLOWAT 16 - #define TARGET_SO_SNDLOWAT 17 - #define TARGET_SO_RCVTIMEO 18 - #define TARGET_SO_SNDTIMEO 19 - #define TARGET_SO_PASSCRED 20 - #define TARGET_SO_PEERCRED 21 -#else - #define TARGET_SO_PASSCRED 16 - #define TARGET_SO_PEERCRED 17 - #define TARGET_SO_RCVLOWAT 18 - #define TARGET_SO_SNDLOWAT 19 - #define TARGET_SO_RCVTIMEO 20 - #define TARGET_SO_SNDTIMEO 21 -#endif - - /* Security levels - as per NRL IPv6 - don't actually do anything */ - #define TARGET_SO_SECURITY_AUTHENTICATION 22 - #define TARGET_SO_SECURITY_ENCRYPTION_TRANSPORT 23 - #define TARGET_SO_SECURITY_ENCRYPTION_NETWORK 24 - - #define TARGET_SO_BINDTODEVICE 25 - - /* Socket filtering */ - #define TARGET_SO_ATTACH_FILTER 26 - #define TARGET_SO_DETACH_FILTER 27 - - #define TARGET_SO_PEERNAME 28 - #define TARGET_SO_TIMESTAMP 29 - #define TARGET_SCM_TIMESTAMP TARGET_SO_TIMESTAMP - - #define TARGET_SO_ACCEPTCONN 30 - - #define TARGET_SO_PEERSEC 31 - -#endif - -#ifndef ARCH_HAS_SOCKET_TYPES - /** sock_type - Socket types - default values - * - * - * @SOCK_STREAM - stream (connection) socket - * @SOCK_DGRAM - datagram (conn.less) socket - * @SOCK_RAW - raw socket - * @SOCK_RDM - reliably-delivered message - * @SOCK_SEQPACKET - sequential packet socket - * @SOCK_DCCP - Datagram Congestion Control Protocol socket - * @SOCK_PACKET - linux specific way of getting packets at the dev level. - * For writing rarp and other similar things on the user - * level. - * @SOCK_CLOEXEC - sets the close-on-exec (FD_CLOEXEC) flag. - * @SOCK_NONBLOCK - sets the O_NONBLOCK file status flag. - */ - enum sock_type { - TARGET_SOCK_STREAM = 1, - TARGET_SOCK_DGRAM = 2, - TARGET_SOCK_RAW = 3, - TARGET_SOCK_RDM = 4, - TARGET_SOCK_SEQPACKET = 5, - TARGET_SOCK_DCCP = 6, - TARGET_SOCK_PACKET = 10, - TARGET_SOCK_CLOEXEC = 02000000, - TARGET_SOCK_NONBLOCK = 04000, - }; - - #define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1) - #define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */ - -#endif diff --git a/qemu/linux-user/sparc/syscall_nr.h b/qemu/linux-user/sparc/syscall_nr.h deleted file mode 100644 index 732b1052a..000000000 --- a/qemu/linux-user/sparc/syscall_nr.h +++ /dev/null @@ -1,325 +0,0 @@ -#define TARGET_NR_exit 1 /* Common */ -#define TARGET_NR_fork 2 /* Common */ -#define TARGET_NR_read 3 /* Common */ -#define TARGET_NR_write 4 /* Common */ -#define TARGET_NR_open 5 /* Common */ -#define TARGET_NR_close 6 /* Common */ -#define TARGET_NR_wait4 7 /* Common */ -#define TARGET_NR_creat 8 /* Common */ -#define TARGET_NR_link 9 /* Common */ -#define TARGET_NR_unlink 10 /* Common */ -#define TARGET_NR_execv 11 /* SunOS Specific */ -#define TARGET_NR_chdir 12 /* Common */ -#define TARGET_NR_chown 13 /* Common */ -#define TARGET_NR_mknod 14 /* Common */ -#define TARGET_NR_chmod 15 /* Common */ -#define TARGET_NR_lchown 16 /* Common */ -#define TARGET_NR_brk 17 /* Common */ -#define TARGET_NR_perfctr 18 /* Performance counter operations */ -#define TARGET_NR_lseek 19 /* Common */ -#define TARGET_NR_getpid 20 /* Common */ -#define TARGET_NR_capget 21 /* Linux Specific */ -#define TARGET_NR_capset 22 /* Linux Specific */ -#define TARGET_NR_setuid 23 /* Implemented via setreuid in SunOS */ -#define TARGET_NR_getuid 24 /* Common */ -#define TARGET_NR_ptrace 26 /* Common */ -#define TARGET_NR_alarm 27 /* Implemented via setitimer in SunOS */ -#define TARGET_NR_sigaltstack 28 /* Common */ -#define TARGET_NR_pause 29 /* Is sigblock(0)->sigpause() in SunOS */ -#define TARGET_NR_utime 30 /* Implemented via utimes() under SunOS */ -#define TARGET_NR_lchown32 31 /* Linux sparc32 specific */ -#define TARGET_NR_fchown32 32 /* Linux sparc32 specific */ -#define TARGET_NR_access 33 /* Common */ -#define TARGET_NR_nice 34 /* Implemented via get/setpriority() in SunOS */ -#define TARGET_NR_chown32 35 /* Linux sparc32 specific */ -#define TARGET_NR_sync 36 /* Common */ -#define TARGET_NR_kill 37 /* Common */ -#define TARGET_NR_stat 38 /* Common */ -#define TARGET_NR_sendfile 39 /* Linux Specific */ -#define TARGET_NR_lstat 40 /* Common */ -#define TARGET_NR_dup 41 /* Common */ -#define TARGET_NR_pipe 42 /* Common */ -#define TARGET_NR_times 43 /* Implemented via getrusage() in SunOS */ -#define TARGET_NR_getuid32 44 /* Linux sparc32 specific */ -#define TARGET_NR_umount2 45 /* Linux Specific */ -#define TARGET_NR_setgid 46 /* Implemented via setregid() in SunOS */ -#define TARGET_NR_getgid 47 /* Common */ -#define TARGET_NR_signal 48 /* Implemented via sigvec() in SunOS */ -#define TARGET_NR_geteuid 49 /* SunOS calls getuid() */ -#define TARGET_NR_getegid 50 /* SunOS calls getgid() */ -#define TARGET_NR_acct 51 /* Common */ -#define TARGET_NR_getgid32 53 /* Linux sparc32 specific */ -#define TARGET_NR_ioctl 54 /* Common */ -#define TARGET_NR_reboot 55 /* Common */ -#define TARGET_NR_mmap2 56 /* Linux sparc32 Specific */ -#define TARGET_NR_symlink 57 /* Common */ -#define TARGET_NR_readlink 58 /* Common */ -#define TARGET_NR_execve 59 /* Common */ -#define TARGET_NR_umask 60 /* Common */ -#define TARGET_NR_chroot 61 /* Common */ -#define TARGET_NR_fstat 62 /* Common */ -#define TARGET_NR_fstat64 63 /* Linux sparc32 Specific */ -#define TARGET_NR_getpagesize 64 /* Common */ -#define TARGET_NR_msync 65 /* Common in newer 1.3.x revs... */ -#define TARGET_NR_vfork 66 /* Common */ -#define TARGET_NR_pread64 67 /* Linux Specific */ -#define TARGET_NR_pwrite64 68 /* Linux Specific */ -#define TARGET_NR_geteuid32 69 /* Linux sparc32, sbrk under SunOS */ -#define TARGET_NR_getegid32 70 /* Linux sparc32, sstk under SunOS */ -#define TARGET_NR_mmap 71 /* Common */ -#define TARGET_NR_setreuid32 72 /* Linux sparc32, vadvise under SunOS */ -#define TARGET_NR_munmap 73 /* Common */ -#define TARGET_NR_mprotect 74 /* Common */ -#define TARGET_NR_madvise 75 /* Common */ -#define TARGET_NR_vhangup 76 /* Common */ -#define TARGET_NR_truncate64 77 /* Linux sparc32 Specific */ -#define TARGET_NR_mincore 78 /* Common */ -#define TARGET_NR_getgroups 79 /* Common */ -#define TARGET_NR_setgroups 80 /* Common */ -#define TARGET_NR_getpgrp 81 /* Common */ -#define TARGET_NR_setgroups32 82 /* Linux sparc32, setpgrp under SunOS */ -#define TARGET_NR_setitimer 83 /* Common */ -#define TARGET_NR_ftruncate64 84 /* Linux sparc32 Specific */ -#define TARGET_NR_swapon 85 /* Common */ -#define TARGET_NR_getitimer 86 /* Common */ -#define TARGET_NR_setuid32 87 /* Linux sparc32, gethostname under SunOS */ -#define TARGET_NR_sethostname 88 /* Common */ -#define TARGET_NR_setgid32 89 /* Linux sparc32, getdtablesize under SunOS */ -#define TARGET_NR_dup2 90 /* Common */ -#define TARGET_NR_setfsuid32 91 /* Linux sparc32, getdopt under SunOS */ -#define TARGET_NR_fcntl 92 /* Common */ -#define TARGET_NR_select 93 /* Common */ -#define TARGET_NR_setfsgid32 94 /* Linux sparc32, setdopt under SunOS */ -#define TARGET_NR_fsync 95 /* Common */ -#define TARGET_NR_setpriority 96 /* Common */ -#define TARGET_NR_socket 97 /* Common */ -#define TARGET_NR_connect 98 /* Common */ -#define TARGET_NR_accept 99 /* Common */ -#define TARGET_NR_getpriority 100 /* Common */ -#define TARGET_NR_rt_sigreturn 101 /* Linux Specific */ -#define TARGET_NR_rt_sigaction 102 /* Linux Specific */ -#define TARGET_NR_rt_sigprocmask 103 /* Linux Specific */ -#define TARGET_NR_rt_sigpending 104 /* Linux Specific */ -#define TARGET_NR_rt_sigtimedwait 105 /* Linux Specific */ -#define TARGET_NR_rt_sigqueueinfo 106 /* Linux Specific */ -#define TARGET_NR_rt_sigsuspend 107 /* Linux Specific */ -#define TARGET_NR_setresuid32 108 /* Linux Specific, sigvec under SunOS */ -#define TARGET_NR_getresuid32 109 /* Linux Specific, sigblock under SunOS */ -#define TARGET_NR_setresgid32 110 /* Linux Specific, sigsetmask under SunOS */ -#define TARGET_NR_getresgid32 111 /* Linux Specific, sigpause under SunOS */ -#define TARGET_NR_setregid32 112 /* Linux sparc32, sigstack under SunOS */ -#define TARGET_NR_recvmsg 113 /* Common */ -#define TARGET_NR_sendmsg 114 /* Common */ -#define TARGET_NR_getgroups32 115 /* Linux sparc32, vtrace under SunOS */ -#define TARGET_NR_gettimeofday 116 /* Common */ -#define TARGET_NR_getrusage 117 /* Common */ -#define TARGET_NR_getsockopt 118 /* Common */ -#define TARGET_NR_getcwd 119 /* Linux Specific */ -#define TARGET_NR_readv 120 /* Common */ -#define TARGET_NR_writev 121 /* Common */ -#define TARGET_NR_settimeofday 122 /* Common */ -#define TARGET_NR_fchown 123 /* Common */ -#define TARGET_NR_fchmod 124 /* Common */ -#define TARGET_NR_recvfrom 125 /* Common */ -#define TARGET_NR_setreuid 126 /* Common */ -#define TARGET_NR_setregid 127 /* Common */ -#define TARGET_NR_rename 128 /* Common */ -#define TARGET_NR_truncate 129 /* Common */ -#define TARGET_NR_ftruncate 130 /* Common */ -#define TARGET_NR_flock 131 /* Common */ -#define TARGET_NR_lstat64 132 /* Linux sparc32 Specific */ -#define TARGET_NR_sendto 133 /* Common */ -#define TARGET_NR_shutdown 134 /* Common */ -#define TARGET_NR_socketpair 135 /* Common */ -#define TARGET_NR_mkdir 136 /* Common */ -#define TARGET_NR_rmdir 137 /* Common */ -#define TARGET_NR_utimes 138 /* SunOS Specific */ -#define TARGET_NR_stat64 139 /* Linux sparc32 Specific */ -#define TARGET_NR_getpeername 141 /* Common */ -#define TARGET_NR_futex 142 /* gethostid under SunOS */ -#define TARGET_NR_gettid 143 /* ENOSYS under SunOS */ -#define TARGET_NR_getrlimit 144 /* Common */ -#define TARGET_NR_setrlimit 145 /* Common */ -#define TARGET_NR_pivot_root 146 /* Linux Specific, killpg under SunOS */ -#define TARGET_NR_prctl 147 /* ENOSYS under SunOS */ -#define TARGET_NR_pciconfig_read 148 /* ENOSYS under SunOS */ -#define TARGET_NR_pciconfig_write 149 /* ENOSYS under SunOS */ -#define TARGET_NR_getsockname 150 /* Common */ -#define TARGET_NR_poll 153 /* Common */ -#define TARGET_NR_getdents64 154 /* Linux specific */ -#define TARGET_NR_fcntl64 155 /* Linux sparc32 Specific */ -#define TARGET_NR_statfs 157 /* Common */ -#define TARGET_NR_fstatfs 158 /* Common */ -#define TARGET_NR_umount 159 /* Common */ -#define TARGET_NR_getdomainname 162 /* SunOS Specific */ -#define TARGET_NR_setdomainname 163 /* Common */ -#define TARGET_NR_quotactl 165 /* Common */ -#define TARGET_NR_set_tid_address 166 /* Linux specific, exportfs under SunOS */ -#define TARGET_NR_mount 167 /* Common */ -#define TARGET_NR_ustat 168 /* Common */ -#define TARGET_NR_getdents 174 /* Common */ -#define TARGET_NR_setsid 175 /* Common */ -#define TARGET_NR_fchdir 176 /* Common */ -#define TARGET_NR_sigpending 183 /* Common */ -#define TARGET_NR_query_module 184 /* Linux Specific */ -#define TARGET_NR_setpgid 185 /* Common */ -#define TARGET_NR_tkill 187 /* SunOS: fpathconf */ -#define TARGET_NR_exit_group 188 /* Linux specific, sysconf undef SunOS */ -#define TARGET_NR_uname 189 /* Linux Specific */ -#define TARGET_NR_init_module 190 /* Linux Specific */ -#define TARGET_NR_personality 191 /* Linux Specific */ -#define TARGET_NR_getppid 197 /* Linux Specific */ -#define TARGET_NR_sigaction 198 /* Linux Specific */ -#define TARGET_NR_sgetmask 199 /* Linux Specific */ -#define TARGET_NR_ssetmask 200 /* Linux Specific */ -#define TARGET_NR_sigsuspend 201 /* Linux Specific */ -#define TARGET_NR_oldlstat 202 /* Linux Specific */ -#define TARGET_NR_uselib 203 /* Linux Specific */ -#define TARGET_NR_readdir 204 /* Linux Specific */ -#define TARGET_NR_readahead 205 /* Linux Specific */ -#define TARGET_NR_socketcall 206 /* Linux Specific */ -#define TARGET_NR_syslog 207 /* Linux Specific */ -#define TARGET_NR_tgkill 211 /* Linux Specific */ -#define TARGET_NR_waitpid 212 /* Linux Specific */ -#define TARGET_NR_swapoff 213 /* Linux Specific */ -#define TARGET_NR_sysinfo 214 /* Linux Specific */ -#define TARGET_NR_ipc 215 /* Linux Specific */ -#define TARGET_NR_sigreturn 216 /* Linux Specific */ -#define TARGET_NR_clone 217 /* Linux Specific */ -#define TARGET_NR_adjtimex 219 /* Linux Specific */ -#define TARGET_NR_sigprocmask 220 /* Linux Specific */ -#define TARGET_NR_create_module 221 /* Linux Specific */ -#define TARGET_NR_delete_module 222 /* Linux Specific */ -#define TARGET_NR_get_kernel_syms 223 /* Linux Specific */ -#define TARGET_NR_getpgid 224 /* Linux Specific */ -#define TARGET_NR_bdflush 225 /* Linux Specific */ -#define TARGET_NR_sysfs 226 /* Linux Specific */ -#define TARGET_NR_afs_syscall 227 /* Linux Specific */ -#define TARGET_NR_setfsuid 228 /* Linux Specific */ -#define TARGET_NR_setfsgid 229 /* Linux Specific */ -#define TARGET_NR__newselect 230 /* Linux Specific */ -#define TARGET_NR_time 231 /* Linux Specific */ -#define TARGET_NR_stime 233 /* Linux Specific */ -#define TARGET_NR_statfs64 234 /* Linux Specific */ -#define TARGET_NR_fstatfs64 235 /* Linux Specific */ -#define TARGET_NR__llseek 236 /* Linux Specific */ -#define TARGET_NR_mlock 237 -#define TARGET_NR_munlock 238 -#define TARGET_NR_mlockall 239 -#define TARGET_NR_munlockall 240 -#define TARGET_NR_sched_setparam 241 -#define TARGET_NR_sched_getparam 242 -#define TARGET_NR_sched_setscheduler 243 -#define TARGET_NR_sched_getscheduler 244 -#define TARGET_NR_sched_yield 245 -#define TARGET_NR_sched_get_priority_max 246 -#define TARGET_NR_sched_get_priority_min 247 -#define TARGET_NR_sched_rr_get_interval 248 -#define TARGET_NR_nanosleep 249 -#define TARGET_NR_mremap 250 -#define TARGET_NR__sysctl 251 -#define TARGET_NR_getsid 252 -#define TARGET_NR_fdatasync 253 -#define TARGET_NR_nfsservctl 254 -#define TARGET_NR_aplib 255 -#define TARGET_NR_clock_settime 256 -#define TARGET_NR_clock_gettime 257 -#define TARGET_NR_clock_getres 258 -#define TARGET_NR_clock_nanosleep 259 -#define TARGET_NR_sched_getaffinity 260 -#define TARGET_NR_sched_setaffinity 261 -#define TARGET_NR_timer_settime 262 -#define TARGET_NR_timer_gettime 263 -#define TARGET_NR_timer_getoverrun 264 -#define TARGET_NR_timer_delete 265 -#define TARGET_NR_timer_create 266 -/* #define TARGET_NR_vserver 267 Reserved for VSERVER */ -#define TARGET_NR_io_setup 268 -#define TARGET_NR_io_destroy 269 -#define TARGET_NR_io_submit 270 -#define TARGET_NR_io_cancel 271 -#define TARGET_NR_io_getevents 272 -#define TARGET_NR_mq_open 273 -#define TARGET_NR_mq_unlink 274 -#define TARGET_NR_mq_timedsend 275 -#define TARGET_NR_mq_timedreceive 276 -#define TARGET_NR_mq_notify 277 -#define TARGET_NR_mq_getsetattr 278 -#define TARGET_NR_waitid 279 -#define TARGET_NR_tee 280 -#define TARGET_NR_add_key 281 -#define TARGET_NR_request_key 282 -#define TARGET_NR_keyctl 283 -#define TARGET_NR_openat 284 -#define TARGET_NR_mkdirat 285 -#define TARGET_NR_mknodat 286 -#define TARGET_NR_fchownat 287 -#define TARGET_NR_futimesat 288 -#define TARGET_NR_fstatat64 289 -#define TARGET_NR_unlinkat 290 -#define TARGET_NR_renameat 291 -#define TARGET_NR_linkat 292 -#define TARGET_NR_symlinkat 293 -#define TARGET_NR_readlinkat 294 -#define TARGET_NR_fchmodat 295 -#define TARGET_NR_faccessat 296 -#define TARGET_NR_pselect6 297 -#define TARGET_NR_ppoll 298 -#define TARGET_NR_unshare 299 -#define TARGET_NR_set_robust_list 300 -#define TARGET_NR_get_robust_list 301 -#define TARGET_NR_migrate_pages 302 -#define TARGET_NR_mbind 303 -#define TARGET_NR_get_mempolicy 304 -#define TARGET_NR_set_mempolicy 305 -#define TARGET_NR_kexec_load 306 -#define TARGET_NR_move_pages 307 -#define TARGET_NR_getcpu 308 -#define TARGET_NR_epoll_pwait 309 -#define TARGET_NR_utimensat 310 -#define TARGET_NR_signalfd 311 -#define TARGET_NR_timerfd_create 312 -#define TARGET_NR_eventfd 313 -#define TARGET_NR_fallocate 314 -#define TARGET_NR_timerfd_settime 315 -#define TARGET_NR_timerfd_gettime 316 -#define TARGET_NR_signalfd4 317 -#define TARGET_NR_eventfd2 318 -#define TARGET_NR_epoll_create1 319 -#define TARGET_NR_dup3 320 -#define TARGET_NR_pipe2 321 -#define TARGET_NR_inotify_init1 322 -#define TARGET_NR_accept4 323 -#define TARGET_NR_preadv 324 -#define TARGET_NR_pwritev 325 -#define TARGET_NR_rt_tgsigqueueinfo 326 -#define TARGET_NR_perf_event_open 327 -#define TARGET_NR_recvmmsg 328 -#define TARGET_NR_fanotify_init 329 -#define TARGET_NR_fanotify_mark 330 -#define TARGET_NR_prlimit64 331 -#define TARGET_NR_name_to_handle_at 332 -#define TARGET_NR_open_by_handle_at 333 -#define TARGET_NR_clock_adjtime 334 -#define TARGET_NR_syncfs 335 -#define TARGET_NR_sendmmsg 336 -#define TARGET_NR_setns 337 -#define TARGET_NR_process_vm_readv 338 -#define TARGET_NR_process_vm_writev 339 -#define TARGET_NR_kern_features 340 -#define TARGET_NR_kcmp 341 -#define TARGET_NR_finit_module 342 -#define TARGET_NR_sched_setattr 343 -#define TARGET_NR_sched_getattr 344 -#define TARGET_NR_renameat2 345 -#define TARGET_NR_seccomp 346 -#define TARGET_NR_getrandom 347 -#define TARGET_NR_memfd_create 348 -#define TARGET_NR_bpf 349 -#define TARGET_NR_execveat 350 -#define TARGET_NR_membarrier 351 -#define TARGET_NR_userfaultfd 352 -#define TARGET_NR_bind 353 -#define TARGET_NR_listen 354 -#define TARGET_NR_setsockopt 355 -#define TARGET_NR_mlock2 356 diff --git a/qemu/linux-user/sparc/target_cpu.h b/qemu/linux-user/sparc/target_cpu.h deleted file mode 100644 index 4944d465a..000000000 --- a/qemu/linux-user/sparc/target_cpu.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * SPARC specific CPU ABI and functions for linux-user - * - * Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> - * Copyright (C) 2003-2005 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUSPARCState *env, target_ulong newsp) -{ - if (newsp) { - env->regwptr[22] = newsp; - } - /* syscall return for clone child: 0, and clear CF since - * this counts as a success return value. - */ - env->regwptr[0] = 0; -#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) - env->xcc &= ~PSR_CARRY; -#else - env->psr &= ~PSR_CARRY; -#endif -} - -static inline void cpu_set_tls(CPUSPARCState *env, target_ulong newtls) -{ - env->gregs[7] = newtls; -} - -#endif diff --git a/qemu/linux-user/sparc/target_signal.h b/qemu/linux-user/sparc/target_signal.h deleted file mode 100644 index c7de300cd..000000000 --- a/qemu/linux-user/sparc/target_signal.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_SIGSTKSZ 16384 - -#ifndef UREG_I6 -#define UREG_I6 6 -#endif -#ifndef UREG_FP -#define UREG_FP UREG_I6 -#endif - -static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state) -{ - return state->regwptr[UREG_FP]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/sparc/target_structs.h b/qemu/linux-user/sparc/target_structs.h deleted file mode 100644 index c139e09a6..000000000 --- a/qemu/linux-user/sparc/target_structs.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SPARC specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ -#if TARGET_ABI_BITS == 32 - abi_ushort __pad1; - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad2; -#else - abi_ushort mode; - abi_ushort __pad1; -#endif - abi_ushort __seq; /* Sequence number. */ - uint64_t __unused1; - uint64_t __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ -#if TARGET_ABI_BITS == 32 - abi_uint __pad1; -#endif - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_uint __pad2; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_uint __pad3; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_cpid; /* pid of creator */ - abi_ulong shm_lpid; /* pid of last shmop */ - abi_long shm_nattch; /* number of current attaches */ - abi_ulong __unused1; - abi_ulong __unused2; -}; - -#endif diff --git a/qemu/linux-user/sparc/target_syscall.h b/qemu/linux-user/sparc/target_syscall.h deleted file mode 100644 index a73fa6dae..000000000 --- a/qemu/linux-user/sparc/target_syscall.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -struct target_pt_regs { - abi_ulong psr; - abi_ulong pc; - abi_ulong npc; - abi_ulong y; - abi_ulong u_regs[16]; -}; - -#define UNAME_MACHINE "sun4" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -/* SPARC kernels don't define this in their Kconfig, but they have the - * same ABI as if they did, implemented by sparc-specific code which fishes - * directly in the u_regs() struct for half the parameters in sparc_do_fork() - * and copy_thread(). - */ -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_MLOCKALL_MCL_CURRENT 0x2000 -#define TARGET_MLOCKALL_MCL_FUTURE 0x4000 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/sparc/termbits.h b/qemu/linux-user/sparc/termbits.h deleted file mode 100644 index 691600d27..000000000 --- a/qemu/linux-user/sparc/termbits.h +++ /dev/null @@ -1,279 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VEOL 5 -#define TARGET_VEOL2 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 - -#define TARGET_VSUSP 10 -#define TARGET_VDSUSP 11 /* SunOS POSIX nicety I do believe... */ -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 - -/* Kernel keeps vmin/vtime separated, user apps assume vmin/vtime is - * shared with eof/eol - */ -#define TARGET_VMIN TARGET_VEOF -#define TARGET_VTIME TARGET_VEOL - -/* c_iflag bits */ -#define TARGET_IGNBRK 0x00000001 -#define TARGET_BRKINT 0x00000002 -#define TARGET_IGNPAR 0x00000004 -#define TARGET_PARMRK 0x00000008 -#define TARGET_INPCK 0x00000010 -#define TARGET_ISTRIP 0x00000020 -#define TARGET_INLCR 0x00000040 -#define TARGET_IGNCR 0x00000080 -#define TARGET_ICRNL 0x00000100 -#define TARGET_IUCLC 0x00000200 -#define TARGET_IXON 0x00000400 -#define TARGET_IXANY 0x00000800 -#define TARGET_IXOFF 0x00001000 -#define TARGET_IMAXBEL 0x00002000 -#define TARGET_IUTF8 0x00004000 - -/* c_oflag bits */ -#define TARGET_OPOST 0x00000001 -#define TARGET_OLCUC 0x00000002 -#define TARGET_ONLCR 0x00000004 -#define TARGET_OCRNL 0x00000008 -#define TARGET_ONOCR 0x00000010 -#define TARGET_ONLRET 0x00000020 -#define TARGET_OFILL 0x00000040 -#define TARGET_OFDEL 0x00000080 -#define TARGET_NLDLY 0x00000100 -#define TARGET_NL0 0x00000000 -#define TARGET_NL1 0x00000100 -#define TARGET_CRDLY 0x00000600 -#define TARGET_CR0 0x00000000 -#define TARGET_CR1 0x00000200 -#define TARGET_CR2 0x00000400 -#define TARGET_CR3 0x00000600 -#define TARGET_TABDLY 0x00001800 -#define TARGET_TAB0 0x00000000 -#define TARGET_TAB1 0x00000800 -#define TARGET_TAB2 0x00001000 -#define TARGET_TAB3 0x00001800 -#define TARGET_XTABS 0x00001800 -#define TARGET_BSDLY 0x00002000 -#define TARGET_BS0 0x00000000 -#define TARGET_BS1 0x00002000 -#define TARGET_VTDLY 0x00004000 -#define TARGET_VT0 0x00000000 -#define TARGET_VT1 0x00004000 -#define TARGET_FFDLY 0x00008000 -#define TARGET_FF0 0x00000000 -#define TARGET_FF1 0x00008000 -#define TARGET_PAGEOUT 0x00010000 /* SUNOS specific */ -#define TARGET_WRAP 0x00020000 /* SUNOS specific */ - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0x0000100f -#define TARGET_B0 0x00000000 /* hang up */ -#define TARGET_B50 0x00000001 -#define TARGET_B75 0x00000002 -#define TARGET_B110 0x00000003 -#define TARGET_B134 0x00000004 -#define TARGET_B150 0x00000005 -#define TARGET_B200 0x00000006 -#define TARGET_B300 0x00000007 -#define TARGET_B600 0x00000008 -#define TARGET_B1200 0x00000009 -#define TARGET_B1800 0x0000000a -#define TARGET_B2400 0x0000000b -#define TARGET_B4800 0x0000000c -#define TARGET_B9600 0x0000000d -#define TARGET_B19200 0x0000000e -#define TARGET_B38400 0x0000000f -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0x00000030 -#define TARGET_CS5 0x00000000 -#define TARGET_CS6 0x00000010 -#define TARGET_CS7 0x00000020 -#define TARGET_CS8 0x00000030 -#define TARGET_CSTOPB 0x00000040 -#define TARGET_CREAD 0x00000080 -#define TARGET_PARENB 0x00000100 -#define TARGET_PARODD 0x00000200 -#define TARGET_HUPCL 0x00000400 -#define TARGET_CLOCAL 0x00000800 -#define TARGET_CBAUDEX 0x00001000 -/* We'll never see these speeds with the Zilogs, but for completeness... */ -#define TARGET_B57600 0x00001001 -#define TARGET_B115200 0x00001002 -#define TARGET_B230400 0x00001003 -#define TARGET_B460800 0x00001004 -/* This is what we can do with the Zilogs. */ -#define TARGET_B76800 0x00001005 -/* This is what we can do with the SAB82532. */ -#define TARGET_B153600 0x00001006 -#define TARGET_B307200 0x00001007 -#define TARGET_B614400 0x00001008 -#define TARGET_B921600 0x00001009 -/* And these are the rest... */ -#define TARGET_B500000 0x0000100a -#define TARGET_B576000 0x0000100b -#define TARGET_B1000000 0x0000100c -#define TARGET_B1152000 0x0000100d -#define TARGET_B1500000 0x0000100e -#define TARGET_B2000000 0x0000100f -/* These have totally bogus values and nobody uses them - so far. Later on we'd have to use say 0x10000x and - adjust CBAUD constant and drivers accordingly. -#define B2500000 0x00001010 -#define B3000000 0x00001011 -#define B3500000 0x00001012 -#define B4000000 0x00001013 */ -#define TARGET_CIBAUD 0x100f0000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 0x40000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 0x80000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0x00000001 -#define TARGET_ICANON 0x00000002 -#define TARGET_XCASE 0x00000004 -#define TARGET_ECHO 0x00000008 -#define TARGET_ECHOE 0x00000010 -#define TARGET_ECHOK 0x00000020 -#define TARGET_ECHONL 0x00000040 -#define TARGET_NOFLSH 0x00000080 -#define TARGET_TOSTOP 0x00000100 -#define TARGET_ECHOCTL 0x00000200 -#define TARGET_ECHOPRT 0x00000400 -#define TARGET_ECHOKE 0x00000800 -#define TARGET_DEFECHO 0x00001000 /* SUNOS thing, what is it? */ -#define TARGET_FLUSHO 0x00002000 -#define TARGET_PENDIN 0x00004000 -#define TARGET_IEXTEN 0x00008000 - -/* ioctls */ - -/* Big T */ -#define TARGET_TCGETA TARGET_IOR('T', 1, struct target_termio) -#define TARGET_TCSETA TARGET_IOW('T', 2, struct target_termio) -#define TARGET_TCSETAW TARGET_IOW('T', 3, struct target_termio) -#define TARGET_TCSETAF TARGET_IOW('T', 4, struct target_termio) -#define TARGET_TCSBRK TARGET_IO('T', 5) -#define TARGET_TCXONC TARGET_IO('T', 6) -#define TARGET_TCFLSH TARGET_IO('T', 7) -#define TARGET_TCGETS TARGET_IOR('T', 8, struct target_termios) -#define TARGET_TCSETS TARGET_IOW('T', 9, struct target_termios) -#define TARGET_TCSETSW TARGET_IOW('T', 10, struct target_termios) -#define TARGET_TCSETSF TARGET_IOW('T', 11, struct target_termios) - -/* Note that all the ioctls that are not available in Linux have a - * double underscore on the front to: a) avoid some programs to - * thing we support some ioctls under Linux (autoconfiguration stuff) - */ -/* Little t */ -#define TARGET_TIOCGETD TARGET_IOR('t', 0, int) -#define TARGET_TIOCSETD TARGET_IOW('t', 1, int) -//#define __TIOCHPCL _IO('t', 2) /* SunOS Specific */ -//#define __TIOCMODG _IOR('t', 3, int) /* SunOS Specific */ -//#define __TIOCMODS _IOW('t', 4, int) /* SunOS Specific */ -//#define __TIOCGETP _IOR('t', 8, struct sgttyb) /* SunOS Specific */ -//#define __TIOCSETP _IOW('t', 9, struct sgttyb) /* SunOS Specific */ -//#define __TIOCSETN _IOW('t', 10, struct sgttyb) /* SunOS Specific */ -#define TARGET_TIOCEXCL TARGET_IO('t', 13) -#define TARGET_TIOCNXCL TARGET_IO('t', 14) -//#define __TIOCFLUSH _IOW('t', 16, int) /* SunOS Specific */ -//#define __TIOCSETC _IOW('t', 17, struct tchars) /* SunOS Specific */ -//#define __TIOCGETC _IOR('t', 18, struct tchars) /* SunOS Specific */ -//#define __TIOCTCNTL _IOW('t', 32, int) /* SunOS Specific */ -//#define __TIOCSIGNAL _IOW('t', 33, int) /* SunOS Specific */ -//#define __TIOCSETX _IOW('t', 34, int) /* SunOS Specific */ -//#define __TIOCGETX _IOR('t', 35, int) /* SunOS Specific */ -#define TARGET_TIOCCONS TARGET_IO('t', 36) -//#define __TIOCSSIZE _IOW('t', 37, struct sunos_ttysize) /* SunOS Specific */ -//#define __TIOCGSIZE _IOR('t', 38, struct sunos_ttysize) /* SunOS Specific */ -#define TARGET_TIOCGSOFTCAR TARGET_IOR('t', 100, int) -#define TARGET_TIOCSSOFTCAR TARGET_IOW('t', 101, int) -//#define __TIOCUCNTL _IOW('t', 102, int) /* SunOS Specific */ -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) -//#define __TIOCREMOTE _IOW('t', 105, int) /* SunOS Specific */ -#define TARGET_TIOCMGET TARGET_IOR('t', 106, int) -#define TARGET_TIOCMBIC TARGET_IOW('t', 107, int) -#define TARGET_TIOCMBIS TARGET_IOW('t', 108, int) -#define TARGET_TIOCMSET TARGET_IOW('t', 109, int) -#define TARGET_TIOCSTART TARGET_IO('t', 110) -#define TARGET_TIOCSTOP TARGET_IO('t', 111) -#define TARGET_TIOCPKT TARGET_IOW('t', 112, int) -#define TARGET_TIOCNOTTY TARGET_IO('t', 113) -#define TARGET_TIOCSTI TARGET_IOW('t', 114, char) -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) -//#define __TIOCGLTC _IOR('t', 116, struct ltchars) /* SunOS Specific */ -//#define __TIOCSLTC _IOW('t', 117, struct ltchars) /* SunOS Specific */ -/* 118 is the non-posix setpgrp tty ioctl */ -/* 119 is the non-posix getpgrp tty ioctl */ -//#define __TIOCCDTR TARGET_IO('t', 120) /* SunOS Specific */ -//#define __TIOCSDTR TARGET_IO('t', 121) /* SunOS Specific */ -#define TARGET_TIOCCBRK TARGET_IO('t', 122) -#define TARGET_TIOCSBRK TARGET_IO('t', 123) -//#define __TIOCLGET TARGET_IOW('t', 124, int) /* SunOS Specific */ -//#define __TIOCLSET TARGET_IOW('t', 125, int) /* SunOS Specific */ -//#define __TIOCLBIC TARGET_IOW('t', 126, int) /* SunOS Specific */ -//#define __TIOCLBIS TARGET_IOW('t', 127, int) /* SunOS Specific */ -//#define __TIOCISPACE TARGET_IOR('t', 128, int) /* SunOS Specific */ -//#define __TIOCISIZE TARGET_IOR('t', 129, int) /* SunOS Specific */ -#define TARGET_TIOCSPGRP TARGET_IOW('t', 130, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 131, int) -#define TARGET_TIOCSCTTY TARGET_IO('t', 132) -#define TARGET_TIOCGSID TARGET_IOR('t', 133, int) -/* Get minor device of a pty master's FD -- Solaris equiv is ISPTM */ -#define TARGET_TIOCGPTN TARGET_IOR('t', 134, unsigned int) /* Get Pty Number */ -#define TARGET_TIOCSPTLCK TARGET_IOW('t', 135, int) /* Lock/unlock PTY */ - -/* Little f */ -#define TARGET_FIOCLEX TARGET_IO('f', 1) -#define TARGET_FIONCLEX TARGET_IO('f', 2) -#define TARGET_FIOASYNC TARGET_IOW('f', 125, int) -#define TARGET_FIONBIO TARGET_IOW('f', 126, int) -#define TARGET_FIONREAD TARGET_IOR('f', 127, int) -#define TARGET_TIOCINQ TARGET_FIONREAD - -/* SCARY Rutgers local SunOS kernel hackery, perhaps I will support it - * someday. This is completely bogus, I know... - */ -//#define __TCGETSTAT TARGET_IO('T', 200) /* Rutgers specific */ -//#define __TCSETSTAT TARGET_IO('T', 201) /* Rutgers specific */ - -/* Linux specific, no SunOS equivalent. */ -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TCSBRKP 0x5425 -#define TARGET_TIOCTTYGSTRUCT 0x5426 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ -#define TARGET_TIOCMIWAIT 0x545C /* Wait input */ -#define TARGET_TIOCGICOUNT 0x545D /* Read serial port inline interrupt counts */ diff --git a/qemu/linux-user/sparc64/syscall_nr.h b/qemu/linux-user/sparc64/syscall_nr.h deleted file mode 100644 index 2b49ead26..000000000 --- a/qemu/linux-user/sparc64/syscall_nr.h +++ /dev/null @@ -1,357 +0,0 @@ -#define TARGET_NR_restart_syscall 0 /* Linux Specific */ -#define TARGET_NR_exit 1 /* Common */ -#define TARGET_NR_fork 2 /* Common */ -#define TARGET_NR_read 3 /* Common */ -#define TARGET_NR_write 4 /* Common */ -#define TARGET_NR_open 5 /* Common */ -#define TARGET_NR_close 6 /* Common */ -#define TARGET_NR_wait4 7 /* Common */ -#define TARGET_NR_creat 8 /* Common */ -#define TARGET_NR_link 9 /* Common */ -#define TARGET_NR_unlink 10 /* Common */ -#define TARGET_NR_execv 11 /* SunOS Specific */ -#define TARGET_NR_chdir 12 /* Common */ -#define TARGET_NR_chown 13 /* Common */ -#define TARGET_NR_mknod 14 /* Common */ -#define TARGET_NR_chmod 15 /* Common */ -#define TARGET_NR_lchown 16 /* Common */ -#define TARGET_NR_brk 17 /* Common */ -#define TARGET_NR_perfctr 18 /* Performance counter operations */ -#define TARGET_NR_lseek 19 /* Common */ -#define TARGET_NR_getpid 20 /* Common */ -#define TARGET_NR_capget 21 /* Linux Specific */ -#define TARGET_NR_capset 22 /* Linux Specific */ -#define TARGET_NR_setuid 23 /* Implemented via setreuid in SunOS */ -#define TARGET_NR_getuid 24 /* Common */ -/* #define TARGET_NR_time alias 25 ENOSYS under SunOS */ -#define TARGET_NR_ptrace 26 /* Common */ -#define TARGET_NR_alarm 27 /* Implemented via setitimer in SunOS */ -#define TARGET_NR_sigaltstack 28 /* Common */ -#define TARGET_NR_pause 29 /* Is sigblock(0)->sigpause() in SunOS */ -#define TARGET_NR_utime 30 /* Implemented via utimes() under SunOS */ -#define TARGET_NR_lchown32 31 /* Linux sparc32 specific */ -#define TARGET_NR_fchown32 32 /* Linux sparc32 specific */ -#define TARGET_NR_access 33 /* Common */ -#define TARGET_NR_nice 34 /* Implemented via get/setpriority() in SunOS */ -#define TARGET_NR_chown32 35 /* Linux sparc32 specific */ -#define TARGET_NR_sync 36 /* Common */ -#define TARGET_NR_kill 37 /* Common */ -#define TARGET_NR_stat 38 /* Common */ -#define TARGET_NR_sendfile 39 /* Linux Specific */ -#define TARGET_NR_lstat 40 /* Common */ -#define TARGET_NR_dup 41 /* Common */ -#define TARGET_NR_pipe 42 /* Common */ -#define TARGET_NR_times 43 /* Implemented via getrusage() in SunOS */ -#define TARGET_NR_getuid32 44 /* Linux sparc32 specific */ -#define TARGET_NR_umount2 45 /* Linux Specific */ -#define TARGET_NR_setgid 46 /* Implemented via setregid() in SunOS */ -#define TARGET_NR_getgid 47 /* Common */ -#define TARGET_NR_signal 48 /* Implemented via sigvec() in SunOS */ -#define TARGET_NR_geteuid 49 /* SunOS calls getuid() */ -#define TARGET_NR_getegid 50 /* SunOS calls getgid() */ -#define TARGET_NR_acct 51 /* Common */ -#define TARGET_NR_memory_ordering 52 /* Linux Specific */ -#define TARGET_NR_getgid32 53 /* Linux sparc32 specific */ -#define TARGET_NR_ioctl 54 /* Common */ -#define TARGET_NR_reboot 55 /* Common */ -#define TARGET_NR_mmap2 56 /* Linux sparc32 Specific */ -#define TARGET_NR_symlink 57 /* Common */ -#define TARGET_NR_readlink 58 /* Common */ -#define TARGET_NR_execve 59 /* Common */ -#define TARGET_NR_umask 60 /* Common */ -#define TARGET_NR_chroot 61 /* Common */ -#define TARGET_NR_fstat 62 /* Common */ -#define TARGET_NR_fstat64 63 /* Linux sparc32 Specific */ -#define TARGET_NR_getpagesize 64 /* Common */ -#define TARGET_NR_msync 65 /* Common in newer 1.3.x revs... */ -#define TARGET_NR_vfork 66 /* Common */ -#define TARGET_NR_pread64 67 /* Linux Specific */ -#define TARGET_NR_pwrite64 68 /* Linux Specific */ -#define TARGET_NR_geteuid32 69 /* Linux sparc32, sbrk under SunOS */ -#define TARGET_NR_getegid32 70 /* Linux sparc32, sstk under SunOS */ -#define TARGET_NR_mmap 71 /* Common */ -#define TARGET_NR_setreuid32 72 /* Linux sparc32, vadvise under SunOS */ -#define TARGET_NR_munmap 73 /* Common */ -#define TARGET_NR_mprotect 74 /* Common */ -#define TARGET_NR_madvise 75 /* Common */ -#define TARGET_NR_vhangup 76 /* Common */ -#define TARGET_NR_truncate64 77 /* Linux sparc32 Specific */ -#define TARGET_NR_mincore 78 /* Common */ -#define TARGET_NR_getgroups 79 /* Common */ -#define TARGET_NR_setgroups 80 /* Common */ -#define TARGET_NR_getpgrp 81 /* Common */ -#define TARGET_NR_setgroups32 82 /* Linux sparc32, setpgrp under SunOS */ -#define TARGET_NR_setitimer 83 /* Common */ -#define TARGET_NR_ftruncate64 84 /* Linux sparc32 Specific */ -#define TARGET_NR_swapon 85 /* Common */ -#define TARGET_NR_getitimer 86 /* Common */ -#define TARGET_NR_setuid32 87 /* Linux sparc32, gethostname under SunOS */ -#define TARGET_NR_sethostname 88 /* Common */ -#define TARGET_NR_setgid32 89 /* Linux sparc32, getdtablesize under SunOS */ -#define TARGET_NR_dup2 90 /* Common */ -#define TARGET_NR_setfsuid32 91 /* Linux sparc32, getdopt under SunOS */ -#define TARGET_NR_fcntl 92 /* Common */ -#define TARGET_NR_select 93 /* Common */ -#define TARGET_NR_setfsgid32 94 /* Linux sparc32, setdopt under SunOS */ -#define TARGET_NR_fsync 95 /* Common */ -#define TARGET_NR_setpriority 96 /* Common */ -#define TARGET_NR_socket 97 /* Common */ -#define TARGET_NR_connect 98 /* Common */ -#define TARGET_NR_accept 99 /* Common */ -#define TARGET_NR_getpriority 100 /* Common */ -#define TARGET_NR_rt_sigreturn 101 /* Linux Specific */ -#define TARGET_NR_rt_sigaction 102 /* Linux Specific */ -#define TARGET_NR_rt_sigprocmask 103 /* Linux Specific */ -#define TARGET_NR_rt_sigpending 104 /* Linux Specific */ -#define TARGET_NR_rt_sigtimedwait 105 /* Linux Specific */ -#define TARGET_NR_rt_sigqueueinfo 106 /* Linux Specific */ -#define TARGET_NR_rt_sigsuspend 107 /* Linux Specific */ -#define TARGET_NR_setresuid 108 /* Linux Specific, sigvec under SunOS */ -#define TARGET_NR_getresuid 109 /* Linux Specific, sigblock under SunOS */ -#define TARGET_NR_setresgid 110 /* Linux Specific, sigsetmask under SunOS */ -#define TARGET_NR_getresgid 111 /* Linux Specific, sigpause under SunOS */ -/* #define TARGET_NR_setregid32 75 Linux sparc32, sigstack under SunOS */ -#define TARGET_NR_recvmsg 113 /* Common */ -#define TARGET_NR_sendmsg 114 /* Common */ -#define TARGET_NR_getgroups32 115 /* Linux sparc32, vtrace under SunOS */ -#define TARGET_NR_gettimeofday 116 /* Common */ -#define TARGET_NR_getrusage 117 /* Common */ -#define TARGET_NR_getsockopt 118 /* Common */ -#define TARGET_NR_getcwd 119 /* Linux Specific */ -#define TARGET_NR_readv 120 /* Common */ -#define TARGET_NR_writev 121 /* Common */ -#define TARGET_NR_settimeofday 122 /* Common */ -#define TARGET_NR_fchown 123 /* Common */ -#define TARGET_NR_fchmod 124 /* Common */ -#define TARGET_NR_recvfrom 125 /* Common */ -#define TARGET_NR_setreuid 126 /* Common */ -#define TARGET_NR_setregid 127 /* Common */ -#define TARGET_NR_rename 128 /* Common */ -#define TARGET_NR_truncate 129 /* Common */ -#define TARGET_NR_ftruncate 130 /* Common */ -#define TARGET_NR_flock 131 /* Common */ -#define TARGET_NR_lstat64 132 /* Linux sparc32 Specific */ -#define TARGET_NR_sendto 133 /* Common */ -#define TARGET_NR_shutdown 134 /* Common */ -#define TARGET_NR_socketpair 135 /* Common */ -#define TARGET_NR_mkdir 136 /* Common */ -#define TARGET_NR_rmdir 137 /* Common */ -#define TARGET_NR_utimes 138 /* SunOS Specific */ -#define TARGET_NR_stat64 139 /* Linux sparc32 Specific */ -#define TARGET_NR_sendfile64 140 /* adjtime under SunOS */ -#define TARGET_NR_getpeername 141 /* Common */ -#define TARGET_NR_futex 142 /* gethostid under SunOS */ -#define TARGET_NR_gettid 143 /* ENOSYS under SunOS */ -#define TARGET_NR_getrlimit 144 /* Common */ -#define TARGET_NR_setrlimit 145 /* Common */ -#define TARGET_NR_pivot_root 146 /* Linux Specific, killpg under SunOS */ -#define TARGET_NR_prctl 147 /* ENOSYS under SunOS */ -#define TARGET_NR_pciconfig_read 148 /* ENOSYS under SunOS */ -#define TARGET_NR_pciconfig_write 149 /* ENOSYS under SunOS */ -#define TARGET_NR_getsockname 150 /* Common */ -/* #define TARGET_NR_getmsg 151 SunOS Specific */ -/* #define TARGET_NR_putmsg 152 SunOS Specific */ -#define TARGET_NR_poll 153 /* Common */ -#define TARGET_NR_getdents64 154 /* Linux specific */ -#define TARGET_NR_fcntl64 155 /* Linux sparc32 Specific */ -/* #define TARGET_NR_getdirentries 156 SunOS Specific */ -#define TARGET_NR_statfs 157 /* Common */ -#define TARGET_NR_fstatfs 158 /* Common */ -#define TARGET_NR_umount 159 /* Common */ -#define TARGET_NR_sched_set_affinity 160 /* Linux specific, async_daemon under SunOS */ -#define TARGET_NR_sched_get_affinity 161 /* Linux specific, getfh under SunOS */ -#define TARGET_NR_getdomainname 162 /* SunOS Specific */ -#define TARGET_NR_setdomainname 163 /* Common */ -#define TARGET_NR_utrap_install 164 /* SYSV ABI/v9 required */ -#define TARGET_NR_quotactl 165 /* Common */ -#define TARGET_NR_set_tid_address 166 /* Linux specific, exportfs under SunOS */ -#define TARGET_NR_mount 167 /* Common */ -#define TARGET_NR_ustat 168 /* Common */ -#define TARGET_NR_setxattr 169 /* SunOS: semsys */ -#define TARGET_NR_lsetxattr 170 /* SunOS: msgsys */ -#define TARGET_NR_fsetxattr 171 /* SunOS: shmsys */ -#define TARGET_NR_getxattr 172 /* SunOS: auditsys */ -#define TARGET_NR_lgetxattr 173 /* SunOS: rfssys */ -#define TARGET_NR_getdents 174 /* Common */ -#define TARGET_NR_setsid 175 /* Common */ -#define TARGET_NR_fchdir 176 /* Common */ -#define TARGET_NR_fgetxattr 177 /* SunOS: fchroot */ -#define TARGET_NR_listxattr 178 /* SunOS: vpixsys */ -#define TARGET_NR_llistxattr 179 /* SunOS: aioread */ -#define TARGET_NR_flistxattr 180 /* SunOS: aiowrite */ -#define TARGET_NR_removexattr 181 /* SunOS: aiowait */ -#define TARGET_NR_lremovexattr 182 /* SunOS: aiocancel */ -#define TARGET_NR_sigpending 183 /* Common */ -#define TARGET_NR_query_module 184 /* Linux Specific */ -#define TARGET_NR_setpgid 185 /* Common */ -#define TARGET_NR_fremovexattr 186 /* SunOS: pathconf */ -#define TARGET_NR_tkill 187 /* SunOS: fpathconf */ -#define TARGET_NR_exit_group 188 /* Linux specific, sysconf undef SunOS */ -#define TARGET_NR_uname 189 /* Linux Specific */ -#define TARGET_NR_init_module 190 /* Linux Specific */ -#define TARGET_NR_personality 191 /* Linux Specific */ -#define TARGET_NR_remap_file_pages 192 /* Linux Specific */ -#define TARGET_NR_epoll_create 193 /* Linux Specific */ -#define TARGET_NR_epoll_ctl 194 /* Linux Specific */ -#define TARGET_NR_epoll_wait 195 /* Linux Specific */ -/* #define TARGET_NR_ulimit 196 Linux Specific */ -#define TARGET_NR_getppid 197 /* Linux Specific */ -#define TARGET_NR_sigaction 198 /* Linux Specific */ -#define TARGET_NR_sgetmask 199 /* Linux Specific */ -#define TARGET_NR_ssetmask 200 /* Linux Specific */ -#define TARGET_NR_sigsuspend 201 /* Linux Specific */ -#define TARGET_NR_oldlstat 202 /* Linux Specific */ -#define TARGET_NR_uselib 203 /* Linux Specific */ -#define TARGET_NR_readdir 204 /* Linux Specific */ -#define TARGET_NR_readahead 205 /* Linux Specific */ -#define TARGET_NR_socketcall 206 /* Linux Specific */ -#define TARGET_NR_syslog 207 /* Linux Specific */ -#define TARGET_NR_lookup_dcookie 208 /* Linux Specific */ -#define TARGET_NR_fadvise64 209 /* Linux Specific */ -#define TARGET_NR_fadvise64_64 210 /* Linux Specific */ -#define TARGET_NR_tgkill 211 /* Linux Specific */ -#define TARGET_NR_waitpid 212 /* Linux Specific */ -#define TARGET_NR_swapoff 213 /* Linux Specific */ -#define TARGET_NR_sysinfo 214 /* Linux Specific */ -#define TARGET_NR_ipc 215 /* Linux Specific */ -#define TARGET_NR_sigreturn 216 /* Linux Specific */ -#define TARGET_NR_clone 217 /* Linux Specific */ -/* #define TARGET_NR_modify_ldt 218 Linux Specific - i386 specific, unused */ -#define TARGET_NR_adjtimex 219 /* Linux Specific */ -#define TARGET_NR_sigprocmask 220 /* Linux Specific */ -#define TARGET_NR_create_module 221 /* Linux Specific */ -#define TARGET_NR_delete_module 222 /* Linux Specific */ -#define TARGET_NR_get_kernel_syms 223 /* Linux Specific */ -#define TARGET_NR_getpgid 224 /* Linux Specific */ -#define TARGET_NR_bdflush 225 /* Linux Specific */ -#define TARGET_NR_sysfs 226 /* Linux Specific */ -#define TARGET_NR_afs_syscall 227 /* Linux Specific */ -#define TARGET_NR_setfsuid 228 /* Linux Specific */ -#define TARGET_NR_setfsgid 229 /* Linux Specific */ -#define TARGET_NR__newselect 230 /* Linux Specific */ -#define TARGET_NR_time 231 /* Linux sparc32 */ -/* #define TARGET_NR_oldstat 232 Linux Specific */ -#define TARGET_NR_stime 233 /* Linux Specific */ -#define TARGET_NR_statfs64 234 /* Linux Specific */ -#define TARGET_NR_fstatfs64 235 /* Linux Specific */ -#define TARGET_NR__llseek 236 /* Linux Specific */ -#define TARGET_NR_mlock 237 -#define TARGET_NR_munlock 238 -#define TARGET_NR_mlockall 239 -#define TARGET_NR_munlockall 240 -#define TARGET_NR_sched_setparam 241 -#define TARGET_NR_sched_getparam 242 -#define TARGET_NR_sched_setscheduler 243 -#define TARGET_NR_sched_getscheduler 244 -#define TARGET_NR_sched_yield 245 -#define TARGET_NR_sched_get_priority_max 246 -#define TARGET_NR_sched_get_priority_min 247 -#define TARGET_NR_sched_rr_get_interval 248 -#define TARGET_NR_nanosleep 249 -#define TARGET_NR_mremap 250 -#define TARGET_NR__sysctl 251 -#define TARGET_NR_getsid 252 -#define TARGET_NR_fdatasync 253 -#define TARGET_NR_nfsservctl 254 -#define TARGET_NR_aplib 255 -#define TARGET_NR_clock_settime 256 -#define TARGET_NR_clock_gettime 257 -#define TARGET_NR_clock_getres 258 -#define TARGET_NR_clock_nanosleep 259 -#define TARGET_NR_sched_getaffinity 260 -#define TARGET_NR_sched_setaffinity 261 -#define TARGET_NR_timer_settime 262 -#define TARGET_NR_timer_gettime 263 -#define TARGET_NR_timer_getoverrun 264 -#define TARGET_NR_timer_delete 265 -#define TARGET_NR_timer_create 266 -/* #define TARGET_NR_vserver 267 Reserved for VSERVER */ -#define TARGET_NR_io_setup 268 -#define TARGET_NR_io_destroy 269 -#define TARGET_NR_io_submit 270 -#define TARGET_NR_io_cancel 271 -#define TARGET_NR_io_getevents 272 -#define TARGET_NR_mq_open 273 -#define TARGET_NR_mq_unlink 274 -#define TARGET_NR_mq_timedsend 275 -#define TARGET_NR_mq_timedreceive 276 -#define TARGET_NR_mq_notify 277 -#define TARGET_NR_mq_getsetattr 278 -#define TARGET_NR_waitid 279 -/*#define TARGET_NR_sys_setaltroot 280 available (was setaltroot) */ -#define TARGET_NR_add_key 281 -#define TARGET_NR_request_key 282 -#define TARGET_NR_keyctl 283 -#define TARGET_NR_openat 284 -#define TARGET_NR_mkdirat 285 -#define TARGET_NR_mknodat 286 -#define TARGET_NR_fchownat 287 -#define TARGET_NR_futimesat 288 -#define TARGET_NR_fstatat64 289 -#define TARGET_NR_unlinkat 290 -#define TARGET_NR_renameat 291 -#define TARGET_NR_linkat 292 -#define TARGET_NR_symlinkat 293 -#define TARGET_NR_readlinkat 294 -#define TARGET_NR_fchmodat 295 -#define TARGET_NR_faccessat 296 -#define TARGET_NR_pselect6 297 -#define TARGET_NR_ppoll 298 -#define TARGET_NR_unshare 299 -#define TARGET_NR_set_robust_list 300 -#define TARGET_NR_get_robust_list 301 -#define TARGET_NR_migrate_pages 302 -#define TARGET_NR_mbind 303 -#define TARGET_NR_get_mempolicy 304 -#define TARGET_NR_set_mempolicy 305 -#define TARGET_NR_kexec_load 306 -#define TARGET_NR_move_pages 307 -#define TARGET_NR_getcpu 308 -#define TARGET_NR_epoll_pwait 309 -#define TARGET_NR_utimensat 310 -#define TARGET_NR_signalfd 311 -#define TARGET_NR_timerfd 312 -#define TARGET_NR_eventfd 313 -#define TARGET_NR_fallocate 314 -#define TARGET_NR_timerfd_settime 315 -#define TARGET_NR_timerfd_gettime 316 -#define TARGET_NR_signalfd4 317 -#define TARGET_NR_eventfd2 318 -#define TARGET_NR_epoll_create1 319 -#define TARGET_NR_dup3 320 -#define TARGET_NR_pipe2 321 -#define TARGET_NR_inotify_init1 322 -#define TARGET_NR_accept4 323 -#define TARGET_NR_preadv 324 -#define TARGET_NR_pwritev 325 -#define TARGET_NR_rt_tgsigqueueinfo 326 -#define TARGET_NR_perf_event_open 327 -#define TARGET_NR_recvmmsg 328 -#define TARGET_NR_fanotify_init 329 -#define TARGET_NR_fanotify_mark 330 -#define TARGET_NR_prlimit64 331 -#define TARGET_NR_name_to_handle_at 332 -#define TARGET_NR_open_by_handle_at 333 -#define TARGET_NR_clock_adjtime 334 -#define TARGET_NR_syncfs 335 -#define TARGET_NR_sendmmsg 336 -#define TARGET_NR_setns 337 -#define TARGET_NR_process_vm_readv 338 -#define TARGET_NR_process_vm_writev 339 -#define TARGET_NR_kern_features 340 -#define TARGET_NR_kcmp 341 -#define TARGET_NR_finit_module 342 -#define TARGET_NR_sched_setattr 343 -#define TARGET_NR_sched_getattr 344 -#define TARGET_NR_renameat2 345 -#define TARGET_NR_seccomp 346 -#define TARGET_NR_getrandom 347 -#define TARGET_NR_memfd_create 348 -#define TARGET_NR_bpf 349 -#define TARGET_NR_execveat 350 -#define TARGET_NR_membarrier 351 -#define TARGET_NR_userfaultfd 352 -#define TARGET_NR_bind 353 -#define TARGET_NR_listen 354 -#define TARGET_NR_setsockopt 355 -#define TARGET_NR_mlock2 356 diff --git a/qemu/linux-user/sparc64/target_cpu.h b/qemu/linux-user/sparc64/target_cpu.h deleted file mode 100644 index b22263d2d..000000000 --- a/qemu/linux-user/sparc64/target_cpu.h +++ /dev/null @@ -1 +0,0 @@ -#include "../sparc/target_cpu.h" diff --git a/qemu/linux-user/sparc64/target_signal.h b/qemu/linux-user/sparc64/target_signal.h deleted file mode 100644 index c7de300cd..000000000 --- a/qemu/linux-user/sparc64/target_signal.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_SIGSTKSZ 16384 - -#ifndef UREG_I6 -#define UREG_I6 6 -#endif -#ifndef UREG_FP -#define UREG_FP UREG_I6 -#endif - -static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state) -{ - return state->regwptr[UREG_FP]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/sparc64/target_structs.h b/qemu/linux-user/sparc64/target_structs.h deleted file mode 100644 index fc1729007..000000000 --- a/qemu/linux-user/sparc64/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * SPARC64 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/sparc64/target_syscall.h b/qemu/linux-user/sparc64/target_syscall.h deleted file mode 100644 index eb827fcac..000000000 --- a/qemu/linux-user/sparc64/target_syscall.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -struct target_pt_regs { - abi_ulong u_regs[16]; - abi_ulong tstate; - abi_ulong pc; - abi_ulong npc; - abi_ulong y; - abi_ulong fprs; -}; - -#define UNAME_MACHINE "sun4u" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -/* SPARC kernels don't define this in their Kconfig, but they have the - * same ABI as if they did, implemented by sparc-specific code which fishes - * directly in the u_regs() struct for half the parameters in sparc_do_fork() - * and copy_thread(). - */ -#define TARGET_CLONE_BACKWARDS -#define TARGET_MINSIGSTKSZ 4096 -#define TARGET_MLOCKALL_MCL_CURRENT 0x2000 -#define TARGET_MLOCKALL_MCL_FUTURE 0x4000 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/sparc64/termbits.h b/qemu/linux-user/sparc64/termbits.h deleted file mode 100644 index 691600d27..000000000 --- a/qemu/linux-user/sparc64/termbits.h +++ /dev/null @@ -1,279 +0,0 @@ -/* from asm/termbits.h */ - -#define TARGET_NCCS 19 - -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VEOL 5 -#define TARGET_VEOL2 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 - -#define TARGET_VSUSP 10 -#define TARGET_VDSUSP 11 /* SunOS POSIX nicety I do believe... */ -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 - -/* Kernel keeps vmin/vtime separated, user apps assume vmin/vtime is - * shared with eof/eol - */ -#define TARGET_VMIN TARGET_VEOF -#define TARGET_VTIME TARGET_VEOL - -/* c_iflag bits */ -#define TARGET_IGNBRK 0x00000001 -#define TARGET_BRKINT 0x00000002 -#define TARGET_IGNPAR 0x00000004 -#define TARGET_PARMRK 0x00000008 -#define TARGET_INPCK 0x00000010 -#define TARGET_ISTRIP 0x00000020 -#define TARGET_INLCR 0x00000040 -#define TARGET_IGNCR 0x00000080 -#define TARGET_ICRNL 0x00000100 -#define TARGET_IUCLC 0x00000200 -#define TARGET_IXON 0x00000400 -#define TARGET_IXANY 0x00000800 -#define TARGET_IXOFF 0x00001000 -#define TARGET_IMAXBEL 0x00002000 -#define TARGET_IUTF8 0x00004000 - -/* c_oflag bits */ -#define TARGET_OPOST 0x00000001 -#define TARGET_OLCUC 0x00000002 -#define TARGET_ONLCR 0x00000004 -#define TARGET_OCRNL 0x00000008 -#define TARGET_ONOCR 0x00000010 -#define TARGET_ONLRET 0x00000020 -#define TARGET_OFILL 0x00000040 -#define TARGET_OFDEL 0x00000080 -#define TARGET_NLDLY 0x00000100 -#define TARGET_NL0 0x00000000 -#define TARGET_NL1 0x00000100 -#define TARGET_CRDLY 0x00000600 -#define TARGET_CR0 0x00000000 -#define TARGET_CR1 0x00000200 -#define TARGET_CR2 0x00000400 -#define TARGET_CR3 0x00000600 -#define TARGET_TABDLY 0x00001800 -#define TARGET_TAB0 0x00000000 -#define TARGET_TAB1 0x00000800 -#define TARGET_TAB2 0x00001000 -#define TARGET_TAB3 0x00001800 -#define TARGET_XTABS 0x00001800 -#define TARGET_BSDLY 0x00002000 -#define TARGET_BS0 0x00000000 -#define TARGET_BS1 0x00002000 -#define TARGET_VTDLY 0x00004000 -#define TARGET_VT0 0x00000000 -#define TARGET_VT1 0x00004000 -#define TARGET_FFDLY 0x00008000 -#define TARGET_FF0 0x00000000 -#define TARGET_FF1 0x00008000 -#define TARGET_PAGEOUT 0x00010000 /* SUNOS specific */ -#define TARGET_WRAP 0x00020000 /* SUNOS specific */ - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0x0000100f -#define TARGET_B0 0x00000000 /* hang up */ -#define TARGET_B50 0x00000001 -#define TARGET_B75 0x00000002 -#define TARGET_B110 0x00000003 -#define TARGET_B134 0x00000004 -#define TARGET_B150 0x00000005 -#define TARGET_B200 0x00000006 -#define TARGET_B300 0x00000007 -#define TARGET_B600 0x00000008 -#define TARGET_B1200 0x00000009 -#define TARGET_B1800 0x0000000a -#define TARGET_B2400 0x0000000b -#define TARGET_B4800 0x0000000c -#define TARGET_B9600 0x0000000d -#define TARGET_B19200 0x0000000e -#define TARGET_B38400 0x0000000f -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0x00000030 -#define TARGET_CS5 0x00000000 -#define TARGET_CS6 0x00000010 -#define TARGET_CS7 0x00000020 -#define TARGET_CS8 0x00000030 -#define TARGET_CSTOPB 0x00000040 -#define TARGET_CREAD 0x00000080 -#define TARGET_PARENB 0x00000100 -#define TARGET_PARODD 0x00000200 -#define TARGET_HUPCL 0x00000400 -#define TARGET_CLOCAL 0x00000800 -#define TARGET_CBAUDEX 0x00001000 -/* We'll never see these speeds with the Zilogs, but for completeness... */ -#define TARGET_B57600 0x00001001 -#define TARGET_B115200 0x00001002 -#define TARGET_B230400 0x00001003 -#define TARGET_B460800 0x00001004 -/* This is what we can do with the Zilogs. */ -#define TARGET_B76800 0x00001005 -/* This is what we can do with the SAB82532. */ -#define TARGET_B153600 0x00001006 -#define TARGET_B307200 0x00001007 -#define TARGET_B614400 0x00001008 -#define TARGET_B921600 0x00001009 -/* And these are the rest... */ -#define TARGET_B500000 0x0000100a -#define TARGET_B576000 0x0000100b -#define TARGET_B1000000 0x0000100c -#define TARGET_B1152000 0x0000100d -#define TARGET_B1500000 0x0000100e -#define TARGET_B2000000 0x0000100f -/* These have totally bogus values and nobody uses them - so far. Later on we'd have to use say 0x10000x and - adjust CBAUD constant and drivers accordingly. -#define B2500000 0x00001010 -#define B3000000 0x00001011 -#define B3500000 0x00001012 -#define B4000000 0x00001013 */ -#define TARGET_CIBAUD 0x100f0000 /* input baud rate (not used) */ -#define TARGET_CMSPAR 0x40000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 0x80000000 /* flow control */ - -/* c_lflag bits */ -#define TARGET_ISIG 0x00000001 -#define TARGET_ICANON 0x00000002 -#define TARGET_XCASE 0x00000004 -#define TARGET_ECHO 0x00000008 -#define TARGET_ECHOE 0x00000010 -#define TARGET_ECHOK 0x00000020 -#define TARGET_ECHONL 0x00000040 -#define TARGET_NOFLSH 0x00000080 -#define TARGET_TOSTOP 0x00000100 -#define TARGET_ECHOCTL 0x00000200 -#define TARGET_ECHOPRT 0x00000400 -#define TARGET_ECHOKE 0x00000800 -#define TARGET_DEFECHO 0x00001000 /* SUNOS thing, what is it? */ -#define TARGET_FLUSHO 0x00002000 -#define TARGET_PENDIN 0x00004000 -#define TARGET_IEXTEN 0x00008000 - -/* ioctls */ - -/* Big T */ -#define TARGET_TCGETA TARGET_IOR('T', 1, struct target_termio) -#define TARGET_TCSETA TARGET_IOW('T', 2, struct target_termio) -#define TARGET_TCSETAW TARGET_IOW('T', 3, struct target_termio) -#define TARGET_TCSETAF TARGET_IOW('T', 4, struct target_termio) -#define TARGET_TCSBRK TARGET_IO('T', 5) -#define TARGET_TCXONC TARGET_IO('T', 6) -#define TARGET_TCFLSH TARGET_IO('T', 7) -#define TARGET_TCGETS TARGET_IOR('T', 8, struct target_termios) -#define TARGET_TCSETS TARGET_IOW('T', 9, struct target_termios) -#define TARGET_TCSETSW TARGET_IOW('T', 10, struct target_termios) -#define TARGET_TCSETSF TARGET_IOW('T', 11, struct target_termios) - -/* Note that all the ioctls that are not available in Linux have a - * double underscore on the front to: a) avoid some programs to - * thing we support some ioctls under Linux (autoconfiguration stuff) - */ -/* Little t */ -#define TARGET_TIOCGETD TARGET_IOR('t', 0, int) -#define TARGET_TIOCSETD TARGET_IOW('t', 1, int) -//#define __TIOCHPCL _IO('t', 2) /* SunOS Specific */ -//#define __TIOCMODG _IOR('t', 3, int) /* SunOS Specific */ -//#define __TIOCMODS _IOW('t', 4, int) /* SunOS Specific */ -//#define __TIOCGETP _IOR('t', 8, struct sgttyb) /* SunOS Specific */ -//#define __TIOCSETP _IOW('t', 9, struct sgttyb) /* SunOS Specific */ -//#define __TIOCSETN _IOW('t', 10, struct sgttyb) /* SunOS Specific */ -#define TARGET_TIOCEXCL TARGET_IO('t', 13) -#define TARGET_TIOCNXCL TARGET_IO('t', 14) -//#define __TIOCFLUSH _IOW('t', 16, int) /* SunOS Specific */ -//#define __TIOCSETC _IOW('t', 17, struct tchars) /* SunOS Specific */ -//#define __TIOCGETC _IOR('t', 18, struct tchars) /* SunOS Specific */ -//#define __TIOCTCNTL _IOW('t', 32, int) /* SunOS Specific */ -//#define __TIOCSIGNAL _IOW('t', 33, int) /* SunOS Specific */ -//#define __TIOCSETX _IOW('t', 34, int) /* SunOS Specific */ -//#define __TIOCGETX _IOR('t', 35, int) /* SunOS Specific */ -#define TARGET_TIOCCONS TARGET_IO('t', 36) -//#define __TIOCSSIZE _IOW('t', 37, struct sunos_ttysize) /* SunOS Specific */ -//#define __TIOCGSIZE _IOR('t', 38, struct sunos_ttysize) /* SunOS Specific */ -#define TARGET_TIOCGSOFTCAR TARGET_IOR('t', 100, int) -#define TARGET_TIOCSSOFTCAR TARGET_IOW('t', 101, int) -//#define __TIOCUCNTL _IOW('t', 102, int) /* SunOS Specific */ -#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) -#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) -//#define __TIOCREMOTE _IOW('t', 105, int) /* SunOS Specific */ -#define TARGET_TIOCMGET TARGET_IOR('t', 106, int) -#define TARGET_TIOCMBIC TARGET_IOW('t', 107, int) -#define TARGET_TIOCMBIS TARGET_IOW('t', 108, int) -#define TARGET_TIOCMSET TARGET_IOW('t', 109, int) -#define TARGET_TIOCSTART TARGET_IO('t', 110) -#define TARGET_TIOCSTOP TARGET_IO('t', 111) -#define TARGET_TIOCPKT TARGET_IOW('t', 112, int) -#define TARGET_TIOCNOTTY TARGET_IO('t', 113) -#define TARGET_TIOCSTI TARGET_IOW('t', 114, char) -#define TARGET_TIOCOUTQ TARGET_IOR('t', 115, int) -//#define __TIOCGLTC _IOR('t', 116, struct ltchars) /* SunOS Specific */ -//#define __TIOCSLTC _IOW('t', 117, struct ltchars) /* SunOS Specific */ -/* 118 is the non-posix setpgrp tty ioctl */ -/* 119 is the non-posix getpgrp tty ioctl */ -//#define __TIOCCDTR TARGET_IO('t', 120) /* SunOS Specific */ -//#define __TIOCSDTR TARGET_IO('t', 121) /* SunOS Specific */ -#define TARGET_TIOCCBRK TARGET_IO('t', 122) -#define TARGET_TIOCSBRK TARGET_IO('t', 123) -//#define __TIOCLGET TARGET_IOW('t', 124, int) /* SunOS Specific */ -//#define __TIOCLSET TARGET_IOW('t', 125, int) /* SunOS Specific */ -//#define __TIOCLBIC TARGET_IOW('t', 126, int) /* SunOS Specific */ -//#define __TIOCLBIS TARGET_IOW('t', 127, int) /* SunOS Specific */ -//#define __TIOCISPACE TARGET_IOR('t', 128, int) /* SunOS Specific */ -//#define __TIOCISIZE TARGET_IOR('t', 129, int) /* SunOS Specific */ -#define TARGET_TIOCSPGRP TARGET_IOW('t', 130, int) -#define TARGET_TIOCGPGRP TARGET_IOR('t', 131, int) -#define TARGET_TIOCSCTTY TARGET_IO('t', 132) -#define TARGET_TIOCGSID TARGET_IOR('t', 133, int) -/* Get minor device of a pty master's FD -- Solaris equiv is ISPTM */ -#define TARGET_TIOCGPTN TARGET_IOR('t', 134, unsigned int) /* Get Pty Number */ -#define TARGET_TIOCSPTLCK TARGET_IOW('t', 135, int) /* Lock/unlock PTY */ - -/* Little f */ -#define TARGET_FIOCLEX TARGET_IO('f', 1) -#define TARGET_FIONCLEX TARGET_IO('f', 2) -#define TARGET_FIOASYNC TARGET_IOW('f', 125, int) -#define TARGET_FIONBIO TARGET_IOW('f', 126, int) -#define TARGET_FIONREAD TARGET_IOR('f', 127, int) -#define TARGET_TIOCINQ TARGET_FIONREAD - -/* SCARY Rutgers local SunOS kernel hackery, perhaps I will support it - * someday. This is completely bogus, I know... - */ -//#define __TCGETSTAT TARGET_IO('T', 200) /* Rutgers specific */ -//#define __TCSETSTAT TARGET_IO('T', 201) /* Rutgers specific */ - -/* Linux specific, no SunOS equivalent. */ -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TCSBRKP 0x5425 -#define TARGET_TIOCTTYGSTRUCT 0x5426 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ -#define TARGET_TIOCMIWAIT 0x545C /* Wait input */ -#define TARGET_TIOCGICOUNT 0x545D /* Read serial port inline interrupt counts */ diff --git a/qemu/linux-user/strace.c b/qemu/linux-user/strace.c deleted file mode 100644 index 0810c85fb..000000000 --- a/qemu/linux-user/strace.c +++ /dev/null @@ -1,1616 +0,0 @@ -#include "qemu/osdep.h" -#include <sys/ipc.h> -#include <sys/msg.h> -#include <sys/sem.h> -#include <sys/shm.h> -#include <sys/select.h> -#include <sys/mount.h> -#include <sys/mman.h> -#include <sched.h> -#include "qemu.h" - -int do_strace=0; - -struct syscallname { - int nr; - const char *name; - const char *format; - void (*call)(const struct syscallname *, - abi_long, abi_long, abi_long, - abi_long, abi_long, abi_long); - void (*result)(const struct syscallname *, abi_long); -}; - -#ifdef __GNUC__ -/* - * It is possible that target doesn't have syscall that uses - * following flags but we don't want the compiler to warn - * us about them being unused. Same applies to utility print - * functions. It is ok to keep them while not used. - */ -#define UNUSED __attribute__ ((unused)) -#else -#define UNUSED -#endif - -/* - * Structure used to translate flag values into strings. This is - * similar that is in the actual strace tool. - */ -struct flags { - abi_long f_value; /* flag */ - const char *f_string; /* stringified flag */ -}; - -/* common flags for all architectures */ -#define FLAG_GENERIC(name) { name, #name } -/* target specific flags (syscall_defs.h has TARGET_<flag>) */ -#define FLAG_TARGET(name) { TARGET_ ## name, #name } -/* end of flags array */ -#define FLAG_END { 0, NULL } - -UNUSED static const char *get_comma(int); -UNUSED static void print_pointer(abi_long, int); -UNUSED static void print_flags(const struct flags *, abi_long, int); -UNUSED static void print_at_dirfd(abi_long, int); -UNUSED static void print_file_mode(abi_long, int); -UNUSED static void print_open_flags(abi_long, int); -UNUSED static void print_syscall_prologue(const struct syscallname *); -UNUSED static void print_syscall_epilogue(const struct syscallname *); -UNUSED static void print_string(abi_long, int); -UNUSED static void print_raw_param(const char *, abi_long, int); -UNUSED static void print_timeval(abi_ulong, int); -UNUSED static void print_number(abi_long, int); -UNUSED static void print_signal(abi_ulong, int); - -/* - * Utility functions - */ -static void -print_ipc_cmd(int cmd) -{ -#define output_cmd(val) \ -if( cmd == val ) { \ - gemu_log(#val); \ - return; \ -} - - cmd &= 0xff; - - /* General IPC commands */ - output_cmd( IPC_RMID ); - output_cmd( IPC_SET ); - output_cmd( IPC_STAT ); - output_cmd( IPC_INFO ); - /* msgctl() commands */ - #ifdef __USER_MISC - output_cmd( MSG_STAT ); - output_cmd( MSG_INFO ); - #endif - /* shmctl() commands */ - output_cmd( SHM_LOCK ); - output_cmd( SHM_UNLOCK ); - output_cmd( SHM_STAT ); - output_cmd( SHM_INFO ); - /* semctl() commands */ - output_cmd( GETPID ); - output_cmd( GETVAL ); - output_cmd( GETALL ); - output_cmd( GETNCNT ); - output_cmd( GETZCNT ); - output_cmd( SETVAL ); - output_cmd( SETALL ); - output_cmd( SEM_STAT ); - output_cmd( SEM_INFO ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - output_cmd( IPC_RMID ); - - /* Some value we don't recognize */ - gemu_log("%d",cmd); -} - -static void -print_signal(abi_ulong arg, int last) -{ - const char *signal_name = NULL; - switch(arg) { - case TARGET_SIGHUP: signal_name = "SIGHUP"; break; - case TARGET_SIGINT: signal_name = "SIGINT"; break; - case TARGET_SIGQUIT: signal_name = "SIGQUIT"; break; - case TARGET_SIGILL: signal_name = "SIGILL"; break; - case TARGET_SIGABRT: signal_name = "SIGABRT"; break; - case TARGET_SIGFPE: signal_name = "SIGFPE"; break; - case TARGET_SIGKILL: signal_name = "SIGKILL"; break; - case TARGET_SIGSEGV: signal_name = "SIGSEGV"; break; - case TARGET_SIGPIPE: signal_name = "SIGPIPE"; break; - case TARGET_SIGALRM: signal_name = "SIGALRM"; break; - case TARGET_SIGTERM: signal_name = "SIGTERM"; break; - case TARGET_SIGUSR1: signal_name = "SIGUSR1"; break; - case TARGET_SIGUSR2: signal_name = "SIGUSR2"; break; - case TARGET_SIGCHLD: signal_name = "SIGCHLD"; break; - case TARGET_SIGCONT: signal_name = "SIGCONT"; break; - case TARGET_SIGSTOP: signal_name = "SIGSTOP"; break; - case TARGET_SIGTTIN: signal_name = "SIGTTIN"; break; - case TARGET_SIGTTOU: signal_name = "SIGTTOU"; break; - } - if (signal_name == NULL) { - print_raw_param("%ld", arg, last); - return; - } - gemu_log("%s%s", signal_name, get_comma(last)); -} - -#ifdef TARGET_NR__newselect -static void -print_fdset(int n, abi_ulong target_fds_addr) -{ - int i; - - gemu_log("["); - if( target_fds_addr ) { - abi_long *target_fds; - - target_fds = lock_user(VERIFY_READ, - target_fds_addr, - sizeof(*target_fds)*(n / TARGET_ABI_BITS + 1), - 1); - - if (!target_fds) - return; - - for (i=n; i>=0; i--) { - if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i & (TARGET_ABI_BITS - 1))) & 1) - gemu_log("%d,", i ); - } - unlock_user(target_fds, target_fds_addr, 0); - } - gemu_log("]"); -} -#endif - -/* - * Sysycall specific output functions - */ - -/* select */ -#ifdef TARGET_NR__newselect -static long newselect_arg1 = 0; -static long newselect_arg2 = 0; -static long newselect_arg3 = 0; -static long newselect_arg4 = 0; -static long newselect_arg5 = 0; - -static void -print_newselect(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - gemu_log("%s(" TARGET_ABI_FMT_ld ",", name->name, arg1); - print_fdset(arg1, arg2); - gemu_log(","); - print_fdset(arg1, arg3); - gemu_log(","); - print_fdset(arg1, arg4); - gemu_log(","); - print_timeval(arg5, 1); - gemu_log(")"); - - /* save for use in the return output function below */ - newselect_arg1=arg1; - newselect_arg2=arg2; - newselect_arg3=arg3; - newselect_arg4=arg4; - newselect_arg5=arg5; -} -#endif - -#ifdef TARGET_NR_semctl -static void -print_semctl(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", name->name, arg1, arg2); - print_ipc_cmd(arg3); - gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4); -} -#endif - -static void -print_execve(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - abi_ulong arg_ptr_addr; - char *s; - - if (!(s = lock_user_string(arg1))) - return; - gemu_log("%s(\"%s\",{", name->name, s); - unlock_user(s, arg1, 0); - - for (arg_ptr_addr = arg2; ; arg_ptr_addr += sizeof(abi_ulong)) { - abi_ulong *arg_ptr, arg_addr; - - arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1); - if (!arg_ptr) - return; - arg_addr = tswapal(*arg_ptr); - unlock_user(arg_ptr, arg_ptr_addr, 0); - if (!arg_addr) - break; - if ((s = lock_user_string(arg_addr))) { - gemu_log("\"%s\",", s); - unlock_user(s, arg_addr, 0); - } - } - - gemu_log("NULL})"); -} - -#ifdef TARGET_NR_ipc -static void -print_ipc(const struct syscallname *name, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - switch(arg1) { - case IPCOP_semctl: - gemu_log("semctl(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", arg1, arg2); - print_ipc_cmd(arg3); - gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4); - break; - default: - gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ")", - name->name, arg1, arg2, arg3, arg4); - } -} -#endif - -/* - * Variants for the return value output function - */ - -static void -print_syscall_ret_addr(const struct syscallname *name, abi_long ret) -{ - char *errstr = NULL; - - if (ret < 0) { - errstr = target_strerror(-ret); - } - if (errstr) { - gemu_log(" = -1 errno=%d (%s)\n", (int)-ret, errstr); - } else { - gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret); - } -} - -#if 0 /* currently unused */ -static void -print_syscall_ret_raw(struct syscallname *name, abi_long ret) -{ - gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret); -} -#endif - -#ifdef TARGET_NR__newselect -static void -print_syscall_ret_newselect(const struct syscallname *name, abi_long ret) -{ - gemu_log(" = 0x" TARGET_ABI_FMT_lx " (", ret); - print_fdset(newselect_arg1,newselect_arg2); - gemu_log(","); - print_fdset(newselect_arg1,newselect_arg3); - gemu_log(","); - print_fdset(newselect_arg1,newselect_arg4); - gemu_log(","); - print_timeval(newselect_arg5, 1); - gemu_log(")\n"); -} -#endif - -UNUSED static struct flags access_flags[] = { - FLAG_GENERIC(F_OK), - FLAG_GENERIC(R_OK), - FLAG_GENERIC(W_OK), - FLAG_GENERIC(X_OK), - FLAG_END, -}; - -UNUSED static struct flags at_file_flags[] = { -#ifdef AT_EACCESS - FLAG_GENERIC(AT_EACCESS), -#endif -#ifdef AT_SYMLINK_NOFOLLOW - FLAG_GENERIC(AT_SYMLINK_NOFOLLOW), -#endif - FLAG_END, -}; - -UNUSED static struct flags unlinkat_flags[] = { -#ifdef AT_REMOVEDIR - FLAG_GENERIC(AT_REMOVEDIR), -#endif - FLAG_END, -}; - -UNUSED static struct flags mode_flags[] = { - FLAG_GENERIC(S_IFSOCK), - FLAG_GENERIC(S_IFLNK), - FLAG_GENERIC(S_IFREG), - FLAG_GENERIC(S_IFBLK), - FLAG_GENERIC(S_IFDIR), - FLAG_GENERIC(S_IFCHR), - FLAG_GENERIC(S_IFIFO), - FLAG_END, -}; - -UNUSED static struct flags open_access_flags[] = { - FLAG_TARGET(O_RDONLY), - FLAG_TARGET(O_WRONLY), - FLAG_TARGET(O_RDWR), - FLAG_END, -}; - -UNUSED static struct flags open_flags[] = { - FLAG_TARGET(O_APPEND), - FLAG_TARGET(O_CREAT), - FLAG_TARGET(O_DIRECTORY), - FLAG_TARGET(O_EXCL), - FLAG_TARGET(O_LARGEFILE), - FLAG_TARGET(O_NOCTTY), - FLAG_TARGET(O_NOFOLLOW), - FLAG_TARGET(O_NONBLOCK), /* also O_NDELAY */ - FLAG_TARGET(O_DSYNC), - FLAG_TARGET(__O_SYNC), - FLAG_TARGET(O_TRUNC), -#ifdef O_DIRECT - FLAG_TARGET(O_DIRECT), -#endif -#ifdef O_NOATIME - FLAG_TARGET(O_NOATIME), -#endif -#ifdef O_CLOEXEC - FLAG_TARGET(O_CLOEXEC), -#endif -#ifdef O_PATH - FLAG_TARGET(O_PATH), -#endif - FLAG_END, -}; - -UNUSED static struct flags mount_flags[] = { -#ifdef MS_BIND - FLAG_GENERIC(MS_BIND), -#endif -#ifdef MS_DIRSYNC - FLAG_GENERIC(MS_DIRSYNC), -#endif - FLAG_GENERIC(MS_MANDLOCK), -#ifdef MS_MOVE - FLAG_GENERIC(MS_MOVE), -#endif - FLAG_GENERIC(MS_NOATIME), - FLAG_GENERIC(MS_NODEV), - FLAG_GENERIC(MS_NODIRATIME), - FLAG_GENERIC(MS_NOEXEC), - FLAG_GENERIC(MS_NOSUID), - FLAG_GENERIC(MS_RDONLY), -#ifdef MS_RELATIME - FLAG_GENERIC(MS_RELATIME), -#endif - FLAG_GENERIC(MS_REMOUNT), - FLAG_GENERIC(MS_SYNCHRONOUS), - FLAG_END, -}; - -UNUSED static struct flags umount2_flags[] = { -#ifdef MNT_FORCE - FLAG_GENERIC(MNT_FORCE), -#endif -#ifdef MNT_DETACH - FLAG_GENERIC(MNT_DETACH), -#endif -#ifdef MNT_EXPIRE - FLAG_GENERIC(MNT_EXPIRE), -#endif - FLAG_END, -}; - -UNUSED static struct flags mmap_prot_flags[] = { - FLAG_GENERIC(PROT_NONE), - FLAG_GENERIC(PROT_EXEC), - FLAG_GENERIC(PROT_READ), - FLAG_GENERIC(PROT_WRITE), - FLAG_TARGET(PROT_SEM), - FLAG_GENERIC(PROT_GROWSDOWN), - FLAG_GENERIC(PROT_GROWSUP), - FLAG_END, -}; - -UNUSED static struct flags mmap_flags[] = { - FLAG_TARGET(MAP_SHARED), - FLAG_TARGET(MAP_PRIVATE), - FLAG_TARGET(MAP_ANONYMOUS), - FLAG_TARGET(MAP_DENYWRITE), - FLAG_TARGET(MAP_FIXED), - FLAG_TARGET(MAP_GROWSDOWN), - FLAG_TARGET(MAP_EXECUTABLE), -#ifdef MAP_LOCKED - FLAG_TARGET(MAP_LOCKED), -#endif -#ifdef MAP_NONBLOCK - FLAG_TARGET(MAP_NONBLOCK), -#endif - FLAG_TARGET(MAP_NORESERVE), -#ifdef MAP_POPULATE - FLAG_TARGET(MAP_POPULATE), -#endif -#ifdef TARGET_MAP_UNINITIALIZED - FLAG_TARGET(MAP_UNINITIALIZED), -#endif - FLAG_END, -}; - -UNUSED static struct flags clone_flags[] = { - FLAG_GENERIC(CLONE_VM), - FLAG_GENERIC(CLONE_FS), - FLAG_GENERIC(CLONE_FILES), - FLAG_GENERIC(CLONE_SIGHAND), - FLAG_GENERIC(CLONE_PTRACE), - FLAG_GENERIC(CLONE_VFORK), - FLAG_GENERIC(CLONE_PARENT), - FLAG_GENERIC(CLONE_THREAD), - FLAG_GENERIC(CLONE_NEWNS), - FLAG_GENERIC(CLONE_SYSVSEM), - FLAG_GENERIC(CLONE_SETTLS), - FLAG_GENERIC(CLONE_PARENT_SETTID), - FLAG_GENERIC(CLONE_CHILD_CLEARTID), - FLAG_GENERIC(CLONE_DETACHED), - FLAG_GENERIC(CLONE_UNTRACED), - FLAG_GENERIC(CLONE_CHILD_SETTID), -#if defined(CLONE_NEWUTS) - FLAG_GENERIC(CLONE_NEWUTS), -#endif -#if defined(CLONE_NEWIPC) - FLAG_GENERIC(CLONE_NEWIPC), -#endif -#if defined(CLONE_NEWUSER) - FLAG_GENERIC(CLONE_NEWUSER), -#endif -#if defined(CLONE_NEWPID) - FLAG_GENERIC(CLONE_NEWPID), -#endif -#if defined(CLONE_NEWNET) - FLAG_GENERIC(CLONE_NEWNET), -#endif -#if defined(CLONE_IO) - FLAG_GENERIC(CLONE_IO), -#endif - FLAG_END, -}; - -/* - * print_xxx utility functions. These are used to print syscall - * parameters in certain format. All of these have parameter - * named 'last'. This parameter is used to add comma to output - * when last == 0. - */ - -static const char * -get_comma(int last) -{ - return ((last) ? "" : ","); -} - -static void -print_flags(const struct flags *f, abi_long flags, int last) -{ - const char *sep = ""; - int n; - - if ((flags == 0) && (f->f_value == 0)) { - gemu_log("%s%s", f->f_string, get_comma(last)); - return; - } - for (n = 0; f->f_string != NULL; f++) { - if ((f->f_value != 0) && ((flags & f->f_value) == f->f_value)) { - gemu_log("%s%s", sep, f->f_string); - flags &= ~f->f_value; - sep = "|"; - n++; - } - } - - if (n > 0) { - /* print rest of the flags as numeric */ - if (flags != 0) { - gemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last)); - } else { - gemu_log("%s", get_comma(last)); - } - } else { - /* no string version of flags found, print them in hex then */ - gemu_log("%#x%s", (unsigned int)flags, get_comma(last)); - } -} - -static void -print_at_dirfd(abi_long dirfd, int last) -{ -#ifdef AT_FDCWD - if (dirfd == AT_FDCWD) { - gemu_log("AT_FDCWD%s", get_comma(last)); - return; - } -#endif - gemu_log("%d%s", (int)dirfd, get_comma(last)); -} - -static void -print_file_mode(abi_long mode, int last) -{ - const char *sep = ""; - const struct flags *m; - - for (m = &mode_flags[0]; m->f_string != NULL; m++) { - if ((m->f_value & mode) == m->f_value) { - gemu_log("%s%s", m->f_string, sep); - sep = "|"; - mode &= ~m->f_value; - break; - } - } - - mode &= ~S_IFMT; - /* print rest of the mode as octal */ - if (mode != 0) - gemu_log("%s%#o", sep, (unsigned int)mode); - - gemu_log("%s", get_comma(last)); -} - -static void -print_open_flags(abi_long flags, int last) -{ - print_flags(open_access_flags, flags & TARGET_O_ACCMODE, 1); - flags &= ~TARGET_O_ACCMODE; - if (flags == 0) { - gemu_log("%s", get_comma(last)); - return; - } - gemu_log("|"); - print_flags(open_flags, flags, last); -} - -static void -print_syscall_prologue(const struct syscallname *sc) -{ - gemu_log("%s(", sc->name); -} - -/*ARGSUSED*/ -static void -print_syscall_epilogue(const struct syscallname *sc) -{ - (void)sc; - gemu_log(")"); -} - -static void -print_string(abi_long addr, int last) -{ - char *s; - - if ((s = lock_user_string(addr)) != NULL) { - gemu_log("\"%s\"%s", s, get_comma(last)); - unlock_user(s, addr, 0); - } else { - /* can't get string out of it, so print it as pointer */ - print_pointer(addr, last); - } -} - -/* - * Prints out raw parameter using given format. Caller needs - * to do byte swapping if needed. - */ -static void -print_raw_param(const char *fmt, abi_long param, int last) -{ - char format[64]; - - (void) snprintf(format, sizeof (format), "%s%s", fmt, get_comma(last)); - gemu_log(format, param); -} - -static void -print_pointer(abi_long p, int last) -{ - if (p == 0) - gemu_log("NULL%s", get_comma(last)); - else - gemu_log("0x" TARGET_ABI_FMT_lx "%s", p, get_comma(last)); -} - -/* - * Reads 32-bit (int) number from guest address space from - * address 'addr' and prints it. - */ -static void -print_number(abi_long addr, int last) -{ - if (addr == 0) { - gemu_log("NULL%s", get_comma(last)); - } else { - int num; - - get_user_s32(num, addr); - gemu_log("[%d]%s", num, get_comma(last)); - } -} - -static void -print_timeval(abi_ulong tv_addr, int last) -{ - if( tv_addr ) { - struct target_timeval *tv; - - tv = lock_user(VERIFY_READ, tv_addr, sizeof(*tv), 1); - if (!tv) - return; - gemu_log("{" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "}%s", - tswapal(tv->tv_sec), tswapal(tv->tv_usec), get_comma(last)); - unlock_user(tv, tv_addr, 0); - } else - gemu_log("NULL%s", get_comma(last)); -} - -#undef UNUSED - -#ifdef TARGET_NR_accept -static void -print_accept(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_pointer(arg1, 0); - print_number(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_access -static void -print_access(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_flags(access_flags, arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_brk -static void -print_brk(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_chdir -static void -print_chdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_chmod -static void -print_chmod(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_clone -static void -print_clone(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); -#if defined(TARGET_M68K) - print_flags(clone_flags, arg0, 0); - print_raw_param("newsp=0x" TARGET_ABI_FMT_lx, arg1, 1); -#elif defined(TARGET_SH4) || defined(TARGET_ALPHA) - print_flags(clone_flags, arg0, 0); - print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg1, 0); - print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0); - print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg3, 0); - print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg4, 1); -#elif defined(TARGET_CRIS) - print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg0, 0); - print_flags(clone_flags, arg1, 0); - print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0); - print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg3, 0); - print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg4, 1); -#else - print_flags(clone_flags, arg0, 0); - print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg1, 0); - print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0); - print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg3, 0); - print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg4, 1); -#endif - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_creat -static void -print_creat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_execv -static void -print_execv(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_raw_param("0x" TARGET_ABI_FMT_lx, arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_faccessat -static void -print_faccessat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_flags(access_flags, arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_fchmodat -static void -print_fchmodat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_fchownat -static void -print_fchownat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_raw_param("%d", arg2, 0); - print_raw_param("%d", arg3, 0); - print_flags(at_file_flags, arg4, 1); - print_syscall_epilogue(name); -} -#endif - -#if defined(TARGET_NR_fcntl) || defined(TARGET_NR_fcntl64) -static void -print_fcntl(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - switch(arg1) { - case TARGET_F_DUPFD: - gemu_log("F_DUPFD,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_GETFD: - gemu_log("F_GETFD"); - break; - case TARGET_F_SETFD: - gemu_log("F_SETFD,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_GETFL: - gemu_log("F_GETFL"); - break; - case TARGET_F_SETFL: - gemu_log("F_SETFL,"); - print_open_flags(arg2, 1); - break; - case TARGET_F_GETLK: - gemu_log("F_GETLK,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLK: - gemu_log("F_SETLK,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLKW: - gemu_log("F_SETLKW,"); - print_pointer(arg2, 1); - break; - case TARGET_F_GETOWN: - gemu_log("F_GETOWN"); - break; - case TARGET_F_SETOWN: - gemu_log("F_SETOWN,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - case TARGET_F_GETSIG: - gemu_log("F_GETSIG"); - break; - case TARGET_F_SETSIG: - gemu_log("F_SETSIG,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; -#if TARGET_ABI_BITS == 32 - case TARGET_F_GETLK64: - gemu_log("F_GETLK64,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLK64: - gemu_log("F_SETLK64,"); - print_pointer(arg2, 1); - break; - case TARGET_F_SETLKW64: - gemu_log("F_SETLKW64,"); - print_pointer(arg2, 1); - break; -#endif - case TARGET_F_SETLEASE: - gemu_log("F_SETLEASE,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - case TARGET_F_GETLEASE: - gemu_log("F_GETLEASE"); - break; - case TARGET_F_DUPFD_CLOEXEC: - gemu_log("F_DUPFD_CLOEXEC,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 1); - break; - case TARGET_F_NOTIFY: - gemu_log("F_NOTIFY,"); - print_raw_param(TARGET_ABI_FMT_ld, arg2, 0); - break; - default: - print_raw_param(TARGET_ABI_FMT_ld, arg1, 0); - print_pointer(arg2, 1); - break; - } - print_syscall_epilogue(name); -} -#define print_fcntl64 print_fcntl -#endif - - -#ifdef TARGET_NR_futimesat -static void -print_futimesat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_timeval(arg2, 0); - print_timeval(arg2 + sizeof (struct target_timeval), 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_link -static void -print_link(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_linkat -static void -print_linkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_at_dirfd(arg2, 0); - print_string(arg3, 0); - print_flags(at_file_flags, arg4, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR__llseek -static void -print__llseek(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - const char *whence = "UNKNOWN"; - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_raw_param("%ld", arg1, 0); - print_raw_param("%ld", arg2, 0); - print_pointer(arg3, 0); - switch(arg4) { - case SEEK_SET: whence = "SEEK_SET"; break; - case SEEK_CUR: whence = "SEEK_CUR"; break; - case SEEK_END: whence = "SEEK_END"; break; - } - gemu_log("%s",whence); - print_syscall_epilogue(name); -} -#endif - -#if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) || \ - defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) -static void -print_stat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#define print_lstat print_stat -#define print_stat64 print_stat -#define print_lstat64 print_stat -#endif - -#if defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64) -static void -print_fstat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#define print_fstat64 print_fstat -#endif - -#ifdef TARGET_NR_mkdir -static void -print_mkdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mkdirat -static void -print_mkdirat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_rmdir -static void -print_rmdir(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_rt_sigaction -static void -print_rt_sigaction(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_signal(arg0, 0); - print_pointer(arg1, 0); - print_pointer(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_rt_sigprocmask -static void -print_rt_sigprocmask(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - const char *how = "UNKNOWN"; - print_syscall_prologue(name); - switch(arg0) { - case TARGET_SIG_BLOCK: how = "SIG_BLOCK"; break; - case TARGET_SIG_UNBLOCK: how = "SIG_UNBLOCK"; break; - case TARGET_SIG_SETMASK: how = "SIG_SETMASK"; break; - } - gemu_log("%s,",how); - print_pointer(arg1, 0); - print_pointer(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mknod -static void -print_mknod(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int hasdev = (arg1 & (S_IFCHR|S_IFBLK)); - - print_syscall_prologue(name); - print_string(arg0, 0); - print_file_mode(arg1, (hasdev == 0)); - if (hasdev) { - print_raw_param("makedev(%d", major(arg2), 0); - print_raw_param("%d)", minor(arg2), 1); - } - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mknodat -static void -print_mknodat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int hasdev = (arg2 & (S_IFCHR|S_IFBLK)); - - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_file_mode(arg2, (hasdev == 0)); - if (hasdev) { - print_raw_param("makedev(%d", major(arg3), 0); - print_raw_param("%d)", minor(arg3), 1); - } - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mq_open -static void -print_mq_open(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int is_creat = (arg1 & TARGET_O_CREAT); - - print_syscall_prologue(name); - print_string(arg0, 0); - print_open_flags(arg1, (is_creat == 0)); - if (is_creat) { - print_file_mode(arg2, 0); - print_pointer(arg3, 1); - } - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_open -static void -print_open(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int is_creat = (arg1 & TARGET_O_CREAT); - - print_syscall_prologue(name); - print_string(arg0, 0); - print_open_flags(arg1, (is_creat == 0)); - if (is_creat) - print_file_mode(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_openat -static void -print_openat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - int is_creat = (arg2 & TARGET_O_CREAT); - - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_open_flags(arg2, (is_creat == 0)); - if (is_creat) - print_file_mode(arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mq_unlink -static void -print_mq_unlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#if defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat) -static void -print_fstatat64(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_pointer(arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#define print_newfstatat print_fstatat64 -#endif - -#ifdef TARGET_NR_readlink -static void -print_readlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 0); - print_raw_param("%u", arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_readlinkat -static void -print_readlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_pointer(arg2, 0); - print_raw_param("%u", arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_rename -static void -print_rename(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_renameat -static void -print_renameat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_at_dirfd(arg2, 0); - print_string(arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_statfs -static void -print_statfs(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#define print_statfs64 print_statfs -#endif - -#ifdef TARGET_NR_symlink -static void -print_symlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_symlinkat -static void -print_symlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_at_dirfd(arg1, 0); - print_string(arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_mount -static void -print_mount(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_string(arg1, 0); - print_string(arg2, 0); - print_flags(mount_flags, arg3, 0); - print_pointer(arg4, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_umount -static void -print_umount(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_umount2 -static void -print_umount2(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_flags(umount2_flags, arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_unlink -static void -print_unlink(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_unlinkat -static void -print_unlinkat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_flags(unlinkat_flags, arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_utime -static void -print_utime(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_utimes -static void -print_utimes(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_string(arg0, 0); - print_pointer(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_utimensat -static void -print_utimensat(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_at_dirfd(arg0, 0); - print_string(arg1, 0); - print_pointer(arg2, 0); - print_flags(at_file_flags, arg3, 1); - print_syscall_epilogue(name); -} -#endif - -#if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2) -static void -print_mmap(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 0); - print_flags(mmap_prot_flags, arg2, 0); - print_flags(mmap_flags, arg3, 0); - print_raw_param("%d", arg4, 0); - print_raw_param("%#x", arg5, 1); - print_syscall_epilogue(name); -} -#define print_mmap2 print_mmap -#endif - -#ifdef TARGET_NR_mprotect -static void -print_mprotect(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 0); - print_flags(mmap_prot_flags, arg2, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_munmap -static void -print_munmap(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_raw_param("%d", arg1, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_futex -static void print_futex_op(abi_long tflag, int last) -{ -#define print_op(val) \ -if( cmd == val ) { \ - gemu_log(#val); \ - return; \ -} - - int cmd = (int)tflag; -#ifdef FUTEX_PRIVATE_FLAG - if (cmd & FUTEX_PRIVATE_FLAG) { - gemu_log("FUTEX_PRIVATE_FLAG|"); - cmd &= ~FUTEX_PRIVATE_FLAG; - } -#endif -#ifdef FUTEX_CLOCK_REALTIME - if (cmd & FUTEX_CLOCK_REALTIME) { - gemu_log("FUTEX_CLOCK_REALTIME|"); - cmd &= ~FUTEX_CLOCK_REALTIME; - } -#endif - print_op(FUTEX_WAIT) - print_op(FUTEX_WAKE) - print_op(FUTEX_FD) - print_op(FUTEX_REQUEUE) - print_op(FUTEX_CMP_REQUEUE) - print_op(FUTEX_WAKE_OP) - print_op(FUTEX_LOCK_PI) - print_op(FUTEX_UNLOCK_PI) - print_op(FUTEX_TRYLOCK_PI) -#ifdef FUTEX_WAIT_BITSET - print_op(FUTEX_WAIT_BITSET) -#endif -#ifdef FUTEX_WAKE_BITSET - print_op(FUTEX_WAKE_BITSET) -#endif - /* unknown values */ - gemu_log("%d",cmd); -} - -static void -print_futex(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_pointer(arg0, 0); - print_futex_op(arg1, 0); - print_raw_param(",%d", arg2, 0); - print_pointer(arg3, 0); /* struct timespec */ - print_pointer(arg4, 0); - print_raw_param("%d", arg4, 1); - print_syscall_epilogue(name); -} -#endif - -#ifdef TARGET_NR_kill -static void -print_kill(const struct syscallname *name, - abi_long arg0, abi_long arg1, abi_long arg2, - abi_long arg3, abi_long arg4, abi_long arg5) -{ - print_syscall_prologue(name); - print_raw_param("%d", arg0, 0); - print_signal(arg1, 1); - print_syscall_epilogue(name); -} -#endif - -/* - * An array of all of the syscalls we know about - */ - -static const struct syscallname scnames[] = { -#include "strace.list" -}; - -static int nsyscalls = ARRAY_SIZE(scnames); - -/* - * The public interface to this module. - */ -void -print_syscall(int num, - abi_long arg1, abi_long arg2, abi_long arg3, - abi_long arg4, abi_long arg5, abi_long arg6) -{ - int i; - const char *format="%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ")"; - - gemu_log("%d ", getpid() ); - - for(i=0;i<nsyscalls;i++) - if( scnames[i].nr == num ) { - if( scnames[i].call != NULL ) { - scnames[i].call(&scnames[i],arg1,arg2,arg3,arg4,arg5,arg6); - } else { - /* XXX: this format system is broken because it uses - host types and host pointers for strings */ - if( scnames[i].format != NULL ) - format = scnames[i].format; - gemu_log(format,scnames[i].name, arg1,arg2,arg3,arg4,arg5,arg6); - } - return; - } - gemu_log("Unknown syscall %d\n", num); -} - - -void -print_syscall_ret(int num, abi_long ret) -{ - int i; - char *errstr = NULL; - - for(i=0;i<nsyscalls;i++) - if( scnames[i].nr == num ) { - if( scnames[i].result != NULL ) { - scnames[i].result(&scnames[i],ret); - } else { - if (ret < 0) { - errstr = target_strerror(-ret); - } - if (errstr) { - gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n", - -ret, errstr); - } else { - gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret); - } - } - break; - } -} diff --git a/qemu/linux-user/strace.list b/qemu/linux-user/strace.list deleted file mode 100644 index aa0cd735c..000000000 --- a/qemu/linux-user/strace.list +++ /dev/null @@ -1,1544 +0,0 @@ -/* - * Note that if you change format strings in these, check also - * that corresponding print functions are able to handle string - * locking correctly (see strace.c). - */ -#ifdef TARGET_NR_accept -{ TARGET_NR_accept, "accept" , NULL, print_accept, NULL }, -#endif -#ifdef TARGET_NR_access -{ TARGET_NR_access, "access" , NULL, print_access, NULL }, -#endif -#ifdef TARGET_NR_acct -{ TARGET_NR_acct, "acct" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_add_key -{ TARGET_NR_add_key, "add_key" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_adjtimex -{ TARGET_NR_adjtimex, "adjtimex" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_afs_syscall -{ TARGET_NR_afs_syscall, "afs_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_alarm -{ TARGET_NR_alarm, "alarm" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_aplib -{ TARGET_NR_aplib, "aplib" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_arch_prctl -{ TARGET_NR_arch_prctl, "arch_prctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_arm_fadvise64_64 -{ TARGET_NR_arm_fadvise64_64, "arm_fadvise64_64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_bdflush -{ TARGET_NR_bdflush, "bdflush" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_bind -{ TARGET_NR_bind, "bind" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_break -{ TARGET_NR_break, "break" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_brk -{ TARGET_NR_brk, "brk" , NULL, print_brk, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_cachectl -{ TARGET_NR_cachectl, "cachectl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_cacheflush -{ TARGET_NR_cacheflush, "cacheflush" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_capget -{ TARGET_NR_capget, "capget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_capset -{ TARGET_NR_capset, "capset" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_chdir -{ TARGET_NR_chdir, "chdir" , NULL, print_chdir, NULL }, -#endif -#ifdef TARGET_NR_chmod -{ TARGET_NR_chmod, "chmod" , NULL, print_chmod, NULL }, -#endif -#ifdef TARGET_NR_chown -{ TARGET_NR_chown, "chown" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_chown32 -{ TARGET_NR_chown32, "chown32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_chroot -{ TARGET_NR_chroot, "chroot" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_clock_getres -{ TARGET_NR_clock_getres, "clock_getres" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_clock_gettime -{ TARGET_NR_clock_gettime, "clock_gettime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_clock_nanosleep -{ TARGET_NR_clock_nanosleep, "clock_nanosleep" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_clock_settime -{ TARGET_NR_clock_settime, "clock_settime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_clone -{ TARGET_NR_clone, "clone" , NULL, print_clone, NULL }, -#endif -#ifdef TARGET_NR_close -{ TARGET_NR_close, "close" , "%s(%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_connect -{ TARGET_NR_connect, "connect" , "%s(%d,%#x,%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_creat -{ TARGET_NR_creat, "creat" , NULL, print_creat, NULL }, -#endif -#ifdef TARGET_NR_create_module -{ TARGET_NR_create_module, "create_module" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_delete_module -{ TARGET_NR_delete_module, "delete_module" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_dipc -{ TARGET_NR_dipc, "dipc" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_dup -{ TARGET_NR_dup, "dup" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_dup2 -{ TARGET_NR_dup2, "dup2" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_create -{ TARGET_NR_epoll_create, "epoll_create" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_create1 -{ TARGET_NR_epoll_create1, "epoll_create1" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_ctl -{ TARGET_NR_epoll_ctl, "epoll_ctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_ctl_old -{ TARGET_NR_epoll_ctl_old, "epoll_ctl_old" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_wait -{ TARGET_NR_epoll_wait, "epoll_wait" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_epoll_wait_old -{ TARGET_NR_epoll_wait_old, "epoll_wait_old" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_execv -{ TARGET_NR_execv, "execv" , NULL, print_execv, NULL }, -#endif -#ifdef TARGET_NR_execve -{ TARGET_NR_execve, "execve" , NULL, print_execve, NULL }, -#endif -#ifdef TARGET_NR_exec_with_loader -{ TARGET_NR_exec_with_loader, "exec_with_loader" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_exit -{ TARGET_NR_exit, "exit" , "%s(%d)\n", NULL, NULL }, -#endif -#ifdef TARGET_NR__exit -{ TARGET_NR__exit, "_exit" , "%s(%d)\n", NULL, NULL }, -#endif -#ifdef TARGET_NR_exit_group -{ TARGET_NR_exit_group, "exit_group" , "%s(%d)\n", NULL, NULL }, -#endif -#ifdef TARGET_NR_faccessat -{ TARGET_NR_faccessat, "faccessat" , NULL, print_faccessat, NULL }, -#endif -#ifdef TARGET_NR_fadvise64 -{ TARGET_NR_fadvise64, "fadvise64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fadvise64_64 -{ TARGET_NR_fadvise64_64, "fadvise64_64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fchdir -{ TARGET_NR_fchdir, "fchdir" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fchmod -{ TARGET_NR_fchmod, "fchmod" , "%s(%d,%#o)", NULL, NULL }, -#endif -#ifdef TARGET_NR_fchmodat -{ TARGET_NR_fchmodat, "fchmodat" , NULL, print_fchmodat, NULL }, -#endif -#ifdef TARGET_NR_fchown -{ TARGET_NR_fchown, "fchown" , "%s(%d,%d,%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_fchown32 -{ TARGET_NR_fchown32, "fchown32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fchownat -{ TARGET_NR_fchownat, "fchownat" , NULL, print_fchownat, NULL }, -#endif -#ifdef TARGET_NR_fcntl -{ TARGET_NR_fcntl, "fcntl" , NULL, print_fcntl, NULL }, -#endif -#ifdef TARGET_NR_fcntl64 -{ TARGET_NR_fcntl64, "fcntl64" , NULL, print_fcntl64, NULL }, -#endif -#ifdef TARGET_NR_fdatasync -{ TARGET_NR_fdatasync, "fdatasync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fgetxattr -{ TARGET_NR_fgetxattr, "fgetxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_flistxattr -{ TARGET_NR_flistxattr, "flistxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_flock -{ TARGET_NR_flock, "flock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fork -{ TARGET_NR_fork, "fork" , "%s()", NULL, NULL }, -#endif -#ifdef TARGET_NR_fremovexattr -{ TARGET_NR_fremovexattr, "fremovexattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fsetxattr -{ TARGET_NR_fsetxattr, "fsetxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fstat -{ TARGET_NR_fstat, "fstat" , NULL, print_fstat, NULL }, -#endif -#ifdef TARGET_NR_fstat64 -{ TARGET_NR_fstat64, "fstat64" , NULL, print_fstat64, NULL }, -#endif -#ifdef TARGET_NR_fstatfs -{ TARGET_NR_fstatfs, "fstatfs" , "%s(%d,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_fstatfs64 -{ TARGET_NR_fstatfs64, "fstatfs64" , "%s(%d,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_fsync -{ TARGET_NR_fsync, "fsync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ftime -{ TARGET_NR_ftime, "ftime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ftruncate -{ TARGET_NR_ftruncate, "ftruncate" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ftruncate64 -{ TARGET_NR_ftruncate64, "ftruncate64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_futex -{ TARGET_NR_futex, "futex" , NULL, print_futex, NULL }, -#endif -#ifdef TARGET_NR_futimesat -{ TARGET_NR_futimesat, "futimesat" , NULL, print_futimesat, NULL }, -#endif -#ifdef TARGET_NR_getcwd -{ TARGET_NR_getcwd, "getcwd" , "%s(%p,%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_getdents -{ TARGET_NR_getdents, "getdents" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getdents64 -{ TARGET_NR_getdents64, "getdents64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getdomainname -{ TARGET_NR_getdomainname, "getdomainname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getdtablesize -{ TARGET_NR_getdtablesize, "getdtablesize" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getegid -{ TARGET_NR_getegid, "getegid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getegid32 -{ TARGET_NR_getegid32, "getegid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_geteuid -{ TARGET_NR_geteuid, "geteuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_geteuid32 -{ TARGET_NR_geteuid32, "geteuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getgid -{ TARGET_NR_getgid, "getgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getgid32 -{ TARGET_NR_getgid32, "getgid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getgroups -{ TARGET_NR_getgroups, "getgroups" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getgroups32 -{ TARGET_NR_getgroups32, "getgroups32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_gethostname -{ TARGET_NR_gethostname, "gethostname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getitimer -{ TARGET_NR_getitimer, "getitimer" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_get_kernel_syms -{ TARGET_NR_get_kernel_syms, "get_kernel_syms" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_get_mempolicy -{ TARGET_NR_get_mempolicy, "get_mempolicy" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpagesize -{ TARGET_NR_getpagesize, "getpagesize" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpeername -{ TARGET_NR_getpeername, "getpeername" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpgid -{ TARGET_NR_getpgid, "getpgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpgrp -{ TARGET_NR_getpgrp, "getpgrp" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpid -{ TARGET_NR_getpid, "getpid" , "%s()", NULL, NULL }, -#endif -#ifdef TARGET_NR_getpmsg -{ TARGET_NR_getpmsg, "getpmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getppid -{ TARGET_NR_getppid, "getppid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getpriority -{ TARGET_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL }, -#endif -#ifdef TARGET_NR_getresgid -{ TARGET_NR_getresgid, "getresgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getresgid32 -{ TARGET_NR_getresgid32, "getresgid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getresuid -{ TARGET_NR_getresuid, "getresuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getresuid32 -{ TARGET_NR_getresuid32, "getresuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getrlimit -{ TARGET_NR_getrlimit, "getrlimit" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_get_robust_list -{ TARGET_NR_get_robust_list, "get_robust_list" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getrusage -{ TARGET_NR_getrusage, "getrusage" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getsid -{ TARGET_NR_getsid, "getsid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getsockname -{ TARGET_NR_getsockname, "getsockname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getsockopt -{ TARGET_NR_getsockopt, "getsockopt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_get_thread_area -{ TARGET_NR_get_thread_area, "get_thread_area" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_gettid -{ TARGET_NR_gettid, "gettid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_gettimeofday -{ TARGET_NR_gettimeofday, "gettimeofday" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getuid -{ TARGET_NR_getuid, "getuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getuid32 -{ TARGET_NR_getuid32, "getuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getxattr -{ TARGET_NR_getxattr, "getxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getxgid -{ TARGET_NR_getxgid, "getxgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getxpid -{ TARGET_NR_getxpid, "getxpid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_getxuid -{ TARGET_NR_getxuid, "getxuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_gtty -{ TARGET_NR_gtty, "gtty" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_idle -{ TARGET_NR_idle, "idle" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_init_module -{ TARGET_NR_init_module, "init_module" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_inotify_add_watch -{ TARGET_NR_inotify_add_watch, "inotify_add_watch" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_inotify_init -{ TARGET_NR_inotify_init, "inotify_init" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_inotify_rm_watch -{ TARGET_NR_inotify_rm_watch, "inotify_rm_watch" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_io_cancel -{ TARGET_NR_io_cancel, "io_cancel" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ioctl -{ TARGET_NR_ioctl, "ioctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_io_destroy -{ TARGET_NR_io_destroy, "io_destroy" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_io_getevents -{ TARGET_NR_io_getevents, "io_getevents" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ioperm -{ TARGET_NR_ioperm, "ioperm" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_iopl -{ TARGET_NR_iopl, "iopl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ioprio_get -{ TARGET_NR_ioprio_get, "ioprio_get" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ioprio_set -{ TARGET_NR_ioprio_set, "ioprio_set" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_io_setup -{ TARGET_NR_io_setup, "io_setup" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_io_submit -{ TARGET_NR_io_submit, "io_submit" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ipc -{ TARGET_NR_ipc, "ipc" , NULL, print_ipc, NULL }, -#endif -#ifdef TARGET_NR_kexec_load -{ TARGET_NR_kexec_load, "kexec_load" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_keyctl -{ TARGET_NR_keyctl, "keyctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_kill -{ TARGET_NR_kill, "kill", NULL, print_kill, NULL }, -#endif -#ifdef TARGET_NR_lchown -{ TARGET_NR_lchown, "lchown" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lchown32 -{ TARGET_NR_lchown32, "lchown32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lgetxattr -{ TARGET_NR_lgetxattr, "lgetxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_link -{ TARGET_NR_link, "link" , NULL, print_link, NULL }, -#endif -#ifdef TARGET_NR_linkat -{ TARGET_NR_linkat, "linkat" , NULL, print_linkat, NULL }, -#endif -#ifdef TARGET_NR_Linux -{ TARGET_NR_Linux, "Linux" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_listen -{ TARGET_NR_listen, "listen" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_listxattr -{ TARGET_NR_listxattr, "listxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_llistxattr -{ TARGET_NR_llistxattr, "llistxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR__llseek -{ TARGET_NR__llseek, "_llseek" , NULL, print__llseek, NULL }, -#endif -#ifdef TARGET_NR_lock -{ TARGET_NR_lock, "lock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lookup_dcookie -{ TARGET_NR_lookup_dcookie, "lookup_dcookie" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lremovexattr -{ TARGET_NR_lremovexattr, "lremovexattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lseek -{ TARGET_NR_lseek, "lseek" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lsetxattr -{ TARGET_NR_lsetxattr, "lsetxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_lstat -{ TARGET_NR_lstat, "lstat" , NULL, print_lstat, NULL }, -#endif -#ifdef TARGET_NR_lstat64 -{ TARGET_NR_lstat64, "lstat64" , NULL, print_lstat64, NULL }, -#endif -#ifdef TARGET_NR_madvise -{ TARGET_NR_madvise, "madvise" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_madvise1 -{ TARGET_NR_madvise1, "madvise1" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mbind -{ TARGET_NR_mbind, "mbind" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_memory_ordering -{ TARGET_NR_memory_ordering, "memory_ordering" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_migrate_pages -{ TARGET_NR_migrate_pages, "migrate_pages" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mincore -{ TARGET_NR_mincore, "mincore" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mkdir -{ TARGET_NR_mkdir, "mkdir" , NULL, print_mkdir, NULL }, -#endif -#ifdef TARGET_NR_mkdirat -{ TARGET_NR_mkdirat, "mkdirat" , NULL, print_mkdirat, NULL }, -#endif -#ifdef TARGET_NR_rmdir -{ TARGET_NR_rmdir, "rmdir" , NULL, print_rmdir, NULL }, -#endif -#ifdef TARGET_NR_mknod -{ TARGET_NR_mknod, "mknod" , NULL, print_mknod, NULL }, -#endif -#ifdef TARGET_NR_mknodat -{ TARGET_NR_mknodat, "mknodat" , NULL, print_mknodat, NULL }, -#endif -#ifdef TARGET_NR_mlock -{ TARGET_NR_mlock, "mlock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mlockall -{ TARGET_NR_mlockall, "mlockall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mmap -{ TARGET_NR_mmap, "mmap" , NULL, print_mmap, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_mmap2 -{ TARGET_NR_mmap2, "mmap2" , NULL, print_mmap2, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_modify_ldt -{ TARGET_NR_modify_ldt, "modify_ldt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mount -{ TARGET_NR_mount, "mount" , NULL, print_mount, NULL }, -#endif -#ifdef TARGET_NR_move_pages -{ TARGET_NR_move_pages, "move_pages" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mprotect -{ TARGET_NR_mprotect, "mprotect" , NULL, print_mprotect, NULL }, -#endif -#ifdef TARGET_NR_mpx -{ TARGET_NR_mpx, "mpx" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_mq_getsetattr -{ TARGET_NR_mq_getsetattr, "mq_getsetattr" , "%s(%d,%p,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_mq_notify -{ TARGET_NR_mq_notify, "mq_notify" , "%s(%d,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_mq_open -{ TARGET_NR_mq_open, "mq_open" , NULL, print_mq_open, NULL }, -#endif -#ifdef TARGET_NR_mq_timedreceive -{ TARGET_NR_mq_timedreceive, "mq_timedreceive" , "%s(%d,%p,%d,%u,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_mq_timedsend -{ TARGET_NR_mq_timedsend, "mq_timedsend" , "%s(%d,%p,%d,%u,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_mq_unlink -{ TARGET_NR_mq_unlink, "mq_unlink" , NULL, print_mq_unlink, NULL }, -#endif -#ifdef TARGET_NR_mremap -{ TARGET_NR_mremap, "mremap" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgctl -{ TARGET_NR_msgctl, "msgctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgget -{ TARGET_NR_msgget, "msgget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgrcv -{ TARGET_NR_msgrcv, "msgrcv" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msgsnd -{ TARGET_NR_msgsnd, "msgsnd" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_msync -{ TARGET_NR_msync, "msync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_multiplexer -{ TARGET_NR_multiplexer, "multiplexer" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_munlock -{ TARGET_NR_munlock, "munlock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_munlockall -{ TARGET_NR_munlockall, "munlockall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_munmap -{ TARGET_NR_munmap, "munmap" , NULL, print_munmap, NULL }, -#endif -#ifdef TARGET_NR_nanosleep -{ TARGET_NR_nanosleep, "nanosleep" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_fstatat64 -{ TARGET_NR_fstatat64, "fstatat64" , NULL, print_fstatat64, NULL }, -#endif -#ifdef TARGET_NR_newfstatat -{ TARGET_NR_newfstatat, "newfstatat" , NULL, print_newfstatat, NULL }, -#endif -#ifdef TARGET_NR__newselect -{ TARGET_NR__newselect, "_newselect" , NULL, print_newselect, print_syscall_ret_newselect }, -#endif -#ifdef TARGET_NR_nfsservctl -{ TARGET_NR_nfsservctl, "nfsservctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_nice -{ TARGET_NR_nice, "nice" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_old_adjtimex -{ TARGET_NR_old_adjtimex, "old_adjtimex" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_oldfstat -{ TARGET_NR_oldfstat, "oldfstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_oldlstat -{ TARGET_NR_oldlstat, "oldlstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_oldolduname -{ TARGET_NR_oldolduname, "oldolduname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_oldstat -{ TARGET_NR_oldstat, "oldstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_olduname -{ TARGET_NR_olduname, "olduname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_open -{ TARGET_NR_open, "open" , NULL, print_open, NULL }, -#endif -#ifdef TARGET_NR_openat -{ TARGET_NR_openat, "openat" , NULL, print_openat, NULL }, -#endif -#ifdef TARGET_NR_osf_adjtime -{ TARGET_NR_osf_adjtime, "osf_adjtime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_afs_syscall -{ TARGET_NR_osf_afs_syscall, "osf_afs_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_alt_plock -{ TARGET_NR_osf_alt_plock, "osf_alt_plock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_alt_setsid -{ TARGET_NR_osf_alt_setsid, "osf_alt_setsid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_alt_sigpending -{ TARGET_NR_osf_alt_sigpending, "osf_alt_sigpending" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_asynch_daemon -{ TARGET_NR_osf_asynch_daemon, "osf_asynch_daemon" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_audcntl -{ TARGET_NR_osf_audcntl, "osf_audcntl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_audgen -{ TARGET_NR_osf_audgen, "osf_audgen" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_chflags -{ TARGET_NR_osf_chflags, "osf_chflags" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_execve -{ TARGET_NR_osf_execve, "osf_execve" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_exportfs -{ TARGET_NR_osf_exportfs, "osf_exportfs" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_fchflags -{ TARGET_NR_osf_fchflags, "osf_fchflags" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_fdatasync -{ TARGET_NR_osf_fdatasync, "osf_fdatasync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_fpathconf -{ TARGET_NR_osf_fpathconf, "osf_fpathconf" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_fstatfs -{ TARGET_NR_osf_fstatfs, "osf_fstatfs" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_fuser -{ TARGET_NR_osf_fuser, "osf_fuser" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getaddressconf -{ TARGET_NR_osf_getaddressconf, "osf_getaddressconf" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getdirentries -{ TARGET_NR_osf_getdirentries, "osf_getdirentries" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getdomainname -{ TARGET_NR_osf_getdomainname, "osf_getdomainname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getfh -{ TARGET_NR_osf_getfh, "osf_getfh" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getfsstat -{ TARGET_NR_osf_getfsstat, "osf_getfsstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_gethostid -{ TARGET_NR_osf_gethostid, "osf_gethostid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getitimer -{ TARGET_NR_osf_getitimer, "osf_getitimer" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getlogin -{ TARGET_NR_osf_getlogin, "osf_getlogin" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getmnt -{ TARGET_NR_osf_getmnt, "osf_getmnt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getrusage -{ TARGET_NR_osf_getrusage, "osf_getrusage" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_getsysinfo -{ TARGET_NR_osf_getsysinfo, "osf_getsysinfo" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_gettimeofday -{ TARGET_NR_osf_gettimeofday, "osf_gettimeofday" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_kloadcall -{ TARGET_NR_osf_kloadcall, "osf_kloadcall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_kmodcall -{ TARGET_NR_osf_kmodcall, "osf_kmodcall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_memcntl -{ TARGET_NR_osf_memcntl, "osf_memcntl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_mincore -{ TARGET_NR_osf_mincore, "osf_mincore" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_mount -{ TARGET_NR_osf_mount, "osf_mount" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_mremap -{ TARGET_NR_osf_mremap, "osf_mremap" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_msfs_syscall -{ TARGET_NR_osf_msfs_syscall, "osf_msfs_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_msleep -{ TARGET_NR_osf_msleep, "osf_msleep" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_mvalid -{ TARGET_NR_osf_mvalid, "osf_mvalid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_mwakeup -{ TARGET_NR_osf_mwakeup, "osf_mwakeup" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_naccept -{ TARGET_NR_osf_naccept, "osf_naccept" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_nfssvc -{ TARGET_NR_osf_nfssvc, "osf_nfssvc" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_ngetpeername -{ TARGET_NR_osf_ngetpeername, "osf_ngetpeername" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_ngetsockname -{ TARGET_NR_osf_ngetsockname, "osf_ngetsockname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_nrecvfrom -{ TARGET_NR_osf_nrecvfrom, "osf_nrecvfrom" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_nrecvmsg -{ TARGET_NR_osf_nrecvmsg, "osf_nrecvmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_nsendmsg -{ TARGET_NR_osf_nsendmsg, "osf_nsendmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_ntp_adjtime -{ TARGET_NR_osf_ntp_adjtime, "osf_ntp_adjtime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_ntp_gettime -{ TARGET_NR_osf_ntp_gettime, "osf_ntp_gettime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_creat -{ TARGET_NR_osf_old_creat, "osf_old_creat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_fstat -{ TARGET_NR_osf_old_fstat, "osf_old_fstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_getpgrp -{ TARGET_NR_osf_old_getpgrp, "osf_old_getpgrp" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_killpg -{ TARGET_NR_osf_old_killpg, "osf_old_killpg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_lstat -{ TARGET_NR_osf_old_lstat, "osf_old_lstat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_open -{ TARGET_NR_osf_old_open, "osf_old_open" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_oldquota -{ TARGET_NR_osf_oldquota, "osf_oldquota" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_sigaction -{ TARGET_NR_osf_old_sigaction, "osf_old_sigaction" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_sigblock -{ TARGET_NR_osf_old_sigblock, "osf_old_sigblock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_sigreturn -{ TARGET_NR_osf_old_sigreturn, "osf_old_sigreturn" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_sigsetmask -{ TARGET_NR_osf_old_sigsetmask, "osf_old_sigsetmask" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_sigvec -{ TARGET_NR_osf_old_sigvec, "osf_old_sigvec" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_stat -{ TARGET_NR_osf_old_stat, "osf_old_stat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_vadvise -{ TARGET_NR_osf_old_vadvise, "osf_old_vadvise" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_vtrace -{ TARGET_NR_osf_old_vtrace, "osf_old_vtrace" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_old_wait -{ TARGET_NR_osf_old_wait, "osf_old_wait" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_pathconf -{ TARGET_NR_osf_pathconf, "osf_pathconf" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_pid_block -{ TARGET_NR_osf_pid_block, "osf_pid_block" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_pid_unblock -{ TARGET_NR_osf_pid_unblock, "osf_pid_unblock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_plock -{ TARGET_NR_osf_plock, "osf_plock" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_priocntlset -{ TARGET_NR_osf_priocntlset, "osf_priocntlset" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_profil -{ TARGET_NR_osf_profil, "osf_profil" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_proplist_syscall -{ TARGET_NR_osf_proplist_syscall, "osf_proplist_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_reboot -{ TARGET_NR_osf_reboot, "osf_reboot" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_revoke -{ TARGET_NR_osf_revoke, "osf_revoke" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sbrk -{ TARGET_NR_osf_sbrk, "osf_sbrk" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_security -{ TARGET_NR_osf_security, "osf_security" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_select -{ TARGET_NR_osf_select, "osf_select" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sethostid -{ TARGET_NR_osf_sethostid, "osf_sethostid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_setitimer -{ TARGET_NR_osf_setitimer, "osf_setitimer" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_setlogin -{ TARGET_NR_osf_setlogin, "osf_setlogin" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_set_program_attributes -{ TARGET_NR_osf_set_program_attributes, "osf_set_program_attributes" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_set_speculative -{ TARGET_NR_osf_set_speculative, "osf_set_speculative" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_setsysinfo -{ TARGET_NR_osf_setsysinfo, "osf_setsysinfo" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_settimeofday -{ TARGET_NR_osf_settimeofday, "osf_settimeofday" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_shmat -{ TARGET_NR_osf_shmat, "osf_shmat" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_signal -{ TARGET_NR_osf_signal, "osf_signal" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sigprocmask -{ TARGET_NR_osf_sigprocmask, "osf_sigprocmask" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sigsendset -{ TARGET_NR_osf_sigsendset, "osf_sigsendset" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sigstack -{ TARGET_NR_osf_sigstack, "osf_sigstack" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sigwaitprim -{ TARGET_NR_osf_sigwaitprim, "osf_sigwaitprim" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sstk -{ TARGET_NR_osf_sstk, "osf_sstk" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_statfs -{ TARGET_NR_osf_statfs, "osf_statfs" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_subsys_info -{ TARGET_NR_osf_subsys_info, "osf_subsys_info" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_swapctl -{ TARGET_NR_osf_swapctl, "osf_swapctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_swapon -{ TARGET_NR_osf_swapon, "osf_swapon" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_syscall -{ TARGET_NR_osf_syscall, "osf_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_sysinfo -{ TARGET_NR_osf_sysinfo, "osf_sysinfo" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_table -{ TARGET_NR_osf_table, "osf_table" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_uadmin -{ TARGET_NR_osf_uadmin, "osf_uadmin" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_usleep_thread -{ TARGET_NR_osf_usleep_thread, "osf_usleep_thread" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_uswitch -{ TARGET_NR_osf_uswitch, "osf_uswitch" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_utc_adjtime -{ TARGET_NR_osf_utc_adjtime, "osf_utc_adjtime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_utc_gettime -{ TARGET_NR_osf_utc_gettime, "osf_utc_gettime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_utimes -{ TARGET_NR_osf_utimes, "osf_utimes" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_utsname -{ TARGET_NR_osf_utsname, "osf_utsname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_wait4 -{ TARGET_NR_osf_wait4, "osf_wait4" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_osf_waitid -{ TARGET_NR_osf_waitid, "osf_waitid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pause -{ TARGET_NR_pause, "pause" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pciconfig_iobase -{ TARGET_NR_pciconfig_iobase, "pciconfig_iobase" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pciconfig_read -{ TARGET_NR_pciconfig_read, "pciconfig_read" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pciconfig_write -{ TARGET_NR_pciconfig_write, "pciconfig_write" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_perfctr -{ TARGET_NR_perfctr, "perfctr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_personality -{ TARGET_NR_personality, "personality" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pipe -{ TARGET_NR_pipe, "pipe" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pivot_root -{ TARGET_NR_pivot_root, "pivot_root" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_poll -{ TARGET_NR_poll, "poll" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ppoll -{ TARGET_NR_ppoll, "ppoll" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_prctl -{ TARGET_NR_prctl, "prctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pread64 -{ TARGET_NR_pread64, "pread64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_prof -{ TARGET_NR_prof, "prof" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_profil -{ TARGET_NR_profil, "profil" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pselect6 -{ TARGET_NR_pselect6, "pselect6" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ptrace -{ TARGET_NR_ptrace, "ptrace" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_putpmsg -{ TARGET_NR_putpmsg, "putpmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pwrite64 -{ TARGET_NR_pwrite64, "pwrite64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_query_module -{ TARGET_NR_query_module, "query_module" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_quotactl -{ TARGET_NR_quotactl, "quotactl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_read -{ TARGET_NR_read, "read" , "%s(%d,%#x,%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_readahead -{ TARGET_NR_readahead, "readahead" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_readdir -{ TARGET_NR_readdir, "readdir" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_readlink -{ TARGET_NR_readlink, "readlink" , NULL, print_readlink, NULL }, -#endif -#ifdef TARGET_NR_readlinkat -{ TARGET_NR_readlinkat, "readlinkat" , NULL, print_readlinkat, NULL }, -#endif -#ifdef TARGET_NR_readv -{ TARGET_NR_readv, "readv" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_reboot -{ TARGET_NR_reboot, "reboot" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_recv -{ TARGET_NR_recv, "recv" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_recvfrom -{ TARGET_NR_recvfrom, "recvfrom" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_recvmsg -{ TARGET_NR_recvmsg, "recvmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_remap_file_pages -{ TARGET_NR_remap_file_pages, "remap_file_pages" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_removexattr -{ TARGET_NR_removexattr, "removexattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rename -{ TARGET_NR_rename, "rename" , NULL, print_rename, NULL }, -#endif -#ifdef TARGET_NR_renameat -{ TARGET_NR_renameat, "renameat" , NULL, print_renameat, NULL }, -#endif -#ifdef TARGET_NR_request_key -{ TARGET_NR_request_key, "request_key" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_reserved221 -{ TARGET_NR_reserved221, "reserved221" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_reserved82 -{ TARGET_NR_reserved82, "reserved82" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_restart_syscall -{ TARGET_NR_restart_syscall, "restart_syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rmdir -{ TARGET_NR_rmdir, "rmdir" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rt_sigaction -{ TARGET_NR_rt_sigaction, "rt_sigaction" , NULL, print_rt_sigaction, NULL }, -#endif -#ifdef TARGET_NR_rt_sigpending -{ TARGET_NR_rt_sigpending, "rt_sigpending" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rt_sigprocmask -{ TARGET_NR_rt_sigprocmask, "rt_sigprocmask" , NULL, print_rt_sigprocmask, NULL }, -#endif -#ifdef TARGET_NR_rt_sigqueueinfo -{ TARGET_NR_rt_sigqueueinfo, "rt_sigqueueinfo" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rt_sigreturn -{ TARGET_NR_rt_sigreturn, "rt_sigreturn" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rt_sigsuspend -{ TARGET_NR_rt_sigsuspend, "rt_sigsuspend" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_rt_sigtimedwait -{ TARGET_NR_rt_sigtimedwait, "rt_sigtimedwait" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_getaffinity -{ TARGET_NR_sched_getaffinity, "sched_getaffinity" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_get_affinity -{ TARGET_NR_sched_get_affinity, "sched_get_affinity" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_getparam -{ TARGET_NR_sched_getparam, "sched_getparam" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_get_priority_max -{ TARGET_NR_sched_get_priority_max, "sched_get_priority_max" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_get_priority_min -{ TARGET_NR_sched_get_priority_min, "sched_get_priority_min" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_getscheduler -{ TARGET_NR_sched_getscheduler, "sched_getscheduler" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_rr_get_interval -{ TARGET_NR_sched_rr_get_interval, "sched_rr_get_interval" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_setaffinity -{ TARGET_NR_sched_setaffinity, "sched_setaffinity" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_set_affinity -{ TARGET_NR_sched_set_affinity, "sched_set_affinity" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_setparam -{ TARGET_NR_sched_setparam, "sched_setparam" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_setscheduler -{ TARGET_NR_sched_setscheduler, "sched_setscheduler" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sched_yield -{ TARGET_NR_sched_yield, "sched_yield" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_security -{ TARGET_NR_security, "security" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_select -{ TARGET_NR_select, "select" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_semctl -{ TARGET_NR_semctl, "semctl" , NULL, print_semctl, NULL }, -#endif -#ifdef TARGET_NR_semget -{ TARGET_NR_semget, "semget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_semop -{ TARGET_NR_semop, "semop" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_semtimedop -{ TARGET_NR_semtimedop, "semtimedop" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_send -{ TARGET_NR_send, "send" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sendfile -{ TARGET_NR_sendfile, "sendfile" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sendfile64 -{ TARGET_NR_sendfile64, "sendfile64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sendmsg -{ TARGET_NR_sendmsg, "sendmsg" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sendto -{ TARGET_NR_sendto, "sendto" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setdomainname -{ TARGET_NR_setdomainname, "setdomainname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setfsgid -{ TARGET_NR_setfsgid, "setfsgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setfsgid32 -{ TARGET_NR_setfsgid32, "setfsgid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setfsuid -{ TARGET_NR_setfsuid, "setfsuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setfsuid32 -{ TARGET_NR_setfsuid32, "setfsuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setgid -{ TARGET_NR_setgid, "setgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setgid32 -{ TARGET_NR_setgid32, "setgid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setgroups -{ TARGET_NR_setgroups, "setgroups" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setgroups32 -{ TARGET_NR_setgroups32, "setgroups32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sethae -{ TARGET_NR_sethae, "sethae" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sethostname -{ TARGET_NR_sethostname, "sethostname" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setitimer -{ TARGET_NR_setitimer, "setitimer" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_set_mempolicy -{ TARGET_NR_set_mempolicy, "set_mempolicy" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setns -{ TARGET_NR_setns, "setns" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setpgid -{ TARGET_NR_setpgid, "setpgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setpgrp -{ TARGET_NR_setpgrp, "setpgrp" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setpriority -{ TARGET_NR_setpriority, "setpriority" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setregid -{ TARGET_NR_setregid, "setregid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setregid32 -{ TARGET_NR_setregid32, "setregid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setresgid -{ TARGET_NR_setresgid, "setresgid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setresgid32 -{ TARGET_NR_setresgid32, "setresgid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setresuid -{ TARGET_NR_setresuid, "setresuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setresuid32 -{ TARGET_NR_setresuid32, "setresuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setreuid -{ TARGET_NR_setreuid, "setreuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setreuid32 -{ TARGET_NR_setreuid32, "setreuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setrlimit -{ TARGET_NR_setrlimit, "setrlimit" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_set_robust_list -{ TARGET_NR_set_robust_list, "set_robust_list" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setsid -{ TARGET_NR_setsid, "setsid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setsockopt -{ TARGET_NR_setsockopt, "setsockopt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_set_thread_area -{ TARGET_NR_set_thread_area, "set_thread_area" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_set_tid_address -{ TARGET_NR_set_tid_address, "set_tid_address" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_settimeofday -{ TARGET_NR_settimeofday, "settimeofday" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setuid -{ TARGET_NR_setuid, "setuid" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setuid32 -{ TARGET_NR_setuid32, "setuid32" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_setxattr -{ TARGET_NR_setxattr, "setxattr" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sgetmask -{ TARGET_NR_sgetmask, "sgetmask" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shmat -{ TARGET_NR_shmat, "shmat" , NULL, NULL, print_syscall_ret_addr }, -#endif -#ifdef TARGET_NR_shmctl -{ TARGET_NR_shmctl, "shmctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shmdt -{ TARGET_NR_shmdt, "shmdt" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shmget -{ TARGET_NR_shmget, "shmget" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_shutdown -{ TARGET_NR_shutdown, "shutdown" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigaction -{ TARGET_NR_sigaction, "sigaction" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigaltstack -{ TARGET_NR_sigaltstack, "sigaltstack" , "%s(%p,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_signal -{ TARGET_NR_signal, "signal" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigpending -{ TARGET_NR_sigpending, "sigpending" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigprocmask -{ TARGET_NR_sigprocmask, "sigprocmask" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigreturn -{ TARGET_NR_sigreturn, "sigreturn" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sigsuspend -{ TARGET_NR_sigsuspend, "sigsuspend" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_socket -{ TARGET_NR_socket, "socket" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_socketcall -{ TARGET_NR_socketcall, "socketcall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_socketpair -{ TARGET_NR_socketpair, "socketpair" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_splice -{ TARGET_NR_splice, "splice" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ssetmask -{ TARGET_NR_ssetmask, "ssetmask" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_stat -{ TARGET_NR_stat, "stat" , NULL, print_stat, NULL }, -#endif -#ifdef TARGET_NR_stat64 -{ TARGET_NR_stat64, "stat64" , NULL, print_stat64, NULL }, -#endif -#ifdef TARGET_NR_statfs -{ TARGET_NR_statfs, "statfs" , NULL, print_statfs, NULL }, -#endif -#ifdef TARGET_NR_statfs64 -{ TARGET_NR_statfs64, "statfs64" , NULL, print_statfs64, NULL }, -#endif -#ifdef TARGET_NR_stime -{ TARGET_NR_stime, "stime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_streams1 -{ TARGET_NR_streams1, "streams1" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_streams2 -{ TARGET_NR_streams2, "streams2" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_stty -{ TARGET_NR_stty, "stty" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_swapcontext -{ TARGET_NR_swapcontext, "swapcontext" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_swapoff -{ TARGET_NR_swapoff, "swapoff" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_swapon -{ TARGET_NR_swapon, "swapon" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_symlink -{ TARGET_NR_symlink, "symlink" , NULL, print_symlink, NULL }, -#endif -#ifdef TARGET_NR_symlinkat -{ TARGET_NR_symlinkat, "symlinkat", NULL, print_symlinkat, NULL }, -#endif -#ifdef TARGET_NR_sync -{ TARGET_NR_sync, "sync" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sync_file_range -{ TARGET_NR_sync_file_range, "sync_file_range" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_syscall -{ TARGET_NR_syscall, "syscall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR__sysctl -{ TARGET_NR__sysctl, "_sysctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sys_epoll_create -{ TARGET_NR_sys_epoll_create, "sys_epoll_create" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sys_epoll_ctl -{ TARGET_NR_sys_epoll_ctl, "sys_epoll_ctl" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sys_epoll_wait -{ TARGET_NR_sys_epoll_wait, "sys_epoll_wait" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sysfs -{ TARGET_NR_sysfs, "sysfs" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sysinfo -{ TARGET_NR_sysinfo, "sysinfo" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sys_kexec_load -{ TARGET_NR_sys_kexec_load, "sys_kexec_load" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_syslog -{ TARGET_NR_syslog, "syslog" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sysmips -{ TARGET_NR_sysmips, "sysmips" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sys_setaltroot -{ TARGET_NR_sys_setaltroot, "sys_setaltroot" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_tee -{ TARGET_NR_tee, "tee" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_tgkill -{ TARGET_NR_tgkill, "tgkill" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_time -{ TARGET_NR_time, "time" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timer_create -{ TARGET_NR_timer_create, "timer_create" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timer_delete -{ TARGET_NR_timer_delete, "timer_delete" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timer_getoverrun -{ TARGET_NR_timer_getoverrun, "timer_getoverrun" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timer_gettime -{ TARGET_NR_timer_gettime, "timer_gettime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timer_settime -{ TARGET_NR_timer_settime, "timer_settime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timerfd_create -{ TARGET_NR_timerfd_create, "timerfd_create" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timerfd_gettime -{ TARGET_NR_timerfd_gettime, "timerfd_gettime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_timerfd_settime -{ TARGET_NR_timerfd_settime, "timerfd_settime" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_times -{ TARGET_NR_times, "times" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_tkill -{ TARGET_NR_tkill, "tkill" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_truncate -{ TARGET_NR_truncate, "truncate" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_truncate64 -{ TARGET_NR_truncate64, "truncate64" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_tuxcall -{ TARGET_NR_tuxcall, "tuxcall" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ugetrlimit -{ TARGET_NR_ugetrlimit, "ugetrlimit" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ulimit -{ TARGET_NR_ulimit, "ulimit" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_umask -{ TARGET_NR_umask, "umask" , "%s(%#o)", NULL, NULL }, -#endif -#ifdef TARGET_NR_umount -{ TARGET_NR_umount, "umount" , NULL, print_umount, NULL }, -#endif -#ifdef TARGET_NR_umount2 -{ TARGET_NR_umount2, "umount2" , NULL, print_umount2, NULL }, -#endif -#ifdef TARGET_NR_uname -{ TARGET_NR_uname, "uname" , "%s(%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_unlink -{ TARGET_NR_unlink, "unlink" , NULL, print_unlink, NULL }, -#endif -#ifdef TARGET_NR_unlinkat -{ TARGET_NR_unlinkat, "unlinkat" , NULL, print_unlinkat, NULL }, -#endif -#ifdef TARGET_NR_unshare -{ TARGET_NR_unshare, "unshare" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused109 -{ TARGET_NR_unused109, "unused109" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused150 -{ TARGET_NR_unused150, "unused150" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused18 -{ TARGET_NR_unused18, "unused18" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused28 -{ TARGET_NR_unused28, "unused28" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused59 -{ TARGET_NR_unused59, "unused59" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_unused84 -{ TARGET_NR_unused84, "unused84" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_uselib -{ TARGET_NR_uselib, "uselib" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_ustat -{ TARGET_NR_ustat, "ustat" , "%s(%#x,%p)", NULL, NULL }, -#endif -#ifdef TARGET_NR_utime -{ TARGET_NR_utime, "utime" , NULL, print_utime, NULL }, -#endif -#ifdef TARGET_NR_utimes -{ TARGET_NR_utimes, "utimes" , NULL, print_utimes, NULL }, -#endif -#ifdef TARGET_NR_utrap_install -{ TARGET_NR_utrap_install, "utrap_install" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vfork -{ TARGET_NR_vfork, "vfork" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vhangup -{ TARGET_NR_vhangup, "vhangup" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vm86 -{ TARGET_NR_vm86, "vm86" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vm86old -{ TARGET_NR_vm86old, "vm86old" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vmsplice -{ TARGET_NR_vmsplice, "vmsplice" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_vserver -{ TARGET_NR_vserver, "vserver" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_wait4 -{ TARGET_NR_wait4, "wait4" , NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_waitid -{ TARGET_NR_waitid, "waitid" , "%s(%#x,%d,%p,%#x)", NULL, NULL }, -#endif -#ifdef TARGET_NR_waitpid -{ TARGET_NR_waitpid, "waitpid" , "%s(%d,%p,%#x)", NULL, NULL }, -#endif -#ifdef TARGET_NR_write -{ TARGET_NR_write, "write" , "%s(%d,%#x,%d)", NULL, NULL }, -#endif -#ifdef TARGET_NR_writev -{ TARGET_NR_writev, "writev" , "%s(%d,%p,%#x)", NULL, NULL }, -#endif -#ifdef TARGET_NR_utimensat -{ TARGET_NR_utimensat, "utimensat", NULL, print_utimensat, NULL }, -#endif -#ifdef TARGET_NR_sync_file_range -{ TARGET_NR_sync_file_range, "sync_file_range", NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_sync_file_range2 -{ TARGET_NR_sync_file_range2, "sync_file_range2", NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_pipe2 -{ TARGET_NR_pipe2, "pipe2", NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_atomic_cmpxchg_32 -{ TARGET_NR_atomic_cmpxchg_32, "atomic_cmpxchg_32", NULL, NULL, NULL }, -#endif -#ifdef TARGET_NR_atomic_barrier -{ TARGET_NR_atomic_barrier, "atomic_barrier", NULL, NULL, NULL }, -#endif diff --git a/qemu/linux-user/syscall.c b/qemu/linux-user/syscall.c deleted file mode 100644 index 032d33886..000000000 --- a/qemu/linux-user/syscall.c +++ /dev/null @@ -1,10262 +0,0 @@ -/* - * Linux syscalls - * - * Copyright (c) 2003 Fabrice Bellard - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#define _ATFILE_SOURCE -#include "qemu/osdep.h" -#include "qemu/cutils.h" -#include "qemu/path.h" -#include <elf.h> -#include <endian.h> -#include <grp.h> -#include <sys/ipc.h> -#include <sys/msg.h> -#include <sys/wait.h> -#include <sys/mount.h> -#include <sys/file.h> -#include <sys/fsuid.h> -#include <sys/personality.h> -#include <sys/prctl.h> -#include <sys/resource.h> -#include <sys/mman.h> -#include <sys/swap.h> -#include <linux/capability.h> -#include <sched.h> -#ifdef __ia64__ -int __clone2(int (*fn)(void *), void *child_stack_base, - size_t stack_size, int flags, void *arg, ...); -#endif -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/uio.h> -#include <sys/poll.h> -#include <sys/times.h> -#include <sys/shm.h> -#include <sys/sem.h> -#include <sys/statfs.h> -#include <utime.h> -#include <sys/sysinfo.h> -#include <sys/signalfd.h> -//#include <sys/user.h> -#include <netinet/ip.h> -#include <netinet/tcp.h> -#include <linux/wireless.h> -#include <linux/icmp.h> -#include "qemu-common.h" -#ifdef CONFIG_TIMERFD -#include <sys/timerfd.h> -#endif -#ifdef TARGET_GPROF -#include <sys/gmon.h> -#endif -#ifdef CONFIG_EVENTFD -#include <sys/eventfd.h> -#endif -#ifdef CONFIG_EPOLL -#include <sys/epoll.h> -#endif -#ifdef CONFIG_ATTR -#include "qemu/xattr.h" -#endif -#ifdef CONFIG_SENDFILE -#include <sys/sendfile.h> -#endif - -#define termios host_termios -#define winsize host_winsize -#define termio host_termio -#define sgttyb host_sgttyb /* same as target */ -#define tchars host_tchars /* same as target */ -#define ltchars host_ltchars /* same as target */ - -#include <linux/termios.h> -#include <linux/unistd.h> -#include <linux/cdrom.h> -#include <linux/hdreg.h> -#include <linux/soundcard.h> -#include <linux/kd.h> -#include <linux/mtio.h> -#include <linux/fs.h> -#if defined(CONFIG_FIEMAP) -#include <linux/fiemap.h> -#endif -#include <linux/fb.h> -#include <linux/vt.h> -#include <linux/dm-ioctl.h> -#include <linux/reboot.h> -#include <linux/route.h> -#include <linux/filter.h> -#include <linux/blkpg.h> -#include "linux_loop.h" -#include "uname.h" - -#include "qemu.h" - -#define CLONE_NPTL_FLAGS2 (CLONE_SETTLS | \ - CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID) - -//#define DEBUG - -//#include <linux/msdos_fs.h> -#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2]) -#define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2]) - - -#undef _syscall0 -#undef _syscall1 -#undef _syscall2 -#undef _syscall3 -#undef _syscall4 -#undef _syscall5 -#undef _syscall6 - -#define _syscall0(type,name) \ -static type name (void) \ -{ \ - return syscall(__NR_##name); \ -} - -#define _syscall1(type,name,type1,arg1) \ -static type name (type1 arg1) \ -{ \ - return syscall(__NR_##name, arg1); \ -} - -#define _syscall2(type,name,type1,arg1,type2,arg2) \ -static type name (type1 arg1,type2 arg2) \ -{ \ - return syscall(__NR_##name, arg1, arg2); \ -} - -#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ -static type name (type1 arg1,type2 arg2,type3 arg3) \ -{ \ - return syscall(__NR_##name, arg1, arg2, arg3); \ -} - -#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ -static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \ -{ \ - return syscall(__NR_##name, arg1, arg2, arg3, arg4); \ -} - -#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ -static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ -{ \ - return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \ -} - - -#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ -static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \ - type6 arg6) \ -{ \ - return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \ -} - - -#define __NR_sys_uname __NR_uname -#define __NR_sys_getcwd1 __NR_getcwd -#define __NR_sys_getdents __NR_getdents -#define __NR_sys_getdents64 __NR_getdents64 -#define __NR_sys_getpriority __NR_getpriority -#define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo -#define __NR_sys_syslog __NR_syslog -#define __NR_sys_tgkill __NR_tgkill -#define __NR_sys_tkill __NR_tkill -#define __NR_sys_futex __NR_futex -#define __NR_sys_inotify_init __NR_inotify_init -#define __NR_sys_inotify_add_watch __NR_inotify_add_watch -#define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch - -#if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__) || \ - defined(__s390x__) -#define __NR__llseek __NR_lseek -#endif - -/* Newer kernel ports have llseek() instead of _llseek() */ -#if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek) -#define TARGET_NR__llseek TARGET_NR_llseek -#endif - -#ifdef __NR_gettid -_syscall0(int, gettid) -#else -/* This is a replacement for the host gettid() and must return a host - errno. */ -static int gettid(void) { - return -ENOSYS; -} -#endif -#if defined(TARGET_NR_getdents) && defined(__NR_getdents) -_syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count); -#endif -#if !defined(__NR_getdents) || \ - (defined(TARGET_NR_getdents64) && defined(__NR_getdents64)) -_syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count); -#endif -#if defined(TARGET_NR__llseek) && defined(__NR_llseek) -_syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, - loff_t *, res, uint, wh); -#endif -_syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo) -_syscall3(int,sys_syslog,int,type,char*,bufp,int,len) -#if defined(TARGET_NR_tgkill) && defined(__NR_tgkill) -_syscall3(int,sys_tgkill,int,tgid,int,pid,int,sig) -#endif -#if defined(TARGET_NR_tkill) && defined(__NR_tkill) -_syscall2(int,sys_tkill,int,tid,int,sig) -#endif -#ifdef __NR_exit_group -_syscall1(int,exit_group,int,error_code) -#endif -#if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address) -_syscall1(int,set_tid_address,int *,tidptr) -#endif -#if defined(TARGET_NR_futex) && defined(__NR_futex) -_syscall6(int,sys_futex,int *,uaddr,int,op,int,val, - const struct timespec *,timeout,int *,uaddr2,int,val3) -#endif -#define __NR_sys_sched_getaffinity __NR_sched_getaffinity -_syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len, - unsigned long *, user_mask_ptr); -#define __NR_sys_sched_setaffinity __NR_sched_setaffinity -_syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len, - unsigned long *, user_mask_ptr); -_syscall4(int, reboot, int, magic1, int, magic2, unsigned int, cmd, - void *, arg); -_syscall2(int, capget, struct __user_cap_header_struct *, header, - struct __user_cap_data_struct *, data); -_syscall2(int, capset, struct __user_cap_header_struct *, header, - struct __user_cap_data_struct *, data); -#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get) -_syscall2(int, ioprio_get, int, which, int, who) -#endif -#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set) -_syscall3(int, ioprio_set, int, which, int, who, int, ioprio) -#endif -#if defined(TARGET_NR_getrandom) && defined(__NR_getrandom) -_syscall3(int, getrandom, void *, buf, size_t, buflen, unsigned int, flags) -#endif - -static bitmask_transtbl fcntl_flags_tbl[] = { - { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, }, - { TARGET_O_ACCMODE, TARGET_O_RDWR, O_ACCMODE, O_RDWR, }, - { TARGET_O_CREAT, TARGET_O_CREAT, O_CREAT, O_CREAT, }, - { TARGET_O_EXCL, TARGET_O_EXCL, O_EXCL, O_EXCL, }, - { TARGET_O_NOCTTY, TARGET_O_NOCTTY, O_NOCTTY, O_NOCTTY, }, - { TARGET_O_TRUNC, TARGET_O_TRUNC, O_TRUNC, O_TRUNC, }, - { TARGET_O_APPEND, TARGET_O_APPEND, O_APPEND, O_APPEND, }, - { TARGET_O_NONBLOCK, TARGET_O_NONBLOCK, O_NONBLOCK, O_NONBLOCK, }, - { TARGET_O_SYNC, TARGET_O_DSYNC, O_SYNC, O_DSYNC, }, - { TARGET_O_SYNC, TARGET_O_SYNC, O_SYNC, O_SYNC, }, - { TARGET_FASYNC, TARGET_FASYNC, FASYNC, FASYNC, }, - { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, }, - { TARGET_O_NOFOLLOW, TARGET_O_NOFOLLOW, O_NOFOLLOW, O_NOFOLLOW, }, -#if defined(O_DIRECT) - { TARGET_O_DIRECT, TARGET_O_DIRECT, O_DIRECT, O_DIRECT, }, -#endif -#if defined(O_NOATIME) - { TARGET_O_NOATIME, TARGET_O_NOATIME, O_NOATIME, O_NOATIME }, -#endif -#if defined(O_CLOEXEC) - { TARGET_O_CLOEXEC, TARGET_O_CLOEXEC, O_CLOEXEC, O_CLOEXEC }, -#endif -#if defined(O_PATH) - { TARGET_O_PATH, TARGET_O_PATH, O_PATH, O_PATH }, -#endif - /* Don't terminate the list prematurely on 64-bit host+guest. */ -#if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0 - { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, }, -#endif - { 0, 0, 0, 0 } -}; - -typedef abi_long (*TargetFdDataFunc)(void *, size_t); -typedef abi_long (*TargetFdAddrFunc)(void *, abi_ulong, socklen_t); -typedef struct TargetFdTrans { - TargetFdDataFunc host_to_target_data; - TargetFdDataFunc target_to_host_data; - TargetFdAddrFunc target_to_host_addr; -} TargetFdTrans; - -static TargetFdTrans **target_fd_trans; - -static unsigned int target_fd_max; - -static TargetFdDataFunc fd_trans_host_to_target_data(int fd) -{ - if (fd >= 0 && fd < target_fd_max && target_fd_trans[fd]) { - return target_fd_trans[fd]->host_to_target_data; - } - return NULL; -} - -static TargetFdAddrFunc fd_trans_target_to_host_addr(int fd) -{ - if (fd >= 0 && fd < target_fd_max && target_fd_trans[fd]) { - return target_fd_trans[fd]->target_to_host_addr; - } - return NULL; -} - -static void fd_trans_register(int fd, TargetFdTrans *trans) -{ - unsigned int oldmax; - - if (fd >= target_fd_max) { - oldmax = target_fd_max; - target_fd_max = ((fd >> 6) + 1) << 6; /* by slice of 64 entries */ - target_fd_trans = g_renew(TargetFdTrans *, - target_fd_trans, target_fd_max); - memset((void *)(target_fd_trans + oldmax), 0, - (target_fd_max - oldmax) * sizeof(TargetFdTrans *)); - } - target_fd_trans[fd] = trans; -} - -static void fd_trans_unregister(int fd) -{ - if (fd >= 0 && fd < target_fd_max) { - target_fd_trans[fd] = NULL; - } -} - -static void fd_trans_dup(int oldfd, int newfd) -{ - fd_trans_unregister(newfd); - if (oldfd < target_fd_max && target_fd_trans[oldfd]) { - fd_trans_register(newfd, target_fd_trans[oldfd]); - } -} - -static int sys_getcwd1(char *buf, size_t size) -{ - if (getcwd(buf, size) == NULL) { - /* getcwd() sets errno */ - return (-1); - } - return strlen(buf)+1; -} - -static int sys_openat(int dirfd, const char *pathname, int flags, mode_t mode) -{ - /* - * open(2) has extra parameter 'mode' when called with - * flag O_CREAT. - */ - if ((flags & O_CREAT) != 0) { - return (openat(dirfd, pathname, flags, mode)); - } - return (openat(dirfd, pathname, flags)); -} - -#ifdef TARGET_NR_utimensat -#ifdef CONFIG_UTIMENSAT -static int sys_utimensat(int dirfd, const char *pathname, - const struct timespec times[2], int flags) -{ - if (pathname == NULL) - return futimens(dirfd, times); - else - return utimensat(dirfd, pathname, times, flags); -} -#elif defined(__NR_utimensat) -#define __NR_sys_utimensat __NR_utimensat -_syscall4(int,sys_utimensat,int,dirfd,const char *,pathname, - const struct timespec *,tsp,int,flags) -#else -static int sys_utimensat(int dirfd, const char *pathname, - const struct timespec times[2], int flags) -{ - errno = ENOSYS; - return -1; -} -#endif -#endif /* TARGET_NR_utimensat */ - -#ifdef CONFIG_INOTIFY -#include <sys/inotify.h> - -#if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init) -static int sys_inotify_init(void) -{ - return (inotify_init()); -} -#endif -#if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch) -static int sys_inotify_add_watch(int fd,const char *pathname, int32_t mask) -{ - return (inotify_add_watch(fd, pathname, mask)); -} -#endif -#if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch) -static int sys_inotify_rm_watch(int fd, int32_t wd) -{ - return (inotify_rm_watch(fd, wd)); -} -#endif -#ifdef CONFIG_INOTIFY1 -#if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1) -static int sys_inotify_init1(int flags) -{ - return (inotify_init1(flags)); -} -#endif -#endif -#else -/* Userspace can usually survive runtime without inotify */ -#undef TARGET_NR_inotify_init -#undef TARGET_NR_inotify_init1 -#undef TARGET_NR_inotify_add_watch -#undef TARGET_NR_inotify_rm_watch -#endif /* CONFIG_INOTIFY */ - -#if defined(TARGET_NR_ppoll) -#ifndef __NR_ppoll -# define __NR_ppoll -1 -#endif -#define __NR_sys_ppoll __NR_ppoll -_syscall5(int, sys_ppoll, struct pollfd *, fds, nfds_t, nfds, - struct timespec *, timeout, const sigset_t *, sigmask, - size_t, sigsetsize) -#endif - -#if defined(TARGET_NR_pselect6) -#ifndef __NR_pselect6 -# define __NR_pselect6 -1 -#endif -#define __NR_sys_pselect6 __NR_pselect6 -_syscall6(int, sys_pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, - fd_set *, exceptfds, struct timespec *, timeout, void *, sig); -#endif - -#if defined(TARGET_NR_prlimit64) -#ifndef __NR_prlimit64 -# define __NR_prlimit64 -1 -#endif -#define __NR_sys_prlimit64 __NR_prlimit64 -/* The glibc rlimit structure may not be that used by the underlying syscall */ -struct host_rlimit64 { - uint64_t rlim_cur; - uint64_t rlim_max; -}; -_syscall4(int, sys_prlimit64, pid_t, pid, int, resource, - const struct host_rlimit64 *, new_limit, - struct host_rlimit64 *, old_limit) -#endif - - -#if defined(TARGET_NR_timer_create) -/* Maxiumum of 32 active POSIX timers allowed at any one time. */ -static timer_t g_posix_timers[32] = { 0, } ; - -static inline int next_free_host_timer(void) -{ - int k ; - /* FIXME: Does finding the next free slot require a lock? */ - for (k = 0; k < ARRAY_SIZE(g_posix_timers); k++) { - if (g_posix_timers[k] == 0) { - g_posix_timers[k] = (timer_t) 1; - return k; - } - } - return -1; -} -#endif - -/* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */ -#ifdef TARGET_ARM -static inline int regpairs_aligned(void *cpu_env) { - return ((((CPUARMState *)cpu_env)->eabi) == 1) ; -} -#elif defined(TARGET_MIPS) -static inline int regpairs_aligned(void *cpu_env) { return 1; } -#elif defined(TARGET_PPC) && !defined(TARGET_PPC64) -/* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs - * of registers which translates to the same as ARM/MIPS, because we start with - * r3 as arg1 */ -static inline int regpairs_aligned(void *cpu_env) { return 1; } -#else -static inline int regpairs_aligned(void *cpu_env) { return 0; } -#endif - -#define ERRNO_TABLE_SIZE 1200 - -/* target_to_host_errno_table[] is initialized from - * host_to_target_errno_table[] in syscall_init(). */ -static uint16_t target_to_host_errno_table[ERRNO_TABLE_SIZE] = { -}; - -/* - * This list is the union of errno values overridden in asm-<arch>/errno.h - * minus the errnos that are not actually generic to all archs. - */ -static uint16_t host_to_target_errno_table[ERRNO_TABLE_SIZE] = { - [EAGAIN] = TARGET_EAGAIN, - [EIDRM] = TARGET_EIDRM, - [ECHRNG] = TARGET_ECHRNG, - [EL2NSYNC] = TARGET_EL2NSYNC, - [EL3HLT] = TARGET_EL3HLT, - [EL3RST] = TARGET_EL3RST, - [ELNRNG] = TARGET_ELNRNG, - [EUNATCH] = TARGET_EUNATCH, - [ENOCSI] = TARGET_ENOCSI, - [EL2HLT] = TARGET_EL2HLT, - [EDEADLK] = TARGET_EDEADLK, - [ENOLCK] = TARGET_ENOLCK, - [EBADE] = TARGET_EBADE, - [EBADR] = TARGET_EBADR, - [EXFULL] = TARGET_EXFULL, - [ENOANO] = TARGET_ENOANO, - [EBADRQC] = TARGET_EBADRQC, - [EBADSLT] = TARGET_EBADSLT, - [EBFONT] = TARGET_EBFONT, - [ENOSTR] = TARGET_ENOSTR, - [ENODATA] = TARGET_ENODATA, - [ETIME] = TARGET_ETIME, - [ENOSR] = TARGET_ENOSR, - [ENONET] = TARGET_ENONET, - [ENOPKG] = TARGET_ENOPKG, - [EREMOTE] = TARGET_EREMOTE, - [ENOLINK] = TARGET_ENOLINK, - [EADV] = TARGET_EADV, - [ESRMNT] = TARGET_ESRMNT, - [ECOMM] = TARGET_ECOMM, - [EPROTO] = TARGET_EPROTO, - [EDOTDOT] = TARGET_EDOTDOT, - [EMULTIHOP] = TARGET_EMULTIHOP, - [EBADMSG] = TARGET_EBADMSG, - [ENAMETOOLONG] = TARGET_ENAMETOOLONG, - [EOVERFLOW] = TARGET_EOVERFLOW, - [ENOTUNIQ] = TARGET_ENOTUNIQ, - [EBADFD] = TARGET_EBADFD, - [EREMCHG] = TARGET_EREMCHG, - [ELIBACC] = TARGET_ELIBACC, - [ELIBBAD] = TARGET_ELIBBAD, - [ELIBSCN] = TARGET_ELIBSCN, - [ELIBMAX] = TARGET_ELIBMAX, - [ELIBEXEC] = TARGET_ELIBEXEC, - [EILSEQ] = TARGET_EILSEQ, - [ENOSYS] = TARGET_ENOSYS, - [ELOOP] = TARGET_ELOOP, - [ERESTART] = TARGET_ERESTART, - [ESTRPIPE] = TARGET_ESTRPIPE, - [ENOTEMPTY] = TARGET_ENOTEMPTY, - [EUSERS] = TARGET_EUSERS, - [ENOTSOCK] = TARGET_ENOTSOCK, - [EDESTADDRREQ] = TARGET_EDESTADDRREQ, - [EMSGSIZE] = TARGET_EMSGSIZE, - [EPROTOTYPE] = TARGET_EPROTOTYPE, - [ENOPROTOOPT] = TARGET_ENOPROTOOPT, - [EPROTONOSUPPORT] = TARGET_EPROTONOSUPPORT, - [ESOCKTNOSUPPORT] = TARGET_ESOCKTNOSUPPORT, - [EOPNOTSUPP] = TARGET_EOPNOTSUPP, - [EPFNOSUPPORT] = TARGET_EPFNOSUPPORT, - [EAFNOSUPPORT] = TARGET_EAFNOSUPPORT, - [EADDRINUSE] = TARGET_EADDRINUSE, - [EADDRNOTAVAIL] = TARGET_EADDRNOTAVAIL, - [ENETDOWN] = TARGET_ENETDOWN, - [ENETUNREACH] = TARGET_ENETUNREACH, - [ENETRESET] = TARGET_ENETRESET, - [ECONNABORTED] = TARGET_ECONNABORTED, - [ECONNRESET] = TARGET_ECONNRESET, - [ENOBUFS] = TARGET_ENOBUFS, - [EISCONN] = TARGET_EISCONN, - [ENOTCONN] = TARGET_ENOTCONN, - [EUCLEAN] = TARGET_EUCLEAN, - [ENOTNAM] = TARGET_ENOTNAM, - [ENAVAIL] = TARGET_ENAVAIL, - [EISNAM] = TARGET_EISNAM, - [EREMOTEIO] = TARGET_EREMOTEIO, - [ESHUTDOWN] = TARGET_ESHUTDOWN, - [ETOOMANYREFS] = TARGET_ETOOMANYREFS, - [ETIMEDOUT] = TARGET_ETIMEDOUT, - [ECONNREFUSED] = TARGET_ECONNREFUSED, - [EHOSTDOWN] = TARGET_EHOSTDOWN, - [EHOSTUNREACH] = TARGET_EHOSTUNREACH, - [EALREADY] = TARGET_EALREADY, - [EINPROGRESS] = TARGET_EINPROGRESS, - [ESTALE] = TARGET_ESTALE, - [ECANCELED] = TARGET_ECANCELED, - [ENOMEDIUM] = TARGET_ENOMEDIUM, - [EMEDIUMTYPE] = TARGET_EMEDIUMTYPE, -#ifdef ENOKEY - [ENOKEY] = TARGET_ENOKEY, -#endif -#ifdef EKEYEXPIRED - [EKEYEXPIRED] = TARGET_EKEYEXPIRED, -#endif -#ifdef EKEYREVOKED - [EKEYREVOKED] = TARGET_EKEYREVOKED, -#endif -#ifdef EKEYREJECTED - [EKEYREJECTED] = TARGET_EKEYREJECTED, -#endif -#ifdef EOWNERDEAD - [EOWNERDEAD] = TARGET_EOWNERDEAD, -#endif -#ifdef ENOTRECOVERABLE - [ENOTRECOVERABLE] = TARGET_ENOTRECOVERABLE, -#endif -}; - -static inline int host_to_target_errno(int err) -{ - if(host_to_target_errno_table[err]) - return host_to_target_errno_table[err]; - return err; -} - -static inline int target_to_host_errno(int err) -{ - if (target_to_host_errno_table[err]) - return target_to_host_errno_table[err]; - return err; -} - -static inline abi_long get_errno(abi_long ret) -{ - if (ret == -1) - return -host_to_target_errno(errno); - else - return ret; -} - -static inline int is_error(abi_long ret) -{ - return (abi_ulong)ret >= (abi_ulong)(-4096); -} - -char *target_strerror(int err) -{ - if ((err >= ERRNO_TABLE_SIZE) || (err < 0)) { - return NULL; - } - return strerror(target_to_host_errno(err)); -} - -static inline int host_to_target_sock_type(int host_type) -{ - int target_type; - - switch (host_type & 0xf /* SOCK_TYPE_MASK */) { - case SOCK_DGRAM: - target_type = TARGET_SOCK_DGRAM; - break; - case SOCK_STREAM: - target_type = TARGET_SOCK_STREAM; - break; - default: - target_type = host_type & 0xf /* SOCK_TYPE_MASK */; - break; - } - -#if defined(SOCK_CLOEXEC) - if (host_type & SOCK_CLOEXEC) { - target_type |= TARGET_SOCK_CLOEXEC; - } -#endif - -#if defined(SOCK_NONBLOCK) - if (host_type & SOCK_NONBLOCK) { - target_type |= TARGET_SOCK_NONBLOCK; - } -#endif - - return target_type; -} - -static abi_ulong target_brk; -static abi_ulong target_original_brk; -static abi_ulong brk_page; - -void target_set_brk(abi_ulong new_brk) -{ - target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk); - brk_page = HOST_PAGE_ALIGN(target_brk); -} - -//#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0) -#define DEBUGF_BRK(message, args...) - -/* do_brk() must return target values and target errnos. */ -abi_long do_brk(abi_ulong new_brk) -{ - abi_long mapped_addr; - int new_alloc_size; - - DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx ") -> ", new_brk); - - if (!new_brk) { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (!new_brk)\n", target_brk); - return target_brk; - } - if (new_brk < target_original_brk) { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk < target_original_brk)\n", - target_brk); - return target_brk; - } - - /* If the new brk is less than the highest page reserved to the - * target heap allocation, set it and we're almost done... */ - if (new_brk <= brk_page) { - /* Heap contents are initialized to zero, as for anonymous - * mapped pages. */ - if (new_brk > target_brk) { - memset(g2h(target_brk), 0, new_brk - target_brk); - } - target_brk = new_brk; - DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk <= brk_page)\n", target_brk); - return target_brk; - } - - /* We need to allocate more memory after the brk... Note that - * we don't use MAP_FIXED because that will map over the top of - * any existing mapping (like the one with the host libc or qemu - * itself); instead we treat "mapped but at wrong address" as - * a failure and unmap again. - */ - new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page); - mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size, - PROT_READ|PROT_WRITE, - MAP_ANON|MAP_PRIVATE, 0, 0)); - - if (mapped_addr == brk_page) { - /* Heap contents are initialized to zero, as for anonymous - * mapped pages. Technically the new pages are already - * initialized to zero since they *are* anonymous mapped - * pages, however we have to take care with the contents that - * come from the remaining part of the previous page: it may - * contains garbage data due to a previous heap usage (grown - * then shrunken). */ - memset(g2h(target_brk), 0, brk_page - target_brk); - - target_brk = new_brk; - brk_page = HOST_PAGE_ALIGN(target_brk); - DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr == brk_page)\n", - target_brk); - return target_brk; - } else if (mapped_addr != -1) { - /* Mapped but at wrong address, meaning there wasn't actually - * enough space for this brk. - */ - target_munmap(mapped_addr, new_alloc_size); - mapped_addr = -1; - DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr != -1)\n", target_brk); - } - else { - DEBUGF_BRK(TARGET_ABI_FMT_lx " (otherwise)\n", target_brk); - } - -#if defined(TARGET_ALPHA) - /* We (partially) emulate OSF/1 on Alpha, which requires we - return a proper errno, not an unchanged brk value. */ - return -TARGET_ENOMEM; -#endif - /* For everything else, return the previous break. */ - return target_brk; -} - -static inline abi_long copy_from_user_fdset(fd_set *fds, - abi_ulong target_fds_addr, - int n) -{ - int i, nw, j, k; - abi_ulong b, *target_fds; - - nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS; - if (!(target_fds = lock_user(VERIFY_READ, - target_fds_addr, - sizeof(abi_ulong) * nw, - 1))) - return -TARGET_EFAULT; - - FD_ZERO(fds); - k = 0; - for (i = 0; i < nw; i++) { - /* grab the abi_ulong */ - __get_user(b, &target_fds[i]); - for (j = 0; j < TARGET_ABI_BITS; j++) { - /* check the bit inside the abi_ulong */ - if ((b >> j) & 1) - FD_SET(k, fds); - k++; - } - } - - unlock_user(target_fds, target_fds_addr, 0); - - return 0; -} - -static inline abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr, - abi_ulong target_fds_addr, - int n) -{ - if (target_fds_addr) { - if (copy_from_user_fdset(fds, target_fds_addr, n)) - return -TARGET_EFAULT; - *fds_ptr = fds; - } else { - *fds_ptr = NULL; - } - return 0; -} - -static inline abi_long copy_to_user_fdset(abi_ulong target_fds_addr, - const fd_set *fds, - int n) -{ - int i, nw, j, k; - abi_long v; - abi_ulong *target_fds; - - nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS; - if (!(target_fds = lock_user(VERIFY_WRITE, - target_fds_addr, - sizeof(abi_ulong) * nw, - 0))) - return -TARGET_EFAULT; - - k = 0; - for (i = 0; i < nw; i++) { - v = 0; - for (j = 0; j < TARGET_ABI_BITS; j++) { - v |= ((abi_ulong)(FD_ISSET(k, fds) != 0) << j); - k++; - } - __put_user(v, &target_fds[i]); - } - - unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw); - - return 0; -} - -#if defined(__alpha__) -#define HOST_HZ 1024 -#else -#define HOST_HZ 100 -#endif - -static inline abi_long host_to_target_clock_t(long ticks) -{ -#if HOST_HZ == TARGET_HZ - return ticks; -#else - return ((int64_t)ticks * TARGET_HZ) / HOST_HZ; -#endif -} - -static inline abi_long host_to_target_rusage(abi_ulong target_addr, - const struct rusage *rusage) -{ - struct target_rusage *target_rusage; - - if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0)) - return -TARGET_EFAULT; - target_rusage->ru_utime.tv_sec = tswapal(rusage->ru_utime.tv_sec); - target_rusage->ru_utime.tv_usec = tswapal(rusage->ru_utime.tv_usec); - target_rusage->ru_stime.tv_sec = tswapal(rusage->ru_stime.tv_sec); - target_rusage->ru_stime.tv_usec = tswapal(rusage->ru_stime.tv_usec); - target_rusage->ru_maxrss = tswapal(rusage->ru_maxrss); - target_rusage->ru_ixrss = tswapal(rusage->ru_ixrss); - target_rusage->ru_idrss = tswapal(rusage->ru_idrss); - target_rusage->ru_isrss = tswapal(rusage->ru_isrss); - target_rusage->ru_minflt = tswapal(rusage->ru_minflt); - target_rusage->ru_majflt = tswapal(rusage->ru_majflt); - target_rusage->ru_nswap = tswapal(rusage->ru_nswap); - target_rusage->ru_inblock = tswapal(rusage->ru_inblock); - target_rusage->ru_oublock = tswapal(rusage->ru_oublock); - target_rusage->ru_msgsnd = tswapal(rusage->ru_msgsnd); - target_rusage->ru_msgrcv = tswapal(rusage->ru_msgrcv); - target_rusage->ru_nsignals = tswapal(rusage->ru_nsignals); - target_rusage->ru_nvcsw = tswapal(rusage->ru_nvcsw); - target_rusage->ru_nivcsw = tswapal(rusage->ru_nivcsw); - unlock_user_struct(target_rusage, target_addr, 1); - - return 0; -} - -static inline rlim_t target_to_host_rlim(abi_ulong target_rlim) -{ - abi_ulong target_rlim_swap; - rlim_t result; - - target_rlim_swap = tswapal(target_rlim); - if (target_rlim_swap == TARGET_RLIM_INFINITY) - return RLIM_INFINITY; - - result = target_rlim_swap; - if (target_rlim_swap != (rlim_t)result) - return RLIM_INFINITY; - - return result; -} - -static inline abi_ulong host_to_target_rlim(rlim_t rlim) -{ - abi_ulong target_rlim_swap; - abi_ulong result; - - if (rlim == RLIM_INFINITY || rlim != (abi_long)rlim) - target_rlim_swap = TARGET_RLIM_INFINITY; - else - target_rlim_swap = rlim; - result = tswapal(target_rlim_swap); - - return result; -} - -static inline int target_to_host_resource(int code) -{ - switch (code) { - case TARGET_RLIMIT_AS: - return RLIMIT_AS; - case TARGET_RLIMIT_CORE: - return RLIMIT_CORE; - case TARGET_RLIMIT_CPU: - return RLIMIT_CPU; - case TARGET_RLIMIT_DATA: - return RLIMIT_DATA; - case TARGET_RLIMIT_FSIZE: - return RLIMIT_FSIZE; - case TARGET_RLIMIT_LOCKS: - return RLIMIT_LOCKS; - case TARGET_RLIMIT_MEMLOCK: - return RLIMIT_MEMLOCK; - case TARGET_RLIMIT_MSGQUEUE: - return RLIMIT_MSGQUEUE; - case TARGET_RLIMIT_NICE: - return RLIMIT_NICE; - case TARGET_RLIMIT_NOFILE: - return RLIMIT_NOFILE; - case TARGET_RLIMIT_NPROC: - return RLIMIT_NPROC; - case TARGET_RLIMIT_RSS: - return RLIMIT_RSS; - case TARGET_RLIMIT_RTPRIO: - return RLIMIT_RTPRIO; - case TARGET_RLIMIT_SIGPENDING: - return RLIMIT_SIGPENDING; - case TARGET_RLIMIT_STACK: - return RLIMIT_STACK; - default: - return code; - } -} - -static inline abi_long copy_from_user_timeval(struct timeval *tv, - abi_ulong target_tv_addr) -{ - struct target_timeval *target_tv; - - if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) - return -TARGET_EFAULT; - - __get_user(tv->tv_sec, &target_tv->tv_sec); - __get_user(tv->tv_usec, &target_tv->tv_usec); - - unlock_user_struct(target_tv, target_tv_addr, 0); - - return 0; -} - -static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, - const struct timeval *tv) -{ - struct target_timeval *target_tv; - - if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) - return -TARGET_EFAULT; - - __put_user(tv->tv_sec, &target_tv->tv_sec); - __put_user(tv->tv_usec, &target_tv->tv_usec); - - unlock_user_struct(target_tv, target_tv_addr, 1); - - return 0; -} - -static inline abi_long copy_from_user_timezone(struct timezone *tz, - abi_ulong target_tz_addr) -{ - struct target_timezone *target_tz; - - if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) { - return -TARGET_EFAULT; - } - - __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest); - __get_user(tz->tz_dsttime, &target_tz->tz_dsttime); - - unlock_user_struct(target_tz, target_tz_addr, 0); - - return 0; -} - -#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open) -#include <mqueue.h> - -static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, - abi_ulong target_mq_attr_addr) -{ - struct target_mq_attr *target_mq_attr; - - if (!lock_user_struct(VERIFY_READ, target_mq_attr, - target_mq_attr_addr, 1)) - return -TARGET_EFAULT; - - __get_user(attr->mq_flags, &target_mq_attr->mq_flags); - __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); - __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); - __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); - - unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0); - - return 0; -} - -static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr, - const struct mq_attr *attr) -{ - struct target_mq_attr *target_mq_attr; - - if (!lock_user_struct(VERIFY_WRITE, target_mq_attr, - target_mq_attr_addr, 0)) - return -TARGET_EFAULT; - - __put_user(attr->mq_flags, &target_mq_attr->mq_flags); - __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); - __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); - __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); - - unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1); - - return 0; -} -#endif - -#if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) -/* do_select() must return target values and target errnos. */ -static abi_long do_select(int n, - abi_ulong rfd_addr, abi_ulong wfd_addr, - abi_ulong efd_addr, abi_ulong target_tv_addr) -{ - fd_set rfds, wfds, efds; - fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; - struct timeval tv, *tv_ptr; - abi_long ret; - - ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); - if (ret) { - return ret; - } - ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); - if (ret) { - return ret; - } - ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); - if (ret) { - return ret; - } - - if (target_tv_addr) { - if (copy_from_user_timeval(&tv, target_tv_addr)) - return -TARGET_EFAULT; - tv_ptr = &tv; - } else { - tv_ptr = NULL; - } - - ret = get_errno(select(n, rfds_ptr, wfds_ptr, efds_ptr, tv_ptr)); - - if (!is_error(ret)) { - if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) - return -TARGET_EFAULT; - if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) - return -TARGET_EFAULT; - if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) - return -TARGET_EFAULT; - - if (target_tv_addr && copy_to_user_timeval(target_tv_addr, &tv)) - return -TARGET_EFAULT; - } - - return ret; -} -#endif - -static abi_long do_pipe2(int host_pipe[], int flags) -{ -#ifdef CONFIG_PIPE2 - return pipe2(host_pipe, flags); -#else - return -ENOSYS; -#endif -} - -static abi_long do_pipe(void *cpu_env, abi_ulong pipedes, - int flags, int is_pipe2) -{ - int host_pipe[2]; - abi_long ret; - ret = flags ? do_pipe2(host_pipe, flags) : pipe(host_pipe); - - if (is_error(ret)) - return get_errno(ret); - - /* Several targets have special calling conventions for the original - pipe syscall, but didn't replicate this into the pipe2 syscall. */ - if (!is_pipe2) { -#if defined(TARGET_ALPHA) - ((CPUAlphaState *)cpu_env)->ir[IR_A4] = host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_MIPS) - ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] = host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_SH4) - ((CPUSH4State*)cpu_env)->gregs[1] = host_pipe[1]; - return host_pipe[0]; -#elif defined(TARGET_SPARC) - ((CPUSPARCState*)cpu_env)->regwptr[1] = host_pipe[1]; - return host_pipe[0]; -#endif - } - - if (put_user_s32(host_pipe[0], pipedes) - || put_user_s32(host_pipe[1], pipedes + sizeof(host_pipe[0]))) - return -TARGET_EFAULT; - return get_errno(ret); -} - -static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, - abi_ulong target_addr, - socklen_t len) -{ - struct target_ip_mreqn *target_smreqn; - - target_smreqn = lock_user(VERIFY_READ, target_addr, len, 1); - if (!target_smreqn) - return -TARGET_EFAULT; - mreqn->imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr; - mreqn->imr_address.s_addr = target_smreqn->imr_address.s_addr; - if (len == sizeof(struct target_ip_mreqn)) - mreqn->imr_ifindex = tswapal(target_smreqn->imr_ifindex); - unlock_user(target_smreqn, target_addr, 0); - - return 0; -} - -static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, - abi_ulong target_addr, - socklen_t len) -{ - const socklen_t unix_maxlen = sizeof (struct sockaddr_un); - sa_family_t sa_family; - struct target_sockaddr *target_saddr; - - if (fd_trans_target_to_host_addr(fd)) { - return fd_trans_target_to_host_addr(fd)(addr, target_addr, len); - } - - target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); - if (!target_saddr) - return -TARGET_EFAULT; - - sa_family = tswap16(target_saddr->sa_family); - - /* Oops. The caller might send a incomplete sun_path; sun_path - * must be terminated by \0 (see the manual page), but - * unfortunately it is quite common to specify sockaddr_un - * length as "strlen(x->sun_path)" while it should be - * "strlen(...) + 1". We'll fix that here if needed. - * Linux kernel has a similar feature. - */ - - if (sa_family == AF_UNIX) { - if (len < unix_maxlen && len > 0) { - char *cp = (char*)target_saddr; - - if ( cp[len-1] && !cp[len] ) - len++; - } - if (len > unix_maxlen) - len = unix_maxlen; - } - - memcpy(addr, target_saddr, len); - addr->sa_family = sa_family; - if (sa_family == AF_PACKET) { - struct target_sockaddr_ll *lladdr; - - lladdr = (struct target_sockaddr_ll *)addr; - lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex); - lladdr->sll_hatype = tswap16(lladdr->sll_hatype); - } - unlock_user(target_saddr, target_addr, 0); - - return 0; -} - -static inline abi_long host_to_target_sockaddr(abi_ulong target_addr, - struct sockaddr *addr, - socklen_t len) -{ - struct target_sockaddr *target_saddr; - - target_saddr = lock_user(VERIFY_WRITE, target_addr, len, 0); - if (!target_saddr) - return -TARGET_EFAULT; - memcpy(target_saddr, addr, len); - target_saddr->sa_family = tswap16(addr->sa_family); - unlock_user(target_saddr, target_addr, len); - - return 0; -} - -static inline abi_long target_to_host_cmsg(struct msghdr *msgh, - struct target_msghdr *target_msgh) -{ - struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh); - abi_long msg_controllen; - abi_ulong target_cmsg_addr; - struct target_cmsghdr *target_cmsg, *target_cmsg_start; - socklen_t space = 0; - - msg_controllen = tswapal(target_msgh->msg_controllen); - if (msg_controllen < sizeof (struct target_cmsghdr)) - goto the_end; - target_cmsg_addr = tswapal(target_msgh->msg_control); - target_cmsg = lock_user(VERIFY_READ, target_cmsg_addr, msg_controllen, 1); - target_cmsg_start = target_cmsg; - if (!target_cmsg) - return -TARGET_EFAULT; - - while (cmsg && target_cmsg) { - void *data = CMSG_DATA(cmsg); - void *target_data = TARGET_CMSG_DATA(target_cmsg); - - int len = tswapal(target_cmsg->cmsg_len) - - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr)); - - space += CMSG_SPACE(len); - if (space > msgh->msg_controllen) { - space -= CMSG_SPACE(len); - /* This is a QEMU bug, since we allocated the payload - * area ourselves (unlike overflow in host-to-target - * conversion, which is just the guest giving us a buffer - * that's too small). It can't happen for the payload types - * we currently support; if it becomes an issue in future - * we would need to improve our allocation strategy to - * something more intelligent than "twice the size of the - * target buffer we're reading from". - */ - gemu_log("Host cmsg overflow\n"); - break; - } - - if (tswap32(target_cmsg->cmsg_level) == TARGET_SOL_SOCKET) { - cmsg->cmsg_level = SOL_SOCKET; - } else { - cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level); - } - cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type); - cmsg->cmsg_len = CMSG_LEN(len); - - if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) { - int *fd = (int *)data; - int *target_fd = (int *)target_data; - int i, numfds = len / sizeof(int); - - for (i = 0; i < numfds; i++) { - __get_user(fd[i], target_fd + i); - } - } else if (cmsg->cmsg_level == SOL_SOCKET - && cmsg->cmsg_type == SCM_CREDENTIALS) { - struct ucred *cred = (struct ucred *)data; - struct target_ucred *target_cred = - (struct target_ucred *)target_data; - - __get_user(cred->pid, &target_cred->pid); - __get_user(cred->uid, &target_cred->uid); - __get_user(cred->gid, &target_cred->gid); - } else { - gemu_log("Unsupported ancillary data: %d/%d\n", - cmsg->cmsg_level, cmsg->cmsg_type); - memcpy(data, target_data, len); - } - - cmsg = CMSG_NXTHDR(msgh, cmsg); - target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg, - target_cmsg_start); - } - unlock_user(target_cmsg, target_cmsg_addr, 0); - the_end: - msgh->msg_controllen = space; - return 0; -} - -static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh, - struct msghdr *msgh) -{ - struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh); - abi_long msg_controllen; - abi_ulong target_cmsg_addr; - struct target_cmsghdr *target_cmsg, *target_cmsg_start; - socklen_t space = 0; - - msg_controllen = tswapal(target_msgh->msg_controllen); - if (msg_controllen < sizeof (struct target_cmsghdr)) - goto the_end; - target_cmsg_addr = tswapal(target_msgh->msg_control); - target_cmsg = lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controllen, 0); - target_cmsg_start = target_cmsg; - if (!target_cmsg) - return -TARGET_EFAULT; - - while (cmsg && target_cmsg) { - void *data = CMSG_DATA(cmsg); - void *target_data = TARGET_CMSG_DATA(target_cmsg); - - int len = cmsg->cmsg_len - CMSG_ALIGN(sizeof (struct cmsghdr)); - int tgt_len, tgt_space; - - /* We never copy a half-header but may copy half-data; - * this is Linux's behaviour in put_cmsg(). Note that - * truncation here is a guest problem (which we report - * to the guest via the CTRUNC bit), unlike truncation - * in target_to_host_cmsg, which is a QEMU bug. - */ - if (msg_controllen < sizeof(struct cmsghdr)) { - target_msgh->msg_flags |= tswap32(MSG_CTRUNC); - break; - } - - if (cmsg->cmsg_level == SOL_SOCKET) { - target_cmsg->cmsg_level = tswap32(TARGET_SOL_SOCKET); - } else { - target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level); - } - target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type); - - tgt_len = TARGET_CMSG_LEN(len); - - /* Payload types which need a different size of payload on - * the target must adjust tgt_len here. - */ - switch (cmsg->cmsg_level) { - case SOL_SOCKET: - switch (cmsg->cmsg_type) { - case SO_TIMESTAMP: - tgt_len = sizeof(struct target_timeval); - break; - default: - break; - } - default: - break; - } - - if (msg_controllen < tgt_len) { - target_msgh->msg_flags |= tswap32(MSG_CTRUNC); - tgt_len = msg_controllen; - } - - /* We must now copy-and-convert len bytes of payload - * into tgt_len bytes of destination space. Bear in mind - * that in both source and destination we may be dealing - * with a truncated value! - */ - switch (cmsg->cmsg_level) { - case SOL_SOCKET: - switch (cmsg->cmsg_type) { - case SCM_RIGHTS: - { - int *fd = (int *)data; - int *target_fd = (int *)target_data; - int i, numfds = tgt_len / sizeof(int); - - for (i = 0; i < numfds; i++) { - __put_user(fd[i], target_fd + i); - } - break; - } - case SO_TIMESTAMP: - { - struct timeval *tv = (struct timeval *)data; - struct target_timeval *target_tv = - (struct target_timeval *)target_data; - - if (len != sizeof(struct timeval) || - tgt_len != sizeof(struct target_timeval)) { - goto unimplemented; - } - - /* copy struct timeval to target */ - __put_user(tv->tv_sec, &target_tv->tv_sec); - __put_user(tv->tv_usec, &target_tv->tv_usec); - break; - } - case SCM_CREDENTIALS: - { - struct ucred *cred = (struct ucred *)data; - struct target_ucred *target_cred = - (struct target_ucred *)target_data; - - __put_user(cred->pid, &target_cred->pid); - __put_user(cred->uid, &target_cred->uid); - __put_user(cred->gid, &target_cred->gid); - break; - } - default: - goto unimplemented; - } - break; - - default: - unimplemented: - gemu_log("Unsupported ancillary data: %d/%d\n", - cmsg->cmsg_level, cmsg->cmsg_type); - memcpy(target_data, data, MIN(len, tgt_len)); - if (tgt_len > len) { - memset(target_data + len, 0, tgt_len - len); - } - } - - target_cmsg->cmsg_len = tswapal(tgt_len); - tgt_space = TARGET_CMSG_SPACE(len); - if (msg_controllen < tgt_space) { - tgt_space = msg_controllen; - } - msg_controllen -= tgt_space; - space += tgt_space; - cmsg = CMSG_NXTHDR(msgh, cmsg); - target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg, - target_cmsg_start); - } - unlock_user(target_cmsg, target_cmsg_addr, space); - the_end: - target_msgh->msg_controllen = tswapal(space); - return 0; -} - -/* do_setsockopt() Must return target values and target errnos. */ -static abi_long do_setsockopt(int sockfd, int level, int optname, - abi_ulong optval_addr, socklen_t optlen) -{ - abi_long ret; - int val; - struct ip_mreqn *ip_mreq; - struct ip_mreq_source *ip_mreq_source; - - switch(level) { - case SOL_TCP: - /* TCP options all take an 'int' value. */ - if (optlen < sizeof(uint32_t)) - return -TARGET_EINVAL; - - if (get_user_u32(val, optval_addr)) - return -TARGET_EFAULT; - ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val))); - break; - case SOL_IP: - switch(optname) { - case IP_TOS: - case IP_TTL: - case IP_HDRINCL: - case IP_ROUTER_ALERT: - case IP_RECVOPTS: - case IP_RETOPTS: - case IP_PKTINFO: - case IP_MTU_DISCOVER: - case IP_RECVERR: - case IP_RECVTOS: -#ifdef IP_FREEBIND - case IP_FREEBIND: -#endif - case IP_MULTICAST_TTL: - case IP_MULTICAST_LOOP: - val = 0; - if (optlen >= sizeof(uint32_t)) { - if (get_user_u32(val, optval_addr)) - return -TARGET_EFAULT; - } else if (optlen >= 1) { - if (get_user_u8(val, optval_addr)) - return -TARGET_EFAULT; - } - ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val))); - break; - case IP_ADD_MEMBERSHIP: - case IP_DROP_MEMBERSHIP: - if (optlen < sizeof (struct target_ip_mreq) || - optlen > sizeof (struct target_ip_mreqn)) - return -TARGET_EINVAL; - - ip_mreq = (struct ip_mreqn *) alloca(optlen); - target_to_host_ip_mreq(ip_mreq, optval_addr, optlen); - ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq, optlen)); - break; - - case IP_BLOCK_SOURCE: - case IP_UNBLOCK_SOURCE: - case IP_ADD_SOURCE_MEMBERSHIP: - case IP_DROP_SOURCE_MEMBERSHIP: - if (optlen != sizeof (struct target_ip_mreq_source)) - return -TARGET_EINVAL; - - ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1); - ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen)); - unlock_user (ip_mreq_source, optval_addr, 0); - break; - - default: - goto unimplemented; - } - break; - case SOL_IPV6: - switch (optname) { - case IPV6_MTU_DISCOVER: - case IPV6_MTU: - case IPV6_V6ONLY: - case IPV6_RECVPKTINFO: - val = 0; - if (optlen < sizeof(uint32_t)) { - return -TARGET_EINVAL; - } - if (get_user_u32(val, optval_addr)) { - return -TARGET_EFAULT; - } - ret = get_errno(setsockopt(sockfd, level, optname, - &val, sizeof(val))); - break; - default: - goto unimplemented; - } - break; - case SOL_RAW: - switch (optname) { - case ICMP_FILTER: - /* struct icmp_filter takes an u32 value */ - if (optlen < sizeof(uint32_t)) { - return -TARGET_EINVAL; - } - - if (get_user_u32(val, optval_addr)) { - return -TARGET_EFAULT; - } - ret = get_errno(setsockopt(sockfd, level, optname, - &val, sizeof(val))); - break; - - default: - goto unimplemented; - } - break; - case TARGET_SOL_SOCKET: - switch (optname) { - case TARGET_SO_RCVTIMEO: - { - struct timeval tv; - - optname = SO_RCVTIMEO; - -set_timeout: - if (optlen != sizeof(struct target_timeval)) { - return -TARGET_EINVAL; - } - - if (copy_from_user_timeval(&tv, optval_addr)) { - return -TARGET_EFAULT; - } - - ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, - &tv, sizeof(tv))); - return ret; - } - case TARGET_SO_SNDTIMEO: - optname = SO_SNDTIMEO; - goto set_timeout; - case TARGET_SO_ATTACH_FILTER: - { - struct target_sock_fprog *tfprog; - struct target_sock_filter *tfilter; - struct sock_fprog fprog; - struct sock_filter *filter; - int i; - - if (optlen != sizeof(*tfprog)) { - return -TARGET_EINVAL; - } - if (!lock_user_struct(VERIFY_READ, tfprog, optval_addr, 0)) { - return -TARGET_EFAULT; - } - if (!lock_user_struct(VERIFY_READ, tfilter, - tswapal(tfprog->filter), 0)) { - unlock_user_struct(tfprog, optval_addr, 1); - return -TARGET_EFAULT; - } - - fprog.len = tswap16(tfprog->len); - filter = g_try_new(struct sock_filter, fprog.len); - if (filter == NULL) { - unlock_user_struct(tfilter, tfprog->filter, 1); - unlock_user_struct(tfprog, optval_addr, 1); - return -TARGET_ENOMEM; - } - for (i = 0; i < fprog.len; i++) { - filter[i].code = tswap16(tfilter[i].code); - filter[i].jt = tfilter[i].jt; - filter[i].jf = tfilter[i].jf; - filter[i].k = tswap32(tfilter[i].k); - } - fprog.filter = filter; - - ret = get_errno(setsockopt(sockfd, SOL_SOCKET, - SO_ATTACH_FILTER, &fprog, sizeof(fprog))); - g_free(filter); - - unlock_user_struct(tfilter, tfprog->filter, 1); - unlock_user_struct(tfprog, optval_addr, 1); - return ret; - } - case TARGET_SO_BINDTODEVICE: - { - char *dev_ifname, *addr_ifname; - - if (optlen > IFNAMSIZ - 1) { - optlen = IFNAMSIZ - 1; - } - dev_ifname = lock_user(VERIFY_READ, optval_addr, optlen, 1); - if (!dev_ifname) { - return -TARGET_EFAULT; - } - optname = SO_BINDTODEVICE; - addr_ifname = alloca(IFNAMSIZ); - memcpy(addr_ifname, dev_ifname, optlen); - addr_ifname[optlen] = 0; - ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, - addr_ifname, optlen)); - unlock_user (dev_ifname, optval_addr, 0); - return ret; - } - /* Options with 'int' argument. */ - case TARGET_SO_DEBUG: - optname = SO_DEBUG; - break; - case TARGET_SO_REUSEADDR: - optname = SO_REUSEADDR; - break; - case TARGET_SO_TYPE: - optname = SO_TYPE; - break; - case TARGET_SO_ERROR: - optname = SO_ERROR; - break; - case TARGET_SO_DONTROUTE: - optname = SO_DONTROUTE; - break; - case TARGET_SO_BROADCAST: - optname = SO_BROADCAST; - break; - case TARGET_SO_SNDBUF: - optname = SO_SNDBUF; - break; - case TARGET_SO_SNDBUFFORCE: - optname = SO_SNDBUFFORCE; - break; - case TARGET_SO_RCVBUF: - optname = SO_RCVBUF; - break; - case TARGET_SO_RCVBUFFORCE: - optname = SO_RCVBUFFORCE; - break; - case TARGET_SO_KEEPALIVE: - optname = SO_KEEPALIVE; - break; - case TARGET_SO_OOBINLINE: - optname = SO_OOBINLINE; - break; - case TARGET_SO_NO_CHECK: - optname = SO_NO_CHECK; - break; - case TARGET_SO_PRIORITY: - optname = SO_PRIORITY; - break; -#ifdef SO_BSDCOMPAT - case TARGET_SO_BSDCOMPAT: - optname = SO_BSDCOMPAT; - break; -#endif - case TARGET_SO_PASSCRED: - optname = SO_PASSCRED; - break; - case TARGET_SO_PASSSEC: - optname = SO_PASSSEC; - break; - case TARGET_SO_TIMESTAMP: - optname = SO_TIMESTAMP; - break; - case TARGET_SO_RCVLOWAT: - optname = SO_RCVLOWAT; - break; - break; - default: - goto unimplemented; - } - if (optlen < sizeof(uint32_t)) - return -TARGET_EINVAL; - - if (get_user_u32(val, optval_addr)) - return -TARGET_EFAULT; - ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val))); - break; - default: - unimplemented: - gemu_log("Unsupported setsockopt level=%d optname=%d\n", level, optname); - ret = -TARGET_ENOPROTOOPT; - } - return ret; -} - -/* do_getsockopt() Must return target values and target errnos. */ -static abi_long do_getsockopt(int sockfd, int level, int optname, - abi_ulong optval_addr, abi_ulong optlen) -{ - abi_long ret; - int len, val; - socklen_t lv; - - switch(level) { - case TARGET_SOL_SOCKET: - level = SOL_SOCKET; - switch (optname) { - /* These don't just return a single integer */ - case TARGET_SO_LINGER: - case TARGET_SO_RCVTIMEO: - case TARGET_SO_SNDTIMEO: - case TARGET_SO_PEERNAME: - goto unimplemented; - case TARGET_SO_PEERCRED: { - struct ucred cr; - socklen_t crlen; - struct target_ucred *tcr; - - if (get_user_u32(len, optlen)) { - return -TARGET_EFAULT; - } - if (len < 0) { - return -TARGET_EINVAL; - } - - crlen = sizeof(cr); - ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED, - &cr, &crlen)); - if (ret < 0) { - return ret; - } - if (len > crlen) { - len = crlen; - } - if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) { - return -TARGET_EFAULT; - } - __put_user(cr.pid, &tcr->pid); - __put_user(cr.uid, &tcr->uid); - __put_user(cr.gid, &tcr->gid); - unlock_user_struct(tcr, optval_addr, 1); - if (put_user_u32(len, optlen)) { - return -TARGET_EFAULT; - } - break; - } - /* Options with 'int' argument. */ - case TARGET_SO_DEBUG: - optname = SO_DEBUG; - goto int_case; - case TARGET_SO_REUSEADDR: - optname = SO_REUSEADDR; - goto int_case; - case TARGET_SO_TYPE: - optname = SO_TYPE; - goto int_case; - case TARGET_SO_ERROR: - optname = SO_ERROR; - goto int_case; - case TARGET_SO_DONTROUTE: - optname = SO_DONTROUTE; - goto int_case; - case TARGET_SO_BROADCAST: - optname = SO_BROADCAST; - goto int_case; - case TARGET_SO_SNDBUF: - optname = SO_SNDBUF; - goto int_case; - case TARGET_SO_RCVBUF: - optname = SO_RCVBUF; - goto int_case; - case TARGET_SO_KEEPALIVE: - optname = SO_KEEPALIVE; - goto int_case; - case TARGET_SO_OOBINLINE: - optname = SO_OOBINLINE; - goto int_case; - case TARGET_SO_NO_CHECK: - optname = SO_NO_CHECK; - goto int_case; - case TARGET_SO_PRIORITY: - optname = SO_PRIORITY; - goto int_case; -#ifdef SO_BSDCOMPAT - case TARGET_SO_BSDCOMPAT: - optname = SO_BSDCOMPAT; - goto int_case; -#endif - case TARGET_SO_PASSCRED: - optname = SO_PASSCRED; - goto int_case; - case TARGET_SO_TIMESTAMP: - optname = SO_TIMESTAMP; - goto int_case; - case TARGET_SO_RCVLOWAT: - optname = SO_RCVLOWAT; - goto int_case; - case TARGET_SO_ACCEPTCONN: - optname = SO_ACCEPTCONN; - goto int_case; - default: - goto int_case; - } - break; - case SOL_TCP: - /* TCP options all take an 'int' value. */ - int_case: - if (get_user_u32(len, optlen)) - return -TARGET_EFAULT; - if (len < 0) - return -TARGET_EINVAL; - lv = sizeof(lv); - ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv)); - if (ret < 0) - return ret; - if (optname == SO_TYPE) { - val = host_to_target_sock_type(val); - } - if (len > lv) - len = lv; - if (len == 4) { - if (put_user_u32(val, optval_addr)) - return -TARGET_EFAULT; - } else { - if (put_user_u8(val, optval_addr)) - return -TARGET_EFAULT; - } - if (put_user_u32(len, optlen)) - return -TARGET_EFAULT; - break; - case SOL_IP: - switch(optname) { - case IP_TOS: - case IP_TTL: - case IP_HDRINCL: - case IP_ROUTER_ALERT: - case IP_RECVOPTS: - case IP_RETOPTS: - case IP_PKTINFO: - case IP_MTU_DISCOVER: - case IP_RECVERR: - case IP_RECVTOS: -#ifdef IP_FREEBIND - case IP_FREEBIND: -#endif - case IP_MULTICAST_TTL: - case IP_MULTICAST_LOOP: - if (get_user_u32(len, optlen)) - return -TARGET_EFAULT; - if (len < 0) - return -TARGET_EINVAL; - lv = sizeof(lv); - ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv)); - if (ret < 0) - return ret; - if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) { - len = 1; - if (put_user_u32(len, optlen) - || put_user_u8(val, optval_addr)) - return -TARGET_EFAULT; - } else { - if (len > sizeof(int)) - len = sizeof(int); - if (put_user_u32(len, optlen) - || put_user_u32(val, optval_addr)) - return -TARGET_EFAULT; - } - break; - default: - ret = -TARGET_ENOPROTOOPT; - break; - } - break; - default: - unimplemented: - gemu_log("getsockopt level=%d optname=%d not yet supported\n", - level, optname); - ret = -TARGET_EOPNOTSUPP; - break; - } - return ret; -} - -static struct iovec *lock_iovec(int type, abi_ulong target_addr, - int count, int copy) -{ - struct target_iovec *target_vec; - struct iovec *vec; - abi_ulong total_len, max_len; - int i; - int err = 0; - bool bad_address = false; - - if (count == 0) { - errno = 0; - return NULL; - } - if (count < 0 || count > IOV_MAX) { - errno = EINVAL; - return NULL; - } - - vec = g_try_new0(struct iovec, count); - if (vec == NULL) { - errno = ENOMEM; - return NULL; - } - - target_vec = lock_user(VERIFY_READ, target_addr, - count * sizeof(struct target_iovec), 1); - if (target_vec == NULL) { - err = EFAULT; - goto fail2; - } - - /* ??? If host page size > target page size, this will result in a - value larger than what we can actually support. */ - max_len = 0x7fffffff & TARGET_PAGE_MASK; - total_len = 0; - - for (i = 0; i < count; i++) { - abi_ulong base = tswapal(target_vec[i].iov_base); - abi_long len = tswapal(target_vec[i].iov_len); - - if (len < 0) { - err = EINVAL; - goto fail; - } else if (len == 0) { - /* Zero length pointer is ignored. */ - vec[i].iov_base = 0; - } else { - vec[i].iov_base = lock_user(type, base, len, copy); - /* If the first buffer pointer is bad, this is a fault. But - * subsequent bad buffers will result in a partial write; this - * is realized by filling the vector with null pointers and - * zero lengths. */ - if (!vec[i].iov_base) { - if (i == 0) { - err = EFAULT; - goto fail; - } else { - bad_address = true; - } - } - if (bad_address) { - len = 0; - } - if (len > max_len - total_len) { - len = max_len - total_len; - } - } - vec[i].iov_len = len; - total_len += len; - } - - unlock_user(target_vec, target_addr, 0); - return vec; - - fail: - while (--i >= 0) { - if (tswapal(target_vec[i].iov_len) > 0) { - unlock_user(vec[i].iov_base, tswapal(target_vec[i].iov_base), 0); - } - } - unlock_user(target_vec, target_addr, 0); - fail2: - g_free(vec); - errno = err; - return NULL; -} - -static void unlock_iovec(struct iovec *vec, abi_ulong target_addr, - int count, int copy) -{ - struct target_iovec *target_vec; - int i; - - target_vec = lock_user(VERIFY_READ, target_addr, - count * sizeof(struct target_iovec), 1); - if (target_vec) { - for (i = 0; i < count; i++) { - abi_ulong base = tswapal(target_vec[i].iov_base); - abi_long len = tswapal(target_vec[i].iov_len); - if (len < 0) { - break; - } - unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0); - } - unlock_user(target_vec, target_addr, 0); - } - - g_free(vec); -} - -static inline int target_to_host_sock_type(int *type) -{ - int host_type = 0; - int target_type = *type; - - switch (target_type & TARGET_SOCK_TYPE_MASK) { - case TARGET_SOCK_DGRAM: - host_type = SOCK_DGRAM; - break; - case TARGET_SOCK_STREAM: - host_type = SOCK_STREAM; - break; - default: - host_type = target_type & TARGET_SOCK_TYPE_MASK; - break; - } - if (target_type & TARGET_SOCK_CLOEXEC) { -#if defined(SOCK_CLOEXEC) - host_type |= SOCK_CLOEXEC; -#else - return -TARGET_EINVAL; -#endif - } - if (target_type & TARGET_SOCK_NONBLOCK) { -#if defined(SOCK_NONBLOCK) - host_type |= SOCK_NONBLOCK; -#elif !defined(O_NONBLOCK) - return -TARGET_EINVAL; -#endif - } - *type = host_type; - return 0; -} - -/* Try to emulate socket type flags after socket creation. */ -static int sock_flags_fixup(int fd, int target_type) -{ -#if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK) - if (target_type & TARGET_SOCK_NONBLOCK) { - int flags = fcntl(fd, F_GETFL); - if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) { - close(fd); - return -TARGET_EINVAL; - } - } -#endif - return fd; -} - -static abi_long packet_target_to_host_sockaddr(void *host_addr, - abi_ulong target_addr, - socklen_t len) -{ - struct sockaddr *addr = host_addr; - struct target_sockaddr *target_saddr; - - target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); - if (!target_saddr) { - return -TARGET_EFAULT; - } - - memcpy(addr, target_saddr, len); - addr->sa_family = tswap16(target_saddr->sa_family); - /* spkt_protocol is big-endian */ - - unlock_user(target_saddr, target_addr, 0); - return 0; -} - -static TargetFdTrans target_packet_trans = { - .target_to_host_addr = packet_target_to_host_sockaddr, -}; - -/* do_socket() Must return target values and target errnos. */ -static abi_long do_socket(int domain, int type, int protocol) -{ - int target_type = type; - int ret; - - ret = target_to_host_sock_type(&type); - if (ret) { - return ret; - } - - if (domain == PF_NETLINK) - return -TARGET_EAFNOSUPPORT; - - if (domain == AF_PACKET || - (domain == AF_INET && type == SOCK_PACKET)) { - protocol = tswap16(protocol); - } - - ret = get_errno(socket(domain, type, protocol)); - if (ret >= 0) { - ret = sock_flags_fixup(ret, target_type); - if (type == SOCK_PACKET) { - /* Manage an obsolete case : - * if socket type is SOCK_PACKET, bind by name - */ - fd_trans_register(ret, &target_packet_trans); - } - } - return ret; -} - -/* do_bind() Must return target values and target errnos. */ -static abi_long do_bind(int sockfd, abi_ulong target_addr, - socklen_t addrlen) -{ - void *addr; - abi_long ret; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - addr = alloca(addrlen+1); - - ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); - if (ret) - return ret; - - return get_errno(bind(sockfd, addr, addrlen)); -} - -/* do_connect() Must return target values and target errnos. */ -static abi_long do_connect(int sockfd, abi_ulong target_addr, - socklen_t addrlen) -{ - void *addr; - abi_long ret; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - addr = alloca(addrlen+1); - - ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); - if (ret) - return ret; - - return get_errno(connect(sockfd, addr, addrlen)); -} - -/* do_sendrecvmsg_locked() Must return target values and target errnos. */ -static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp, - int flags, int send) -{ - abi_long ret, len; - struct msghdr msg; - int count; - struct iovec *vec; - abi_ulong target_vec; - - if (msgp->msg_name) { - msg.msg_namelen = tswap32(msgp->msg_namelen); - msg.msg_name = alloca(msg.msg_namelen+1); - ret = target_to_host_sockaddr(fd, msg.msg_name, - tswapal(msgp->msg_name), - msg.msg_namelen); - if (ret) { - goto out2; - } - } else { - msg.msg_name = NULL; - msg.msg_namelen = 0; - } - msg.msg_controllen = 2 * tswapal(msgp->msg_controllen); - msg.msg_control = alloca(msg.msg_controllen); - msg.msg_flags = tswap32(msgp->msg_flags); - - count = tswapal(msgp->msg_iovlen); - target_vec = tswapal(msgp->msg_iov); - vec = lock_iovec(send ? VERIFY_READ : VERIFY_WRITE, - target_vec, count, send); - if (vec == NULL) { - ret = -host_to_target_errno(errno); - goto out2; - } - msg.msg_iovlen = count; - msg.msg_iov = vec; - - if (send) { - ret = target_to_host_cmsg(&msg, msgp); - if (ret == 0) - ret = get_errno(sendmsg(fd, &msg, flags)); - } else { - ret = get_errno(recvmsg(fd, &msg, flags)); - if (!is_error(ret)) { - len = ret; - ret = host_to_target_cmsg(msgp, &msg); - if (!is_error(ret)) { - msgp->msg_namelen = tswap32(msg.msg_namelen); - if (msg.msg_name != NULL) { - ret = host_to_target_sockaddr(tswapal(msgp->msg_name), - msg.msg_name, msg.msg_namelen); - if (ret) { - goto out; - } - } - - ret = len; - } - } - } - -out: - unlock_iovec(vec, target_vec, count, !send); -out2: - return ret; -} - -static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, - int flags, int send) -{ - abi_long ret; - struct target_msghdr *msgp; - - if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE, - msgp, - target_msg, - send ? 1 : 0)) { - return -TARGET_EFAULT; - } - ret = do_sendrecvmsg_locked(fd, msgp, flags, send); - unlock_user_struct(msgp, target_msg, send ? 0 : 1); - return ret; -} - -/* We don't rely on the C library to have sendmmsg/recvmmsg support, - * so it might not have this *mmsg-specific flag either. - */ -#ifndef MSG_WAITFORONE -#define MSG_WAITFORONE 0x10000 -#endif - -static abi_long do_sendrecvmmsg(int fd, abi_ulong target_msgvec, - unsigned int vlen, unsigned int flags, - int send) -{ - struct target_mmsghdr *mmsgp; - abi_long ret = 0; - int i; - - if (vlen > UIO_MAXIOV) { - vlen = UIO_MAXIOV; - } - - mmsgp = lock_user(VERIFY_WRITE, target_msgvec, sizeof(*mmsgp) * vlen, 1); - if (!mmsgp) { - return -TARGET_EFAULT; - } - - for (i = 0; i < vlen; i++) { - ret = do_sendrecvmsg_locked(fd, &mmsgp[i].msg_hdr, flags, send); - if (is_error(ret)) { - break; - } - mmsgp[i].msg_len = tswap32(ret); - /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */ - if (flags & MSG_WAITFORONE) { - flags |= MSG_DONTWAIT; - } - } - - unlock_user(mmsgp, target_msgvec, sizeof(*mmsgp) * i); - - /* Return number of datagrams sent if we sent any at all; - * otherwise return the error. - */ - if (i) { - return i; - } - return ret; -} - -/* If we don't have a system accept4() then just call accept. - * The callsites to do_accept4() will ensure that they don't - * pass a non-zero flags argument in this config. - */ -#ifndef CONFIG_ACCEPT4 -static inline int accept4(int sockfd, struct sockaddr *addr, - socklen_t *addrlen, int flags) -{ - assert(flags == 0); - return accept(sockfd, addr, addrlen); -} -#endif - -/* do_accept4() Must return target values and target errnos. */ -static abi_long do_accept4(int fd, abi_ulong target_addr, - abi_ulong target_addrlen_addr, int flags) -{ - socklen_t addrlen; - void *addr; - abi_long ret; - int host_flags; - - host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl); - - if (target_addr == 0) { - return get_errno(accept4(fd, NULL, NULL, host_flags)); - } - - /* linux returns EINVAL if addrlen pointer is invalid */ - if (get_user_u32(addrlen, target_addrlen_addr)) - return -TARGET_EINVAL; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) - return -TARGET_EINVAL; - - addr = alloca(addrlen); - - ret = get_errno(accept4(fd, addr, &addrlen, host_flags)); - if (!is_error(ret)) { - host_to_target_sockaddr(target_addr, addr, addrlen); - if (put_user_u32(addrlen, target_addrlen_addr)) - ret = -TARGET_EFAULT; - } - return ret; -} - -/* do_getpeername() Must return target values and target errnos. */ -static abi_long do_getpeername(int fd, abi_ulong target_addr, - abi_ulong target_addrlen_addr) -{ - socklen_t addrlen; - void *addr; - abi_long ret; - - if (get_user_u32(addrlen, target_addrlen_addr)) - return -TARGET_EFAULT; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) - return -TARGET_EFAULT; - - addr = alloca(addrlen); - - ret = get_errno(getpeername(fd, addr, &addrlen)); - if (!is_error(ret)) { - host_to_target_sockaddr(target_addr, addr, addrlen); - if (put_user_u32(addrlen, target_addrlen_addr)) - ret = -TARGET_EFAULT; - } - return ret; -} - -/* do_getsockname() Must return target values and target errnos. */ -static abi_long do_getsockname(int fd, abi_ulong target_addr, - abi_ulong target_addrlen_addr) -{ - socklen_t addrlen; - void *addr; - abi_long ret; - - if (get_user_u32(addrlen, target_addrlen_addr)) - return -TARGET_EFAULT; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) - return -TARGET_EFAULT; - - addr = alloca(addrlen); - - ret = get_errno(getsockname(fd, addr, &addrlen)); - if (!is_error(ret)) { - host_to_target_sockaddr(target_addr, addr, addrlen); - if (put_user_u32(addrlen, target_addrlen_addr)) - ret = -TARGET_EFAULT; - } - return ret; -} - -/* do_socketpair() Must return target values and target errnos. */ -static abi_long do_socketpair(int domain, int type, int protocol, - abi_ulong target_tab_addr) -{ - int tab[2]; - abi_long ret; - - target_to_host_sock_type(&type); - - ret = get_errno(socketpair(domain, type, protocol, tab)); - if (!is_error(ret)) { - if (put_user_s32(tab[0], target_tab_addr) - || put_user_s32(tab[1], target_tab_addr + sizeof(tab[0]))) - ret = -TARGET_EFAULT; - } - return ret; -} - -/* do_sendto() Must return target values and target errnos. */ -static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, - abi_ulong target_addr, socklen_t addrlen) -{ - void *addr; - void *host_msg; - abi_long ret; - - if ((int)addrlen < 0) { - return -TARGET_EINVAL; - } - - host_msg = lock_user(VERIFY_READ, msg, len, 1); - if (!host_msg) - return -TARGET_EFAULT; - if (target_addr) { - addr = alloca(addrlen+1); - ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen); - if (ret) { - unlock_user(host_msg, msg, 0); - return ret; - } - ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen)); - } else { - ret = get_errno(send(fd, host_msg, len, flags)); - } - unlock_user(host_msg, msg, 0); - return ret; -} - -/* do_recvfrom() Must return target values and target errnos. */ -static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags, - abi_ulong target_addr, - abi_ulong target_addrlen) -{ - socklen_t addrlen; - void *addr; - void *host_msg; - abi_long ret; - - host_msg = lock_user(VERIFY_WRITE, msg, len, 0); - if (!host_msg) - return -TARGET_EFAULT; - if (target_addr) { - if (get_user_u32(addrlen, target_addrlen)) { - ret = -TARGET_EFAULT; - goto fail; - } - if ((int)addrlen < 0) { - ret = -TARGET_EINVAL; - goto fail; - } - addr = alloca(addrlen); - ret = get_errno(recvfrom(fd, host_msg, len, flags, addr, &addrlen)); - } else { - addr = NULL; /* To keep compiler quiet. */ - ret = get_errno(qemu_recv(fd, host_msg, len, flags)); - } - if (!is_error(ret)) { - if (target_addr) { - host_to_target_sockaddr(target_addr, addr, addrlen); - if (put_user_u32(addrlen, target_addrlen)) { - ret = -TARGET_EFAULT; - goto fail; - } - } - unlock_user(host_msg, msg, len); - } else { -fail: - unlock_user(host_msg, msg, 0); - } - return ret; -} - -#ifdef TARGET_NR_socketcall -/* do_socketcall() Must return target values and target errnos. */ -static abi_long do_socketcall(int num, abi_ulong vptr) -{ - static const unsigned ac[] = { /* number of arguments per call */ - [SOCKOP_socket] = 3, /* domain, type, protocol */ - [SOCKOP_bind] = 3, /* sockfd, addr, addrlen */ - [SOCKOP_connect] = 3, /* sockfd, addr, addrlen */ - [SOCKOP_listen] = 2, /* sockfd, backlog */ - [SOCKOP_accept] = 3, /* sockfd, addr, addrlen */ - [SOCKOP_accept4] = 4, /* sockfd, addr, addrlen, flags */ - [SOCKOP_getsockname] = 3, /* sockfd, addr, addrlen */ - [SOCKOP_getpeername] = 3, /* sockfd, addr, addrlen */ - [SOCKOP_socketpair] = 4, /* domain, type, protocol, tab */ - [SOCKOP_send] = 4, /* sockfd, msg, len, flags */ - [SOCKOP_recv] = 4, /* sockfd, msg, len, flags */ - [SOCKOP_sendto] = 6, /* sockfd, msg, len, flags, addr, addrlen */ - [SOCKOP_recvfrom] = 6, /* sockfd, msg, len, flags, addr, addrlen */ - [SOCKOP_shutdown] = 2, /* sockfd, how */ - [SOCKOP_sendmsg] = 3, /* sockfd, msg, flags */ - [SOCKOP_recvmsg] = 3, /* sockfd, msg, flags */ - [SOCKOP_sendmmsg] = 4, /* sockfd, msgvec, vlen, flags */ - [SOCKOP_recvmmsg] = 4, /* sockfd, msgvec, vlen, flags */ - [SOCKOP_setsockopt] = 5, /* sockfd, level, optname, optval, optlen */ - [SOCKOP_getsockopt] = 5, /* sockfd, level, optname, optval, optlen */ - }; - abi_long a[6]; /* max 6 args */ - - /* first, collect the arguments in a[] according to ac[] */ - if (num >= 0 && num < ARRAY_SIZE(ac)) { - unsigned i; - assert(ARRAY_SIZE(a) >= ac[num]); /* ensure we have space for args */ - for (i = 0; i < ac[num]; ++i) { - if (get_user_ual(a[i], vptr + i * sizeof(abi_long)) != 0) { - return -TARGET_EFAULT; - } - } - } - - /* now when we have the args, actually handle the call */ - switch (num) { - case SOCKOP_socket: /* domain, type, protocol */ - return do_socket(a[0], a[1], a[2]); - case SOCKOP_bind: /* sockfd, addr, addrlen */ - return do_bind(a[0], a[1], a[2]); - case SOCKOP_connect: /* sockfd, addr, addrlen */ - return do_connect(a[0], a[1], a[2]); - case SOCKOP_listen: /* sockfd, backlog */ - return get_errno(listen(a[0], a[1])); - case SOCKOP_accept: /* sockfd, addr, addrlen */ - return do_accept4(a[0], a[1], a[2], 0); - case SOCKOP_accept4: /* sockfd, addr, addrlen, flags */ - return do_accept4(a[0], a[1], a[2], a[3]); - case SOCKOP_getsockname: /* sockfd, addr, addrlen */ - return do_getsockname(a[0], a[1], a[2]); - case SOCKOP_getpeername: /* sockfd, addr, addrlen */ - return do_getpeername(a[0], a[1], a[2]); - case SOCKOP_socketpair: /* domain, type, protocol, tab */ - return do_socketpair(a[0], a[1], a[2], a[3]); - case SOCKOP_send: /* sockfd, msg, len, flags */ - return do_sendto(a[0], a[1], a[2], a[3], 0, 0); - case SOCKOP_recv: /* sockfd, msg, len, flags */ - return do_recvfrom(a[0], a[1], a[2], a[3], 0, 0); - case SOCKOP_sendto: /* sockfd, msg, len, flags, addr, addrlen */ - return do_sendto(a[0], a[1], a[2], a[3], a[4], a[5]); - case SOCKOP_recvfrom: /* sockfd, msg, len, flags, addr, addrlen */ - return do_recvfrom(a[0], a[1], a[2], a[3], a[4], a[5]); - case SOCKOP_shutdown: /* sockfd, how */ - return get_errno(shutdown(a[0], a[1])); - case SOCKOP_sendmsg: /* sockfd, msg, flags */ - return do_sendrecvmsg(a[0], a[1], a[2], 1); - case SOCKOP_recvmsg: /* sockfd, msg, flags */ - return do_sendrecvmsg(a[0], a[1], a[2], 0); - case SOCKOP_sendmmsg: /* sockfd, msgvec, vlen, flags */ - return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 1); - case SOCKOP_recvmmsg: /* sockfd, msgvec, vlen, flags */ - return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 0); - case SOCKOP_setsockopt: /* sockfd, level, optname, optval, optlen */ - return do_setsockopt(a[0], a[1], a[2], a[3], a[4]); - case SOCKOP_getsockopt: /* sockfd, level, optname, optval, optlen */ - return do_getsockopt(a[0], a[1], a[2], a[3], a[4]); - default: - gemu_log("Unsupported socketcall: %d\n", num); - return -TARGET_ENOSYS; - } -} -#endif - -#define N_SHM_REGIONS 32 - -static struct shm_region { - abi_ulong start; - abi_ulong size; - bool in_use; -} shm_regions[N_SHM_REGIONS]; - -struct target_semid_ds -{ - struct target_ipc_perm sem_perm; - abi_ulong sem_otime; -#if !defined(TARGET_PPC64) - abi_ulong __unused1; -#endif - abi_ulong sem_ctime; -#if !defined(TARGET_PPC64) - abi_ulong __unused2; -#endif - abi_ulong sem_nsems; - abi_ulong __unused3; - abi_ulong __unused4; -}; - -static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip, - abi_ulong target_addr) -{ - struct target_ipc_perm *target_ip; - struct target_semid_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - target_ip = &(target_sd->sem_perm); - host_ip->__key = tswap32(target_ip->__key); - host_ip->uid = tswap32(target_ip->uid); - host_ip->gid = tswap32(target_ip->gid); - host_ip->cuid = tswap32(target_ip->cuid); - host_ip->cgid = tswap32(target_ip->cgid); -#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) - host_ip->mode = tswap32(target_ip->mode); -#else - host_ip->mode = tswap16(target_ip->mode); -#endif -#if defined(TARGET_PPC) - host_ip->__seq = tswap32(target_ip->__seq); -#else - host_ip->__seq = tswap16(target_ip->__seq); -#endif - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr, - struct ipc_perm *host_ip) -{ - struct target_ipc_perm *target_ip; - struct target_semid_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - target_ip = &(target_sd->sem_perm); - target_ip->__key = tswap32(host_ip->__key); - target_ip->uid = tswap32(host_ip->uid); - target_ip->gid = tswap32(host_ip->gid); - target_ip->cuid = tswap32(host_ip->cuid); - target_ip->cgid = tswap32(host_ip->cgid); -#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC) - target_ip->mode = tswap32(host_ip->mode); -#else - target_ip->mode = tswap16(host_ip->mode); -#endif -#if defined(TARGET_PPC) - target_ip->__seq = tswap32(host_ip->__seq); -#else - target_ip->__seq = tswap16(host_ip->__seq); -#endif - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd, - abi_ulong target_addr) -{ - struct target_semid_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr)) - return -TARGET_EFAULT; - host_sd->sem_nsems = tswapal(target_sd->sem_nsems); - host_sd->sem_otime = tswapal(target_sd->sem_otime); - host_sd->sem_ctime = tswapal(target_sd->sem_ctime); - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_semid_ds(abi_ulong target_addr, - struct semid_ds *host_sd) -{ - struct target_semid_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm))) - return -TARGET_EFAULT; - target_sd->sem_nsems = tswapal(host_sd->sem_nsems); - target_sd->sem_otime = tswapal(host_sd->sem_otime); - target_sd->sem_ctime = tswapal(host_sd->sem_ctime); - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -struct target_seminfo { - int semmap; - int semmni; - int semmns; - int semmnu; - int semmsl; - int semopm; - int semume; - int semusz; - int semvmx; - int semaem; -}; - -static inline abi_long host_to_target_seminfo(abi_ulong target_addr, - struct seminfo *host_seminfo) -{ - struct target_seminfo *target_seminfo; - if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_seminfo->semmap, &target_seminfo->semmap); - __put_user(host_seminfo->semmni, &target_seminfo->semmni); - __put_user(host_seminfo->semmns, &target_seminfo->semmns); - __put_user(host_seminfo->semmnu, &target_seminfo->semmnu); - __put_user(host_seminfo->semmsl, &target_seminfo->semmsl); - __put_user(host_seminfo->semopm, &target_seminfo->semopm); - __put_user(host_seminfo->semume, &target_seminfo->semume); - __put_user(host_seminfo->semusz, &target_seminfo->semusz); - __put_user(host_seminfo->semvmx, &target_seminfo->semvmx); - __put_user(host_seminfo->semaem, &target_seminfo->semaem); - unlock_user_struct(target_seminfo, target_addr, 1); - return 0; -} - -union semun { - int val; - struct semid_ds *buf; - unsigned short *array; - struct seminfo *__buf; -}; - -union target_semun { - int val; - abi_ulong buf; - abi_ulong array; - abi_ulong __buf; -}; - -static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array, - abi_ulong target_addr) -{ - int nsems; - unsigned short *array; - union semun semun; - struct semid_ds semid_ds; - int i, ret; - - semun.buf = &semid_ds; - - ret = semctl(semid, 0, IPC_STAT, semun); - if (ret == -1) - return get_errno(ret); - - nsems = semid_ds.sem_nsems; - - *host_array = g_try_new(unsigned short, nsems); - if (!*host_array) { - return -TARGET_ENOMEM; - } - array = lock_user(VERIFY_READ, target_addr, - nsems*sizeof(unsigned short), 1); - if (!array) { - g_free(*host_array); - return -TARGET_EFAULT; - } - - for(i=0; i<nsems; i++) { - __get_user((*host_array)[i], &array[i]); - } - unlock_user(array, target_addr, 0); - - return 0; -} - -static inline abi_long host_to_target_semarray(int semid, abi_ulong target_addr, - unsigned short **host_array) -{ - int nsems; - unsigned short *array; - union semun semun; - struct semid_ds semid_ds; - int i, ret; - - semun.buf = &semid_ds; - - ret = semctl(semid, 0, IPC_STAT, semun); - if (ret == -1) - return get_errno(ret); - - nsems = semid_ds.sem_nsems; - - array = lock_user(VERIFY_WRITE, target_addr, - nsems*sizeof(unsigned short), 0); - if (!array) - return -TARGET_EFAULT; - - for(i=0; i<nsems; i++) { - __put_user((*host_array)[i], &array[i]); - } - g_free(*host_array); - unlock_user(array, target_addr, 1); - - return 0; -} - -static inline abi_long do_semctl(int semid, int semnum, int cmd, - abi_ulong target_arg) -{ - union target_semun target_su = { .buf = target_arg }; - union semun arg; - struct semid_ds dsarg; - unsigned short *array = NULL; - struct seminfo seminfo; - abi_long ret = -TARGET_EINVAL; - abi_long err; - cmd &= 0xff; - - switch( cmd ) { - case GETVAL: - case SETVAL: - /* In 64 bit cross-endian situations, we will erroneously pick up - * the wrong half of the union for the "val" element. To rectify - * this, the entire 8-byte structure is byteswapped, followed by - * a swap of the 4 byte val field. In other cases, the data is - * already in proper host byte order. */ - if (sizeof(target_su.val) != (sizeof(target_su.buf))) { - target_su.buf = tswapal(target_su.buf); - arg.val = tswap32(target_su.val); - } else { - arg.val = target_su.val; - } - ret = get_errno(semctl(semid, semnum, cmd, arg)); - break; - case GETALL: - case SETALL: - err = target_to_host_semarray(semid, &array, target_su.array); - if (err) - return err; - arg.array = array; - ret = get_errno(semctl(semid, semnum, cmd, arg)); - err = host_to_target_semarray(semid, target_su.array, &array); - if (err) - return err; - break; - case IPC_STAT: - case IPC_SET: - case SEM_STAT: - err = target_to_host_semid_ds(&dsarg, target_su.buf); - if (err) - return err; - arg.buf = &dsarg; - ret = get_errno(semctl(semid, semnum, cmd, arg)); - err = host_to_target_semid_ds(target_su.buf, &dsarg); - if (err) - return err; - break; - case IPC_INFO: - case SEM_INFO: - arg.__buf = &seminfo; - ret = get_errno(semctl(semid, semnum, cmd, arg)); - err = host_to_target_seminfo(target_su.__buf, &seminfo); - if (err) - return err; - break; - case IPC_RMID: - case GETPID: - case GETNCNT: - case GETZCNT: - ret = get_errno(semctl(semid, semnum, cmd, NULL)); - break; - } - - return ret; -} - -struct target_sembuf { - unsigned short sem_num; - short sem_op; - short sem_flg; -}; - -static inline abi_long target_to_host_sembuf(struct sembuf *host_sembuf, - abi_ulong target_addr, - unsigned nsops) -{ - struct target_sembuf *target_sembuf; - int i; - - target_sembuf = lock_user(VERIFY_READ, target_addr, - nsops*sizeof(struct target_sembuf), 1); - if (!target_sembuf) - return -TARGET_EFAULT; - - for(i=0; i<nsops; i++) { - __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num); - __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op); - __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg); - } - - unlock_user(target_sembuf, target_addr, 0); - - return 0; -} - -static inline abi_long do_semop(int semid, abi_long ptr, unsigned nsops) -{ - struct sembuf sops[nsops]; - - if (target_to_host_sembuf(sops, ptr, nsops)) - return -TARGET_EFAULT; - - return get_errno(semop(semid, sops, nsops)); -} - -struct target_msqid_ds -{ - struct target_ipc_perm msg_perm; - abi_ulong msg_stime; -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong msg_rtime; -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong msg_ctime; -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_ulong __msg_cbytes; - abi_ulong msg_qnum; - abi_ulong msg_qbytes; - abi_ulong msg_lspid; - abi_ulong msg_lrpid; - abi_ulong __unused4; - abi_ulong __unused5; -}; - -static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md, - abi_ulong target_addr) -{ - struct target_msqid_ds *target_md; - - if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1)) - return -TARGET_EFAULT; - if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr)) - return -TARGET_EFAULT; - host_md->msg_stime = tswapal(target_md->msg_stime); - host_md->msg_rtime = tswapal(target_md->msg_rtime); - host_md->msg_ctime = tswapal(target_md->msg_ctime); - host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes); - host_md->msg_qnum = tswapal(target_md->msg_qnum); - host_md->msg_qbytes = tswapal(target_md->msg_qbytes); - host_md->msg_lspid = tswapal(target_md->msg_lspid); - host_md->msg_lrpid = tswapal(target_md->msg_lrpid); - unlock_user_struct(target_md, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr, - struct msqid_ds *host_md) -{ - struct target_msqid_ds *target_md; - - if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm))) - return -TARGET_EFAULT; - target_md->msg_stime = tswapal(host_md->msg_stime); - target_md->msg_rtime = tswapal(host_md->msg_rtime); - target_md->msg_ctime = tswapal(host_md->msg_ctime); - target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes); - target_md->msg_qnum = tswapal(host_md->msg_qnum); - target_md->msg_qbytes = tswapal(host_md->msg_qbytes); - target_md->msg_lspid = tswapal(host_md->msg_lspid); - target_md->msg_lrpid = tswapal(host_md->msg_lrpid); - unlock_user_struct(target_md, target_addr, 1); - return 0; -} - -struct target_msginfo { - int msgpool; - int msgmap; - int msgmax; - int msgmnb; - int msgmni; - int msgssz; - int msgtql; - unsigned short int msgseg; -}; - -static inline abi_long host_to_target_msginfo(abi_ulong target_addr, - struct msginfo *host_msginfo) -{ - struct target_msginfo *target_msginfo; - if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_msginfo->msgpool, &target_msginfo->msgpool); - __put_user(host_msginfo->msgmap, &target_msginfo->msgmap); - __put_user(host_msginfo->msgmax, &target_msginfo->msgmax); - __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb); - __put_user(host_msginfo->msgmni, &target_msginfo->msgmni); - __put_user(host_msginfo->msgssz, &target_msginfo->msgssz); - __put_user(host_msginfo->msgtql, &target_msginfo->msgtql); - __put_user(host_msginfo->msgseg, &target_msginfo->msgseg); - unlock_user_struct(target_msginfo, target_addr, 1); - return 0; -} - -static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr) -{ - struct msqid_ds dsarg; - struct msginfo msginfo; - abi_long ret = -TARGET_EINVAL; - - cmd &= 0xff; - - switch (cmd) { - case IPC_STAT: - case IPC_SET: - case MSG_STAT: - if (target_to_host_msqid_ds(&dsarg,ptr)) - return -TARGET_EFAULT; - ret = get_errno(msgctl(msgid, cmd, &dsarg)); - if (host_to_target_msqid_ds(ptr,&dsarg)) - return -TARGET_EFAULT; - break; - case IPC_RMID: - ret = get_errno(msgctl(msgid, cmd, NULL)); - break; - case IPC_INFO: - case MSG_INFO: - ret = get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo)); - if (host_to_target_msginfo(ptr, &msginfo)) - return -TARGET_EFAULT; - break; - } - - return ret; -} - -struct target_msgbuf { - abi_long mtype; - char mtext[1]; -}; - -static inline abi_long do_msgsnd(int msqid, abi_long msgp, - ssize_t msgsz, int msgflg) -{ - struct target_msgbuf *target_mb; - struct msgbuf *host_mb; - abi_long ret = 0; - - if (msgsz < 0) { - return -TARGET_EINVAL; - } - - if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0)) - return -TARGET_EFAULT; - host_mb = g_try_malloc(msgsz + sizeof(long)); - if (!host_mb) { - unlock_user_struct(target_mb, msgp, 0); - return -TARGET_ENOMEM; - } - host_mb->mtype = (abi_long) tswapal(target_mb->mtype); - memcpy(host_mb->mtext, target_mb->mtext, msgsz); - ret = get_errno(msgsnd(msqid, host_mb, msgsz, msgflg)); - g_free(host_mb); - unlock_user_struct(target_mb, msgp, 0); - - return ret; -} - -static inline abi_long do_msgrcv(int msqid, abi_long msgp, - unsigned int msgsz, abi_long msgtyp, - int msgflg) -{ - struct target_msgbuf *target_mb; - char *target_mtext; - struct msgbuf *host_mb; - abi_long ret = 0; - - if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0)) - return -TARGET_EFAULT; - - host_mb = g_malloc(msgsz+sizeof(long)); - ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg)); - - if (ret > 0) { - abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong); - target_mtext = lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0); - if (!target_mtext) { - ret = -TARGET_EFAULT; - goto end; - } - memcpy(target_mb->mtext, host_mb->mtext, ret); - unlock_user(target_mtext, target_mtext_addr, ret); - } - - target_mb->mtype = tswapal(host_mb->mtype); - -end: - if (target_mb) - unlock_user_struct(target_mb, msgp, 1); - g_free(host_mb); - return ret; -} - -static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd, - abi_ulong target_addr) -{ - struct target_shmid_ds *target_sd; - - if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) - return -TARGET_EFAULT; - if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr)) - return -TARGET_EFAULT; - __get_user(host_sd->shm_segsz, &target_sd->shm_segsz); - __get_user(host_sd->shm_atime, &target_sd->shm_atime); - __get_user(host_sd->shm_dtime, &target_sd->shm_dtime); - __get_user(host_sd->shm_ctime, &target_sd->shm_ctime); - __get_user(host_sd->shm_cpid, &target_sd->shm_cpid); - __get_user(host_sd->shm_lpid, &target_sd->shm_lpid); - __get_user(host_sd->shm_nattch, &target_sd->shm_nattch); - unlock_user_struct(target_sd, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr, - struct shmid_ds *host_sd) -{ - struct target_shmid_ds *target_sd; - - if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) - return -TARGET_EFAULT; - if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm))) - return -TARGET_EFAULT; - __put_user(host_sd->shm_segsz, &target_sd->shm_segsz); - __put_user(host_sd->shm_atime, &target_sd->shm_atime); - __put_user(host_sd->shm_dtime, &target_sd->shm_dtime); - __put_user(host_sd->shm_ctime, &target_sd->shm_ctime); - __put_user(host_sd->shm_cpid, &target_sd->shm_cpid); - __put_user(host_sd->shm_lpid, &target_sd->shm_lpid); - __put_user(host_sd->shm_nattch, &target_sd->shm_nattch); - unlock_user_struct(target_sd, target_addr, 1); - return 0; -} - -struct target_shminfo { - abi_ulong shmmax; - abi_ulong shmmin; - abi_ulong shmmni; - abi_ulong shmseg; - abi_ulong shmall; -}; - -static inline abi_long host_to_target_shminfo(abi_ulong target_addr, - struct shminfo *host_shminfo) -{ - struct target_shminfo *target_shminfo; - if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_shminfo->shmmax, &target_shminfo->shmmax); - __put_user(host_shminfo->shmmin, &target_shminfo->shmmin); - __put_user(host_shminfo->shmmni, &target_shminfo->shmmni); - __put_user(host_shminfo->shmseg, &target_shminfo->shmseg); - __put_user(host_shminfo->shmall, &target_shminfo->shmall); - unlock_user_struct(target_shminfo, target_addr, 1); - return 0; -} - -struct target_shm_info { - int used_ids; - abi_ulong shm_tot; - abi_ulong shm_rss; - abi_ulong shm_swp; - abi_ulong swap_attempts; - abi_ulong swap_successes; -}; - -static inline abi_long host_to_target_shm_info(abi_ulong target_addr, - struct shm_info *host_shm_info) -{ - struct target_shm_info *target_shm_info; - if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0)) - return -TARGET_EFAULT; - __put_user(host_shm_info->used_ids, &target_shm_info->used_ids); - __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot); - __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss); - __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp); - __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attempts); - __put_user(host_shm_info->swap_successes, &target_shm_info->swap_successes); - unlock_user_struct(target_shm_info, target_addr, 1); - return 0; -} - -static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf) -{ - struct shmid_ds dsarg; - struct shminfo shminfo; - struct shm_info shm_info; - abi_long ret = -TARGET_EINVAL; - - cmd &= 0xff; - - switch(cmd) { - case IPC_STAT: - case IPC_SET: - case SHM_STAT: - if (target_to_host_shmid_ds(&dsarg, buf)) - return -TARGET_EFAULT; - ret = get_errno(shmctl(shmid, cmd, &dsarg)); - if (host_to_target_shmid_ds(buf, &dsarg)) - return -TARGET_EFAULT; - break; - case IPC_INFO: - ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo)); - if (host_to_target_shminfo(buf, &shminfo)) - return -TARGET_EFAULT; - break; - case SHM_INFO: - ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info)); - if (host_to_target_shm_info(buf, &shm_info)) - return -TARGET_EFAULT; - break; - case IPC_RMID: - case SHM_LOCK: - case SHM_UNLOCK: - ret = get_errno(shmctl(shmid, cmd, NULL)); - break; - } - - return ret; -} - -static inline abi_ulong do_shmat(int shmid, abi_ulong shmaddr, int shmflg) -{ - abi_long raddr; - void *host_raddr; - struct shmid_ds shm_info; - int i,ret; - - /* find out the length of the shared memory segment */ - ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info)); - if (is_error(ret)) { - /* can't get length, bail out */ - return ret; - } - - mmap_lock(); - - if (shmaddr) - host_raddr = shmat(shmid, (void *)g2h(shmaddr), shmflg); - else { - abi_ulong mmap_start; - - mmap_start = mmap_find_vma(0, shm_info.shm_segsz); - - if (mmap_start == -1) { - errno = ENOMEM; - host_raddr = (void *)-1; - } else - host_raddr = shmat(shmid, g2h(mmap_start), shmflg | SHM_REMAP); - } - - if (host_raddr == (void *)-1) { - mmap_unlock(); - return get_errno((long)host_raddr); - } - raddr=h2g((unsigned long)host_raddr); - - page_set_flags(raddr, raddr + shm_info.shm_segsz, - PAGE_VALID | PAGE_READ | - ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE)); - - for (i = 0; i < N_SHM_REGIONS; i++) { - if (!shm_regions[i].in_use) { - shm_regions[i].in_use = true; - shm_regions[i].start = raddr; - shm_regions[i].size = shm_info.shm_segsz; - break; - } - } - - mmap_unlock(); - return raddr; - -} - -static inline abi_long do_shmdt(abi_ulong shmaddr) -{ - int i; - - for (i = 0; i < N_SHM_REGIONS; ++i) { - if (shm_regions[i].in_use && shm_regions[i].start == shmaddr) { - shm_regions[i].in_use = false; - page_set_flags(shmaddr, shmaddr + shm_regions[i].size, 0); - break; - } - } - - return get_errno(shmdt(g2h(shmaddr))); -} - -#ifdef TARGET_NR_ipc -/* ??? This only works with linear mappings. */ -/* do_ipc() must return target values and target errnos. */ -static abi_long do_ipc(unsigned int call, abi_long first, - abi_long second, abi_long third, - abi_long ptr, abi_long fifth) -{ - int version; - abi_long ret = 0; - - version = call >> 16; - call &= 0xffff; - - switch (call) { - case IPCOP_semop: - ret = do_semop(first, ptr, second); - break; - - case IPCOP_semget: - ret = get_errno(semget(first, second, third)); - break; - - case IPCOP_semctl: { - /* The semun argument to semctl is passed by value, so dereference the - * ptr argument. */ - abi_ulong atptr; - get_user_ual(atptr, ptr); - ret = do_semctl(first, second, third, atptr); - break; - } - - case IPCOP_msgget: - ret = get_errno(msgget(first, second)); - break; - - case IPCOP_msgsnd: - ret = do_msgsnd(first, ptr, second, third); - break; - - case IPCOP_msgctl: - ret = do_msgctl(first, second, ptr); - break; - - case IPCOP_msgrcv: - switch (version) { - case 0: - { - struct target_ipc_kludge { - abi_long msgp; - abi_long msgtyp; - } *tmp; - - if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) { - ret = -TARGET_EFAULT; - break; - } - - ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third); - - unlock_user_struct(tmp, ptr, 0); - break; - } - default: - ret = do_msgrcv(first, ptr, second, fifth, third); - } - break; - - case IPCOP_shmat: - switch (version) { - default: - { - abi_ulong raddr; - raddr = do_shmat(first, ptr, second); - if (is_error(raddr)) - return get_errno(raddr); - if (put_user_ual(raddr, third)) - return -TARGET_EFAULT; - break; - } - case 1: - ret = -TARGET_EINVAL; - break; - } - break; - case IPCOP_shmdt: - ret = do_shmdt(ptr); - break; - - case IPCOP_shmget: - /* IPC_* flag values are the same on all linux platforms */ - ret = get_errno(shmget(first, second, third)); - break; - - /* IPC_* and SHM_* command values are the same on all linux platforms */ - case IPCOP_shmctl: - ret = do_shmctl(first, second, ptr); - break; - default: - gemu_log("Unsupported ipc call: %d (version %d)\n", call, version); - ret = -TARGET_ENOSYS; - break; - } - return ret; -} -#endif - -/* kernel structure types definitions */ - -#define STRUCT(name, ...) STRUCT_ ## name, -#define STRUCT_SPECIAL(name) STRUCT_ ## name, -enum { -#include "syscall_types.h" -STRUCT_MAX -}; -#undef STRUCT -#undef STRUCT_SPECIAL - -#define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL }; -#define STRUCT_SPECIAL(name) -#include "syscall_types.h" -#undef STRUCT -#undef STRUCT_SPECIAL - -typedef struct IOCTLEntry IOCTLEntry; - -typedef abi_long do_ioctl_fn(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg); - -struct IOCTLEntry { - int target_cmd; - unsigned int host_cmd; - const char *name; - int access; - do_ioctl_fn *do_ioctl; - const argtype arg_type[5]; -}; - -#define IOC_R 0x0001 -#define IOC_W 0x0002 -#define IOC_RW (IOC_R | IOC_W) - -#define MAX_STRUCT_SIZE 4096 - -#ifdef CONFIG_FIEMAP -/* So fiemap access checks don't overflow on 32 bit systems. - * This is very slightly smaller than the limit imposed by - * the underlying kernel. - */ -#define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \ - / sizeof(struct fiemap_extent)) - -static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - /* The parameter for this ioctl is a struct fiemap followed - * by an array of struct fiemap_extent whose size is set - * in fiemap->fm_extent_count. The array is filled in by the - * ioctl. - */ - int target_size_in, target_size_out; - struct fiemap *fm; - const argtype *arg_type = ie->arg_type; - const argtype extent_arg_type[] = { MK_STRUCT(STRUCT_fiemap_extent) }; - void *argptr, *p; - abi_long ret; - int i, extent_size = thunk_type_size(extent_arg_type, 0); - uint32_t outbufsz; - int free_fm = 0; - - assert(arg_type[0] == TYPE_PTR); - assert(ie->access == IOC_RW); - arg_type++; - target_size_in = thunk_type_size(arg_type, 0); - argptr = lock_user(VERIFY_READ, arg, target_size_in, 1); - if (!argptr) { - return -TARGET_EFAULT; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - fm = (struct fiemap *)buf_temp; - if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) { - return -TARGET_EINVAL; - } - - outbufsz = sizeof (*fm) + - (sizeof(struct fiemap_extent) * fm->fm_extent_count); - - if (outbufsz > MAX_STRUCT_SIZE) { - /* We can't fit all the extents into the fixed size buffer. - * Allocate one that is large enough and use it instead. - */ - fm = g_try_malloc(outbufsz); - if (!fm) { - return -TARGET_ENOMEM; - } - memcpy(fm, buf_temp, sizeof(struct fiemap)); - free_fm = 1; - } - ret = get_errno(ioctl(fd, ie->host_cmd, fm)); - if (!is_error(ret)) { - target_size_out = target_size_in; - /* An extent_count of 0 means we were only counting the extents - * so there are no structs to copy - */ - if (fm->fm_extent_count != 0) { - target_size_out += fm->fm_mapped_extents * extent_size; - } - argptr = lock_user(VERIFY_WRITE, arg, target_size_out, 0); - if (!argptr) { - ret = -TARGET_EFAULT; - } else { - /* Convert the struct fiemap */ - thunk_convert(argptr, fm, arg_type, THUNK_TARGET); - if (fm->fm_extent_count != 0) { - p = argptr + target_size_in; - /* ...and then all the struct fiemap_extents */ - for (i = 0; i < fm->fm_mapped_extents; i++) { - thunk_convert(p, &fm->fm_extents[i], extent_arg_type, - THUNK_TARGET); - p += extent_size; - } - } - unlock_user(argptr, arg, target_size_out); - } - } - if (free_fm) { - g_free(fm); - } - return ret; -} -#endif - -static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype *arg_type = ie->arg_type; - int target_size; - void *argptr; - int ret; - struct ifconf *host_ifconf; - uint32_t outbufsz; - const argtype ifreq_arg_type[] = { MK_STRUCT(STRUCT_sockaddr_ifreq) }; - int target_ifreq_size; - int nb_ifreq; - int free_buf = 0; - int i; - int target_ifc_len; - abi_long target_ifc_buf; - int host_ifc_len; - char *host_ifc_buf; - - assert(arg_type[0] == TYPE_PTR); - assert(ie->access == IOC_RW); - - arg_type++; - target_size = thunk_type_size(arg_type, 0); - - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - host_ifconf = (struct ifconf *)(unsigned long)buf_temp; - target_ifc_len = host_ifconf->ifc_len; - target_ifc_buf = (abi_long)(unsigned long)host_ifconf->ifc_buf; - - target_ifreq_size = thunk_type_size(ifreq_arg_type, 0); - nb_ifreq = target_ifc_len / target_ifreq_size; - host_ifc_len = nb_ifreq * sizeof(struct ifreq); - - outbufsz = sizeof(*host_ifconf) + host_ifc_len; - if (outbufsz > MAX_STRUCT_SIZE) { - /* We can't fit all the extents into the fixed size buffer. - * Allocate one that is large enough and use it instead. - */ - host_ifconf = malloc(outbufsz); - if (!host_ifconf) { - return -TARGET_ENOMEM; - } - memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf)); - free_buf = 1; - } - host_ifc_buf = (char*)host_ifconf + sizeof(*host_ifconf); - - host_ifconf->ifc_len = host_ifc_len; - host_ifconf->ifc_buf = host_ifc_buf; - - ret = get_errno(ioctl(fd, ie->host_cmd, host_ifconf)); - if (!is_error(ret)) { - /* convert host ifc_len to target ifc_len */ - - nb_ifreq = host_ifconf->ifc_len / sizeof(struct ifreq); - target_ifc_len = nb_ifreq * target_ifreq_size; - host_ifconf->ifc_len = target_ifc_len; - - /* restore target ifc_buf */ - - host_ifconf->ifc_buf = (char *)(unsigned long)target_ifc_buf; - - /* copy struct ifconf to target user */ - - argptr = lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - - /* copy ifreq[] to target user */ - - argptr = lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_len, 0); - for (i = 0; i < nb_ifreq ; i++) { - thunk_convert(argptr + i * target_ifreq_size, - host_ifc_buf + i * sizeof(struct ifreq), - ifreq_arg_type, THUNK_TARGET); - } - unlock_user(argptr, target_ifc_buf, target_ifc_len); - } - - if (free_buf) { - free(host_ifconf); - } - - return ret; -} - -static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd, - int cmd, abi_long arg) -{ - void *argptr; - struct dm_ioctl *host_dm; - abi_long guest_data; - uint32_t guest_data_size; - int target_size; - const argtype *arg_type = ie->arg_type; - abi_long ret; - void *big_buf = NULL; - char *host_data; - - arg_type++; - target_size = thunk_type_size(arg_type, 0); - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret = -TARGET_EFAULT; - goto out; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - /* buf_temp is too small, so fetch things into a bigger buffer */ - big_buf = g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2); - memcpy(big_buf, buf_temp, target_size); - buf_temp = big_buf; - host_dm = big_buf; - - guest_data = arg + host_dm->data_start; - if ((guest_data - arg) < 0) { - ret = -EINVAL; - goto out; - } - guest_data_size = host_dm->data_size - host_dm->data_start; - host_data = (char*)host_dm + host_dm->data_start; - - argptr = lock_user(VERIFY_READ, guest_data, guest_data_size, 1); - switch (ie->host_cmd) { - case DM_REMOVE_ALL: - case DM_LIST_DEVICES: - case DM_DEV_CREATE: - case DM_DEV_REMOVE: - case DM_DEV_SUSPEND: - case DM_DEV_STATUS: - case DM_DEV_WAIT: - case DM_TABLE_STATUS: - case DM_TABLE_CLEAR: - case DM_TABLE_DEPS: - case DM_LIST_VERSIONS: - /* no input data */ - break; - case DM_DEV_RENAME: - case DM_DEV_SET_GEOMETRY: - /* data contains only strings */ - memcpy(host_data, argptr, guest_data_size); - break; - case DM_TARGET_MSG: - memcpy(host_data, argptr, guest_data_size); - *(uint64_t*)host_data = tswap64(*(uint64_t*)argptr); - break; - case DM_TABLE_LOAD: - { - void *gspec = argptr; - void *cur_data = host_data; - const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) }; - int spec_size = thunk_type_size(arg_type, 0); - int i; - - for (i = 0; i < host_dm->target_count; i++) { - struct dm_target_spec *spec = cur_data; - uint32_t next; - int slen; - - thunk_convert(spec, gspec, arg_type, THUNK_HOST); - slen = strlen((char*)gspec + spec_size) + 1; - next = spec->next; - spec->next = sizeof(*spec) + slen; - strcpy((char*)&spec[1], gspec + spec_size); - gspec += next; - cur_data += spec->next; - } - break; - } - default: - ret = -TARGET_EINVAL; - unlock_user(argptr, guest_data, 0); - goto out; - } - unlock_user(argptr, guest_data, 0); - - ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - guest_data = arg + host_dm->data_start; - guest_data_size = host_dm->data_size - host_dm->data_start; - argptr = lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0); - switch (ie->host_cmd) { - case DM_REMOVE_ALL: - case DM_DEV_CREATE: - case DM_DEV_REMOVE: - case DM_DEV_RENAME: - case DM_DEV_SUSPEND: - case DM_DEV_STATUS: - case DM_TABLE_LOAD: - case DM_TABLE_CLEAR: - case DM_TARGET_MSG: - case DM_DEV_SET_GEOMETRY: - /* no return data */ - break; - case DM_LIST_DEVICES: - { - struct dm_name_list *nl = (void*)host_dm + host_dm->data_start; - uint32_t remaining_data = guest_data_size; - void *cur_data = argptr; - const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_name_list) }; - int nl_size = 12; /* can't use thunk_size due to alignment */ - - while (1) { - uint32_t next = nl->next; - if (next) { - nl->next = nl_size + (strlen(nl->name) + 1); - } - if (remaining_data < nl->next) { - host_dm->flags |= DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, nl, arg_type, THUNK_TARGET); - strcpy(cur_data + nl_size, nl->name); - cur_data += nl->next; - remaining_data -= nl->next; - if (!next) { - break; - } - nl = (void*)nl + next; - } - break; - } - case DM_DEV_WAIT: - case DM_TABLE_STATUS: - { - struct dm_target_spec *spec = (void*)host_dm + host_dm->data_start; - void *cur_data = argptr; - const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) }; - int spec_size = thunk_type_size(arg_type, 0); - int i; - - for (i = 0; i < host_dm->target_count; i++) { - uint32_t next = spec->next; - int slen = strlen((char*)&spec[1]) + 1; - spec->next = (cur_data - argptr) + spec_size + slen; - if (guest_data_size < spec->next) { - host_dm->flags |= DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, spec, arg_type, THUNK_TARGET); - strcpy(cur_data + spec_size, (char*)&spec[1]); - cur_data = argptr + spec->next; - spec = (void*)host_dm + host_dm->data_start + next; - } - break; - } - case DM_TABLE_DEPS: - { - void *hdata = (void*)host_dm + host_dm->data_start; - int count = *(uint32_t*)hdata; - uint64_t *hdev = hdata + 8; - uint64_t *gdev = argptr + 8; - int i; - - *(uint32_t*)argptr = tswap32(count); - for (i = 0; i < count; i++) { - *gdev = tswap64(*hdev); - gdev++; - hdev++; - } - break; - } - case DM_LIST_VERSIONS: - { - struct dm_target_versions *vers = (void*)host_dm + host_dm->data_start; - uint32_t remaining_data = guest_data_size; - void *cur_data = argptr; - const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_versions) }; - int vers_size = thunk_type_size(arg_type, 0); - - while (1) { - uint32_t next = vers->next; - if (next) { - vers->next = vers_size + (strlen(vers->name) + 1); - } - if (remaining_data < vers->next) { - host_dm->flags |= DM_BUFFER_FULL_FLAG; - break; - } - thunk_convert(cur_data, vers, arg_type, THUNK_TARGET); - strcpy(cur_data + vers_size, vers->name); - cur_data += vers->next; - remaining_data -= vers->next; - if (!next) { - break; - } - vers = (void*)vers + next; - } - break; - } - default: - unlock_user(argptr, guest_data, 0); - ret = -TARGET_EINVAL; - goto out; - } - unlock_user(argptr, guest_data, guest_data_size); - - argptr = lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) { - ret = -TARGET_EFAULT; - goto out; - } - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } -out: - g_free(big_buf); - return ret; -} - -static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, int fd, - int cmd, abi_long arg) -{ - void *argptr; - int target_size; - const argtype *arg_type = ie->arg_type; - const argtype part_arg_type[] = { MK_STRUCT(STRUCT_blkpg_partition) }; - abi_long ret; - - struct blkpg_ioctl_arg *host_blkpg = (void*)buf_temp; - struct blkpg_partition host_part; - - /* Read and convert blkpg */ - arg_type++; - target_size = thunk_type_size(arg_type, 0); - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret = -TARGET_EFAULT; - goto out; - } - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - switch (host_blkpg->op) { - case BLKPG_ADD_PARTITION: - case BLKPG_DEL_PARTITION: - /* payload is struct blkpg_partition */ - break; - default: - /* Unknown opcode */ - ret = -TARGET_EINVAL; - goto out; - } - - /* Read and convert blkpg->data */ - arg = (abi_long)(uintptr_t)host_blkpg->data; - target_size = thunk_type_size(part_arg_type, 0); - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - ret = -TARGET_EFAULT; - goto out; - } - thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - - /* Swizzle the data pointer to our local copy and call! */ - host_blkpg->data = &host_part; - ret = get_errno(ioctl(fd, ie->host_cmd, host_blkpg)); - -out: - return ret; -} - -static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - const argtype *arg_type = ie->arg_type; - const StructEntry *se; - const argtype *field_types; - const int *dst_offsets, *src_offsets; - int target_size; - void *argptr; - abi_ulong *target_rt_dev_ptr; - unsigned long *host_rt_dev_ptr; - abi_long ret; - int i; - - assert(ie->access == IOC_W); - assert(*arg_type == TYPE_PTR); - arg_type++; - assert(*arg_type == TYPE_STRUCT); - target_size = thunk_type_size(arg_type, 0); - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) { - return -TARGET_EFAULT; - } - arg_type++; - assert(*arg_type == (int)STRUCT_rtentry); - se = struct_entries + *arg_type++; - assert(se->convert[0] == NULL); - /* convert struct here to be able to catch rt_dev string */ - field_types = se->field_types; - dst_offsets = se->field_offsets[THUNK_HOST]; - src_offsets = se->field_offsets[THUNK_TARGET]; - for (i = 0; i < se->nb_fields; i++) { - if (dst_offsets[i] == offsetof(struct rtentry, rt_dev)) { - assert(*field_types == TYPE_PTRVOID); - target_rt_dev_ptr = (abi_ulong *)(argptr + src_offsets[i]); - host_rt_dev_ptr = (unsigned long *)(buf_temp + dst_offsets[i]); - if (*target_rt_dev_ptr != 0) { - *host_rt_dev_ptr = (unsigned long)lock_user_string( - tswapal(*target_rt_dev_ptr)); - if (!*host_rt_dev_ptr) { - unlock_user(argptr, arg, 0); - return -TARGET_EFAULT; - } - } else { - *host_rt_dev_ptr = 0; - } - field_types++; - continue; - } - field_types = thunk_convert(buf_temp + dst_offsets[i], - argptr + src_offsets[i], - field_types, THUNK_HOST); - } - unlock_user(argptr, arg, 0); - - ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); - if (*host_rt_dev_ptr != 0) { - unlock_user((void *)*host_rt_dev_ptr, - *target_rt_dev_ptr, 0); - } - return ret; -} - -static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp, - int fd, int cmd, abi_long arg) -{ - int sig = target_to_host_signal(arg); - return get_errno(ioctl(fd, ie->host_cmd, sig)); -} - -static IOCTLEntry ioctl_entries[] = { -#define IOCTL(cmd, access, ...) \ - { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } }, -#define IOCTL_SPECIAL(cmd, access, dofn, ...) \ - { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } }, -#include "ioctls.h" - { 0, 0, }, -}; - -/* ??? Implement proper locking for ioctls. */ -/* do_ioctl() Must return target values and target errnos. */ -static abi_long do_ioctl(int fd, int cmd, abi_long arg) -{ - const IOCTLEntry *ie; - const argtype *arg_type; - abi_long ret; - uint8_t buf_temp[MAX_STRUCT_SIZE]; - int target_size; - void *argptr; - - ie = ioctl_entries; - for(;;) { - if (ie->target_cmd == 0) { - gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd); - return -TARGET_ENOSYS; - } - if (ie->target_cmd == cmd) - break; - ie++; - } - arg_type = ie->arg_type; -#if defined(DEBUG) - gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd, ie->name); -#endif - if (ie->do_ioctl) { - return ie->do_ioctl(ie, buf_temp, fd, cmd, arg); - } - - switch(arg_type[0]) { - case TYPE_NULL: - /* no argument */ - ret = get_errno(ioctl(fd, ie->host_cmd)); - break; - case TYPE_PTRVOID: - case TYPE_INT: - ret = get_errno(ioctl(fd, ie->host_cmd, arg)); - break; - case TYPE_PTR: - arg_type++; - target_size = thunk_type_size(arg_type, 0); - switch(ie->access) { - case IOC_R: - ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - argptr = lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } - break; - case IOC_W: - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); - break; - default: - case IOC_RW: - argptr = lock_user(VERIFY_READ, arg, target_size, 1); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST); - unlock_user(argptr, arg, 0); - ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp)); - if (!is_error(ret)) { - argptr = lock_user(VERIFY_WRITE, arg, target_size, 0); - if (!argptr) - return -TARGET_EFAULT; - thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET); - unlock_user(argptr, arg, target_size); - } - break; - } - break; - default: - gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n", - (long)cmd, arg_type[0]); - ret = -TARGET_ENOSYS; - break; - } - return ret; -} - -static const bitmask_transtbl iflag_tbl[] = { - { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK }, - { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT }, - { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR }, - { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK }, - { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK }, - { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP }, - { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR }, - { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR }, - { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL }, - { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC }, - { TARGET_IXON, TARGET_IXON, IXON, IXON }, - { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY }, - { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF }, - { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL }, - { 0, 0, 0, 0 } -}; - -static const bitmask_transtbl oflag_tbl[] = { - { TARGET_OPOST, TARGET_OPOST, OPOST, OPOST }, - { TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC }, - { TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR }, - { TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL }, - { TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR }, - { TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET }, - { TARGET_OFILL, TARGET_OFILL, OFILL, OFILL }, - { TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL }, - { TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 }, - { TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 }, - { TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 }, - { TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 }, - { TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 }, - { TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 }, - { TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 }, - { TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 }, - { TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 }, - { TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 }, - { TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 }, - { TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 }, - { TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 }, - { TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 }, - { TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 }, - { TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 }, - { 0, 0, 0, 0 } -}; - -static const bitmask_transtbl cflag_tbl[] = { - { TARGET_CBAUD, TARGET_B0, CBAUD, B0 }, - { TARGET_CBAUD, TARGET_B50, CBAUD, B50 }, - { TARGET_CBAUD, TARGET_B75, CBAUD, B75 }, - { TARGET_CBAUD, TARGET_B110, CBAUD, B110 }, - { TARGET_CBAUD, TARGET_B134, CBAUD, B134 }, - { TARGET_CBAUD, TARGET_B150, CBAUD, B150 }, - { TARGET_CBAUD, TARGET_B200, CBAUD, B200 }, - { TARGET_CBAUD, TARGET_B300, CBAUD, B300 }, - { TARGET_CBAUD, TARGET_B600, CBAUD, B600 }, - { TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 }, - { TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 }, - { TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 }, - { TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 }, - { TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 }, - { TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 }, - { TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 }, - { TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 }, - { TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 }, - { TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 }, - { TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 }, - { TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 }, - { TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 }, - { TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 }, - { TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 }, - { TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB }, - { TARGET_CREAD, TARGET_CREAD, CREAD, CREAD }, - { TARGET_PARENB, TARGET_PARENB, PARENB, PARENB }, - { TARGET_PARODD, TARGET_PARODD, PARODD, PARODD }, - { TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL }, - { TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL }, - { TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS }, - { 0, 0, 0, 0 } -}; - -static const bitmask_transtbl lflag_tbl[] = { - { TARGET_ISIG, TARGET_ISIG, ISIG, ISIG }, - { TARGET_ICANON, TARGET_ICANON, ICANON, ICANON }, - { TARGET_XCASE, TARGET_XCASE, XCASE, XCASE }, - { TARGET_ECHO, TARGET_ECHO, ECHO, ECHO }, - { TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE }, - { TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK }, - { TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL }, - { TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH }, - { TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP }, - { TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL }, - { TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT }, - { TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE }, - { TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO }, - { TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN }, - { TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN }, - { 0, 0, 0, 0 } -}; - -static void target_to_host_termios (void *dst, const void *src) -{ - struct host_termios *host = dst; - const struct target_termios *target = src; - - host->c_iflag = - target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl); - host->c_oflag = - target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl); - host->c_cflag = - target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl); - host->c_lflag = - target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl); - host->c_line = target->c_line; - - memset(host->c_cc, 0, sizeof(host->c_cc)); - host->c_cc[VINTR] = target->c_cc[TARGET_VINTR]; - host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT]; - host->c_cc[VERASE] = target->c_cc[TARGET_VERASE]; - host->c_cc[VKILL] = target->c_cc[TARGET_VKILL]; - host->c_cc[VEOF] = target->c_cc[TARGET_VEOF]; - host->c_cc[VTIME] = target->c_cc[TARGET_VTIME]; - host->c_cc[VMIN] = target->c_cc[TARGET_VMIN]; - host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC]; - host->c_cc[VSTART] = target->c_cc[TARGET_VSTART]; - host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP]; - host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP]; - host->c_cc[VEOL] = target->c_cc[TARGET_VEOL]; - host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT]; - host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD]; - host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE]; - host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT]; - host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2]; -} - -static void host_to_target_termios (void *dst, const void *src) -{ - struct target_termios *target = dst; - const struct host_termios *host = src; - - target->c_iflag = - tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl)); - target->c_oflag = - tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl)); - target->c_cflag = - tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl)); - target->c_lflag = - tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl)); - target->c_line = host->c_line; - - memset(target->c_cc, 0, sizeof(target->c_cc)); - target->c_cc[TARGET_VINTR] = host->c_cc[VINTR]; - target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT]; - target->c_cc[TARGET_VERASE] = host->c_cc[VERASE]; - target->c_cc[TARGET_VKILL] = host->c_cc[VKILL]; - target->c_cc[TARGET_VEOF] = host->c_cc[VEOF]; - target->c_cc[TARGET_VTIME] = host->c_cc[VTIME]; - target->c_cc[TARGET_VMIN] = host->c_cc[VMIN]; - target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC]; - target->c_cc[TARGET_VSTART] = host->c_cc[VSTART]; - target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP]; - target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP]; - target->c_cc[TARGET_VEOL] = host->c_cc[VEOL]; - target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT]; - target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD]; - target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE]; - target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT]; - target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2]; -} - -static const StructEntry struct_termios_def = { - .convert = { host_to_target_termios, target_to_host_termios }, - .size = { sizeof(struct target_termios), sizeof(struct host_termios) }, - .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) }, -}; - -static bitmask_transtbl mmap_flags_tbl[] = { - { TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED }, - { TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE }, - { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED }, - { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS, MAP_ANONYMOUS, MAP_ANONYMOUS }, - { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN, MAP_GROWSDOWN, MAP_GROWSDOWN }, - { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, MAP_DENYWRITE, MAP_DENYWRITE }, - { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, MAP_EXECUTABLE, MAP_EXECUTABLE }, - { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED }, - { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, MAP_NORESERVE, - MAP_NORESERVE }, - { 0, 0, 0, 0 } -}; - -#if defined(TARGET_I386) - -/* NOTE: there is really one LDT for all the threads */ -static uint8_t *ldt_table; - -static abi_long read_ldt(abi_ulong ptr, unsigned long bytecount) -{ - int size; - void *p; - - if (!ldt_table) - return 0; - size = TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE; - if (size > bytecount) - size = bytecount; - p = lock_user(VERIFY_WRITE, ptr, size, 0); - if (!p) - return -TARGET_EFAULT; - /* ??? Should this by byteswapped? */ - memcpy(p, ldt_table, size); - unlock_user(p, ptr, size); - return size; -} - -/* XXX: add locking support */ -static abi_long write_ldt(CPUX86State *env, - abi_ulong ptr, unsigned long bytecount, int oldmode) -{ - struct target_modify_ldt_ldt_s ldt_info; - struct target_modify_ldt_ldt_s *target_ldt_info; - int seg_32bit, contents, read_exec_only, limit_in_pages; - int seg_not_present, useable, lm; - uint32_t *lp, entry_1, entry_2; - - if (bytecount != sizeof(ldt_info)) - return -TARGET_EINVAL; - if (!lock_user_struct(VERIFY_READ, target_ldt_info, ptr, 1)) - return -TARGET_EFAULT; - ldt_info.entry_number = tswap32(target_ldt_info->entry_number); - ldt_info.base_addr = tswapal(target_ldt_info->base_addr); - ldt_info.limit = tswap32(target_ldt_info->limit); - ldt_info.flags = tswap32(target_ldt_info->flags); - unlock_user_struct(target_ldt_info, ptr, 0); - - if (ldt_info.entry_number >= TARGET_LDT_ENTRIES) - return -TARGET_EINVAL; - seg_32bit = ldt_info.flags & 1; - contents = (ldt_info.flags >> 1) & 3; - read_exec_only = (ldt_info.flags >> 3) & 1; - limit_in_pages = (ldt_info.flags >> 4) & 1; - seg_not_present = (ldt_info.flags >> 5) & 1; - useable = (ldt_info.flags >> 6) & 1; -#ifdef TARGET_ABI32 - lm = 0; -#else - lm = (ldt_info.flags >> 7) & 1; -#endif - if (contents == 3) { - if (oldmode) - return -TARGET_EINVAL; - if (seg_not_present == 0) - return -TARGET_EINVAL; - } - /* allocate the LDT */ - if (!ldt_table) { - env->ldt.base = target_mmap(0, - TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE, - PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); - if (env->ldt.base == -1) - return -TARGET_ENOMEM; - memset(g2h(env->ldt.base), 0, - TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE); - env->ldt.limit = 0xffff; - ldt_table = g2h(env->ldt.base); - } - - /* NOTE: same code as Linux kernel */ - /* Allow LDTs to be cleared by the user. */ - if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { - if (oldmode || - (contents == 0 && - read_exec_only == 1 && - seg_32bit == 0 && - limit_in_pages == 0 && - seg_not_present == 1 && - useable == 0 )) { - entry_1 = 0; - entry_2 = 0; - goto install; - } - } - - entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) | - (ldt_info.limit & 0x0ffff); - entry_2 = (ldt_info.base_addr & 0xff000000) | - ((ldt_info.base_addr & 0x00ff0000) >> 16) | - (ldt_info.limit & 0xf0000) | - ((read_exec_only ^ 1) << 9) | - (contents << 10) | - ((seg_not_present ^ 1) << 15) | - (seg_32bit << 22) | - (limit_in_pages << 23) | - (lm << 21) | - 0x7000; - if (!oldmode) - entry_2 |= (useable << 20); - - /* Install the new entry ... */ -install: - lp = (uint32_t *)(ldt_table + (ldt_info.entry_number << 3)); - lp[0] = tswap32(entry_1); - lp[1] = tswap32(entry_2); - return 0; -} - -/* specific and weird i386 syscalls */ -static abi_long do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr, - unsigned long bytecount) -{ - abi_long ret; - - switch (func) { - case 0: - ret = read_ldt(ptr, bytecount); - break; - case 1: - ret = write_ldt(env, ptr, bytecount, 1); - break; - case 0x11: - ret = write_ldt(env, ptr, bytecount, 0); - break; - default: - ret = -TARGET_ENOSYS; - break; - } - return ret; -} - -#if defined(TARGET_I386) && defined(TARGET_ABI32) -abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr) -{ - uint64_t *gdt_table = g2h(env->gdt.base); - struct target_modify_ldt_ldt_s ldt_info; - struct target_modify_ldt_ldt_s *target_ldt_info; - int seg_32bit, contents, read_exec_only, limit_in_pages; - int seg_not_present, useable, lm; - uint32_t *lp, entry_1, entry_2; - int i; - - lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1); - if (!target_ldt_info) - return -TARGET_EFAULT; - ldt_info.entry_number = tswap32(target_ldt_info->entry_number); - ldt_info.base_addr = tswapal(target_ldt_info->base_addr); - ldt_info.limit = tswap32(target_ldt_info->limit); - ldt_info.flags = tswap32(target_ldt_info->flags); - if (ldt_info.entry_number == -1) { - for (i=TARGET_GDT_ENTRY_TLS_MIN; i<=TARGET_GDT_ENTRY_TLS_MAX; i++) { - if (gdt_table[i] == 0) { - ldt_info.entry_number = i; - target_ldt_info->entry_number = tswap32(i); - break; - } - } - } - unlock_user_struct(target_ldt_info, ptr, 1); - - if (ldt_info.entry_number < TARGET_GDT_ENTRY_TLS_MIN || - ldt_info.entry_number > TARGET_GDT_ENTRY_TLS_MAX) - return -TARGET_EINVAL; - seg_32bit = ldt_info.flags & 1; - contents = (ldt_info.flags >> 1) & 3; - read_exec_only = (ldt_info.flags >> 3) & 1; - limit_in_pages = (ldt_info.flags >> 4) & 1; - seg_not_present = (ldt_info.flags >> 5) & 1; - useable = (ldt_info.flags >> 6) & 1; -#ifdef TARGET_ABI32 - lm = 0; -#else - lm = (ldt_info.flags >> 7) & 1; -#endif - - if (contents == 3) { - if (seg_not_present == 0) - return -TARGET_EINVAL; - } - - /* NOTE: same code as Linux kernel */ - /* Allow LDTs to be cleared by the user. */ - if (ldt_info.base_addr == 0 && ldt_info.limit == 0) { - if ((contents == 0 && - read_exec_only == 1 && - seg_32bit == 0 && - limit_in_pages == 0 && - seg_not_present == 1 && - useable == 0 )) { - entry_1 = 0; - entry_2 = 0; - goto install; - } - } - - entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) | - (ldt_info.limit & 0x0ffff); - entry_2 = (ldt_info.base_addr & 0xff000000) | - ((ldt_info.base_addr & 0x00ff0000) >> 16) | - (ldt_info.limit & 0xf0000) | - ((read_exec_only ^ 1) << 9) | - (contents << 10) | - ((seg_not_present ^ 1) << 15) | - (seg_32bit << 22) | - (limit_in_pages << 23) | - (useable << 20) | - (lm << 21) | - 0x7000; - - /* Install the new entry ... */ -install: - lp = (uint32_t *)(gdt_table + ldt_info.entry_number); - lp[0] = tswap32(entry_1); - lp[1] = tswap32(entry_2); - return 0; -} - -static abi_long do_get_thread_area(CPUX86State *env, abi_ulong ptr) -{ - struct target_modify_ldt_ldt_s *target_ldt_info; - uint64_t *gdt_table = g2h(env->gdt.base); - uint32_t base_addr, limit, flags; - int seg_32bit, contents, read_exec_only, limit_in_pages, idx; - int seg_not_present, useable, lm; - uint32_t *lp, entry_1, entry_2; - - lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1); - if (!target_ldt_info) - return -TARGET_EFAULT; - idx = tswap32(target_ldt_info->entry_number); - if (idx < TARGET_GDT_ENTRY_TLS_MIN || - idx > TARGET_GDT_ENTRY_TLS_MAX) { - unlock_user_struct(target_ldt_info, ptr, 1); - return -TARGET_EINVAL; - } - lp = (uint32_t *)(gdt_table + idx); - entry_1 = tswap32(lp[0]); - entry_2 = tswap32(lp[1]); - - read_exec_only = ((entry_2 >> 9) & 1) ^ 1; - contents = (entry_2 >> 10) & 3; - seg_not_present = ((entry_2 >> 15) & 1) ^ 1; - seg_32bit = (entry_2 >> 22) & 1; - limit_in_pages = (entry_2 >> 23) & 1; - useable = (entry_2 >> 20) & 1; -#ifdef TARGET_ABI32 - lm = 0; -#else - lm = (entry_2 >> 21) & 1; -#endif - flags = (seg_32bit << 0) | (contents << 1) | - (read_exec_only << 3) | (limit_in_pages << 4) | - (seg_not_present << 5) | (useable << 6) | (lm << 7); - limit = (entry_1 & 0xffff) | (entry_2 & 0xf0000); - base_addr = (entry_1 >> 16) | - (entry_2 & 0xff000000) | - ((entry_2 & 0xff) << 16); - target_ldt_info->base_addr = tswapal(base_addr); - target_ldt_info->limit = tswap32(limit); - target_ldt_info->flags = tswap32(flags); - unlock_user_struct(target_ldt_info, ptr, 1); - return 0; -} -#endif /* TARGET_I386 && TARGET_ABI32 */ - -#ifndef TARGET_ABI32 -abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr) -{ - abi_long ret = 0; - abi_ulong val; - int idx; - - switch(code) { - case TARGET_ARCH_SET_GS: - case TARGET_ARCH_SET_FS: - if (code == TARGET_ARCH_SET_GS) - idx = R_GS; - else - idx = R_FS; - cpu_x86_load_seg(env, idx, 0); - env->segs[idx].base = addr; - break; - case TARGET_ARCH_GET_GS: - case TARGET_ARCH_GET_FS: - if (code == TARGET_ARCH_GET_GS) - idx = R_GS; - else - idx = R_FS; - val = env->segs[idx].base; - if (put_user(val, addr, abi_ulong)) - ret = -TARGET_EFAULT; - break; - default: - ret = -TARGET_EINVAL; - break; - } - return ret; -} -#endif - -#endif /* defined(TARGET_I386) */ - -#define NEW_STACK_SIZE 0x40000 - - -static pthread_mutex_t clone_lock = PTHREAD_MUTEX_INITIALIZER; -typedef struct { - CPUArchState *env; - pthread_mutex_t mutex; - pthread_cond_t cond; - pthread_t thread; - uint32_t tid; - abi_ulong child_tidptr; - abi_ulong parent_tidptr; - sigset_t sigmask; -} new_thread_info; - -static void *clone_func(void *arg) -{ - new_thread_info *info = arg; - CPUArchState *env; - CPUState *cpu; - TaskState *ts; - - rcu_register_thread(); - env = info->env; - cpu = ENV_GET_CPU(env); - thread_cpu = cpu; - ts = (TaskState *)cpu->opaque; - info->tid = gettid(); - cpu->host_tid = info->tid; - task_settid(ts); - if (info->child_tidptr) - put_user_u32(info->tid, info->child_tidptr); - if (info->parent_tidptr) - put_user_u32(info->tid, info->parent_tidptr); - /* Enable signals. */ - sigprocmask(SIG_SETMASK, &info->sigmask, NULL); - /* Signal to the parent that we're ready. */ - pthread_mutex_lock(&info->mutex); - pthread_cond_broadcast(&info->cond); - pthread_mutex_unlock(&info->mutex); - /* Wait until the parent has finshed initializing the tls state. */ - pthread_mutex_lock(&clone_lock); - pthread_mutex_unlock(&clone_lock); - cpu_loop(env); - /* never exits */ - return NULL; -} - -/* do_fork() Must return host values and target errnos (unlike most - do_*() functions). */ -static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp, - abi_ulong parent_tidptr, target_ulong newtls, - abi_ulong child_tidptr) -{ - CPUState *cpu = ENV_GET_CPU(env); - int ret; - TaskState *ts; - CPUState *new_cpu; - CPUArchState *new_env; - unsigned int nptl_flags; - sigset_t sigmask; - - /* Emulate vfork() with fork() */ - if (flags & CLONE_VFORK) - flags &= ~(CLONE_VFORK | CLONE_VM); - - if (flags & CLONE_VM) { - TaskState *parent_ts = (TaskState *)cpu->opaque; - new_thread_info info; - pthread_attr_t attr; - - ts = g_new0(TaskState, 1); - init_task_state(ts); - /* we create a new CPU instance. */ - new_env = cpu_copy(env); - /* Init regs that differ from the parent. */ - cpu_clone_regs(new_env, newsp); - new_cpu = ENV_GET_CPU(new_env); - new_cpu->opaque = ts; - ts->bprm = parent_ts->bprm; - ts->info = parent_ts->info; - nptl_flags = flags; - flags &= ~CLONE_NPTL_FLAGS2; - - if (nptl_flags & CLONE_CHILD_CLEARTID) { - ts->child_tidptr = child_tidptr; - } - - if (nptl_flags & CLONE_SETTLS) - cpu_set_tls (new_env, newtls); - - /* Grab a mutex so that thread setup appears atomic. */ - pthread_mutex_lock(&clone_lock); - - memset(&info, 0, sizeof(info)); - pthread_mutex_init(&info.mutex, NULL); - pthread_mutex_lock(&info.mutex); - pthread_cond_init(&info.cond, NULL); - info.env = new_env; - if (nptl_flags & CLONE_CHILD_SETTID) - info.child_tidptr = child_tidptr; - if (nptl_flags & CLONE_PARENT_SETTID) - info.parent_tidptr = parent_tidptr; - - ret = pthread_attr_init(&attr); - ret = pthread_attr_setstacksize(&attr, NEW_STACK_SIZE); - ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - /* It is not safe to deliver signals until the child has finished - initializing, so temporarily block all signals. */ - sigfillset(&sigmask); - sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask); - - ret = pthread_create(&info.thread, &attr, clone_func, &info); - /* TODO: Free new CPU state if thread creation failed. */ - - sigprocmask(SIG_SETMASK, &info.sigmask, NULL); - pthread_attr_destroy(&attr); - if (ret == 0) { - /* Wait for the child to initialize. */ - pthread_cond_wait(&info.cond, &info.mutex); - ret = info.tid; - if (flags & CLONE_PARENT_SETTID) - put_user_u32(ret, parent_tidptr); - } else { - ret = -1; - } - pthread_mutex_unlock(&info.mutex); - pthread_cond_destroy(&info.cond); - pthread_mutex_destroy(&info.mutex); - pthread_mutex_unlock(&clone_lock); - } else { - /* if no CLONE_VM, we consider it is a fork */ - if ((flags & ~(CSIGNAL | CLONE_NPTL_FLAGS2)) != 0) { - return -TARGET_EINVAL; - } - fork_start(); - ret = fork(); - if (ret == 0) { - /* Child Process. */ - rcu_after_fork(); - cpu_clone_regs(env, newsp); - fork_end(1); - /* There is a race condition here. The parent process could - theoretically read the TID in the child process before the child - tid is set. This would require using either ptrace - (not implemented) or having *_tidptr to point at a shared memory - mapping. We can't repeat the spinlock hack used above because - the child process gets its own copy of the lock. */ - if (flags & CLONE_CHILD_SETTID) - put_user_u32(gettid(), child_tidptr); - if (flags & CLONE_PARENT_SETTID) - put_user_u32(gettid(), parent_tidptr); - ts = (TaskState *)cpu->opaque; - if (flags & CLONE_SETTLS) - cpu_set_tls (env, newtls); - if (flags & CLONE_CHILD_CLEARTID) - ts->child_tidptr = child_tidptr; - } else { - fork_end(0); - } - } - return ret; -} - -/* warning : doesn't handle linux specific flags... */ -static int target_to_host_fcntl_cmd(int cmd) -{ - switch(cmd) { - case TARGET_F_DUPFD: - case TARGET_F_GETFD: - case TARGET_F_SETFD: - case TARGET_F_GETFL: - case TARGET_F_SETFL: - return cmd; - case TARGET_F_GETLK: - return F_GETLK; - case TARGET_F_SETLK: - return F_SETLK; - case TARGET_F_SETLKW: - return F_SETLKW; - case TARGET_F_GETOWN: - return F_GETOWN; - case TARGET_F_SETOWN: - return F_SETOWN; - case TARGET_F_GETSIG: - return F_GETSIG; - case TARGET_F_SETSIG: - return F_SETSIG; -#if TARGET_ABI_BITS == 32 - case TARGET_F_GETLK64: - return F_GETLK64; - case TARGET_F_SETLK64: - return F_SETLK64; - case TARGET_F_SETLKW64: - return F_SETLKW64; -#endif - case TARGET_F_SETLEASE: - return F_SETLEASE; - case TARGET_F_GETLEASE: - return F_GETLEASE; -#ifdef F_DUPFD_CLOEXEC - case TARGET_F_DUPFD_CLOEXEC: - return F_DUPFD_CLOEXEC; -#endif - case TARGET_F_NOTIFY: - return F_NOTIFY; -#ifdef F_GETOWN_EX - case TARGET_F_GETOWN_EX: - return F_GETOWN_EX; -#endif -#ifdef F_SETOWN_EX - case TARGET_F_SETOWN_EX: - return F_SETOWN_EX; -#endif - default: - return -TARGET_EINVAL; - } - return -TARGET_EINVAL; -} - -#define TRANSTBL_CONVERT(a) { -1, TARGET_##a, -1, a } -static const bitmask_transtbl flock_tbl[] = { - TRANSTBL_CONVERT(F_RDLCK), - TRANSTBL_CONVERT(F_WRLCK), - TRANSTBL_CONVERT(F_UNLCK), - TRANSTBL_CONVERT(F_EXLCK), - TRANSTBL_CONVERT(F_SHLCK), - { 0, 0, 0, 0 } -}; - -static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) -{ - struct flock fl; - struct target_flock *target_fl; - struct flock64 fl64; - struct target_flock64 *target_fl64; -#ifdef F_GETOWN_EX - struct f_owner_ex fox; - struct target_f_owner_ex *target_fox; -#endif - abi_long ret; - int host_cmd = target_to_host_fcntl_cmd(cmd); - - if (host_cmd == -TARGET_EINVAL) - return host_cmd; - - switch(cmd) { - case TARGET_F_GETLK: - if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) - return -TARGET_EFAULT; - fl.l_type = - target_to_host_bitmask(tswap16(target_fl->l_type), flock_tbl); - fl.l_whence = tswap16(target_fl->l_whence); - fl.l_start = tswapal(target_fl->l_start); - fl.l_len = tswapal(target_fl->l_len); - fl.l_pid = tswap32(target_fl->l_pid); - unlock_user_struct(target_fl, arg, 0); - ret = get_errno(fcntl(fd, host_cmd, &fl)); - if (ret == 0) { - if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0)) - return -TARGET_EFAULT; - target_fl->l_type = - host_to_target_bitmask(tswap16(fl.l_type), flock_tbl); - target_fl->l_whence = tswap16(fl.l_whence); - target_fl->l_start = tswapal(fl.l_start); - target_fl->l_len = tswapal(fl.l_len); - target_fl->l_pid = tswap32(fl.l_pid); - unlock_user_struct(target_fl, arg, 1); - } - break; - - case TARGET_F_SETLK: - case TARGET_F_SETLKW: - if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) - return -TARGET_EFAULT; - fl.l_type = - target_to_host_bitmask(tswap16(target_fl->l_type), flock_tbl); - fl.l_whence = tswap16(target_fl->l_whence); - fl.l_start = tswapal(target_fl->l_start); - fl.l_len = tswapal(target_fl->l_len); - fl.l_pid = tswap32(target_fl->l_pid); - unlock_user_struct(target_fl, arg, 0); - ret = get_errno(fcntl(fd, host_cmd, &fl)); - break; - - case TARGET_F_GETLK64: - if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) - return -TARGET_EFAULT; - fl64.l_type = - target_to_host_bitmask(tswap16(target_fl64->l_type), flock_tbl) >> 1; - fl64.l_whence = tswap16(target_fl64->l_whence); - fl64.l_start = tswap64(target_fl64->l_start); - fl64.l_len = tswap64(target_fl64->l_len); - fl64.l_pid = tswap32(target_fl64->l_pid); - unlock_user_struct(target_fl64, arg, 0); - ret = get_errno(fcntl(fd, host_cmd, &fl64)); - if (ret == 0) { - if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0)) - return -TARGET_EFAULT; - target_fl64->l_type = - host_to_target_bitmask(tswap16(fl64.l_type), flock_tbl) >> 1; - target_fl64->l_whence = tswap16(fl64.l_whence); - target_fl64->l_start = tswap64(fl64.l_start); - target_fl64->l_len = tswap64(fl64.l_len); - target_fl64->l_pid = tswap32(fl64.l_pid); - unlock_user_struct(target_fl64, arg, 1); - } - break; - case TARGET_F_SETLK64: - case TARGET_F_SETLKW64: - if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) - return -TARGET_EFAULT; - fl64.l_type = - target_to_host_bitmask(tswap16(target_fl64->l_type), flock_tbl) >> 1; - fl64.l_whence = tswap16(target_fl64->l_whence); - fl64.l_start = tswap64(target_fl64->l_start); - fl64.l_len = tswap64(target_fl64->l_len); - fl64.l_pid = tswap32(target_fl64->l_pid); - unlock_user_struct(target_fl64, arg, 0); - ret = get_errno(fcntl(fd, host_cmd, &fl64)); - break; - - case TARGET_F_GETFL: - ret = get_errno(fcntl(fd, host_cmd, arg)); - if (ret >= 0) { - ret = host_to_target_bitmask(ret, fcntl_flags_tbl); - } - break; - - case TARGET_F_SETFL: - ret = get_errno(fcntl(fd, host_cmd, target_to_host_bitmask(arg, fcntl_flags_tbl))); - break; - -#ifdef F_GETOWN_EX - case TARGET_F_GETOWN_EX: - ret = get_errno(fcntl(fd, host_cmd, &fox)); - if (ret >= 0) { - if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0)) - return -TARGET_EFAULT; - target_fox->type = tswap32(fox.type); - target_fox->pid = tswap32(fox.pid); - unlock_user_struct(target_fox, arg, 1); - } - break; -#endif - -#ifdef F_SETOWN_EX - case TARGET_F_SETOWN_EX: - if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1)) - return -TARGET_EFAULT; - fox.type = tswap32(target_fox->type); - fox.pid = tswap32(target_fox->pid); - unlock_user_struct(target_fox, arg, 0); - ret = get_errno(fcntl(fd, host_cmd, &fox)); - break; -#endif - - case TARGET_F_SETOWN: - case TARGET_F_GETOWN: - case TARGET_F_SETSIG: - case TARGET_F_GETSIG: - case TARGET_F_SETLEASE: - case TARGET_F_GETLEASE: - ret = get_errno(fcntl(fd, host_cmd, arg)); - break; - - default: - ret = get_errno(fcntl(fd, cmd, arg)); - break; - } - return ret; -} - -#ifdef USE_UID16 - -static inline int high2lowuid(int uid) -{ - if (uid > 65535) - return 65534; - else - return uid; -} - -static inline int high2lowgid(int gid) -{ - if (gid > 65535) - return 65534; - else - return gid; -} - -static inline int low2highuid(int uid) -{ - if ((int16_t)uid == -1) - return -1; - else - return uid; -} - -static inline int low2highgid(int gid) -{ - if ((int16_t)gid == -1) - return -1; - else - return gid; -} -static inline int tswapid(int id) -{ - return tswap16(id); -} - -#define put_user_id(x, gaddr) put_user_u16(x, gaddr) - -#else /* !USE_UID16 */ -static inline int high2lowuid(int uid) -{ - return uid; -} -static inline int high2lowgid(int gid) -{ - return gid; -} -static inline int low2highuid(int uid) -{ - return uid; -} -static inline int low2highgid(int gid) -{ - return gid; -} -static inline int tswapid(int id) -{ - return tswap32(id); -} - -#define put_user_id(x, gaddr) put_user_u32(x, gaddr) - -#endif /* USE_UID16 */ - -void syscall_init(void) -{ - IOCTLEntry *ie; - const argtype *arg_type; - int size; - int i; - - thunk_init(STRUCT_MAX); - -#define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def); -#define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def); -#include "syscall_types.h" -#undef STRUCT -#undef STRUCT_SPECIAL - - /* Build target_to_host_errno_table[] table from - * host_to_target_errno_table[]. */ - for (i = 0; i < ERRNO_TABLE_SIZE; i++) { - target_to_host_errno_table[host_to_target_errno_table[i]] = i; - } - - /* we patch the ioctl size if necessary. We rely on the fact that - no ioctl has all the bits at '1' in the size field */ - ie = ioctl_entries; - while (ie->target_cmd != 0) { - if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMASK) == - TARGET_IOC_SIZEMASK) { - arg_type = ie->arg_type; - if (arg_type[0] != TYPE_PTR) { - fprintf(stderr, "cannot patch size for ioctl 0x%x\n", - ie->target_cmd); - exit(1); - } - arg_type++; - size = thunk_type_size(arg_type, 0); - ie->target_cmd = (ie->target_cmd & - ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT)) | - (size << TARGET_IOC_SIZESHIFT); - } - - /* automatic consistency check if same arch */ -#if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \ - (defined(__x86_64__) && defined(TARGET_X86_64)) - if (unlikely(ie->target_cmd != ie->host_cmd)) { - fprintf(stderr, "ERROR: ioctl(%s): target=0x%x host=0x%x\n", - ie->name, ie->target_cmd, ie->host_cmd); - } -#endif - ie++; - } -} - -#if TARGET_ABI_BITS == 32 -static inline uint64_t target_offset64(uint32_t word0, uint32_t word1) -{ -#ifdef TARGET_WORDS_BIGENDIAN - return ((uint64_t)word0 << 32) | word1; -#else - return ((uint64_t)word1 << 32) | word0; -#endif -} -#else /* TARGET_ABI_BITS == 32 */ -static inline uint64_t target_offset64(uint64_t word0, uint64_t word1) -{ - return word0; -} -#endif /* TARGET_ABI_BITS != 32 */ - -#ifdef TARGET_NR_truncate64 -static inline abi_long target_truncate64(void *cpu_env, const char *arg1, - abi_long arg2, - abi_long arg3, - abi_long arg4) -{ - if (regpairs_aligned(cpu_env)) { - arg2 = arg3; - arg3 = arg4; - } - return get_errno(truncate64(arg1, target_offset64(arg2, arg3))); -} -#endif - -#ifdef TARGET_NR_ftruncate64 -static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1, - abi_long arg2, - abi_long arg3, - abi_long arg4) -{ - if (regpairs_aligned(cpu_env)) { - arg2 = arg3; - arg3 = arg4; - } - return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3))); -} -#endif - -static inline abi_long target_to_host_timespec(struct timespec *host_ts, - abi_ulong target_addr) -{ - struct target_timespec *target_ts; - - if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) - return -TARGET_EFAULT; - host_ts->tv_sec = tswapal(target_ts->tv_sec); - host_ts->tv_nsec = tswapal(target_ts->tv_nsec); - unlock_user_struct(target_ts, target_addr, 0); - return 0; -} - -static inline abi_long host_to_target_timespec(abi_ulong target_addr, - struct timespec *host_ts) -{ - struct target_timespec *target_ts; - - if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) - return -TARGET_EFAULT; - target_ts->tv_sec = tswapal(host_ts->tv_sec); - target_ts->tv_nsec = tswapal(host_ts->tv_nsec); - unlock_user_struct(target_ts, target_addr, 1); - return 0; -} - -static inline abi_long target_to_host_itimerspec(struct itimerspec *host_itspec, - abi_ulong target_addr) -{ - struct target_itimerspec *target_itspec; - - if (!lock_user_struct(VERIFY_READ, target_itspec, target_addr, 1)) { - return -TARGET_EFAULT; - } - - host_itspec->it_interval.tv_sec = - tswapal(target_itspec->it_interval.tv_sec); - host_itspec->it_interval.tv_nsec = - tswapal(target_itspec->it_interval.tv_nsec); - host_itspec->it_value.tv_sec = tswapal(target_itspec->it_value.tv_sec); - host_itspec->it_value.tv_nsec = tswapal(target_itspec->it_value.tv_nsec); - - unlock_user_struct(target_itspec, target_addr, 1); - return 0; -} - -static inline abi_long host_to_target_itimerspec(abi_ulong target_addr, - struct itimerspec *host_its) -{ - struct target_itimerspec *target_itspec; - - if (!lock_user_struct(VERIFY_WRITE, target_itspec, target_addr, 0)) { - return -TARGET_EFAULT; - } - - target_itspec->it_interval.tv_sec = tswapal(host_its->it_interval.tv_sec); - target_itspec->it_interval.tv_nsec = tswapal(host_its->it_interval.tv_nsec); - - target_itspec->it_value.tv_sec = tswapal(host_its->it_value.tv_sec); - target_itspec->it_value.tv_nsec = tswapal(host_its->it_value.tv_nsec); - - unlock_user_struct(target_itspec, target_addr, 0); - return 0; -} - -static inline abi_long target_to_host_sigevent(struct sigevent *host_sevp, - abi_ulong target_addr) -{ - struct target_sigevent *target_sevp; - - if (!lock_user_struct(VERIFY_READ, target_sevp, target_addr, 1)) { - return -TARGET_EFAULT; - } - - /* This union is awkward on 64 bit systems because it has a 32 bit - * integer and a pointer in it; we follow the conversion approach - * used for handling sigval types in signal.c so the guest should get - * the correct value back even if we did a 64 bit byteswap and it's - * using the 32 bit integer. - */ - host_sevp->sigev_value.sival_ptr = - (void *)(uintptr_t)tswapal(target_sevp->sigev_value.sival_ptr); - host_sevp->sigev_signo = - target_to_host_signal(tswap32(target_sevp->sigev_signo)); - host_sevp->sigev_notify = tswap32(target_sevp->sigev_notify); - host_sevp->_sigev_un._tid = tswap32(target_sevp->_sigev_un._tid); - - unlock_user_struct(target_sevp, target_addr, 1); - return 0; -} - -#if defined(TARGET_NR_mlockall) -static inline int target_to_host_mlockall_arg(int arg) -{ - int result = 0; - - if (arg & TARGET_MLOCKALL_MCL_CURRENT) { - result |= MCL_CURRENT; - } - if (arg & TARGET_MLOCKALL_MCL_FUTURE) { - result |= MCL_FUTURE; - } - return result; -} -#endif - -static inline abi_long host_to_target_stat64(void *cpu_env, - abi_ulong target_addr, - struct stat *host_st) -{ -#if defined(TARGET_ARM) && defined(TARGET_ABI32) - if (((CPUARMState *)cpu_env)->eabi) { - struct target_eabi_stat64 *target_st; - - if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) - return -TARGET_EFAULT; - memset(target_st, 0, sizeof(struct target_eabi_stat64)); - __put_user(host_st->st_dev, &target_st->st_dev); - __put_user(host_st->st_ino, &target_st->st_ino); -#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO - __put_user(host_st->st_ino, &target_st->__st_ino); -#endif - __put_user(host_st->st_mode, &target_st->st_mode); - __put_user(host_st->st_nlink, &target_st->st_nlink); - __put_user(host_st->st_uid, &target_st->st_uid); - __put_user(host_st->st_gid, &target_st->st_gid); - __put_user(host_st->st_rdev, &target_st->st_rdev); - __put_user(host_st->st_size, &target_st->st_size); - __put_user(host_st->st_blksize, &target_st->st_blksize); - __put_user(host_st->st_blocks, &target_st->st_blocks); - __put_user(host_st->st_atime, &target_st->target_st_atime); - __put_user(host_st->st_mtime, &target_st->target_st_mtime); - __put_user(host_st->st_ctime, &target_st->target_st_ctime); - unlock_user_struct(target_st, target_addr, 1); - } else -#endif - { -#if defined(TARGET_HAS_STRUCT_STAT64) - struct target_stat64 *target_st; -#else - struct target_stat *target_st; -#endif - - if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0)) - return -TARGET_EFAULT; - memset(target_st, 0, sizeof(*target_st)); - __put_user(host_st->st_dev, &target_st->st_dev); - __put_user(host_st->st_ino, &target_st->st_ino); -#ifdef TARGET_STAT64_HAS_BROKEN_ST_INO - __put_user(host_st->st_ino, &target_st->__st_ino); -#endif - __put_user(host_st->st_mode, &target_st->st_mode); - __put_user(host_st->st_nlink, &target_st->st_nlink); - __put_user(host_st->st_uid, &target_st->st_uid); - __put_user(host_st->st_gid, &target_st->st_gid); - __put_user(host_st->st_rdev, &target_st->st_rdev); - /* XXX: better use of kernel struct */ - __put_user(host_st->st_size, &target_st->st_size); - __put_user(host_st->st_blksize, &target_st->st_blksize); - __put_user(host_st->st_blocks, &target_st->st_blocks); - __put_user(host_st->st_atime, &target_st->target_st_atime); - __put_user(host_st->st_mtime, &target_st->target_st_mtime); - __put_user(host_st->st_ctime, &target_st->target_st_ctime); - unlock_user_struct(target_st, target_addr, 1); - } - - return 0; -} - -/* ??? Using host futex calls even when target atomic operations - are not really atomic probably breaks things. However implementing - futexes locally would make futexes shared between multiple processes - tricky. However they're probably useless because guest atomic - operations won't work either. */ -static int do_futex(target_ulong uaddr, int op, int val, target_ulong timeout, - target_ulong uaddr2, int val3) -{ - struct timespec ts, *pts; - int base_op; - - /* ??? We assume FUTEX_* constants are the same on both host - and target. */ -#ifdef FUTEX_CMD_MASK - base_op = op & FUTEX_CMD_MASK; -#else - base_op = op; -#endif - switch (base_op) { - case FUTEX_WAIT: - case FUTEX_WAIT_BITSET: - if (timeout) { - pts = &ts; - target_to_host_timespec(pts, timeout); - } else { - pts = NULL; - } - return get_errno(sys_futex(g2h(uaddr), op, tswap32(val), - pts, NULL, val3)); - case FUTEX_WAKE: - return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0)); - case FUTEX_FD: - return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0)); - case FUTEX_REQUEUE: - case FUTEX_CMP_REQUEUE: - case FUTEX_WAKE_OP: - /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the - TIMEOUT parameter is interpreted as a uint32_t by the kernel. - But the prototype takes a `struct timespec *'; insert casts - to satisfy the compiler. We do not need to tswap TIMEOUT - since it's not compared to guest memory. */ - pts = (struct timespec *)(uintptr_t) timeout; - return get_errno(sys_futex(g2h(uaddr), op, val, pts, - g2h(uaddr2), - (base_op == FUTEX_CMP_REQUEUE - ? tswap32(val3) - : val3))); - default: - return -TARGET_ENOSYS; - } -} -#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) -static abi_long do_name_to_handle_at(abi_long dirfd, abi_long pathname, - abi_long handle, abi_long mount_id, - abi_long flags) -{ - struct file_handle *target_fh; - struct file_handle *fh; - int mid = 0; - abi_long ret; - char *name; - unsigned int size, total_size; - - if (get_user_s32(size, handle)) { - return -TARGET_EFAULT; - } - - name = lock_user_string(pathname); - if (!name) { - return -TARGET_EFAULT; - } - - total_size = sizeof(struct file_handle) + size; - target_fh = lock_user(VERIFY_WRITE, handle, total_size, 0); - if (!target_fh) { - unlock_user(name, pathname, 0); - return -TARGET_EFAULT; - } - - fh = g_malloc0(total_size); - fh->handle_bytes = size; - - ret = get_errno(name_to_handle_at(dirfd, path(name), fh, &mid, flags)); - unlock_user(name, pathname, 0); - - /* man name_to_handle_at(2): - * Other than the use of the handle_bytes field, the caller should treat - * the file_handle structure as an opaque data type - */ - - memcpy(target_fh, fh, total_size); - target_fh->handle_bytes = tswap32(fh->handle_bytes); - target_fh->handle_type = tswap32(fh->handle_type); - g_free(fh); - unlock_user(target_fh, handle, total_size); - - if (put_user_s32(mid, mount_id)) { - return -TARGET_EFAULT; - } - - return ret; - -} -#endif - -#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) -static abi_long do_open_by_handle_at(abi_long mount_fd, abi_long handle, - abi_long flags) -{ - struct file_handle *target_fh; - struct file_handle *fh; - unsigned int size, total_size; - abi_long ret; - - if (get_user_s32(size, handle)) { - return -TARGET_EFAULT; - } - - total_size = sizeof(struct file_handle) + size; - target_fh = lock_user(VERIFY_READ, handle, total_size, 1); - if (!target_fh) { - return -TARGET_EFAULT; - } - - fh = g_memdup(target_fh, total_size); - fh->handle_bytes = size; - fh->handle_type = tswap32(target_fh->handle_type); - - ret = get_errno(open_by_handle_at(mount_fd, fh, - target_to_host_bitmask(flags, fcntl_flags_tbl))); - - g_free(fh); - - unlock_user(target_fh, handle, total_size); - - return ret; -} -#endif - -#if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4) - -/* signalfd siginfo conversion */ - -static void -host_to_target_signalfd_siginfo(struct signalfd_siginfo *tinfo, - const struct signalfd_siginfo *info) -{ - int sig = host_to_target_signal(info->ssi_signo); - - /* linux/signalfd.h defines a ssi_addr_lsb - * not defined in sys/signalfd.h but used by some kernels - */ - -#ifdef BUS_MCEERR_AO - if (tinfo->ssi_signo == SIGBUS && - (tinfo->ssi_code == BUS_MCEERR_AR || - tinfo->ssi_code == BUS_MCEERR_AO)) { - uint16_t *ssi_addr_lsb = (uint16_t *)(&info->ssi_addr + 1); - uint16_t *tssi_addr_lsb = (uint16_t *)(&tinfo->ssi_addr + 1); - *tssi_addr_lsb = tswap16(*ssi_addr_lsb); - } -#endif - - tinfo->ssi_signo = tswap32(sig); - tinfo->ssi_errno = tswap32(tinfo->ssi_errno); - tinfo->ssi_code = tswap32(info->ssi_code); - tinfo->ssi_pid = tswap32(info->ssi_pid); - tinfo->ssi_uid = tswap32(info->ssi_uid); - tinfo->ssi_fd = tswap32(info->ssi_fd); - tinfo->ssi_tid = tswap32(info->ssi_tid); - tinfo->ssi_band = tswap32(info->ssi_band); - tinfo->ssi_overrun = tswap32(info->ssi_overrun); - tinfo->ssi_trapno = tswap32(info->ssi_trapno); - tinfo->ssi_status = tswap32(info->ssi_status); - tinfo->ssi_int = tswap32(info->ssi_int); - tinfo->ssi_ptr = tswap64(info->ssi_ptr); - tinfo->ssi_utime = tswap64(info->ssi_utime); - tinfo->ssi_stime = tswap64(info->ssi_stime); - tinfo->ssi_addr = tswap64(info->ssi_addr); -} - -static abi_long host_to_target_data_signalfd(void *buf, size_t len) -{ - int i; - - for (i = 0; i < len; i += sizeof(struct signalfd_siginfo)) { - host_to_target_signalfd_siginfo(buf + i, buf + i); - } - - return len; -} - -static TargetFdTrans target_signalfd_trans = { - .host_to_target_data = host_to_target_data_signalfd, -}; - -static abi_long do_signalfd4(int fd, abi_long mask, int flags) -{ - int host_flags; - target_sigset_t *target_mask; - sigset_t host_mask; - abi_long ret; - - if (flags & ~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC)) { - return -TARGET_EINVAL; - } - if (!lock_user_struct(VERIFY_READ, target_mask, mask, 1)) { - return -TARGET_EFAULT; - } - - target_to_host_sigset(&host_mask, target_mask); - - host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl); - - ret = get_errno(signalfd(fd, &host_mask, host_flags)); - if (ret >= 0) { - fd_trans_register(ret, &target_signalfd_trans); - } - - unlock_user_struct(target_mask, mask, 0); - - return ret; -} -#endif - -/* Map host to target signal numbers for the wait family of syscalls. - Assume all other status bits are the same. */ -int host_to_target_waitstatus(int status) -{ - if (WIFSIGNALED(status)) { - return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f); - } - if (WIFSTOPPED(status)) { - return (host_to_target_signal(WSTOPSIG(status)) << 8) - | (status & 0xff); - } - return status; -} - -static int open_self_cmdline(void *cpu_env, int fd) -{ - int fd_orig = -1; - bool word_skipped = false; - - fd_orig = open("/proc/self/cmdline", O_RDONLY); - if (fd_orig < 0) { - return fd_orig; - } - - while (true) { - ssize_t nb_read; - char buf[128]; - char *cp_buf = buf; - - nb_read = read(fd_orig, buf, sizeof(buf)); - if (nb_read < 0) { - fd_orig = close(fd_orig); - return -1; - } else if (nb_read == 0) { - break; - } - - if (!word_skipped) { - /* Skip the first string, which is the path to qemu-*-static - instead of the actual command. */ - cp_buf = memchr(buf, 0, sizeof(buf)); - if (cp_buf) { - /* Null byte found, skip one string */ - cp_buf++; - nb_read -= cp_buf - buf; - word_skipped = true; - } - } - - if (word_skipped) { - if (write(fd, cp_buf, nb_read) != nb_read) { - close(fd_orig); - return -1; - } - } - } - - return close(fd_orig); -} - -static int open_self_maps(void *cpu_env, int fd) -{ - CPUState *cpu = ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts = cpu->opaque; - FILE *fp; - char *line = NULL; - size_t len = 0; - ssize_t read; - - fp = fopen("/proc/self/maps", "r"); - if (fp == NULL) { - return -EACCES; - } - - while ((read = getline(&line, &len, fp)) != -1) { - int fields, dev_maj, dev_min, inode; - uint64_t min, max, offset; - char flag_r, flag_w, flag_x, flag_p; - char path[512] = ""; - fields = sscanf(line, "%"PRIx64"-%"PRIx64" %c%c%c%c %"PRIx64" %x:%x %d" - " %512s", &min, &max, &flag_r, &flag_w, &flag_x, - &flag_p, &offset, &dev_maj, &dev_min, &inode, path); - - if ((fields < 10) || (fields > 11)) { - continue; - } - if (h2g_valid(min)) { - int flags = page_get_flags(h2g(min)); - max = h2g_valid(max - 1) ? max : (uintptr_t)g2h(GUEST_ADDR_MAX); - if (page_check_range(h2g(min), max - min, flags) == -1) { - continue; - } - if (h2g(min) == ts->info->stack_limit) { - pstrcpy(path, sizeof(path), " [stack]"); - } - dprintf(fd, TARGET_ABI_FMT_lx "-" TARGET_ABI_FMT_lx - " %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n", - h2g(min), h2g(max - 1) + 1, flag_r, flag_w, - flag_x, flag_p, offset, dev_maj, dev_min, inode, - path[0] ? " " : "", path); - } - } - - free(line); - fclose(fp); - - return 0; -} - -static int open_self_stat(void *cpu_env, int fd) -{ - CPUState *cpu = ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts = cpu->opaque; - abi_ulong start_stack = ts->info->start_stack; - int i; - - for (i = 0; i < 44; i++) { - char buf[128]; - int len; - uint64_t val = 0; - - if (i == 0) { - /* pid */ - val = getpid(); - snprintf(buf, sizeof(buf), "%"PRId64 " ", val); - } else if (i == 1) { - /* app name */ - snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->argv[0]); - } else if (i == 27) { - /* stack bottom */ - val = start_stack; - snprintf(buf, sizeof(buf), "%"PRId64 " ", val); - } else { - /* for the rest, there is MasterCard */ - snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' '); - } - - len = strlen(buf); - if (write(fd, buf, len) != len) { - return -1; - } - } - - return 0; -} - -static int open_self_auxv(void *cpu_env, int fd) -{ - CPUState *cpu = ENV_GET_CPU((CPUArchState *)cpu_env); - TaskState *ts = cpu->opaque; - abi_ulong auxv = ts->info->saved_auxv; - abi_ulong len = ts->info->auxv_len; - char *ptr; - - /* - * Auxiliary vector is stored in target process stack. - * read in whole auxv vector and copy it to file - */ - ptr = lock_user(VERIFY_READ, auxv, len, 0); - if (ptr != NULL) { - while (len > 0) { - ssize_t r; - r = write(fd, ptr, len); - if (r <= 0) { - break; - } - len -= r; - ptr += r; - } - lseek(fd, 0, SEEK_SET); - unlock_user(ptr, auxv, len); - } - - return 0; -} - -static int is_proc_myself(const char *filename, const char *entry) -{ - if (!strncmp(filename, "/proc/", strlen("/proc/"))) { - filename += strlen("/proc/"); - if (!strncmp(filename, "self/", strlen("self/"))) { - filename += strlen("self/"); - } else if (*filename >= '1' && *filename <= '9') { - char myself[80]; - snprintf(myself, sizeof(myself), "%d/", getpid()); - if (!strncmp(filename, myself, strlen(myself))) { - filename += strlen(myself); - } else { - return 0; - } - } else { - return 0; - } - if (!strcmp(filename, entry)) { - return 1; - } - } - return 0; -} - -#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) -static int is_proc(const char *filename, const char *entry) -{ - return strcmp(filename, entry) == 0; -} - -static int open_net_route(void *cpu_env, int fd) -{ - FILE *fp; - char *line = NULL; - size_t len = 0; - ssize_t read; - - fp = fopen("/proc/net/route", "r"); - if (fp == NULL) { - return -EACCES; - } - - /* read header */ - - read = getline(&line, &len, fp); - dprintf(fd, "%s", line); - - /* read routes */ - - while ((read = getline(&line, &len, fp)) != -1) { - char iface[16]; - uint32_t dest, gw, mask; - unsigned int flags, refcnt, use, metric, mtu, window, irtt; - sscanf(line, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", - iface, &dest, &gw, &flags, &refcnt, &use, &metric, - &mask, &mtu, &window, &irtt); - dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n", - iface, tswap32(dest), tswap32(gw), flags, refcnt, use, - metric, tswap32(mask), mtu, window, irtt); - } - - free(line); - fclose(fp); - - return 0; -} -#endif - -static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags, mode_t mode) -{ - struct fake_open { - const char *filename; - int (*fill)(void *cpu_env, int fd); - int (*cmp)(const char *s1, const char *s2); - }; - const struct fake_open *fake_open; - static const struct fake_open fakes[] = { - { "maps", open_self_maps, is_proc_myself }, - { "stat", open_self_stat, is_proc_myself }, - { "auxv", open_self_auxv, is_proc_myself }, - { "cmdline", open_self_cmdline, is_proc_myself }, -#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) - { "/proc/net/route", open_net_route, is_proc }, -#endif - { NULL, NULL, NULL } - }; - - if (is_proc_myself(pathname, "exe")) { - int execfd = qemu_getauxval(AT_EXECFD); - return execfd ? execfd : get_errno(sys_openat(dirfd, exec_path, flags, mode)); - } - - for (fake_open = fakes; fake_open->filename; fake_open++) { - if (fake_open->cmp(pathname, fake_open->filename)) { - break; - } - } - - if (fake_open->filename) { - const char *tmpdir; - char filename[PATH_MAX]; - int fd, r; - - /* create temporary file to map stat to */ - tmpdir = getenv("TMPDIR"); - if (!tmpdir) - tmpdir = "/tmp"; - snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir); - fd = mkstemp(filename); - if (fd < 0) { - return fd; - } - unlink(filename); - - if ((r = fake_open->fill(cpu_env, fd))) { - close(fd); - return r; - } - lseek(fd, 0, SEEK_SET); - - return fd; - } - - return get_errno(sys_openat(dirfd, path(pathname), flags, mode)); -} - -#define TIMER_MAGIC 0x0caf0000 -#define TIMER_MAGIC_MASK 0xffff0000 - -/* Convert QEMU provided timer ID back to internal 16bit index format */ -static target_timer_t get_timer_id(abi_long arg) -{ - target_timer_t timerid = arg; - - if ((timerid & TIMER_MAGIC_MASK) != TIMER_MAGIC) { - return -TARGET_EINVAL; - } - - timerid &= 0xffff; - - if (timerid >= ARRAY_SIZE(g_posix_timers)) { - return -TARGET_EINVAL; - } - - return timerid; -} - -/* do_syscall() should always have a single exit point at the end so - that actions, such as logging of syscall results, can be performed. - All errnos that do_syscall() returns must be -TARGET_<errcode>. */ -abi_long do_syscall(void *cpu_env, int num, abi_long arg1, - abi_long arg2, abi_long arg3, abi_long arg4, - abi_long arg5, abi_long arg6, abi_long arg7, - abi_long arg8) -{ - CPUState *cpu = ENV_GET_CPU(cpu_env); - abi_long ret; - struct stat st; - struct statfs stfs; - void *p; - -#ifdef DEBUG - gemu_log("syscall %d", num); -#endif - if(do_strace) - print_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); - - switch(num) { - case TARGET_NR_exit: - /* In old applications this may be used to implement _exit(2). - However in threaded applictions it is used for thread termination, - and _exit_group is used for application termination. - Do thread termination if we have more then one thread. */ - /* FIXME: This probably breaks if a signal arrives. We should probably - be disabling signals. */ - if (CPU_NEXT(first_cpu)) { - TaskState *ts; - - cpu_list_lock(); - /* Remove the CPU from the list. */ - QTAILQ_REMOVE(&cpus, cpu, node); - cpu_list_unlock(); - ts = cpu->opaque; - if (ts->child_tidptr) { - put_user_u32(0, ts->child_tidptr); - sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX, - NULL, NULL, 0); - } - thread_cpu = NULL; - object_unref(OBJECT(cpu)); - g_free(ts); - rcu_unregister_thread(); - pthread_exit(NULL); - } -#ifdef TARGET_GPROF - _mcleanup(); -#endif - gdb_exit(cpu_env, arg1); - _exit(arg1); - ret = 0; /* avoid warning */ - break; - case TARGET_NR_read: - if (arg3 == 0) - ret = 0; - else { - if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) - goto efault; - ret = get_errno(read(arg1, p, arg3)); - if (ret >= 0 && - fd_trans_host_to_target_data(arg1)) { - ret = fd_trans_host_to_target_data(arg1)(p, ret); - } - unlock_user(p, arg2, ret); - } - break; - case TARGET_NR_write: - if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) - goto efault; - ret = get_errno(write(arg1, p, arg3)); - unlock_user(p, arg2, 0); - break; -#ifdef TARGET_NR_open - case TARGET_NR_open: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(do_openat(cpu_env, AT_FDCWD, p, - target_to_host_bitmask(arg2, fcntl_flags_tbl), - arg3)); - fd_trans_unregister(ret); - unlock_user(p, arg1, 0); - break; -#endif - case TARGET_NR_openat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(do_openat(cpu_env, arg1, p, - target_to_host_bitmask(arg3, fcntl_flags_tbl), - arg4)); - fd_trans_unregister(ret); - unlock_user(p, arg2, 0); - break; -#if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) - case TARGET_NR_name_to_handle_at: - ret = do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5); - break; -#endif -#if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE) - case TARGET_NR_open_by_handle_at: - ret = do_open_by_handle_at(arg1, arg2, arg3); - fd_trans_unregister(ret); - break; -#endif - case TARGET_NR_close: - fd_trans_unregister(arg1); - ret = get_errno(close(arg1)); - break; - case TARGET_NR_brk: - ret = do_brk(arg1); - break; -#ifdef TARGET_NR_fork - case TARGET_NR_fork: - ret = get_errno(do_fork(cpu_env, SIGCHLD, 0, 0, 0, 0)); - break; -#endif -#ifdef TARGET_NR_waitpid - case TARGET_NR_waitpid: - { - int status; - ret = get_errno(waitpid(arg1, &status, arg3)); - if (!is_error(ret) && arg2 && ret - && put_user_s32(host_to_target_waitstatus(status), arg2)) - goto efault; - } - break; -#endif -#ifdef TARGET_NR_waitid - case TARGET_NR_waitid: - { - siginfo_t info; - info.si_pid = 0; - ret = get_errno(waitid(arg1, arg2, &info, arg4)); - if (!is_error(ret) && arg3 && info.si_pid != 0) { - if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_siginfo_t), 0))) - goto efault; - host_to_target_siginfo(p, &info); - unlock_user(p, arg3, sizeof(target_siginfo_t)); - } - } - break; -#endif -#ifdef TARGET_NR_creat /* not on alpha */ - case TARGET_NR_creat: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(creat(p, arg2)); - fd_trans_unregister(ret); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_link - case TARGET_NR_link: - { - void * p2; - p = lock_user_string(arg1); - p2 = lock_user_string(arg2); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(link(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - break; -#endif -#if defined(TARGET_NR_linkat) - case TARGET_NR_linkat: - { - void * p2 = NULL; - if (!arg2 || !arg4) - goto efault; - p = lock_user_string(arg2); - p2 = lock_user_string(arg4); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(linkat(arg1, p, arg3, p2, arg5)); - unlock_user(p, arg2, 0); - unlock_user(p2, arg4, 0); - } - break; -#endif -#ifdef TARGET_NR_unlink - case TARGET_NR_unlink: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(unlink(p)); - unlock_user(p, arg1, 0); - break; -#endif -#if defined(TARGET_NR_unlinkat) - case TARGET_NR_unlinkat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(unlinkat(arg1, p, arg3)); - unlock_user(p, arg2, 0); - break; -#endif - case TARGET_NR_execve: - { - char **argp, **envp; - int argc, envc; - abi_ulong gp; - abi_ulong guest_argp; - abi_ulong guest_envp; - abi_ulong addr; - char **q; - int total_size = 0; - - argc = 0; - guest_argp = arg2; - for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) { - if (get_user_ual(addr, gp)) - goto efault; - if (!addr) - break; - argc++; - } - envc = 0; - guest_envp = arg3; - for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) { - if (get_user_ual(addr, gp)) - goto efault; - if (!addr) - break; - envc++; - } - - argp = alloca((argc + 1) * sizeof(void *)); - envp = alloca((envc + 1) * sizeof(void *)); - - for (gp = guest_argp, q = argp; gp; - gp += sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp)) - goto execve_efault; - if (!addr) - break; - if (!(*q = lock_user_string(addr))) - goto execve_efault; - total_size += strlen(*q) + 1; - } - *q = NULL; - - for (gp = guest_envp, q = envp; gp; - gp += sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp)) - goto execve_efault; - if (!addr) - break; - if (!(*q = lock_user_string(addr))) - goto execve_efault; - total_size += strlen(*q) + 1; - } - *q = NULL; - - if (!(p = lock_user_string(arg1))) - goto execve_efault; - ret = get_errno(execve(p, argp, envp)); - unlock_user(p, arg1, 0); - - goto execve_end; - - execve_efault: - ret = -TARGET_EFAULT; - - execve_end: - for (gp = guest_argp, q = argp; *q; - gp += sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp) - || !addr) - break; - unlock_user(*q, addr, 0); - } - for (gp = guest_envp, q = envp; *q; - gp += sizeof(abi_ulong), q++) { - if (get_user_ual(addr, gp) - || !addr) - break; - unlock_user(*q, addr, 0); - } - } - break; - case TARGET_NR_chdir: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(chdir(p)); - unlock_user(p, arg1, 0); - break; -#ifdef TARGET_NR_time - case TARGET_NR_time: - { - time_t host_time; - ret = get_errno(time(&host_time)); - if (!is_error(ret) - && arg1 - && put_user_sal(host_time, arg1)) - goto efault; - } - break; -#endif -#ifdef TARGET_NR_mknod - case TARGET_NR_mknod: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(mknod(p, arg2, arg3)); - unlock_user(p, arg1, 0); - break; -#endif -#if defined(TARGET_NR_mknodat) - case TARGET_NR_mknodat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(mknodat(arg1, p, arg3, arg4)); - unlock_user(p, arg2, 0); - break; -#endif -#ifdef TARGET_NR_chmod - case TARGET_NR_chmod: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(chmod(p, arg2)); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_break - case TARGET_NR_break: - goto unimplemented; -#endif -#ifdef TARGET_NR_oldstat - case TARGET_NR_oldstat: - goto unimplemented; -#endif - case TARGET_NR_lseek: - ret = get_errno(lseek(arg1, arg2, arg3)); - break; -#if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_getxpid: - ((CPUAlphaState *)cpu_env)->ir[IR_A4] = getppid(); - ret = get_errno(getpid()); - break; -#endif -#ifdef TARGET_NR_getpid - case TARGET_NR_getpid: - ret = get_errno(getpid()); - break; -#endif - case TARGET_NR_mount: - { - /* need to look at the data field */ - void *p2, *p3; - - if (arg1) { - p = lock_user_string(arg1); - if (!p) { - goto efault; - } - } else { - p = NULL; - } - - p2 = lock_user_string(arg2); - if (!p2) { - if (arg1) { - unlock_user(p, arg1, 0); - } - goto efault; - } - - if (arg3) { - p3 = lock_user_string(arg3); - if (!p3) { - if (arg1) { - unlock_user(p, arg1, 0); - } - unlock_user(p2, arg2, 0); - goto efault; - } - } else { - p3 = NULL; - } - - /* FIXME - arg5 should be locked, but it isn't clear how to - * do that since it's not guaranteed to be a NULL-terminated - * string. - */ - if (!arg5) { - ret = mount(p, p2, p3, (unsigned long)arg4, NULL); - } else { - ret = mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)); - } - ret = get_errno(ret); - - if (arg1) { - unlock_user(p, arg1, 0); - } - unlock_user(p2, arg2, 0); - if (arg3) { - unlock_user(p3, arg3, 0); - } - } - break; -#ifdef TARGET_NR_umount - case TARGET_NR_umount: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(umount(p)); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_stime /* not on alpha */ - case TARGET_NR_stime: - { - time_t host_time; - if (get_user_sal(host_time, arg1)) - goto efault; - ret = get_errno(stime(&host_time)); - } - break; -#endif - case TARGET_NR_ptrace: - goto unimplemented; -#ifdef TARGET_NR_alarm /* not on alpha */ - case TARGET_NR_alarm: - ret = alarm(arg1); - break; -#endif -#ifdef TARGET_NR_oldfstat - case TARGET_NR_oldfstat: - goto unimplemented; -#endif -#ifdef TARGET_NR_pause /* not on alpha */ - case TARGET_NR_pause: - ret = get_errno(pause()); - break; -#endif -#ifdef TARGET_NR_utime - case TARGET_NR_utime: - { - struct utimbuf tbuf, *host_tbuf; - struct target_utimbuf *target_tbuf; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1)) - goto efault; - tbuf.actime = tswapal(target_tbuf->actime); - tbuf.modtime = tswapal(target_tbuf->modtime); - unlock_user_struct(target_tbuf, arg2, 0); - host_tbuf = &tbuf; - } else { - host_tbuf = NULL; - } - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(utime(p, host_tbuf)); - unlock_user(p, arg1, 0); - } - break; -#endif -#ifdef TARGET_NR_utimes - case TARGET_NR_utimes: - { - struct timeval *tvp, tv[2]; - if (arg2) { - if (copy_from_user_timeval(&tv[0], arg2) - || copy_from_user_timeval(&tv[1], - arg2 + sizeof(struct target_timeval))) - goto efault; - tvp = tv; - } else { - tvp = NULL; - } - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(utimes(p, tvp)); - unlock_user(p, arg1, 0); - } - break; -#endif -#if defined(TARGET_NR_futimesat) - case TARGET_NR_futimesat: - { - struct timeval *tvp, tv[2]; - if (arg3) { - if (copy_from_user_timeval(&tv[0], arg3) - || copy_from_user_timeval(&tv[1], - arg3 + sizeof(struct target_timeval))) - goto efault; - tvp = tv; - } else { - tvp = NULL; - } - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(futimesat(arg1, path(p), tvp)); - unlock_user(p, arg2, 0); - } - break; -#endif -#ifdef TARGET_NR_stty - case TARGET_NR_stty: - goto unimplemented; -#endif -#ifdef TARGET_NR_gtty - case TARGET_NR_gtty: - goto unimplemented; -#endif -#ifdef TARGET_NR_access - case TARGET_NR_access: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(access(path(p), arg2)); - unlock_user(p, arg1, 0); - break; -#endif -#if defined(TARGET_NR_faccessat) && defined(__NR_faccessat) - case TARGET_NR_faccessat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(faccessat(arg1, p, arg3, 0)); - unlock_user(p, arg2, 0); - break; -#endif -#ifdef TARGET_NR_nice /* not on alpha */ - case TARGET_NR_nice: - ret = get_errno(nice(arg1)); - break; -#endif -#ifdef TARGET_NR_ftime - case TARGET_NR_ftime: - goto unimplemented; -#endif - case TARGET_NR_sync: - sync(); - ret = 0; - break; - case TARGET_NR_kill: - ret = get_errno(kill(arg1, target_to_host_signal(arg2))); - break; -#ifdef TARGET_NR_rename - case TARGET_NR_rename: - { - void *p2; - p = lock_user_string(arg1); - p2 = lock_user_string(arg2); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(rename(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - break; -#endif -#if defined(TARGET_NR_renameat) - case TARGET_NR_renameat: - { - void *p2; - p = lock_user_string(arg2); - p2 = lock_user_string(arg4); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(renameat(arg1, p, arg3, p2)); - unlock_user(p2, arg4, 0); - unlock_user(p, arg2, 0); - } - break; -#endif -#ifdef TARGET_NR_mkdir - case TARGET_NR_mkdir: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(mkdir(p, arg2)); - unlock_user(p, arg1, 0); - break; -#endif -#if defined(TARGET_NR_mkdirat) - case TARGET_NR_mkdirat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(mkdirat(arg1, p, arg3)); - unlock_user(p, arg2, 0); - break; -#endif -#ifdef TARGET_NR_rmdir - case TARGET_NR_rmdir: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(rmdir(p)); - unlock_user(p, arg1, 0); - break; -#endif - case TARGET_NR_dup: - ret = get_errno(dup(arg1)); - if (ret >= 0) { - fd_trans_dup(arg1, ret); - } - break; -#ifdef TARGET_NR_pipe - case TARGET_NR_pipe: - ret = do_pipe(cpu_env, arg1, 0, 0); - break; -#endif -#ifdef TARGET_NR_pipe2 - case TARGET_NR_pipe2: - ret = do_pipe(cpu_env, arg1, - target_to_host_bitmask(arg2, fcntl_flags_tbl), 1); - break; -#endif - case TARGET_NR_times: - { - struct target_tms *tmsp; - struct tms tms; - ret = get_errno(times(&tms)); - if (arg1) { - tmsp = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_tms), 0); - if (!tmsp) - goto efault; - tmsp->tms_utime = tswapal(host_to_target_clock_t(tms.tms_utime)); - tmsp->tms_stime = tswapal(host_to_target_clock_t(tms.tms_stime)); - tmsp->tms_cutime = tswapal(host_to_target_clock_t(tms.tms_cutime)); - tmsp->tms_cstime = tswapal(host_to_target_clock_t(tms.tms_cstime)); - } - if (!is_error(ret)) - ret = host_to_target_clock_t(ret); - } - break; -#ifdef TARGET_NR_prof - case TARGET_NR_prof: - goto unimplemented; -#endif -#ifdef TARGET_NR_signal - case TARGET_NR_signal: - goto unimplemented; -#endif - case TARGET_NR_acct: - if (arg1 == 0) { - ret = get_errno(acct(NULL)); - } else { - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(acct(path(p))); - unlock_user(p, arg1, 0); - } - break; -#ifdef TARGET_NR_umount2 - case TARGET_NR_umount2: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(umount2(p, arg2)); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_lock - case TARGET_NR_lock: - goto unimplemented; -#endif - case TARGET_NR_ioctl: - ret = do_ioctl(arg1, arg2, arg3); - break; - case TARGET_NR_fcntl: - ret = do_fcntl(arg1, arg2, arg3); - break; -#ifdef TARGET_NR_mpx - case TARGET_NR_mpx: - goto unimplemented; -#endif - case TARGET_NR_setpgid: - ret = get_errno(setpgid(arg1, arg2)); - break; -#ifdef TARGET_NR_ulimit - case TARGET_NR_ulimit: - goto unimplemented; -#endif -#ifdef TARGET_NR_oldolduname - case TARGET_NR_oldolduname: - goto unimplemented; -#endif - case TARGET_NR_umask: - ret = get_errno(umask(arg1)); - break; - case TARGET_NR_chroot: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(chroot(p)); - unlock_user(p, arg1, 0); - break; -#ifdef TARGET_NR_ustat - case TARGET_NR_ustat: - goto unimplemented; -#endif -#ifdef TARGET_NR_dup2 - case TARGET_NR_dup2: - ret = get_errno(dup2(arg1, arg2)); - if (ret >= 0) { - fd_trans_dup(arg1, arg2); - } - break; -#endif -#if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3) - case TARGET_NR_dup3: - ret = get_errno(dup3(arg1, arg2, arg3)); - if (ret >= 0) { - fd_trans_dup(arg1, arg2); - } - break; -#endif -#ifdef TARGET_NR_getppid /* not on alpha */ - case TARGET_NR_getppid: - ret = get_errno(getppid()); - break; -#endif -#ifdef TARGET_NR_getpgrp - case TARGET_NR_getpgrp: - ret = get_errno(getpgrp()); - break; -#endif - case TARGET_NR_setsid: - ret = get_errno(setsid()); - break; -#ifdef TARGET_NR_sigaction - case TARGET_NR_sigaction: - { -#if defined(TARGET_ALPHA) - struct target_sigaction act, oact, *pact = 0; - struct target_old_sigaction *old_act; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - goto efault; - act._sa_handler = old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask); - act.sa_flags = old_act->sa_flags; - act.sa_restorer = 0; - unlock_user_struct(old_act, arg2, 0); - pact = &act; - } - ret = get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - goto efault; - old_act->_sa_handler = oact._sa_handler; - old_act->sa_mask = oact.sa_mask.sig[0]; - old_act->sa_flags = oact.sa_flags; - unlock_user_struct(old_act, arg3, 1); - } -#elif defined(TARGET_MIPS) - struct target_sigaction act, oact, *pact, *old_act; - - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - goto efault; - act._sa_handler = old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]); - act.sa_flags = old_act->sa_flags; - unlock_user_struct(old_act, arg2, 0); - pact = &act; - } else { - pact = NULL; - } - - ret = get_errno(do_sigaction(arg1, pact, &oact)); - - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - goto efault; - old_act->_sa_handler = oact._sa_handler; - old_act->sa_flags = oact.sa_flags; - old_act->sa_mask.sig[0] = oact.sa_mask.sig[0]; - old_act->sa_mask.sig[1] = 0; - old_act->sa_mask.sig[2] = 0; - old_act->sa_mask.sig[3] = 0; - unlock_user_struct(old_act, arg3, 1); - } -#else - struct target_old_sigaction *old_act; - struct target_sigaction act, oact, *pact; - if (arg2) { - if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) - goto efault; - act._sa_handler = old_act->_sa_handler; - target_siginitset(&act.sa_mask, old_act->sa_mask); - act.sa_flags = old_act->sa_flags; - act.sa_restorer = old_act->sa_restorer; - unlock_user_struct(old_act, arg2, 0); - pact = &act; - } else { - pact = NULL; - } - ret = get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) - goto efault; - old_act->_sa_handler = oact._sa_handler; - old_act->sa_mask = oact.sa_mask.sig[0]; - old_act->sa_flags = oact.sa_flags; - old_act->sa_restorer = oact.sa_restorer; - unlock_user_struct(old_act, arg3, 1); - } -#endif - } - break; -#endif - case TARGET_NR_rt_sigaction: - { -#if defined(TARGET_ALPHA) - struct target_sigaction act, oact, *pact = 0; - struct target_rt_sigaction *rt_act; - /* ??? arg4 == sizeof(sigset_t). */ - if (arg2) { - if (!lock_user_struct(VERIFY_READ, rt_act, arg2, 1)) - goto efault; - act._sa_handler = rt_act->_sa_handler; - act.sa_mask = rt_act->sa_mask; - act.sa_flags = rt_act->sa_flags; - act.sa_restorer = arg5; - unlock_user_struct(rt_act, arg2, 0); - pact = &act; - } - ret = get_errno(do_sigaction(arg1, pact, &oact)); - if (!is_error(ret) && arg3) { - if (!lock_user_struct(VERIFY_WRITE, rt_act, arg3, 0)) - goto efault; - rt_act->_sa_handler = oact._sa_handler; - rt_act->sa_mask = oact.sa_mask; - rt_act->sa_flags = oact.sa_flags; - unlock_user_struct(rt_act, arg3, 1); - } -#else - struct target_sigaction *act; - struct target_sigaction *oact; - - if (arg2) { - if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) - goto efault; - } else - act = NULL; - if (arg3) { - if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) { - ret = -TARGET_EFAULT; - goto rt_sigaction_fail; - } - } else - oact = NULL; - ret = get_errno(do_sigaction(arg1, act, oact)); - rt_sigaction_fail: - if (act) - unlock_user_struct(act, arg2, 0); - if (oact) - unlock_user_struct(oact, arg3, 1); -#endif - } - break; -#ifdef TARGET_NR_sgetmask /* not on alpha */ - case TARGET_NR_sgetmask: - { - sigset_t cur_set; - abi_ulong target_set; - do_sigprocmask(0, NULL, &cur_set); - host_to_target_old_sigset(&target_set, &cur_set); - ret = target_set; - } - break; -#endif -#ifdef TARGET_NR_ssetmask /* not on alpha */ - case TARGET_NR_ssetmask: - { - sigset_t set, oset, cur_set; - abi_ulong target_set = arg1; - do_sigprocmask(0, NULL, &cur_set); - target_to_host_old_sigset(&set, &target_set); - sigorset(&set, &set, &cur_set); - do_sigprocmask(SIG_SETMASK, &set, &oset); - host_to_target_old_sigset(&target_set, &oset); - ret = target_set; - } - break; -#endif -#ifdef TARGET_NR_sigprocmask - case TARGET_NR_sigprocmask: - { -#if defined(TARGET_ALPHA) - sigset_t set, oldset; - abi_ulong mask; - int how; - - switch (arg1) { - case TARGET_SIG_BLOCK: - how = SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how = SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how = SIG_SETMASK; - break; - default: - ret = -TARGET_EINVAL; - goto fail; - } - mask = arg2; - target_to_host_old_sigset(&set, &mask); - - ret = get_errno(do_sigprocmask(how, &set, &oldset)); - if (!is_error(ret)) { - host_to_target_old_sigset(&mask, &oldset); - ret = mask; - ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0; /* force no error */ - } -#else - sigset_t set, oldset, *set_ptr; - int how; - - if (arg2) { - switch (arg1) { - case TARGET_SIG_BLOCK: - how = SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how = SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how = SIG_SETMASK; - break; - default: - ret = -TARGET_EINVAL; - goto fail; - } - if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_old_sigset(&set, p); - unlock_user(p, arg2, 0); - set_ptr = &set; - } else { - how = 0; - set_ptr = NULL; - } - ret = get_errno(do_sigprocmask(how, set_ptr, &oldset)); - if (!is_error(ret) && arg3) { - if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0))) - goto efault; - host_to_target_old_sigset(p, &oldset); - unlock_user(p, arg3, sizeof(target_sigset_t)); - } -#endif - } - break; -#endif - case TARGET_NR_rt_sigprocmask: - { - int how = arg1; - sigset_t set, oldset, *set_ptr; - - if (arg2) { - switch(how) { - case TARGET_SIG_BLOCK: - how = SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how = SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how = SIG_SETMASK; - break; - default: - ret = -TARGET_EINVAL; - goto fail; - } - if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_sigset(&set, p); - unlock_user(p, arg2, 0); - set_ptr = &set; - } else { - how = 0; - set_ptr = NULL; - } - ret = get_errno(do_sigprocmask(how, set_ptr, &oldset)); - if (!is_error(ret) && arg3) { - if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0))) - goto efault; - host_to_target_sigset(p, &oldset); - unlock_user(p, arg3, sizeof(target_sigset_t)); - } - } - break; -#ifdef TARGET_NR_sigpending - case TARGET_NR_sigpending: - { - sigset_t set; - ret = get_errno(sigpending(&set)); - if (!is_error(ret)) { - if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0))) - goto efault; - host_to_target_old_sigset(p, &set); - unlock_user(p, arg1, sizeof(target_sigset_t)); - } - } - break; -#endif - case TARGET_NR_rt_sigpending: - { - sigset_t set; - ret = get_errno(sigpending(&set)); - if (!is_error(ret)) { - if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0))) - goto efault; - host_to_target_sigset(p, &set); - unlock_user(p, arg1, sizeof(target_sigset_t)); - } - } - break; -#ifdef TARGET_NR_sigsuspend - case TARGET_NR_sigsuspend: - { - sigset_t set; -#if defined(TARGET_ALPHA) - abi_ulong mask = arg1; - target_to_host_old_sigset(&set, &mask); -#else - if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_old_sigset(&set, p); - unlock_user(p, arg1, 0); -#endif - ret = get_errno(sigsuspend(&set)); - } - break; -#endif - case TARGET_NR_rt_sigsuspend: - { - sigset_t set; - if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_sigset(&set, p); - unlock_user(p, arg1, 0); - ret = get_errno(sigsuspend(&set)); - } - break; - case TARGET_NR_rt_sigtimedwait: - { - sigset_t set; - struct timespec uts, *puts; - siginfo_t uinfo; - - if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_sigset(&set, p); - unlock_user(p, arg1, 0); - if (arg3) { - puts = &uts; - target_to_host_timespec(puts, arg3); - } else { - puts = NULL; - } - ret = get_errno(sigtimedwait(&set, &uinfo, puts)); - if (!is_error(ret)) { - if (arg2) { - p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), - 0); - if (!p) { - goto efault; - } - host_to_target_siginfo(p, &uinfo); - unlock_user(p, arg2, sizeof(target_siginfo_t)); - } - ret = host_to_target_signal(ret); - } - } - break; - case TARGET_NR_rt_sigqueueinfo: - { - siginfo_t uinfo; - if (!(p = lock_user(VERIFY_READ, arg3, sizeof(target_sigset_t), 1))) - goto efault; - target_to_host_siginfo(&uinfo, p); - unlock_user(p, arg1, 0); - ret = get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo)); - } - break; -#ifdef TARGET_NR_sigreturn - case TARGET_NR_sigreturn: - /* NOTE: ret is eax, so not transcoding must be done */ - ret = do_sigreturn(cpu_env); - break; -#endif - case TARGET_NR_rt_sigreturn: - /* NOTE: ret is eax, so not transcoding must be done */ - ret = do_rt_sigreturn(cpu_env); - break; - case TARGET_NR_sethostname: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(sethostname(p, arg2)); - unlock_user(p, arg1, 0); - break; - case TARGET_NR_setrlimit: - { - int resource = target_to_host_resource(arg1); - struct target_rlimit *target_rlim; - struct rlimit rlim; - if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) - goto efault; - rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur); - rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max); - unlock_user_struct(target_rlim, arg2, 0); - ret = get_errno(setrlimit(resource, &rlim)); - } - break; - case TARGET_NR_getrlimit: - { - int resource = target_to_host_resource(arg1); - struct target_rlimit *target_rlim; - struct rlimit rlim; - - ret = get_errno(getrlimit(resource, &rlim)); - if (!is_error(ret)) { - if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) - goto efault; - target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur); - target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max); - unlock_user_struct(target_rlim, arg2, 1); - } - } - break; - case TARGET_NR_getrusage: - { - struct rusage rusage; - ret = get_errno(getrusage(arg1, &rusage)); - if (!is_error(ret)) { - ret = host_to_target_rusage(arg2, &rusage); - } - } - break; - case TARGET_NR_gettimeofday: - { - struct timeval tv; - ret = get_errno(gettimeofday(&tv, NULL)); - if (!is_error(ret)) { - if (copy_to_user_timeval(arg1, &tv)) - goto efault; - } - } - break; - case TARGET_NR_settimeofday: - { - struct timeval tv, *ptv = NULL; - struct timezone tz, *ptz = NULL; - - if (arg1) { - if (copy_from_user_timeval(&tv, arg1)) { - goto efault; - } - ptv = &tv; - } - - if (arg2) { - if (copy_from_user_timezone(&tz, arg2)) { - goto efault; - } - ptz = &tz; - } - - ret = get_errno(settimeofday(ptv, ptz)); - } - break; -#if defined(TARGET_NR_select) - case TARGET_NR_select: -#if defined(TARGET_S390X) || defined(TARGET_ALPHA) - ret = do_select(arg1, arg2, arg3, arg4, arg5); -#else - { - struct target_sel_arg_struct *sel; - abi_ulong inp, outp, exp, tvp; - long nsel; - - if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) - goto efault; - nsel = tswapal(sel->n); - inp = tswapal(sel->inp); - outp = tswapal(sel->outp); - exp = tswapal(sel->exp); - tvp = tswapal(sel->tvp); - unlock_user_struct(sel, arg1, 0); - ret = do_select(nsel, inp, outp, exp, tvp); - } -#endif - break; -#endif -#ifdef TARGET_NR_pselect6 - case TARGET_NR_pselect6: - { - abi_long rfd_addr, wfd_addr, efd_addr, n, ts_addr; - fd_set rfds, wfds, efds; - fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; - struct timespec ts, *ts_ptr; - - /* - * The 6th arg is actually two args smashed together, - * so we cannot use the C library. - */ - sigset_t set; - struct { - sigset_t *set; - size_t size; - } sig, *sig_ptr; - - abi_ulong arg_sigset, arg_sigsize, *arg7; - target_sigset_t *target_sigset; - - n = arg1; - rfd_addr = arg2; - wfd_addr = arg3; - efd_addr = arg4; - ts_addr = arg5; - - ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); - if (ret) { - goto fail; - } - ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); - if (ret) { - goto fail; - } - ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); - if (ret) { - goto fail; - } - - /* - * This takes a timespec, and not a timeval, so we cannot - * use the do_select() helper ... - */ - if (ts_addr) { - if (target_to_host_timespec(&ts, ts_addr)) { - goto efault; - } - ts_ptr = &ts; - } else { - ts_ptr = NULL; - } - - /* Extract the two packed args for the sigset */ - if (arg6) { - sig_ptr = &sig; - sig.size = _NSIG / 8; - - arg7 = lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1); - if (!arg7) { - goto efault; - } - arg_sigset = tswapal(arg7[0]); - arg_sigsize = tswapal(arg7[1]); - unlock_user(arg7, arg6, 0); - - if (arg_sigset) { - sig.set = &set; - if (arg_sigsize != sizeof(*target_sigset)) { - /* Like the kernel, we enforce correct size sigsets */ - ret = -TARGET_EINVAL; - goto fail; - } - target_sigset = lock_user(VERIFY_READ, arg_sigset, - sizeof(*target_sigset), 1); - if (!target_sigset) { - goto efault; - } - target_to_host_sigset(&set, target_sigset); - unlock_user(target_sigset, arg_sigset, 0); - } else { - sig.set = NULL; - } - } else { - sig_ptr = NULL; - } - - ret = get_errno(sys_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr, - ts_ptr, sig_ptr)); - - if (!is_error(ret)) { - if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) - goto efault; - if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) - goto efault; - if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) - goto efault; - - if (ts_addr && host_to_target_timespec(ts_addr, &ts)) - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_symlink - case TARGET_NR_symlink: - { - void *p2; - p = lock_user_string(arg1); - p2 = lock_user_string(arg2); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(symlink(p, p2)); - unlock_user(p2, arg2, 0); - unlock_user(p, arg1, 0); - } - break; -#endif -#if defined(TARGET_NR_symlinkat) - case TARGET_NR_symlinkat: - { - void *p2; - p = lock_user_string(arg1); - p2 = lock_user_string(arg3); - if (!p || !p2) - ret = -TARGET_EFAULT; - else - ret = get_errno(symlinkat(p, arg2, p2)); - unlock_user(p2, arg3, 0); - unlock_user(p, arg1, 0); - } - break; -#endif -#ifdef TARGET_NR_oldlstat - case TARGET_NR_oldlstat: - goto unimplemented; -#endif -#ifdef TARGET_NR_readlink - case TARGET_NR_readlink: - { - void *p2; - p = lock_user_string(arg1); - p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0); - if (!p || !p2) { - ret = -TARGET_EFAULT; - } else if (!arg3) { - /* Short circuit this for the magic exe check. */ - ret = -TARGET_EINVAL; - } else if (is_proc_myself((const char *)p, "exe")) { - char real[PATH_MAX], *temp; - temp = realpath(exec_path, real); - /* Return value is # of bytes that we wrote to the buffer. */ - if (temp == NULL) { - ret = get_errno(-1); - } else { - /* Don't worry about sign mismatch as earlier mapping - * logic would have thrown a bad address error. */ - ret = MIN(strlen(real), arg3); - /* We cannot NUL terminate the string. */ - memcpy(p2, real, ret); - } - } else { - ret = get_errno(readlink(path(p), p2, arg3)); - } - unlock_user(p2, arg2, ret); - unlock_user(p, arg1, 0); - } - break; -#endif -#if defined(TARGET_NR_readlinkat) - case TARGET_NR_readlinkat: - { - void *p2; - p = lock_user_string(arg2); - p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0); - if (!p || !p2) { - ret = -TARGET_EFAULT; - } else if (is_proc_myself((const char *)p, "exe")) { - char real[PATH_MAX], *temp; - temp = realpath(exec_path, real); - ret = temp == NULL ? get_errno(-1) : strlen(real) ; - snprintf((char *)p2, arg4, "%s", real); - } else { - ret = get_errno(readlinkat(arg1, path(p), p2, arg4)); - } - unlock_user(p2, arg3, ret); - unlock_user(p, arg2, 0); - } - break; -#endif -#ifdef TARGET_NR_uselib - case TARGET_NR_uselib: - goto unimplemented; -#endif -#ifdef TARGET_NR_swapon - case TARGET_NR_swapon: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(swapon(p, arg2)); - unlock_user(p, arg1, 0); - break; -#endif - case TARGET_NR_reboot: - if (arg3 == LINUX_REBOOT_CMD_RESTART2) { - /* arg4 must be ignored in all other cases */ - p = lock_user_string(arg4); - if (!p) { - goto efault; - } - ret = get_errno(reboot(arg1, arg2, arg3, p)); - unlock_user(p, arg4, 0); - } else { - ret = get_errno(reboot(arg1, arg2, arg3, NULL)); - } - break; -#ifdef TARGET_NR_readdir - case TARGET_NR_readdir: - goto unimplemented; -#endif -#ifdef TARGET_NR_mmap - case TARGET_NR_mmap: -#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \ - (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \ - defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE) \ - || defined(TARGET_S390X) - { - abi_ulong *v; - abi_ulong v1, v2, v3, v4, v5, v6; - if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1))) - goto efault; - v1 = tswapal(v[0]); - v2 = tswapal(v[1]); - v3 = tswapal(v[2]); - v4 = tswapal(v[3]); - v5 = tswapal(v[4]); - v6 = tswapal(v[5]); - unlock_user(v, arg1, 0); - ret = get_errno(target_mmap(v1, v2, v3, - target_to_host_bitmask(v4, mmap_flags_tbl), - v5, v6)); - } -#else - ret = get_errno(target_mmap(arg1, arg2, arg3, - target_to_host_bitmask(arg4, mmap_flags_tbl), - arg5, - arg6)); -#endif - break; -#endif -#ifdef TARGET_NR_mmap2 - case TARGET_NR_mmap2: -#ifndef MMAP_SHIFT -#define MMAP_SHIFT 12 -#endif - ret = get_errno(target_mmap(arg1, arg2, arg3, - target_to_host_bitmask(arg4, mmap_flags_tbl), - arg5, - arg6 << MMAP_SHIFT)); - break; -#endif - case TARGET_NR_munmap: - ret = get_errno(target_munmap(arg1, arg2)); - break; - case TARGET_NR_mprotect: - { - TaskState *ts = cpu->opaque; - /* Special hack to detect libc making the stack executable. */ - if ((arg3 & PROT_GROWSDOWN) - && arg1 >= ts->info->stack_limit - && arg1 <= ts->info->start_stack) { - arg3 &= ~PROT_GROWSDOWN; - arg2 = arg2 + arg1 - ts->info->stack_limit; - arg1 = ts->info->stack_limit; - } - } - ret = get_errno(target_mprotect(arg1, arg2, arg3)); - break; -#ifdef TARGET_NR_mremap - case TARGET_NR_mremap: - ret = get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5)); - break; -#endif - /* ??? msync/mlock/munlock are broken for softmmu. */ -#ifdef TARGET_NR_msync - case TARGET_NR_msync: - ret = get_errno(msync(g2h(arg1), arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_mlock - case TARGET_NR_mlock: - ret = get_errno(mlock(g2h(arg1), arg2)); - break; -#endif -#ifdef TARGET_NR_munlock - case TARGET_NR_munlock: - ret = get_errno(munlock(g2h(arg1), arg2)); - break; -#endif -#ifdef TARGET_NR_mlockall - case TARGET_NR_mlockall: - ret = get_errno(mlockall(target_to_host_mlockall_arg(arg1))); - break; -#endif -#ifdef TARGET_NR_munlockall - case TARGET_NR_munlockall: - ret = get_errno(munlockall()); - break; -#endif - case TARGET_NR_truncate: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(truncate(p, arg2)); - unlock_user(p, arg1, 0); - break; - case TARGET_NR_ftruncate: - ret = get_errno(ftruncate(arg1, arg2)); - break; - case TARGET_NR_fchmod: - ret = get_errno(fchmod(arg1, arg2)); - break; -#if defined(TARGET_NR_fchmodat) - case TARGET_NR_fchmodat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(fchmodat(arg1, p, arg3, 0)); - unlock_user(p, arg2, 0); - break; -#endif - case TARGET_NR_getpriority: - /* Note that negative values are valid for getpriority, so we must - differentiate based on errno settings. */ - errno = 0; - ret = getpriority(arg1, arg2); - if (ret == -1 && errno != 0) { - ret = -host_to_target_errno(errno); - break; - } -#ifdef TARGET_ALPHA - /* Return value is the unbiased priority. Signal no error. */ - ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0; -#else - /* Return value is a biased priority to avoid negative numbers. */ - ret = 20 - ret; -#endif - break; - case TARGET_NR_setpriority: - ret = get_errno(setpriority(arg1, arg2, arg3)); - break; -#ifdef TARGET_NR_profil - case TARGET_NR_profil: - goto unimplemented; -#endif - case TARGET_NR_statfs: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(statfs(path(p), &stfs)); - unlock_user(p, arg1, 0); - convert_statfs: - if (!is_error(ret)) { - struct target_statfs *target_stfs; - - if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg2, 0)) - goto efault; - __put_user(stfs.f_type, &target_stfs->f_type); - __put_user(stfs.f_bsize, &target_stfs->f_bsize); - __put_user(stfs.f_blocks, &target_stfs->f_blocks); - __put_user(stfs.f_bfree, &target_stfs->f_bfree); - __put_user(stfs.f_bavail, &target_stfs->f_bavail); - __put_user(stfs.f_files, &target_stfs->f_files); - __put_user(stfs.f_ffree, &target_stfs->f_ffree); - __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]); - __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]); - __put_user(stfs.f_namelen, &target_stfs->f_namelen); - __put_user(stfs.f_frsize, &target_stfs->f_frsize); - memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare)); - unlock_user_struct(target_stfs, arg2, 1); - } - break; - case TARGET_NR_fstatfs: - ret = get_errno(fstatfs(arg1, &stfs)); - goto convert_statfs; -#ifdef TARGET_NR_statfs64 - case TARGET_NR_statfs64: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(statfs(path(p), &stfs)); - unlock_user(p, arg1, 0); - convert_statfs64: - if (!is_error(ret)) { - struct target_statfs64 *target_stfs; - - if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg3, 0)) - goto efault; - __put_user(stfs.f_type, &target_stfs->f_type); - __put_user(stfs.f_bsize, &target_stfs->f_bsize); - __put_user(stfs.f_blocks, &target_stfs->f_blocks); - __put_user(stfs.f_bfree, &target_stfs->f_bfree); - __put_user(stfs.f_bavail, &target_stfs->f_bavail); - __put_user(stfs.f_files, &target_stfs->f_files); - __put_user(stfs.f_ffree, &target_stfs->f_ffree); - __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]); - __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]); - __put_user(stfs.f_namelen, &target_stfs->f_namelen); - __put_user(stfs.f_frsize, &target_stfs->f_frsize); - memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare)); - unlock_user_struct(target_stfs, arg3, 1); - } - break; - case TARGET_NR_fstatfs64: - ret = get_errno(fstatfs(arg1, &stfs)); - goto convert_statfs64; -#endif -#ifdef TARGET_NR_ioperm - case TARGET_NR_ioperm: - goto unimplemented; -#endif -#ifdef TARGET_NR_socketcall - case TARGET_NR_socketcall: - ret = do_socketcall(arg1, arg2); - break; -#endif -#ifdef TARGET_NR_accept - case TARGET_NR_accept: - ret = do_accept4(arg1, arg2, arg3, 0); - break; -#endif -#ifdef TARGET_NR_accept4 - case TARGET_NR_accept4: -#ifdef CONFIG_ACCEPT4 - ret = do_accept4(arg1, arg2, arg3, arg4); -#else - goto unimplemented; -#endif - break; -#endif -#ifdef TARGET_NR_bind - case TARGET_NR_bind: - ret = do_bind(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_connect - case TARGET_NR_connect: - ret = do_connect(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_getpeername - case TARGET_NR_getpeername: - ret = do_getpeername(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_getsockname - case TARGET_NR_getsockname: - ret = do_getsockname(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_getsockopt - case TARGET_NR_getsockopt: - ret = do_getsockopt(arg1, arg2, arg3, arg4, arg5); - break; -#endif -#ifdef TARGET_NR_listen - case TARGET_NR_listen: - ret = get_errno(listen(arg1, arg2)); - break; -#endif -#ifdef TARGET_NR_recv - case TARGET_NR_recv: - ret = do_recvfrom(arg1, arg2, arg3, arg4, 0, 0); - break; -#endif -#ifdef TARGET_NR_recvfrom - case TARGET_NR_recvfrom: - ret = do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6); - break; -#endif -#ifdef TARGET_NR_recvmsg - case TARGET_NR_recvmsg: - ret = do_sendrecvmsg(arg1, arg2, arg3, 0); - break; -#endif -#ifdef TARGET_NR_send - case TARGET_NR_send: - ret = do_sendto(arg1, arg2, arg3, arg4, 0, 0); - break; -#endif -#ifdef TARGET_NR_sendmsg - case TARGET_NR_sendmsg: - ret = do_sendrecvmsg(arg1, arg2, arg3, 1); - break; -#endif -#ifdef TARGET_NR_sendmmsg - case TARGET_NR_sendmmsg: - ret = do_sendrecvmmsg(arg1, arg2, arg3, arg4, 1); - break; - case TARGET_NR_recvmmsg: - ret = do_sendrecvmmsg(arg1, arg2, arg3, arg4, 0); - break; -#endif -#ifdef TARGET_NR_sendto - case TARGET_NR_sendto: - ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6); - break; -#endif -#ifdef TARGET_NR_shutdown - case TARGET_NR_shutdown: - ret = get_errno(shutdown(arg1, arg2)); - break; -#endif -#if defined(TARGET_NR_getrandom) && defined(__NR_getrandom) - case TARGET_NR_getrandom: - p = lock_user(VERIFY_WRITE, arg1, arg2, 0); - if (!p) { - goto efault; - } - ret = get_errno(getrandom(p, arg2, arg3)); - unlock_user(p, arg1, ret); - break; -#endif -#ifdef TARGET_NR_socket - case TARGET_NR_socket: - ret = do_socket(arg1, arg2, arg3); - fd_trans_unregister(ret); - break; -#endif -#ifdef TARGET_NR_socketpair - case TARGET_NR_socketpair: - ret = do_socketpair(arg1, arg2, arg3, arg4); - break; -#endif -#ifdef TARGET_NR_setsockopt - case TARGET_NR_setsockopt: - ret = do_setsockopt(arg1, arg2, arg3, arg4, (socklen_t) arg5); - break; -#endif - - case TARGET_NR_syslog: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(sys_syslog((int)arg1, p, (int)arg3)); - unlock_user(p, arg2, 0); - break; - - case TARGET_NR_setitimer: - { - struct itimerval value, ovalue, *pvalue; - - if (arg2) { - pvalue = &value; - if (copy_from_user_timeval(&pvalue->it_interval, arg2) - || copy_from_user_timeval(&pvalue->it_value, - arg2 + sizeof(struct target_timeval))) - goto efault; - } else { - pvalue = NULL; - } - ret = get_errno(setitimer(arg1, pvalue, &ovalue)); - if (!is_error(ret) && arg3) { - if (copy_to_user_timeval(arg3, - &ovalue.it_interval) - || copy_to_user_timeval(arg3 + sizeof(struct target_timeval), - &ovalue.it_value)) - goto efault; - } - } - break; - case TARGET_NR_getitimer: - { - struct itimerval value; - - ret = get_errno(getitimer(arg1, &value)); - if (!is_error(ret) && arg2) { - if (copy_to_user_timeval(arg2, - &value.it_interval) - || copy_to_user_timeval(arg2 + sizeof(struct target_timeval), - &value.it_value)) - goto efault; - } - } - break; -#ifdef TARGET_NR_stat - case TARGET_NR_stat: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(stat(path(p), &st)); - unlock_user(p, arg1, 0); - goto do_stat; -#endif -#ifdef TARGET_NR_lstat - case TARGET_NR_lstat: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(lstat(path(p), &st)); - unlock_user(p, arg1, 0); - goto do_stat; -#endif - case TARGET_NR_fstat: - { - ret = get_errno(fstat(arg1, &st)); -#if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat) - do_stat: -#endif - if (!is_error(ret)) { - struct target_stat *target_st; - - if (!lock_user_struct(VERIFY_WRITE, target_st, arg2, 0)) - goto efault; - memset(target_st, 0, sizeof(*target_st)); - __put_user(st.st_dev, &target_st->st_dev); - __put_user(st.st_ino, &target_st->st_ino); - __put_user(st.st_mode, &target_st->st_mode); - __put_user(st.st_uid, &target_st->st_uid); - __put_user(st.st_gid, &target_st->st_gid); - __put_user(st.st_nlink, &target_st->st_nlink); - __put_user(st.st_rdev, &target_st->st_rdev); - __put_user(st.st_size, &target_st->st_size); - __put_user(st.st_blksize, &target_st->st_blksize); - __put_user(st.st_blocks, &target_st->st_blocks); - __put_user(st.st_atime, &target_st->target_st_atime); - __put_user(st.st_mtime, &target_st->target_st_mtime); - __put_user(st.st_ctime, &target_st->target_st_ctime); - unlock_user_struct(target_st, arg2, 1); - } - } - break; -#ifdef TARGET_NR_olduname - case TARGET_NR_olduname: - goto unimplemented; -#endif -#ifdef TARGET_NR_iopl - case TARGET_NR_iopl: - goto unimplemented; -#endif - case TARGET_NR_vhangup: - ret = get_errno(vhangup()); - break; -#ifdef TARGET_NR_idle - case TARGET_NR_idle: - goto unimplemented; -#endif -#ifdef TARGET_NR_syscall - case TARGET_NR_syscall: - ret = do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5, - arg6, arg7, arg8, 0); - break; -#endif - case TARGET_NR_wait4: - { - int status; - abi_long status_ptr = arg2; - struct rusage rusage, *rusage_ptr; - abi_ulong target_rusage = arg4; - abi_long rusage_err; - if (target_rusage) - rusage_ptr = &rusage; - else - rusage_ptr = NULL; - ret = get_errno(wait4(arg1, &status, arg3, rusage_ptr)); - if (!is_error(ret)) { - if (status_ptr && ret) { - status = host_to_target_waitstatus(status); - if (put_user_s32(status, status_ptr)) - goto efault; - } - if (target_rusage) { - rusage_err = host_to_target_rusage(target_rusage, &rusage); - if (rusage_err) { - ret = rusage_err; - } - } - } - } - break; -#ifdef TARGET_NR_swapoff - case TARGET_NR_swapoff: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(swapoff(p)); - unlock_user(p, arg1, 0); - break; -#endif - case TARGET_NR_sysinfo: - { - struct target_sysinfo *target_value; - struct sysinfo value; - ret = get_errno(sysinfo(&value)); - if (!is_error(ret) && arg1) - { - if (!lock_user_struct(VERIFY_WRITE, target_value, arg1, 0)) - goto efault; - __put_user(value.uptime, &target_value->uptime); - __put_user(value.loads[0], &target_value->loads[0]); - __put_user(value.loads[1], &target_value->loads[1]); - __put_user(value.loads[2], &target_value->loads[2]); - __put_user(value.totalram, &target_value->totalram); - __put_user(value.freeram, &target_value->freeram); - __put_user(value.sharedram, &target_value->sharedram); - __put_user(value.bufferram, &target_value->bufferram); - __put_user(value.totalswap, &target_value->totalswap); - __put_user(value.freeswap, &target_value->freeswap); - __put_user(value.procs, &target_value->procs); - __put_user(value.totalhigh, &target_value->totalhigh); - __put_user(value.freehigh, &target_value->freehigh); - __put_user(value.mem_unit, &target_value->mem_unit); - unlock_user_struct(target_value, arg1, 1); - } - } - break; -#ifdef TARGET_NR_ipc - case TARGET_NR_ipc: - ret = do_ipc(arg1, arg2, arg3, arg4, arg5, arg6); - break; -#endif -#ifdef TARGET_NR_semget - case TARGET_NR_semget: - ret = get_errno(semget(arg1, arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_semop - case TARGET_NR_semop: - ret = do_semop(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_semctl - case TARGET_NR_semctl: - ret = do_semctl(arg1, arg2, arg3, arg4); - break; -#endif -#ifdef TARGET_NR_msgctl - case TARGET_NR_msgctl: - ret = do_msgctl(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_msgget - case TARGET_NR_msgget: - ret = get_errno(msgget(arg1, arg2)); - break; -#endif -#ifdef TARGET_NR_msgrcv - case TARGET_NR_msgrcv: - ret = do_msgrcv(arg1, arg2, arg3, arg4, arg5); - break; -#endif -#ifdef TARGET_NR_msgsnd - case TARGET_NR_msgsnd: - ret = do_msgsnd(arg1, arg2, arg3, arg4); - break; -#endif -#ifdef TARGET_NR_shmget - case TARGET_NR_shmget: - ret = get_errno(shmget(arg1, arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_shmctl - case TARGET_NR_shmctl: - ret = do_shmctl(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_shmat - case TARGET_NR_shmat: - ret = do_shmat(arg1, arg2, arg3); - break; -#endif -#ifdef TARGET_NR_shmdt - case TARGET_NR_shmdt: - ret = do_shmdt(arg1); - break; -#endif - case TARGET_NR_fsync: - ret = get_errno(fsync(arg1)); - break; - case TARGET_NR_clone: - /* Linux manages to have three different orderings for its - * arguments to clone(); the BACKWARDS and BACKWARDS2 defines - * match the kernel's CONFIG_CLONE_* settings. - * Microblaze is further special in that it uses a sixth - * implicit argument to clone for the TLS pointer. - */ -#if defined(TARGET_MICROBLAZE) - ret = get_errno(do_fork(cpu_env, arg1, arg2, arg4, arg6, arg5)); -#elif defined(TARGET_CLONE_BACKWARDS) - ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5)); -#elif defined(TARGET_CLONE_BACKWARDS2) - ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg5, arg4)); -#else - ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4)); -#endif - break; -#ifdef __NR_exit_group - /* new thread calls */ - case TARGET_NR_exit_group: -#ifdef TARGET_GPROF - _mcleanup(); -#endif - gdb_exit(cpu_env, arg1); - ret = get_errno(exit_group(arg1)); - break; -#endif - case TARGET_NR_setdomainname: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(setdomainname(p, arg2)); - unlock_user(p, arg1, 0); - break; - case TARGET_NR_uname: - /* no need to transcode because we use the linux syscall */ - { - struct new_utsname * buf; - - if (!lock_user_struct(VERIFY_WRITE, buf, arg1, 0)) - goto efault; - ret = get_errno(sys_uname(buf)); - if (!is_error(ret)) { - /* Overrite the native machine name with whatever is being - emulated. */ - strcpy (buf->machine, cpu_to_uname_machine(cpu_env)); - /* Allow the user to override the reported release. */ - if (qemu_uname_release && *qemu_uname_release) - strcpy (buf->release, qemu_uname_release); - } - unlock_user_struct(buf, arg1, 1); - } - break; -#ifdef TARGET_I386 - case TARGET_NR_modify_ldt: - ret = do_modify_ldt(cpu_env, arg1, arg2, arg3); - break; -#if !defined(TARGET_X86_64) - case TARGET_NR_vm86old: - goto unimplemented; - case TARGET_NR_vm86: - ret = do_vm86(cpu_env, arg1, arg2); - break; -#endif -#endif - case TARGET_NR_adjtimex: - goto unimplemented; -#ifdef TARGET_NR_create_module - case TARGET_NR_create_module: -#endif - case TARGET_NR_init_module: - case TARGET_NR_delete_module: -#ifdef TARGET_NR_get_kernel_syms - case TARGET_NR_get_kernel_syms: -#endif - goto unimplemented; - case TARGET_NR_quotactl: - goto unimplemented; - case TARGET_NR_getpgid: - ret = get_errno(getpgid(arg1)); - break; - case TARGET_NR_fchdir: - ret = get_errno(fchdir(arg1)); - break; -#ifdef TARGET_NR_bdflush /* not on x86_64 */ - case TARGET_NR_bdflush: - goto unimplemented; -#endif -#ifdef TARGET_NR_sysfs - case TARGET_NR_sysfs: - goto unimplemented; -#endif - case TARGET_NR_personality: - ret = get_errno(personality(arg1)); - break; -#ifdef TARGET_NR_afs_syscall - case TARGET_NR_afs_syscall: - goto unimplemented; -#endif -#ifdef TARGET_NR__llseek /* Not on alpha */ - case TARGET_NR__llseek: - { - int64_t res; -#if !defined(__NR_llseek) - res = lseek(arg1, ((uint64_t)arg2 << 32) | arg3, arg5); - if (res == -1) { - ret = get_errno(res); - } else { - ret = 0; - } -#else - ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5)); -#endif - if ((ret == 0) && put_user_s64(res, arg4)) { - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_getdents - case TARGET_NR_getdents: -#ifdef __NR_getdents -#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 - { - struct target_dirent *target_dirp; - struct linux_dirent *dirp; - abi_long count = arg3; - - dirp = g_try_malloc(count); - if (!dirp) { - ret = -TARGET_ENOMEM; - goto fail; - } - - ret = get_errno(sys_getdents(arg1, dirp, count)); - if (!is_error(ret)) { - struct linux_dirent *de; - struct target_dirent *tde; - int len = ret; - int reclen, treclen; - int count1, tnamelen; - - count1 = 0; - de = dirp; - if (!(target_dirp = lock_user(VERIFY_WRITE, arg2, count, 0))) - goto efault; - tde = target_dirp; - while (len > 0) { - reclen = de->d_reclen; - tnamelen = reclen - offsetof(struct linux_dirent, d_name); - assert(tnamelen >= 0); - treclen = tnamelen + offsetof(struct target_dirent, d_name); - assert(count1 + treclen <= count); - tde->d_reclen = tswap16(treclen); - tde->d_ino = tswapal(de->d_ino); - tde->d_off = tswapal(de->d_off); - memcpy(tde->d_name, de->d_name, tnamelen); - de = (struct linux_dirent *)((char *)de + reclen); - len -= reclen; - tde = (struct target_dirent *)((char *)tde + treclen); - count1 += treclen; - } - ret = count1; - unlock_user(target_dirp, arg2, ret); - } - g_free(dirp); - } -#else - { - struct linux_dirent *dirp; - abi_long count = arg3; - - if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0))) - goto efault; - ret = get_errno(sys_getdents(arg1, dirp, count)); - if (!is_error(ret)) { - struct linux_dirent *de; - int len = ret; - int reclen; - de = dirp; - while (len > 0) { - reclen = de->d_reclen; - if (reclen > len) - break; - de->d_reclen = tswap16(reclen); - tswapls(&de->d_ino); - tswapls(&de->d_off); - de = (struct linux_dirent *)((char *)de + reclen); - len -= reclen; - } - } - unlock_user(dirp, arg2, ret); - } -#endif -#else - /* Implement getdents in terms of getdents64 */ - { - struct linux_dirent64 *dirp; - abi_long count = arg3; - - dirp = lock_user(VERIFY_WRITE, arg2, count, 0); - if (!dirp) { - goto efault; - } - ret = get_errno(sys_getdents64(arg1, dirp, count)); - if (!is_error(ret)) { - /* Convert the dirent64 structs to target dirent. We do this - * in-place, since we can guarantee that a target_dirent is no - * larger than a dirent64; however this means we have to be - * careful to read everything before writing in the new format. - */ - struct linux_dirent64 *de; - struct target_dirent *tde; - int len = ret; - int tlen = 0; - - de = dirp; - tde = (struct target_dirent *)dirp; - while (len > 0) { - int namelen, treclen; - int reclen = de->d_reclen; - uint64_t ino = de->d_ino; - int64_t off = de->d_off; - uint8_t type = de->d_type; - - namelen = strlen(de->d_name); - treclen = offsetof(struct target_dirent, d_name) - + namelen + 2; - treclen = QEMU_ALIGN_UP(treclen, sizeof(abi_long)); - - memmove(tde->d_name, de->d_name, namelen + 1); - tde->d_ino = tswapal(ino); - tde->d_off = tswapal(off); - tde->d_reclen = tswap16(treclen); - /* The target_dirent type is in what was formerly a padding - * byte at the end of the structure: - */ - *(((char *)tde) + treclen - 1) = type; - - de = (struct linux_dirent64 *)((char *)de + reclen); - tde = (struct target_dirent *)((char *)tde + treclen); - len -= reclen; - tlen += treclen; - } - ret = tlen; - } - unlock_user(dirp, arg2, ret); - } -#endif - break; -#endif /* TARGET_NR_getdents */ -#if defined(TARGET_NR_getdents64) && defined(__NR_getdents64) - case TARGET_NR_getdents64: - { - struct linux_dirent64 *dirp; - abi_long count = arg3; - if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0))) - goto efault; - ret = get_errno(sys_getdents64(arg1, dirp, count)); - if (!is_error(ret)) { - struct linux_dirent64 *de; - int len = ret; - int reclen; - de = dirp; - while (len > 0) { - reclen = de->d_reclen; - if (reclen > len) - break; - de->d_reclen = tswap16(reclen); - tswap64s((uint64_t *)&de->d_ino); - tswap64s((uint64_t *)&de->d_off); - de = (struct linux_dirent64 *)((char *)de + reclen); - len -= reclen; - } - } - unlock_user(dirp, arg2, ret); - } - break; -#endif /* TARGET_NR_getdents64 */ -#if defined(TARGET_NR__newselect) - case TARGET_NR__newselect: - ret = do_select(arg1, arg2, arg3, arg4, arg5); - break; -#endif -#if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll) -# ifdef TARGET_NR_poll - case TARGET_NR_poll: -# endif -# ifdef TARGET_NR_ppoll - case TARGET_NR_ppoll: -# endif - { - struct target_pollfd *target_pfd; - unsigned int nfds = arg2; - int timeout = arg3; - struct pollfd *pfd; - unsigned int i; - - pfd = NULL; - target_pfd = NULL; - if (nfds) { - target_pfd = lock_user(VERIFY_WRITE, arg1, - sizeof(struct target_pollfd) * nfds, 1); - if (!target_pfd) { - goto efault; - } - - pfd = alloca(sizeof(struct pollfd) * nfds); - for (i = 0; i < nfds; i++) { - pfd[i].fd = tswap32(target_pfd[i].fd); - pfd[i].events = tswap16(target_pfd[i].events); - } - } - -# ifdef TARGET_NR_ppoll - if (num == TARGET_NR_ppoll) { - struct timespec _timeout_ts, *timeout_ts = &_timeout_ts; - target_sigset_t *target_set; - sigset_t _set, *set = &_set; - - if (arg3) { - if (target_to_host_timespec(timeout_ts, arg3)) { - unlock_user(target_pfd, arg1, 0); - goto efault; - } - } else { - timeout_ts = NULL; - } - - if (arg4) { - target_set = lock_user(VERIFY_READ, arg4, sizeof(target_sigset_t), 1); - if (!target_set) { - unlock_user(target_pfd, arg1, 0); - goto efault; - } - target_to_host_sigset(set, target_set); - } else { - set = NULL; - } - - ret = get_errno(sys_ppoll(pfd, nfds, timeout_ts, set, _NSIG/8)); - - if (!is_error(ret) && arg3) { - host_to_target_timespec(arg3, timeout_ts); - } - if (arg4) { - unlock_user(target_set, arg4, 0); - } - } else -# endif - ret = get_errno(poll(pfd, nfds, timeout)); - - if (!is_error(ret)) { - for(i = 0; i < nfds; i++) { - target_pfd[i].revents = tswap16(pfd[i].revents); - } - } - unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds); - } - break; -#endif - case TARGET_NR_flock: - /* NOTE: the flock constant seems to be the same for every - Linux platform */ - ret = get_errno(flock(arg1, arg2)); - break; - case TARGET_NR_readv: - { - struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0); - if (vec != NULL) { - ret = get_errno(readv(arg1, vec, arg3)); - unlock_iovec(vec, arg2, arg3, 1); - } else { - ret = -host_to_target_errno(errno); - } - } - break; - case TARGET_NR_writev: - { - struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1); - if (vec != NULL) { - ret = get_errno(writev(arg1, vec, arg3)); - unlock_iovec(vec, arg2, arg3, 0); - } else { - ret = -host_to_target_errno(errno); - } - } - break; - case TARGET_NR_getsid: - ret = get_errno(getsid(arg1)); - break; -#if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */ - case TARGET_NR_fdatasync: - ret = get_errno(fdatasync(arg1)); - break; -#endif -#ifdef TARGET_NR__sysctl - case TARGET_NR__sysctl: - /* We don't implement this, but ENOTDIR is always a safe - return value. */ - ret = -TARGET_ENOTDIR; - break; -#endif - case TARGET_NR_sched_getaffinity: - { - unsigned int mask_size; - unsigned long *mask; - - /* - * sched_getaffinity needs multiples of ulong, so need to take - * care of mismatches between target ulong and host ulong sizes. - */ - if (arg2 & (sizeof(abi_ulong) - 1)) { - ret = -TARGET_EINVAL; - break; - } - mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1); - - mask = alloca(mask_size); - ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask)); - - if (!is_error(ret)) { - if (ret > arg2) { - /* More data returned than the caller's buffer will fit. - * This only happens if sizeof(abi_long) < sizeof(long) - * and the caller passed us a buffer holding an odd number - * of abi_longs. If the host kernel is actually using the - * extra 4 bytes then fail EINVAL; otherwise we can just - * ignore them and only copy the interesting part. - */ - int numcpus = sysconf(_SC_NPROCESSORS_CONF); - if (numcpus > arg2 * 8) { - ret = -TARGET_EINVAL; - break; - } - ret = arg2; - } - - if (copy_to_user(arg3, mask, ret)) { - goto efault; - } - } - } - break; - case TARGET_NR_sched_setaffinity: - { - unsigned int mask_size; - unsigned long *mask; - - /* - * sched_setaffinity needs multiples of ulong, so need to take - * care of mismatches between target ulong and host ulong sizes. - */ - if (arg2 & (sizeof(abi_ulong) - 1)) { - ret = -TARGET_EINVAL; - break; - } - mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1); - - mask = alloca(mask_size); - if (!lock_user_struct(VERIFY_READ, p, arg3, 1)) { - goto efault; - } - memcpy(mask, p, arg2); - unlock_user_struct(p, arg2, 0); - - ret = get_errno(sys_sched_setaffinity(arg1, mask_size, mask)); - } - break; - case TARGET_NR_sched_setparam: - { - struct sched_param *target_schp; - struct sched_param schp; - - if (arg2 == 0) { - return -TARGET_EINVAL; - } - if (!lock_user_struct(VERIFY_READ, target_schp, arg2, 1)) - goto efault; - schp.sched_priority = tswap32(target_schp->sched_priority); - unlock_user_struct(target_schp, arg2, 0); - ret = get_errno(sched_setparam(arg1, &schp)); - } - break; - case TARGET_NR_sched_getparam: - { - struct sched_param *target_schp; - struct sched_param schp; - - if (arg2 == 0) { - return -TARGET_EINVAL; - } - ret = get_errno(sched_getparam(arg1, &schp)); - if (!is_error(ret)) { - if (!lock_user_struct(VERIFY_WRITE, target_schp, arg2, 0)) - goto efault; - target_schp->sched_priority = tswap32(schp.sched_priority); - unlock_user_struct(target_schp, arg2, 1); - } - } - break; - case TARGET_NR_sched_setscheduler: - { - struct sched_param *target_schp; - struct sched_param schp; - if (arg3 == 0) { - return -TARGET_EINVAL; - } - if (!lock_user_struct(VERIFY_READ, target_schp, arg3, 1)) - goto efault; - schp.sched_priority = tswap32(target_schp->sched_priority); - unlock_user_struct(target_schp, arg3, 0); - ret = get_errno(sched_setscheduler(arg1, arg2, &schp)); - } - break; - case TARGET_NR_sched_getscheduler: - ret = get_errno(sched_getscheduler(arg1)); - break; - case TARGET_NR_sched_yield: - ret = get_errno(sched_yield()); - break; - case TARGET_NR_sched_get_priority_max: - ret = get_errno(sched_get_priority_max(arg1)); - break; - case TARGET_NR_sched_get_priority_min: - ret = get_errno(sched_get_priority_min(arg1)); - break; - case TARGET_NR_sched_rr_get_interval: - { - struct timespec ts; - ret = get_errno(sched_rr_get_interval(arg1, &ts)); - if (!is_error(ret)) { - ret = host_to_target_timespec(arg2, &ts); - } - } - break; - case TARGET_NR_nanosleep: - { - struct timespec req, rem; - target_to_host_timespec(&req, arg1); - ret = get_errno(nanosleep(&req, &rem)); - if (is_error(ret) && arg2) { - host_to_target_timespec(arg2, &rem); - } - } - break; -#ifdef TARGET_NR_query_module - case TARGET_NR_query_module: - goto unimplemented; -#endif -#ifdef TARGET_NR_nfsservctl - case TARGET_NR_nfsservctl: - goto unimplemented; -#endif - case TARGET_NR_prctl: - switch (arg1) { - case PR_GET_PDEATHSIG: - { - int deathsig; - ret = get_errno(prctl(arg1, &deathsig, arg3, arg4, arg5)); - if (!is_error(ret) && arg2 - && put_user_ual(deathsig, arg2)) { - goto efault; - } - break; - } -#ifdef PR_GET_NAME - case PR_GET_NAME: - { - void *name = lock_user(VERIFY_WRITE, arg2, 16, 1); - if (!name) { - goto efault; - } - ret = get_errno(prctl(arg1, (unsigned long)name, - arg3, arg4, arg5)); - unlock_user(name, arg2, 16); - break; - } - case PR_SET_NAME: - { - void *name = lock_user(VERIFY_READ, arg2, 16, 1); - if (!name) { - goto efault; - } - ret = get_errno(prctl(arg1, (unsigned long)name, - arg3, arg4, arg5)); - unlock_user(name, arg2, 0); - break; - } -#endif - default: - /* Most prctl options have no pointer arguments */ - ret = get_errno(prctl(arg1, arg2, arg3, arg4, arg5)); - break; - } - break; -#ifdef TARGET_NR_arch_prctl - case TARGET_NR_arch_prctl: -#if defined(TARGET_I386) && !defined(TARGET_ABI32) - ret = do_arch_prctl(cpu_env, arg1, arg2); - break; -#else - goto unimplemented; -#endif -#endif -#ifdef TARGET_NR_pread64 - case TARGET_NR_pread64: - if (regpairs_aligned(cpu_env)) { - arg4 = arg5; - arg5 = arg6; - } - if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) - goto efault; - ret = get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg5))); - unlock_user(p, arg2, ret); - break; - case TARGET_NR_pwrite64: - if (regpairs_aligned(cpu_env)) { - arg4 = arg5; - arg5 = arg6; - } - if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) - goto efault; - ret = get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, arg5))); - unlock_user(p, arg2, 0); - break; -#endif - case TARGET_NR_getcwd: - if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0))) - goto efault; - ret = get_errno(sys_getcwd1(p, arg2)); - unlock_user(p, arg1, ret); - break; - case TARGET_NR_capget: - case TARGET_NR_capset: - { - struct target_user_cap_header *target_header; - struct target_user_cap_data *target_data = NULL; - struct __user_cap_header_struct header; - struct __user_cap_data_struct data[2]; - struct __user_cap_data_struct *dataptr = NULL; - int i, target_datalen; - int data_items = 1; - - if (!lock_user_struct(VERIFY_WRITE, target_header, arg1, 1)) { - goto efault; - } - header.version = tswap32(target_header->version); - header.pid = tswap32(target_header->pid); - - if (header.version != _LINUX_CAPABILITY_VERSION) { - /* Version 2 and up takes pointer to two user_data structs */ - data_items = 2; - } - - target_datalen = sizeof(*target_data) * data_items; - - if (arg2) { - if (num == TARGET_NR_capget) { - target_data = lock_user(VERIFY_WRITE, arg2, target_datalen, 0); - } else { - target_data = lock_user(VERIFY_READ, arg2, target_datalen, 1); - } - if (!target_data) { - unlock_user_struct(target_header, arg1, 0); - goto efault; - } - - if (num == TARGET_NR_capset) { - for (i = 0; i < data_items; i++) { - data[i].effective = tswap32(target_data[i].effective); - data[i].permitted = tswap32(target_data[i].permitted); - data[i].inheritable = tswap32(target_data[i].inheritable); - } - } - - dataptr = data; - } - - if (num == TARGET_NR_capget) { - ret = get_errno(capget(&header, dataptr)); - } else { - ret = get_errno(capset(&header, dataptr)); - } - - /* The kernel always updates version for both capget and capset */ - target_header->version = tswap32(header.version); - unlock_user_struct(target_header, arg1, 1); - - if (arg2) { - if (num == TARGET_NR_capget) { - for (i = 0; i < data_items; i++) { - target_data[i].effective = tswap32(data[i].effective); - target_data[i].permitted = tswap32(data[i].permitted); - target_data[i].inheritable = tswap32(data[i].inheritable); - } - unlock_user(target_data, arg2, target_datalen); - } else { - unlock_user(target_data, arg2, 0); - } - } - break; - } - case TARGET_NR_sigaltstack: - ret = do_sigaltstack(arg1, arg2, get_sp_from_cpustate((CPUArchState *)cpu_env)); - break; - -#ifdef CONFIG_SENDFILE - case TARGET_NR_sendfile: - { - off_t *offp = NULL; - off_t off; - if (arg3) { - ret = get_user_sal(off, arg3); - if (is_error(ret)) { - break; - } - offp = &off; - } - ret = get_errno(sendfile(arg1, arg2, offp, arg4)); - if (!is_error(ret) && arg3) { - abi_long ret2 = put_user_sal(off, arg3); - if (is_error(ret2)) { - ret = ret2; - } - } - break; - } -#ifdef TARGET_NR_sendfile64 - case TARGET_NR_sendfile64: - { - off_t *offp = NULL; - off_t off; - if (arg3) { - ret = get_user_s64(off, arg3); - if (is_error(ret)) { - break; - } - offp = &off; - } - ret = get_errno(sendfile(arg1, arg2, offp, arg4)); - if (!is_error(ret) && arg3) { - abi_long ret2 = put_user_s64(off, arg3); - if (is_error(ret2)) { - ret = ret2; - } - } - break; - } -#endif -#else - case TARGET_NR_sendfile: -#ifdef TARGET_NR_sendfile64 - case TARGET_NR_sendfile64: -#endif - goto unimplemented; -#endif - -#ifdef TARGET_NR_getpmsg - case TARGET_NR_getpmsg: - goto unimplemented; -#endif -#ifdef TARGET_NR_putpmsg - case TARGET_NR_putpmsg: - goto unimplemented; -#endif -#ifdef TARGET_NR_vfork - case TARGET_NR_vfork: - ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, - 0, 0, 0, 0)); - break; -#endif -#ifdef TARGET_NR_ugetrlimit - case TARGET_NR_ugetrlimit: - { - struct rlimit rlim; - int resource = target_to_host_resource(arg1); - ret = get_errno(getrlimit(resource, &rlim)); - if (!is_error(ret)) { - struct target_rlimit *target_rlim; - if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) - goto efault; - target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur); - target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max); - unlock_user_struct(target_rlim, arg2, 1); - } - break; - } -#endif -#ifdef TARGET_NR_truncate64 - case TARGET_NR_truncate64: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = target_truncate64(cpu_env, p, arg2, arg3, arg4); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_ftruncate64 - case TARGET_NR_ftruncate64: - ret = target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4); - break; -#endif -#ifdef TARGET_NR_stat64 - case TARGET_NR_stat64: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(stat(path(p), &st)); - unlock_user(p, arg1, 0); - if (!is_error(ret)) - ret = host_to_target_stat64(cpu_env, arg2, &st); - break; -#endif -#ifdef TARGET_NR_lstat64 - case TARGET_NR_lstat64: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(lstat(path(p), &st)); - unlock_user(p, arg1, 0); - if (!is_error(ret)) - ret = host_to_target_stat64(cpu_env, arg2, &st); - break; -#endif -#ifdef TARGET_NR_fstat64 - case TARGET_NR_fstat64: - ret = get_errno(fstat(arg1, &st)); - if (!is_error(ret)) - ret = host_to_target_stat64(cpu_env, arg2, &st); - break; -#endif -#if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)) -#ifdef TARGET_NR_fstatat64 - case TARGET_NR_fstatat64: -#endif -#ifdef TARGET_NR_newfstatat - case TARGET_NR_newfstatat: -#endif - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(fstatat(arg1, path(p), &st, arg4)); - if (!is_error(ret)) - ret = host_to_target_stat64(cpu_env, arg3, &st); - break; -#endif -#ifdef TARGET_NR_lchown - case TARGET_NR_lchown: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(lchown(p, low2highuid(arg2), low2highgid(arg3))); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_getuid - case TARGET_NR_getuid: - ret = get_errno(high2lowuid(getuid())); - break; -#endif -#ifdef TARGET_NR_getgid - case TARGET_NR_getgid: - ret = get_errno(high2lowgid(getgid())); - break; -#endif -#ifdef TARGET_NR_geteuid - case TARGET_NR_geteuid: - ret = get_errno(high2lowuid(geteuid())); - break; -#endif -#ifdef TARGET_NR_getegid - case TARGET_NR_getegid: - ret = get_errno(high2lowgid(getegid())); - break; -#endif - case TARGET_NR_setreuid: - ret = get_errno(setreuid(low2highuid(arg1), low2highuid(arg2))); - break; - case TARGET_NR_setregid: - ret = get_errno(setregid(low2highgid(arg1), low2highgid(arg2))); - break; - case TARGET_NR_getgroups: - { - int gidsetsize = arg1; - target_id *target_grouplist; - gid_t *grouplist; - int i; - - grouplist = alloca(gidsetsize * sizeof(gid_t)); - ret = get_errno(getgroups(gidsetsize, grouplist)); - if (gidsetsize == 0) - break; - if (!is_error(ret)) { - target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * sizeof(target_id), 0); - if (!target_grouplist) - goto efault; - for(i = 0;i < ret; i++) - target_grouplist[i] = tswapid(high2lowgid(grouplist[i])); - unlock_user(target_grouplist, arg2, gidsetsize * sizeof(target_id)); - } - } - break; - case TARGET_NR_setgroups: - { - int gidsetsize = arg1; - target_id *target_grouplist; - gid_t *grouplist = NULL; - int i; - if (gidsetsize) { - grouplist = alloca(gidsetsize * sizeof(gid_t)); - target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * sizeof(target_id), 1); - if (!target_grouplist) { - ret = -TARGET_EFAULT; - goto fail; - } - for (i = 0; i < gidsetsize; i++) { - grouplist[i] = low2highgid(tswapid(target_grouplist[i])); - } - unlock_user(target_grouplist, arg2, 0); - } - ret = get_errno(setgroups(gidsetsize, grouplist)); - } - break; - case TARGET_NR_fchown: - ret = get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3))); - break; -#if defined(TARGET_NR_fchownat) - case TARGET_NR_fchownat: - if (!(p = lock_user_string(arg2))) - goto efault; - ret = get_errno(fchownat(arg1, p, low2highuid(arg3), - low2highgid(arg4), arg5)); - unlock_user(p, arg2, 0); - break; -#endif -#ifdef TARGET_NR_setresuid - case TARGET_NR_setresuid: - ret = get_errno(setresuid(low2highuid(arg1), - low2highuid(arg2), - low2highuid(arg3))); - break; -#endif -#ifdef TARGET_NR_getresuid - case TARGET_NR_getresuid: - { - uid_t ruid, euid, suid; - ret = get_errno(getresuid(&ruid, &euid, &suid)); - if (!is_error(ret)) { - if (put_user_id(high2lowuid(ruid), arg1) - || put_user_id(high2lowuid(euid), arg2) - || put_user_id(high2lowuid(suid), arg3)) - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_getresgid - case TARGET_NR_setresgid: - ret = get_errno(setresgid(low2highgid(arg1), - low2highgid(arg2), - low2highgid(arg3))); - break; -#endif -#ifdef TARGET_NR_getresgid - case TARGET_NR_getresgid: - { - gid_t rgid, egid, sgid; - ret = get_errno(getresgid(&rgid, &egid, &sgid)); - if (!is_error(ret)) { - if (put_user_id(high2lowgid(rgid), arg1) - || put_user_id(high2lowgid(egid), arg2) - || put_user_id(high2lowgid(sgid), arg3)) - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_chown - case TARGET_NR_chown: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(chown(p, low2highuid(arg2), low2highgid(arg3))); - unlock_user(p, arg1, 0); - break; -#endif - case TARGET_NR_setuid: - ret = get_errno(setuid(low2highuid(arg1))); - break; - case TARGET_NR_setgid: - ret = get_errno(setgid(low2highgid(arg1))); - break; - case TARGET_NR_setfsuid: - ret = get_errno(setfsuid(arg1)); - break; - case TARGET_NR_setfsgid: - ret = get_errno(setfsgid(arg1)); - break; - -#ifdef TARGET_NR_lchown32 - case TARGET_NR_lchown32: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(lchown(p, arg2, arg3)); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_getuid32 - case TARGET_NR_getuid32: - ret = get_errno(getuid()); - break; -#endif - -#if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_getxuid: - { - uid_t euid; - euid=geteuid(); - ((CPUAlphaState *)cpu_env)->ir[IR_A4]=euid; - } - ret = get_errno(getuid()); - break; -#endif -#if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_getxgid: - { - uid_t egid; - egid=getegid(); - ((CPUAlphaState *)cpu_env)->ir[IR_A4]=egid; - } - ret = get_errno(getgid()); - break; -#endif -#if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_osf_getsysinfo: - ret = -TARGET_EOPNOTSUPP; - switch (arg1) { - case TARGET_GSI_IEEE_FP_CONTROL: - { - uint64_t swcr, fpcr = cpu_alpha_load_fpcr (cpu_env); - - /* Copied from linux ieee_fpcr_to_swcr. */ - swcr = (fpcr >> 35) & SWCR_STATUS_MASK; - swcr |= (fpcr >> 36) & SWCR_MAP_DMZ; - swcr |= (~fpcr >> 48) & (SWCR_TRAP_ENABLE_INV - | SWCR_TRAP_ENABLE_DZE - | SWCR_TRAP_ENABLE_OVF); - swcr |= (~fpcr >> 57) & (SWCR_TRAP_ENABLE_UNF - | SWCR_TRAP_ENABLE_INE); - swcr |= (fpcr >> 47) & SWCR_MAP_UMZ; - swcr |= (~fpcr >> 41) & SWCR_TRAP_ENABLE_DNO; - - if (put_user_u64 (swcr, arg2)) - goto efault; - ret = 0; - } - break; - - /* case GSI_IEEE_STATE_AT_SIGNAL: - -- Not implemented in linux kernel. - case GSI_UACPROC: - -- Retrieves current unaligned access state; not much used. - case GSI_PROC_TYPE: - -- Retrieves implver information; surely not used. - case GSI_GET_HWRPB: - -- Grabs a copy of the HWRPB; surely not used. - */ - } - break; -#endif -#if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA) - /* Alpha specific */ - case TARGET_NR_osf_setsysinfo: - ret = -TARGET_EOPNOTSUPP; - switch (arg1) { - case TARGET_SSI_IEEE_FP_CONTROL: - { - uint64_t swcr, fpcr, orig_fpcr; - - if (get_user_u64 (swcr, arg2)) { - goto efault; - } - orig_fpcr = cpu_alpha_load_fpcr(cpu_env); - fpcr = orig_fpcr & FPCR_DYN_MASK; - - /* Copied from linux ieee_swcr_to_fpcr. */ - fpcr |= (swcr & SWCR_STATUS_MASK) << 35; - fpcr |= (swcr & SWCR_MAP_DMZ) << 36; - fpcr |= (~swcr & (SWCR_TRAP_ENABLE_INV - | SWCR_TRAP_ENABLE_DZE - | SWCR_TRAP_ENABLE_OVF)) << 48; - fpcr |= (~swcr & (SWCR_TRAP_ENABLE_UNF - | SWCR_TRAP_ENABLE_INE)) << 57; - fpcr |= (swcr & SWCR_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0); - fpcr |= (~swcr & SWCR_TRAP_ENABLE_DNO) << 41; - - cpu_alpha_store_fpcr(cpu_env, fpcr); - ret = 0; - } - break; - - case TARGET_SSI_IEEE_RAISE_EXCEPTION: - { - uint64_t exc, fpcr, orig_fpcr; - int si_code; - - if (get_user_u64(exc, arg2)) { - goto efault; - } - - orig_fpcr = cpu_alpha_load_fpcr(cpu_env); - - /* We only add to the exception status here. */ - fpcr = orig_fpcr | ((exc & SWCR_STATUS_MASK) << 35); - - cpu_alpha_store_fpcr(cpu_env, fpcr); - ret = 0; - - /* Old exceptions are not signaled. */ - fpcr &= ~(orig_fpcr & FPCR_STATUS_MASK); - - /* If any exceptions set by this call, - and are unmasked, send a signal. */ - si_code = 0; - if ((fpcr & (FPCR_INE | FPCR_INED)) == FPCR_INE) { - si_code = TARGET_FPE_FLTRES; - } - if ((fpcr & (FPCR_UNF | FPCR_UNFD)) == FPCR_UNF) { - si_code = TARGET_FPE_FLTUND; - } - if ((fpcr & (FPCR_OVF | FPCR_OVFD)) == FPCR_OVF) { - si_code = TARGET_FPE_FLTOVF; - } - if ((fpcr & (FPCR_DZE | FPCR_DZED)) == FPCR_DZE) { - si_code = TARGET_FPE_FLTDIV; - } - if ((fpcr & (FPCR_INV | FPCR_INVD)) == FPCR_INV) { - si_code = TARGET_FPE_FLTINV; - } - if (si_code != 0) { - target_siginfo_t info; - info.si_signo = SIGFPE; - info.si_errno = 0; - info.si_code = si_code; - info._sifields._sigfault._addr - = ((CPUArchState *)cpu_env)->pc; - queue_signal((CPUArchState *)cpu_env, info.si_signo, &info); - } - } - break; - - /* case SSI_NVPAIRS: - -- Used with SSIN_UACPROC to enable unaligned accesses. - case SSI_IEEE_STATE_AT_SIGNAL: - case SSI_IEEE_IGNORE_STATE_AT_SIGNAL: - -- Not implemented in linux kernel - */ - } - break; -#endif -#ifdef TARGET_NR_osf_sigprocmask - /* Alpha specific. */ - case TARGET_NR_osf_sigprocmask: - { - abi_ulong mask; - int how; - sigset_t set, oldset; - - switch(arg1) { - case TARGET_SIG_BLOCK: - how = SIG_BLOCK; - break; - case TARGET_SIG_UNBLOCK: - how = SIG_UNBLOCK; - break; - case TARGET_SIG_SETMASK: - how = SIG_SETMASK; - break; - default: - ret = -TARGET_EINVAL; - goto fail; - } - mask = arg2; - target_to_host_old_sigset(&set, &mask); - do_sigprocmask(how, &set, &oldset); - host_to_target_old_sigset(&mask, &oldset); - ret = mask; - } - break; -#endif - -#ifdef TARGET_NR_getgid32 - case TARGET_NR_getgid32: - ret = get_errno(getgid()); - break; -#endif -#ifdef TARGET_NR_geteuid32 - case TARGET_NR_geteuid32: - ret = get_errno(geteuid()); - break; -#endif -#ifdef TARGET_NR_getegid32 - case TARGET_NR_getegid32: - ret = get_errno(getegid()); - break; -#endif -#ifdef TARGET_NR_setreuid32 - case TARGET_NR_setreuid32: - ret = get_errno(setreuid(arg1, arg2)); - break; -#endif -#ifdef TARGET_NR_setregid32 - case TARGET_NR_setregid32: - ret = get_errno(setregid(arg1, arg2)); - break; -#endif -#ifdef TARGET_NR_getgroups32 - case TARGET_NR_getgroups32: - { - int gidsetsize = arg1; - uint32_t *target_grouplist; - gid_t *grouplist; - int i; - - grouplist = alloca(gidsetsize * sizeof(gid_t)); - ret = get_errno(getgroups(gidsetsize, grouplist)); - if (gidsetsize == 0) - break; - if (!is_error(ret)) { - target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 4, 0); - if (!target_grouplist) { - ret = -TARGET_EFAULT; - goto fail; - } - for(i = 0;i < ret; i++) - target_grouplist[i] = tswap32(grouplist[i]); - unlock_user(target_grouplist, arg2, gidsetsize * 4); - } - } - break; -#endif -#ifdef TARGET_NR_setgroups32 - case TARGET_NR_setgroups32: - { - int gidsetsize = arg1; - uint32_t *target_grouplist; - gid_t *grouplist; - int i; - - grouplist = alloca(gidsetsize * sizeof(gid_t)); - target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 4, 1); - if (!target_grouplist) { - ret = -TARGET_EFAULT; - goto fail; - } - for(i = 0;i < gidsetsize; i++) - grouplist[i] = tswap32(target_grouplist[i]); - unlock_user(target_grouplist, arg2, 0); - ret = get_errno(setgroups(gidsetsize, grouplist)); - } - break; -#endif -#ifdef TARGET_NR_fchown32 - case TARGET_NR_fchown32: - ret = get_errno(fchown(arg1, arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_setresuid32 - case TARGET_NR_setresuid32: - ret = get_errno(setresuid(arg1, arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_getresuid32 - case TARGET_NR_getresuid32: - { - uid_t ruid, euid, suid; - ret = get_errno(getresuid(&ruid, &euid, &suid)); - if (!is_error(ret)) { - if (put_user_u32(ruid, arg1) - || put_user_u32(euid, arg2) - || put_user_u32(suid, arg3)) - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_setresgid32 - case TARGET_NR_setresgid32: - ret = get_errno(setresgid(arg1, arg2, arg3)); - break; -#endif -#ifdef TARGET_NR_getresgid32 - case TARGET_NR_getresgid32: - { - gid_t rgid, egid, sgid; - ret = get_errno(getresgid(&rgid, &egid, &sgid)); - if (!is_error(ret)) { - if (put_user_u32(rgid, arg1) - || put_user_u32(egid, arg2) - || put_user_u32(sgid, arg3)) - goto efault; - } - } - break; -#endif -#ifdef TARGET_NR_chown32 - case TARGET_NR_chown32: - if (!(p = lock_user_string(arg1))) - goto efault; - ret = get_errno(chown(p, arg2, arg3)); - unlock_user(p, arg1, 0); - break; -#endif -#ifdef TARGET_NR_setuid32 - case TARGET_NR_setuid32: - ret = get_errno(setuid(arg1)); - break; -#endif -#ifdef TARGET_NR_setgid32 - case TARGET_NR_setgid32: - ret = get_errno(setgid(arg1)); - break; -#endif -#ifdef TARGET_NR_setfsuid32 - case TARGET_NR_setfsuid32: - ret = get_errno(setfsuid(arg1)); - break; -#endif -#ifdef TARGET_NR_setfsgid32 - case TARGET_NR_setfsgid32: - ret = get_errno(setfsgid(arg1)); - break; -#endif - - case TARGET_NR_pivot_root: - goto unimplemented; -#ifdef TARGET_NR_mincore - case TARGET_NR_mincore: - { - void *a; - ret = -TARGET_EFAULT; - if (!(a = lock_user(VERIFY_READ, arg1,arg2, 0))) - goto efault; - if (!(p = lock_user_string(arg3))) - goto mincore_fail; - ret = get_errno(mincore(a, arg2, p)); - unlock_user(p, arg3, ret); - mincore_fail: - unlock_user(a, arg1, 0); - } - break; -#endif -#ifdef TARGET_NR_arm_fadvise64_64 - case TARGET_NR_arm_fadvise64_64: - { - /* - * arm_fadvise64_64 looks like fadvise64_64 but - * with different argument order - */ - abi_long temp; - temp = arg3; - arg3 = arg4; - arg4 = temp; - } -#endif -#if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64) || defined(TARGET_NR_fadvise64) -#ifdef TARGET_NR_fadvise64_64 - case TARGET_NR_fadvise64_64: -#endif -#ifdef TARGET_NR_fadvise64 - case TARGET_NR_fadvise64: -#endif -#ifdef TARGET_S390X - switch (arg4) { - case 4: arg4 = POSIX_FADV_NOREUSE + 1; break; /* make sure it's an invalid value */ - case 5: arg4 = POSIX_FADV_NOREUSE + 2; break; /* ditto */ - case 6: arg4 = POSIX_FADV_DONTNEED; break; - case 7: arg4 = POSIX_FADV_NOREUSE; break; - default: break; - } -#endif - ret = -posix_fadvise(arg1, arg2, arg3, arg4); - break; -#endif -#ifdef TARGET_NR_madvise - case TARGET_NR_madvise: - /* A straight passthrough may not be safe because qemu sometimes - turns private file-backed mappings into anonymous mappings. - This will break MADV_DONTNEED. - This is a hint, so ignoring and returning success is ok. */ - ret = get_errno(0); - break; -#endif -#if TARGET_ABI_BITS == 32 - case TARGET_NR_fcntl64: - { - int cmd; - struct flock64 fl; - struct target_flock64 *target_fl; -#ifdef TARGET_ARM - struct target_eabi_flock64 *target_efl; -#endif - - cmd = target_to_host_fcntl_cmd(arg2); - if (cmd == -TARGET_EINVAL) { - ret = cmd; - break; - } - - switch(arg2) { - case TARGET_F_GETLK64: -#ifdef TARGET_ARM - if (((CPUARMState *)cpu_env)->eabi) { - if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) - goto efault; - fl.l_type = tswap16(target_efl->l_type); - fl.l_whence = tswap16(target_efl->l_whence); - fl.l_start = tswap64(target_efl->l_start); - fl.l_len = tswap64(target_efl->l_len); - fl.l_pid = tswap32(target_efl->l_pid); - unlock_user_struct(target_efl, arg3, 0); - } else -#endif - { - if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) - goto efault; - fl.l_type = tswap16(target_fl->l_type); - fl.l_whence = tswap16(target_fl->l_whence); - fl.l_start = tswap64(target_fl->l_start); - fl.l_len = tswap64(target_fl->l_len); - fl.l_pid = tswap32(target_fl->l_pid); - unlock_user_struct(target_fl, arg3, 0); - } - ret = get_errno(fcntl(arg1, cmd, &fl)); - if (ret == 0) { -#ifdef TARGET_ARM - if (((CPUARMState *)cpu_env)->eabi) { - if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 0)) - goto efault; - target_efl->l_type = tswap16(fl.l_type); - target_efl->l_whence = tswap16(fl.l_whence); - target_efl->l_start = tswap64(fl.l_start); - target_efl->l_len = tswap64(fl.l_len); - target_efl->l_pid = tswap32(fl.l_pid); - unlock_user_struct(target_efl, arg3, 1); - } else -#endif - { - if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0)) - goto efault; - target_fl->l_type = tswap16(fl.l_type); - target_fl->l_whence = tswap16(fl.l_whence); - target_fl->l_start = tswap64(fl.l_start); - target_fl->l_len = tswap64(fl.l_len); - target_fl->l_pid = tswap32(fl.l_pid); - unlock_user_struct(target_fl, arg3, 1); - } - } - break; - - case TARGET_F_SETLK64: - case TARGET_F_SETLKW64: -#ifdef TARGET_ARM - if (((CPUARMState *)cpu_env)->eabi) { - if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1)) - goto efault; - fl.l_type = tswap16(target_efl->l_type); - fl.l_whence = tswap16(target_efl->l_whence); - fl.l_start = tswap64(target_efl->l_start); - fl.l_len = tswap64(target_efl->l_len); - fl.l_pid = tswap32(target_efl->l_pid); - unlock_user_struct(target_efl, arg3, 0); - } else -#endif - { - if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) - goto efault; - fl.l_type = tswap16(target_fl->l_type); - fl.l_whence = tswap16(target_fl->l_whence); - fl.l_start = tswap64(target_fl->l_start); - fl.l_len = tswap64(target_fl->l_len); - fl.l_pid = tswap32(target_fl->l_pid); - unlock_user_struct(target_fl, arg3, 0); - } - ret = get_errno(fcntl(arg1, cmd, &fl)); - break; - default: - ret = do_fcntl(arg1, arg2, arg3); - break; - } - break; - } -#endif -#ifdef TARGET_NR_cacheflush - case TARGET_NR_cacheflush: - /* self-modifying code is handled automatically, so nothing needed */ - ret = 0; - break; -#endif -#ifdef TARGET_NR_security - case TARGET_NR_security: - goto unimplemented; -#endif -#ifdef TARGET_NR_getpagesize - case TARGET_NR_getpagesize: - ret = TARGET_PAGE_SIZE; - break; -#endif - case TARGET_NR_gettid: - ret = get_errno(gettid()); - break; -#ifdef TARGET_NR_readahead - case TARGET_NR_readahead: -#if TARGET_ABI_BITS == 32 - if (regpairs_aligned(cpu_env)) { - arg2 = arg3; - arg3 = arg4; - arg4 = arg5; - } - ret = get_errno(readahead(arg1, ((off64_t)arg3 << 32) | arg2, arg4)); -#else - ret = get_errno(readahead(arg1, arg2, arg3)); -#endif - break; -#endif -#ifdef CONFIG_ATTR -#ifdef TARGET_NR_setxattr - case TARGET_NR_listxattr: - case TARGET_NR_llistxattr: - { - void *p, *b = 0; - if (arg2) { - b = lock_user(VERIFY_WRITE, arg2, arg3, 0); - if (!b) { - ret = -TARGET_EFAULT; - break; - } - } - p = lock_user_string(arg1); - if (p) { - if (num == TARGET_NR_listxattr) { - ret = get_errno(listxattr(p, b, arg3)); - } else { - ret = get_errno(llistxattr(p, b, arg3)); - } - } else { - ret = -TARGET_EFAULT; - } - unlock_user(p, arg1, 0); - unlock_user(b, arg2, arg3); - break; - } - case TARGET_NR_flistxattr: - { - void *b = 0; - if (arg2) { - b = lock_user(VERIFY_WRITE, arg2, arg3, 0); - if (!b) { - ret = -TARGET_EFAULT; - break; - } - } - ret = get_errno(flistxattr(arg1, b, arg3)); - unlock_user(b, arg2, arg3); - break; - } - case TARGET_NR_setxattr: - case TARGET_NR_lsetxattr: - { - void *p, *n, *v = 0; - if (arg3) { - v = lock_user(VERIFY_READ, arg3, arg4, 1); - if (!v) { - ret = -TARGET_EFAULT; - break; - } - } - p = lock_user_string(arg1); - n = lock_user_string(arg2); - if (p && n) { - if (num == TARGET_NR_setxattr) { - ret = get_errno(setxattr(p, n, v, arg4, arg5)); - } else { - ret = get_errno(lsetxattr(p, n, v, arg4, arg5)); - } - } else { - ret = -TARGET_EFAULT; - } - unlock_user(p, arg1, 0); - unlock_user(n, arg2, 0); - unlock_user(v, arg3, 0); - } - break; - case TARGET_NR_fsetxattr: - { - void *n, *v = 0; - if (arg3) { - v = lock_user(VERIFY_READ, arg3, arg4, 1); - if (!v) { - ret = -TARGET_EFAULT; - break; - } - } - n = lock_user_string(arg2); - if (n) { - ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5)); - } else { - ret = -TARGET_EFAULT; - } - unlock_user(n, arg2, 0); - unlock_user(v, arg3, 0); - } - break; - case TARGET_NR_getxattr: - case TARGET_NR_lgetxattr: - { - void *p, *n, *v = 0; - if (arg3) { - v = lock_user(VERIFY_WRITE, arg3, arg4, 0); - if (!v) { - ret = -TARGET_EFAULT; - break; - } - } - p = lock_user_string(arg1); - n = lock_user_string(arg2); - if (p && n) { - if (num == TARGET_NR_getxattr) { - ret = get_errno(getxattr(p, n, v, arg4)); - } else { - ret = get_errno(lgetxattr(p, n, v, arg4)); - } - } else { - ret = -TARGET_EFAULT; - } - unlock_user(p, arg1, 0); - unlock_user(n, arg2, 0); - unlock_user(v, arg3, arg4); - } - break; - case TARGET_NR_fgetxattr: - { - void *n, *v = 0; - if (arg3) { - v = lock_user(VERIFY_WRITE, arg3, arg4, 0); - if (!v) { - ret = -TARGET_EFAULT; - break; - } - } - n = lock_user_string(arg2); - if (n) { - ret = get_errno(fgetxattr(arg1, n, v, arg4)); - } else { - ret = -TARGET_EFAULT; - } - unlock_user(n, arg2, 0); - unlock_user(v, arg3, arg4); - } - break; - case TARGET_NR_removexattr: - case TARGET_NR_lremovexattr: - { - void *p, *n; - p = lock_user_string(arg1); - n = lock_user_string(arg2); - if (p && n) { - if (num == TARGET_NR_removexattr) { - ret = get_errno(removexattr(p, n)); - } else { - ret = get_errno(lremovexattr(p, n)); - } - } else { - ret = -TARGET_EFAULT; - } - unlock_user(p, arg1, 0); - unlock_user(n, arg2, 0); - } - break; - case TARGET_NR_fremovexattr: - { - void *n; - n = lock_user_string(arg2); - if (n) { - ret = get_errno(fremovexattr(arg1, n)); - } else { - ret = -TARGET_EFAULT; - } - unlock_user(n, arg2, 0); - } - break; -#endif -#endif /* CONFIG_ATTR */ -#ifdef TARGET_NR_set_thread_area - case TARGET_NR_set_thread_area: -#if defined(TARGET_MIPS) - ((CPUMIPSState *) cpu_env)->active_tc.CP0_UserLocal = arg1; - ret = 0; - break; -#elif defined(TARGET_CRIS) - if (arg1 & 0xff) - ret = -TARGET_EINVAL; - else { - ((CPUCRISState *) cpu_env)->pregs[PR_PID] = arg1; - ret = 0; - } - break; -#elif defined(TARGET_I386) && defined(TARGET_ABI32) - ret = do_set_thread_area(cpu_env, arg1); - break; -#elif defined(TARGET_M68K) - { - TaskState *ts = cpu->opaque; - ts->tp_value = arg1; - ret = 0; - break; - } -#else - goto unimplemented_nowarn; -#endif -#endif -#ifdef TARGET_NR_get_thread_area - case TARGET_NR_get_thread_area: -#if defined(TARGET_I386) && defined(TARGET_ABI32) - ret = do_get_thread_area(cpu_env, arg1); - break; -#elif defined(TARGET_M68K) - { - TaskState *ts = cpu->opaque; - ret = ts->tp_value; - break; - } -#else - goto unimplemented_nowarn; -#endif -#endif -#ifdef TARGET_NR_getdomainname - case TARGET_NR_getdomainname: - goto unimplemented_nowarn; -#endif - -#ifdef TARGET_NR_clock_gettime - case TARGET_NR_clock_gettime: - { - struct timespec ts; - ret = get_errno(clock_gettime(arg1, &ts)); - if (!is_error(ret)) { - host_to_target_timespec(arg2, &ts); - } - break; - } -#endif -#ifdef TARGET_NR_clock_getres - case TARGET_NR_clock_getres: - { - struct timespec ts; - ret = get_errno(clock_getres(arg1, &ts)); - if (!is_error(ret)) { - host_to_target_timespec(arg2, &ts); - } - break; - } -#endif -#ifdef TARGET_NR_clock_nanosleep - case TARGET_NR_clock_nanosleep: - { - struct timespec ts; - target_to_host_timespec(&ts, arg3); - ret = get_errno(clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL)); - if (arg4) - host_to_target_timespec(arg4, &ts); - -#if defined(TARGET_PPC) - /* clock_nanosleep is odd in that it returns positive errno values. - * On PPC, CR0 bit 3 should be set in such a situation. */ - if (ret) { - ((CPUPPCState *)cpu_env)->crf[0] |= 1; - } -#endif - break; - } -#endif - -#if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address) - case TARGET_NR_set_tid_address: - ret = get_errno(set_tid_address((int *)g2h(arg1))); - break; -#endif - -#if defined(TARGET_NR_tkill) && defined(__NR_tkill) - case TARGET_NR_tkill: - ret = get_errno(sys_tkill((int)arg1, target_to_host_signal(arg2))); - break; -#endif - -#if defined(TARGET_NR_tgkill) && defined(__NR_tgkill) - case TARGET_NR_tgkill: - ret = get_errno(sys_tgkill((int)arg1, (int)arg2, - target_to_host_signal(arg3))); - break; -#endif - -#ifdef TARGET_NR_set_robust_list - case TARGET_NR_set_robust_list: - case TARGET_NR_get_robust_list: - /* The ABI for supporting robust futexes has userspace pass - * the kernel a pointer to a linked list which is updated by - * userspace after the syscall; the list is walked by the kernel - * when the thread exits. Since the linked list in QEMU guest - * memory isn't a valid linked list for the host and we have - * no way to reliably intercept the thread-death event, we can't - * support these. Silently return ENOSYS so that guest userspace - * falls back to a non-robust futex implementation (which should - * be OK except in the corner case of the guest crashing while - * holding a mutex that is shared with another process via - * shared memory). - */ - goto unimplemented_nowarn; -#endif - -#if defined(TARGET_NR_utimensat) - case TARGET_NR_utimensat: - { - struct timespec *tsp, ts[2]; - if (!arg3) { - tsp = NULL; - } else { - target_to_host_timespec(ts, arg3); - target_to_host_timespec(ts+1, arg3+sizeof(struct target_timespec)); - tsp = ts; - } - if (!arg2) - ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4)); - else { - if (!(p = lock_user_string(arg2))) { - ret = -TARGET_EFAULT; - goto fail; - } - ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4)); - unlock_user(p, arg2, 0); - } - } - break; -#endif - case TARGET_NR_futex: - ret = do_futex(arg1, arg2, arg3, arg4, arg5, arg6); - break; -#if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init) - case TARGET_NR_inotify_init: - ret = get_errno(sys_inotify_init()); - break; -#endif -#ifdef CONFIG_INOTIFY1 -#if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1) - case TARGET_NR_inotify_init1: - ret = get_errno(sys_inotify_init1(arg1)); - break; -#endif -#endif -#if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch) - case TARGET_NR_inotify_add_watch: - p = lock_user_string(arg2); - ret = get_errno(sys_inotify_add_watch(arg1, path(p), arg3)); - unlock_user(p, arg2, 0); - break; -#endif -#if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch) - case TARGET_NR_inotify_rm_watch: - ret = get_errno(sys_inotify_rm_watch(arg1, arg2)); - break; -#endif - -#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open) - case TARGET_NR_mq_open: - { - struct mq_attr posix_mq_attr, *attrp; - - p = lock_user_string(arg1 - 1); - if (arg4 != 0) { - copy_from_user_mq_attr (&posix_mq_attr, arg4); - attrp = &posix_mq_attr; - } else { - attrp = 0; - } - ret = get_errno(mq_open(p, arg2, arg3, attrp)); - unlock_user (p, arg1, 0); - } - break; - - case TARGET_NR_mq_unlink: - p = lock_user_string(arg1 - 1); - ret = get_errno(mq_unlink(p)); - unlock_user (p, arg1, 0); - break; - - case TARGET_NR_mq_timedsend: - { - struct timespec ts; - - p = lock_user (VERIFY_READ, arg2, arg3, 1); - if (arg5 != 0) { - target_to_host_timespec(&ts, arg5); - ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts)); - host_to_target_timespec(arg5, &ts); - } - else - ret = get_errno(mq_send(arg1, p, arg3, arg4)); - unlock_user (p, arg2, arg3); - } - break; - - case TARGET_NR_mq_timedreceive: - { - struct timespec ts; - unsigned int prio; - - p = lock_user (VERIFY_READ, arg2, arg3, 1); - if (arg5 != 0) { - target_to_host_timespec(&ts, arg5); - ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts)); - host_to_target_timespec(arg5, &ts); - } - else - ret = get_errno(mq_receive(arg1, p, arg3, &prio)); - unlock_user (p, arg2, arg3); - if (arg4 != 0) - put_user_u32(prio, arg4); - } - break; - - /* Not implemented for now... */ -/* case TARGET_NR_mq_notify: */ -/* break; */ - - case TARGET_NR_mq_getsetattr: - { - struct mq_attr posix_mq_attr_in, posix_mq_attr_out; - ret = 0; - if (arg3 != 0) { - ret = mq_getattr(arg1, &posix_mq_attr_out); - copy_to_user_mq_attr(arg3, &posix_mq_attr_out); - } - if (arg2 != 0) { - copy_from_user_mq_attr(&posix_mq_attr_in, arg2); - ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); - } - - } - break; -#endif - -#ifdef CONFIG_SPLICE -#ifdef TARGET_NR_tee - case TARGET_NR_tee: - { - ret = get_errno(tee(arg1,arg2,arg3,arg4)); - } - break; -#endif -#ifdef TARGET_NR_splice - case TARGET_NR_splice: - { - loff_t loff_in, loff_out; - loff_t *ploff_in = NULL, *ploff_out = NULL; - if (arg2) { - if (get_user_u64(loff_in, arg2)) { - goto efault; - } - ploff_in = &loff_in; - } - if (arg4) { - if (get_user_u64(loff_out, arg4)) { - goto efault; - } - ploff_out = &loff_out; - } - ret = get_errno(splice(arg1, ploff_in, arg3, ploff_out, arg5, arg6)); - if (arg2) { - if (put_user_u64(loff_in, arg2)) { - goto efault; - } - } - if (arg4) { - if (put_user_u64(loff_out, arg4)) { - goto efault; - } - } - } - break; -#endif -#ifdef TARGET_NR_vmsplice - case TARGET_NR_vmsplice: - { - struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1); - if (vec != NULL) { - ret = get_errno(vmsplice(arg1, vec, arg3, arg4)); - unlock_iovec(vec, arg2, arg3, 0); - } else { - ret = -host_to_target_errno(errno); - } - } - break; -#endif -#endif /* CONFIG_SPLICE */ -#ifdef CONFIG_EVENTFD -#if defined(TARGET_NR_eventfd) - case TARGET_NR_eventfd: - ret = get_errno(eventfd(arg1, 0)); - fd_trans_unregister(ret); - break; -#endif -#if defined(TARGET_NR_eventfd2) - case TARGET_NR_eventfd2: - { - int host_flags = arg2 & (~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC)); - if (arg2 & TARGET_O_NONBLOCK) { - host_flags |= O_NONBLOCK; - } - if (arg2 & TARGET_O_CLOEXEC) { - host_flags |= O_CLOEXEC; - } - ret = get_errno(eventfd(arg1, host_flags)); - fd_trans_unregister(ret); - break; - } -#endif -#endif /* CONFIG_EVENTFD */ -#if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate) - case TARGET_NR_fallocate: -#if TARGET_ABI_BITS == 32 - ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4), - target_offset64(arg5, arg6))); -#else - ret = get_errno(fallocate(arg1, arg2, arg3, arg4)); -#endif - break; -#endif -#if defined(CONFIG_SYNC_FILE_RANGE) -#if defined(TARGET_NR_sync_file_range) - case TARGET_NR_sync_file_range: -#if TARGET_ABI_BITS == 32 -#if defined(TARGET_MIPS) - ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4), - target_offset64(arg5, arg6), arg7)); -#else - ret = get_errno(sync_file_range(arg1, target_offset64(arg2, arg3), - target_offset64(arg4, arg5), arg6)); -#endif /* !TARGET_MIPS */ -#else - ret = get_errno(sync_file_range(arg1, arg2, arg3, arg4)); -#endif - break; -#endif -#if defined(TARGET_NR_sync_file_range2) - case TARGET_NR_sync_file_range2: - /* This is like sync_file_range but the arguments are reordered */ -#if TARGET_ABI_BITS == 32 - ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4), - target_offset64(arg5, arg6), arg2)); -#else - ret = get_errno(sync_file_range(arg1, arg3, arg4, arg2)); -#endif - break; -#endif -#endif -#if defined(TARGET_NR_signalfd4) - case TARGET_NR_signalfd4: - ret = do_signalfd4(arg1, arg2, arg4); - break; -#endif -#if defined(TARGET_NR_signalfd) - case TARGET_NR_signalfd: - ret = do_signalfd4(arg1, arg2, 0); - break; -#endif -#if defined(CONFIG_EPOLL) -#if defined(TARGET_NR_epoll_create) - case TARGET_NR_epoll_create: - ret = get_errno(epoll_create(arg1)); - break; -#endif -#if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1) - case TARGET_NR_epoll_create1: - ret = get_errno(epoll_create1(arg1)); - break; -#endif -#if defined(TARGET_NR_epoll_ctl) - case TARGET_NR_epoll_ctl: - { - struct epoll_event ep; - struct epoll_event *epp = 0; - if (arg4) { - struct target_epoll_event *target_ep; - if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) { - goto efault; - } - ep.events = tswap32(target_ep->events); - /* The epoll_data_t union is just opaque data to the kernel, - * so we transfer all 64 bits across and need not worry what - * actual data type it is. - */ - ep.data.u64 = tswap64(target_ep->data.u64); - unlock_user_struct(target_ep, arg4, 0); - epp = &ep; - } - ret = get_errno(epoll_ctl(arg1, arg2, arg3, epp)); - break; - } -#endif - -#if defined(TARGET_NR_epoll_pwait) && defined(CONFIG_EPOLL_PWAIT) -#define IMPLEMENT_EPOLL_PWAIT -#endif -#if defined(TARGET_NR_epoll_wait) || defined(IMPLEMENT_EPOLL_PWAIT) -#if defined(TARGET_NR_epoll_wait) - case TARGET_NR_epoll_wait: -#endif -#if defined(IMPLEMENT_EPOLL_PWAIT) - case TARGET_NR_epoll_pwait: -#endif - { - struct target_epoll_event *target_ep; - struct epoll_event *ep; - int epfd = arg1; - int maxevents = arg3; - int timeout = arg4; - - target_ep = lock_user(VERIFY_WRITE, arg2, - maxevents * sizeof(struct target_epoll_event), 1); - if (!target_ep) { - goto efault; - } - - ep = alloca(maxevents * sizeof(struct epoll_event)); - - switch (num) { -#if defined(IMPLEMENT_EPOLL_PWAIT) - case TARGET_NR_epoll_pwait: - { - target_sigset_t *target_set; - sigset_t _set, *set = &_set; - - if (arg5) { - target_set = lock_user(VERIFY_READ, arg5, - sizeof(target_sigset_t), 1); - if (!target_set) { - unlock_user(target_ep, arg2, 0); - goto efault; - } - target_to_host_sigset(set, target_set); - unlock_user(target_set, arg5, 0); - } else { - set = NULL; - } - - ret = get_errno(epoll_pwait(epfd, ep, maxevents, timeout, set)); - break; - } -#endif -#if defined(TARGET_NR_epoll_wait) - case TARGET_NR_epoll_wait: - ret = get_errno(epoll_wait(epfd, ep, maxevents, timeout)); - break; -#endif - default: - ret = -TARGET_ENOSYS; - } - if (!is_error(ret)) { - int i; - for (i = 0; i < ret; i++) { - target_ep[i].events = tswap32(ep[i].events); - target_ep[i].data.u64 = tswap64(ep[i].data.u64); - } - } - unlock_user(target_ep, arg2, ret * sizeof(struct target_epoll_event)); - break; - } -#endif -#endif -#ifdef TARGET_NR_prlimit64 - case TARGET_NR_prlimit64: - { - /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */ - struct target_rlimit64 *target_rnew, *target_rold; - struct host_rlimit64 rnew, rold, *rnewp = 0; - int resource = target_to_host_resource(arg2); - if (arg3) { - if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) { - goto efault; - } - rnew.rlim_cur = tswap64(target_rnew->rlim_cur); - rnew.rlim_max = tswap64(target_rnew->rlim_max); - unlock_user_struct(target_rnew, arg3, 0); - rnewp = &rnew; - } - - ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ? &rold : 0)); - if (!is_error(ret) && arg4) { - if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) { - goto efault; - } - target_rold->rlim_cur = tswap64(rold.rlim_cur); - target_rold->rlim_max = tswap64(rold.rlim_max); - unlock_user_struct(target_rold, arg4, 1); - } - break; - } -#endif -#ifdef TARGET_NR_gethostname - case TARGET_NR_gethostname: - { - char *name = lock_user(VERIFY_WRITE, arg1, arg2, 0); - if (name) { - ret = get_errno(gethostname(name, arg2)); - unlock_user(name, arg1, arg2); - } else { - ret = -TARGET_EFAULT; - } - break; - } -#endif -#ifdef TARGET_NR_atomic_cmpxchg_32 - case TARGET_NR_atomic_cmpxchg_32: - { - /* should use start_exclusive from main.c */ - abi_ulong mem_value; - if (get_user_u32(mem_value, arg6)) { - target_siginfo_t info; - info.si_signo = SIGSEGV; - info.si_errno = 0; - info.si_code = TARGET_SEGV_MAPERR; - info._sifields._sigfault._addr = arg6; - queue_signal((CPUArchState *)cpu_env, info.si_signo, &info); - ret = 0xdeadbeef; - - } - if (mem_value == arg2) - put_user_u32(arg1, arg6); - ret = mem_value; - break; - } -#endif -#ifdef TARGET_NR_atomic_barrier - case TARGET_NR_atomic_barrier: - { - /* Like the kernel implementation and the qemu arm barrier, no-op this? */ - ret = 0; - break; - } -#endif - -#ifdef TARGET_NR_timer_create - case TARGET_NR_timer_create: - { - /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */ - - struct sigevent host_sevp = { {0}, }, *phost_sevp = NULL; - - int clkid = arg1; - int timer_index = next_free_host_timer(); - - if (timer_index < 0) { - ret = -TARGET_EAGAIN; - } else { - timer_t *phtimer = g_posix_timers + timer_index; - - if (arg2) { - phost_sevp = &host_sevp; - ret = target_to_host_sigevent(phost_sevp, arg2); - if (ret != 0) { - break; - } - } - - ret = get_errno(timer_create(clkid, phost_sevp, phtimer)); - if (ret) { - phtimer = NULL; - } else { - if (put_user(TIMER_MAGIC | timer_index, arg3, target_timer_t)) { - goto efault; - } - } - } - break; - } -#endif - -#ifdef TARGET_NR_timer_settime - case TARGET_NR_timer_settime: - { - /* args: timer_t timerid, int flags, const struct itimerspec *new_value, - * struct itimerspec * old_value */ - target_timer_t timerid = get_timer_id(arg1); - - if (timerid < 0) { - ret = timerid; - } else if (arg3 == 0) { - ret = -TARGET_EINVAL; - } else { - timer_t htimer = g_posix_timers[timerid]; - struct itimerspec hspec_new = {{0},}, hspec_old = {{0},}; - - target_to_host_itimerspec(&hspec_new, arg3); - ret = get_errno( - timer_settime(htimer, arg2, &hspec_new, &hspec_old)); - host_to_target_itimerspec(arg2, &hspec_old); - } - break; - } -#endif - -#ifdef TARGET_NR_timer_gettime - case TARGET_NR_timer_gettime: - { - /* args: timer_t timerid, struct itimerspec *curr_value */ - target_timer_t timerid = get_timer_id(arg1); - - if (timerid < 0) { - ret = timerid; - } else if (!arg2) { - ret = -TARGET_EFAULT; - } else { - timer_t htimer = g_posix_timers[timerid]; - struct itimerspec hspec; - ret = get_errno(timer_gettime(htimer, &hspec)); - - if (host_to_target_itimerspec(arg2, &hspec)) { - ret = -TARGET_EFAULT; - } - } - break; - } -#endif - -#ifdef TARGET_NR_timer_getoverrun - case TARGET_NR_timer_getoverrun: - { - /* args: timer_t timerid */ - target_timer_t timerid = get_timer_id(arg1); - - if (timerid < 0) { - ret = timerid; - } else { - timer_t htimer = g_posix_timers[timerid]; - ret = get_errno(timer_getoverrun(htimer)); - } - fd_trans_unregister(ret); - break; - } -#endif - -#ifdef TARGET_NR_timer_delete - case TARGET_NR_timer_delete: - { - /* args: timer_t timerid */ - target_timer_t timerid = get_timer_id(arg1); - - if (timerid < 0) { - ret = timerid; - } else { - timer_t htimer = g_posix_timers[timerid]; - ret = get_errno(timer_delete(htimer)); - g_posix_timers[timerid] = 0; - } - break; - } -#endif - -#if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD) - case TARGET_NR_timerfd_create: - ret = get_errno(timerfd_create(arg1, - target_to_host_bitmask(arg2, fcntl_flags_tbl))); - break; -#endif - -#if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD) - case TARGET_NR_timerfd_gettime: - { - struct itimerspec its_curr; - - ret = get_errno(timerfd_gettime(arg1, &its_curr)); - - if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) { - goto efault; - } - } - break; -#endif - -#if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD) - case TARGET_NR_timerfd_settime: - { - struct itimerspec its_new, its_old, *p_new; - - if (arg3) { - if (target_to_host_itimerspec(&its_new, arg3)) { - goto efault; - } - p_new = &its_new; - } else { - p_new = NULL; - } - - ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old)); - - if (arg4 && host_to_target_itimerspec(arg4, &its_old)) { - goto efault; - } - } - break; -#endif - -#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get) - case TARGET_NR_ioprio_get: - ret = get_errno(ioprio_get(arg1, arg2)); - break; -#endif - -#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set) - case TARGET_NR_ioprio_set: - ret = get_errno(ioprio_set(arg1, arg2, arg3)); - break; -#endif - -#if defined(TARGET_NR_setns) && defined(CONFIG_SETNS) - case TARGET_NR_setns: - ret = get_errno(setns(arg1, arg2)); - break; -#endif -#if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS) - case TARGET_NR_unshare: - ret = get_errno(unshare(arg1)); - break; -#endif - - default: - unimplemented: - gemu_log("qemu: Unsupported syscall: %d\n", num); -#if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list) - unimplemented_nowarn: -#endif - ret = -TARGET_ENOSYS; - break; - } -fail: -#ifdef DEBUG - gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret); -#endif - if(do_strace) - print_syscall_ret(num, ret); - return ret; -efault: - ret = -TARGET_EFAULT; - goto fail; -} diff --git a/qemu/linux-user/syscall_defs.h b/qemu/linux-user/syscall_defs.h deleted file mode 100644 index 9e2b3c200..000000000 --- a/qemu/linux-user/syscall_defs.h +++ /dev/null @@ -1,2590 +0,0 @@ -/* common syscall defines for all architectures */ - -/* Note: although the syscall numbers change between architectures, - most of them stay the same, so we handle it by putting ifdefs if - necessary */ - -#ifndef SYSCALL_DEFS_H -#define SYSCALL_DEFS_H 1 - - -#include "syscall_nr.h" - -#define SOCKOP_socket 1 -#define SOCKOP_bind 2 -#define SOCKOP_connect 3 -#define SOCKOP_listen 4 -#define SOCKOP_accept 5 -#define SOCKOP_getsockname 6 -#define SOCKOP_getpeername 7 -#define SOCKOP_socketpair 8 -#define SOCKOP_send 9 -#define SOCKOP_recv 10 -#define SOCKOP_sendto 11 -#define SOCKOP_recvfrom 12 -#define SOCKOP_shutdown 13 -#define SOCKOP_setsockopt 14 -#define SOCKOP_getsockopt 15 -#define SOCKOP_sendmsg 16 -#define SOCKOP_recvmsg 17 -#define SOCKOP_accept4 18 -#define SOCKOP_recvmmsg 19 -#define SOCKOP_sendmmsg 20 - -#define IPCOP_semop 1 -#define IPCOP_semget 2 -#define IPCOP_semctl 3 -#define IPCOP_semtimedop 4 -#define IPCOP_msgsnd 11 -#define IPCOP_msgrcv 12 -#define IPCOP_msgget 13 -#define IPCOP_msgctl 14 -#define IPCOP_shmat 21 -#define IPCOP_shmdt 22 -#define IPCOP_shmget 23 -#define IPCOP_shmctl 24 - -/* - * The following is for compatibility across the various Linux - * platforms. The i386 ioctl numbering scheme doesn't really enforce - * a type field. De facto, however, the top 8 bits of the lower 16 - * bits are indeed used as a type field, so we might just as well make - * this explicit here. Please be sure to use the decoding macros - * below from now on. - */ -#define TARGET_IOC_NRBITS 8 -#define TARGET_IOC_TYPEBITS 8 - -#if defined(TARGET_I386) || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \ - || defined(TARGET_SPARC) \ - || defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS) - /* 16 bit uid wrappers emulation */ -#define USE_UID16 -#define target_id uint16_t -#else -#define target_id uint32_t -#endif - -#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SH4) \ - || defined(TARGET_M68K) || defined(TARGET_CRIS) \ - || defined(TARGET_UNICORE32) || defined(TARGET_S390X) \ - || defined(TARGET_OPENRISC) || defined(TARGET_TILEGX) - -#define TARGET_IOC_SIZEBITS 14 -#define TARGET_IOC_DIRBITS 2 - -#define TARGET_IOC_NONE 0U -#define TARGET_IOC_WRITE 1U -#define TARGET_IOC_READ 2U - -#elif defined(TARGET_PPC) || defined(TARGET_ALPHA) || \ - defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE) || \ - defined(TARGET_MIPS) - -#define TARGET_IOC_SIZEBITS 13 -#define TARGET_IOC_DIRBITS 3 - -#define TARGET_IOC_NONE 1U -#define TARGET_IOC_READ 2U -#define TARGET_IOC_WRITE 4U - -#else -#error unsupported CPU -#endif - -#define TARGET_IOC_NRMASK ((1 << TARGET_IOC_NRBITS)-1) -#define TARGET_IOC_TYPEMASK ((1 << TARGET_IOC_TYPEBITS)-1) -#define TARGET_IOC_SIZEMASK ((1 << TARGET_IOC_SIZEBITS)-1) -#define TARGET_IOC_DIRMASK ((1 << TARGET_IOC_DIRBITS)-1) - -#define TARGET_IOC_NRSHIFT 0 -#define TARGET_IOC_TYPESHIFT (TARGET_IOC_NRSHIFT+TARGET_IOC_NRBITS) -#define TARGET_IOC_SIZESHIFT (TARGET_IOC_TYPESHIFT+TARGET_IOC_TYPEBITS) -#define TARGET_IOC_DIRSHIFT (TARGET_IOC_SIZESHIFT+TARGET_IOC_SIZEBITS) - -#define TARGET_IOC(dir,type,nr,size) \ - (((dir) << TARGET_IOC_DIRSHIFT) | \ - ((type) << TARGET_IOC_TYPESHIFT) | \ - ((nr) << TARGET_IOC_NRSHIFT) | \ - ((size) << TARGET_IOC_SIZESHIFT)) - -/* used to create numbers */ -#define TARGET_IO(type,nr) TARGET_IOC(TARGET_IOC_NONE,(type),(nr),0) -#define TARGET_IOR(type,nr,size) TARGET_IOC(TARGET_IOC_READ,(type),(nr),sizeof(size)) -#define TARGET_IOW(type,nr,size) TARGET_IOC(TARGET_IOC_WRITE,(type),(nr),sizeof(size)) -#define TARGET_IOWR(type,nr,size) TARGET_IOC(TARGET_IOC_READ|TARGET_IOC_WRITE,(type),(nr),sizeof(size)) - -/* the size is automatically computed for these defines */ -#define TARGET_IORU(type,nr) TARGET_IOC(TARGET_IOC_READ,(type),(nr),TARGET_IOC_SIZEMASK) -#define TARGET_IOWU(type,nr) TARGET_IOC(TARGET_IOC_WRITE,(type),(nr),TARGET_IOC_SIZEMASK) -#define TARGET_IOWRU(type,nr) TARGET_IOC(TARGET_IOC_READ|TARGET_IOC_WRITE,(type),(nr),TARGET_IOC_SIZEMASK) - -struct target_sockaddr { - uint16_t sa_family; - uint8_t sa_data[14]; -}; - -struct target_sockaddr_ll { - uint16_t sll_family; /* Always AF_PACKET */ - uint16_t sll_protocol; /* Physical layer protocol */ - int sll_ifindex; /* Interface number */ - uint16_t sll_hatype; /* ARP hardware type */ - uint8_t sll_pkttype; /* Packet type */ - uint8_t sll_halen; /* Length of address */ - uint8_t sll_addr[8]; /* Physical layer address */ -}; - -struct target_sock_filter { - abi_ushort code; - uint8_t jt; - uint8_t jf; - abi_uint k; -}; - -struct target_sock_fprog { - abi_ushort len; - abi_ulong filter; -}; - -struct target_in_addr { - uint32_t s_addr; /* big endian */ -}; - -struct target_ip_mreq { - struct target_in_addr imr_multiaddr; - struct target_in_addr imr_address; -}; - -struct target_ip_mreqn { - struct target_in_addr imr_multiaddr; - struct target_in_addr imr_address; - abi_long imr_ifindex; -}; - -struct target_ip_mreq_source { - /* big endian */ - uint32_t imr_multiaddr; - uint32_t imr_interface; - uint32_t imr_sourceaddr; -}; - -struct target_timeval { - abi_long tv_sec; - abi_long tv_usec; -}; - -struct target_timespec { - abi_long tv_sec; - abi_long tv_nsec; -}; - -struct target_timezone { - abi_int tz_minuteswest; - abi_int tz_dsttime; -}; - -struct target_itimerval { - struct target_timeval it_interval; - struct target_timeval it_value; -}; - -struct target_itimerspec { - struct target_timespec it_interval; - struct target_timespec it_value; -}; - -typedef abi_long target_clock_t; - -#define TARGET_HZ 100 - -struct target_tms { - target_clock_t tms_utime; - target_clock_t tms_stime; - target_clock_t tms_cutime; - target_clock_t tms_cstime; -}; - -struct target_utimbuf { - abi_long actime; - abi_long modtime; -}; - -struct target_sel_arg_struct { - abi_long n; - abi_long inp, outp, exp; - abi_long tvp; -}; - -struct target_iovec { - abi_long iov_base; /* Starting address */ - abi_long iov_len; /* Number of bytes */ -}; - -struct target_msghdr { - abi_long msg_name; /* Socket name */ - int msg_namelen; /* Length of name */ - abi_long msg_iov; /* Data blocks */ - abi_long msg_iovlen; /* Number of blocks */ - abi_long msg_control; /* Per protocol magic (eg BSD file descriptor passing) */ - abi_long msg_controllen; /* Length of cmsg list */ - unsigned int msg_flags; -}; - -struct target_cmsghdr { - abi_long cmsg_len; - int cmsg_level; - int cmsg_type; -}; - -#define TARGET_CMSG_DATA(cmsg) ((unsigned char *) ((struct target_cmsghdr *) (cmsg) + 1)) -#define TARGET_CMSG_NXTHDR(mhdr, cmsg, cmsg_start) \ - __target_cmsg_nxthdr(mhdr, cmsg, cmsg_start) -#define TARGET_CMSG_ALIGN(len) (((len) + sizeof (abi_long) - 1) \ - & (size_t) ~(sizeof (abi_long) - 1)) -#define TARGET_CMSG_SPACE(len) (TARGET_CMSG_ALIGN (len) \ - + TARGET_CMSG_ALIGN (sizeof (struct target_cmsghdr))) -#define TARGET_CMSG_LEN(len) (TARGET_CMSG_ALIGN (sizeof (struct target_cmsghdr)) + (len)) - -static __inline__ struct target_cmsghdr * -__target_cmsg_nxthdr(struct target_msghdr *__mhdr, - struct target_cmsghdr *__cmsg, - struct target_cmsghdr *__cmsg_start) -{ - struct target_cmsghdr *__ptr; - - __ptr = (struct target_cmsghdr *)((unsigned char *) __cmsg - + TARGET_CMSG_ALIGN (tswapal(__cmsg->cmsg_len))); - if ((unsigned long)((char *)(__ptr+1) - (char *)__cmsg_start) - > tswapal(__mhdr->msg_controllen)) { - /* No more entries. */ - return (struct target_cmsghdr *)0; - } - return __ptr; -} - -struct target_mmsghdr { - struct target_msghdr msg_hdr; /* Message header */ - unsigned int msg_len; /* Number of bytes transmitted */ -}; - -struct target_rusage { - struct target_timeval ru_utime; /* user time used */ - struct target_timeval ru_stime; /* system time used */ - abi_long ru_maxrss; /* maximum resident set size */ - abi_long ru_ixrss; /* integral shared memory size */ - abi_long ru_idrss; /* integral unshared data size */ - abi_long ru_isrss; /* integral unshared stack size */ - abi_long ru_minflt; /* page reclaims */ - abi_long ru_majflt; /* page faults */ - abi_long ru_nswap; /* swaps */ - abi_long ru_inblock; /* block input operations */ - abi_long ru_oublock; /* block output operations */ - abi_long ru_msgsnd; /* messages sent */ - abi_long ru_msgrcv; /* messages received */ - abi_long ru_nsignals; /* signals received */ - abi_long ru_nvcsw; /* voluntary context switches */ - abi_long ru_nivcsw; /* involuntary " */ -}; - -typedef struct { - int val[2]; -} kernel_fsid_t; - -struct kernel_statfs { - int f_type; - int f_bsize; - int f_blocks; - int f_bfree; - int f_bavail; - int f_files; - int f_ffree; - kernel_fsid_t f_fsid; - int f_namelen; - int f_spare[6]; -}; - -struct target_dirent { - abi_long d_ino; - abi_long d_off; - unsigned short d_reclen; - char d_name[]; -}; - -struct target_dirent64 { - uint64_t d_ino; - int64_t d_off; - unsigned short d_reclen; - unsigned char d_type; - char d_name[256]; -}; - - -/* mostly generic signal stuff */ -#define TARGET_SIG_DFL ((abi_long)0) /* default signal handling */ -#define TARGET_SIG_IGN ((abi_long)1) /* ignore signal */ -#define TARGET_SIG_ERR ((abi_long)-1) /* error return from signal */ - -#ifdef TARGET_MIPS -#define TARGET_NSIG 128 -#else -#define TARGET_NSIG 64 -#endif -#define TARGET_NSIG_BPW TARGET_ABI_BITS -#define TARGET_NSIG_WORDS (TARGET_NSIG / TARGET_NSIG_BPW) - -typedef struct { - abi_ulong sig[TARGET_NSIG_WORDS]; -} target_sigset_t; - -#ifdef BSWAP_NEEDED -static inline void tswap_sigset(target_sigset_t *d, const target_sigset_t *s) -{ - int i; - for(i = 0;i < TARGET_NSIG_WORDS; i++) - d->sig[i] = tswapal(s->sig[i]); -} -#else -static inline void tswap_sigset(target_sigset_t *d, const target_sigset_t *s) -{ - *d = *s; -} -#endif - -static inline void target_siginitset(target_sigset_t *d, abi_ulong set) -{ - int i; - d->sig[0] = set; - for(i = 1;i < TARGET_NSIG_WORDS; i++) - d->sig[i] = 0; -} - -void host_to_target_sigset(target_sigset_t *d, const sigset_t *s); -void target_to_host_sigset(sigset_t *d, const target_sigset_t *s); -void host_to_target_old_sigset(abi_ulong *old_sigset, - const sigset_t *sigset); -void target_to_host_old_sigset(sigset_t *sigset, - const abi_ulong *old_sigset); -struct target_sigaction; -int do_sigaction(int sig, const struct target_sigaction *act, - struct target_sigaction *oact); - -#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \ - || defined(TARGET_PPC) || defined(TARGET_MIPS) || defined(TARGET_SH4) \ - || defined(TARGET_M68K) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) \ - || defined(TARGET_MICROBLAZE) || defined(TARGET_UNICORE32) \ - || defined(TARGET_S390X) || defined(TARGET_OPENRISC) \ - || defined(TARGET_TILEGX) - -#if defined(TARGET_SPARC) -#define TARGET_SA_NOCLDSTOP 8u -#define TARGET_SA_NOCLDWAIT 0x100u -#define TARGET_SA_SIGINFO 0x200u -#define TARGET_SA_ONSTACK 1u -#define TARGET_SA_RESTART 2u -#define TARGET_SA_NODEFER 0x20u -#define TARGET_SA_RESETHAND 4u -#elif defined(TARGET_MIPS) -#define TARGET_SA_NOCLDSTOP 0x00000001 -#define TARGET_SA_NOCLDWAIT 0x00010000 -#define TARGET_SA_SIGINFO 0x00000008 -#define TARGET_SA_ONSTACK 0x08000000 -#define TARGET_SA_NODEFER 0x40000000 -#define TARGET_SA_RESTART 0x10000000 -#define TARGET_SA_RESETHAND 0x80000000 -#if !defined(TARGET_ABI_MIPSN32) && !defined(TARGET_ABI_MIPSN64) -#define TARGET_SA_RESTORER 0x04000000 /* Only for O32 */ -#endif -#elif defined(TARGET_OPENRISC) -#define TARGET_SA_NOCLDSTOP 0x00000001 -#define TARGET_SA_NOCLDWAIT 0x00000002 -#define TARGET_SA_SIGINFO 0x00000004 -#define TARGET_SA_ONSTACK 0x08000000 -#define TARGET_SA_RESTART 0x10000000 -#define TARGET_SA_NODEFER 0x40000000 -#define TARGET_SA_RESETHAND 0x80000000 -#elif defined(TARGET_ALPHA) -#define TARGET_SA_ONSTACK 0x00000001 -#define TARGET_SA_RESTART 0x00000002 -#define TARGET_SA_NOCLDSTOP 0x00000004 -#define TARGET_SA_NODEFER 0x00000008 -#define TARGET_SA_RESETHAND 0x00000010 -#define TARGET_SA_NOCLDWAIT 0x00000020 /* not supported yet */ -#define TARGET_SA_SIGINFO 0x00000040 -#else -#define TARGET_SA_NOCLDSTOP 0x00000001 -#define TARGET_SA_NOCLDWAIT 0x00000002 /* not supported yet */ -#define TARGET_SA_SIGINFO 0x00000004 -#define TARGET_SA_ONSTACK 0x08000000 -#define TARGET_SA_RESTART 0x10000000 -#define TARGET_SA_NODEFER 0x40000000 -#define TARGET_SA_RESETHAND 0x80000000 -#define TARGET_SA_RESTORER 0x04000000 -#endif - -#if defined(TARGET_ALPHA) - -#define TARGET_SIGHUP 1 -#define TARGET_SIGINT 2 -#define TARGET_SIGQUIT 3 -#define TARGET_SIGILL 4 -#define TARGET_SIGTRAP 5 -#define TARGET_SIGABRT 6 -#define TARGET_SIGSTKFLT 7 /* actually SIGEMT */ -#define TARGET_SIGFPE 8 -#define TARGET_SIGKILL 9 -#define TARGET_SIGBUS 10 -#define TARGET_SIGSEGV 11 -#define TARGET_SIGSYS 12 -#define TARGET_SIGPIPE 13 -#define TARGET_SIGALRM 14 -#define TARGET_SIGTERM 15 -#define TARGET_SIGURG 16 -#define TARGET_SIGSTOP 17 -#define TARGET_SIGTSTP 18 -#define TARGET_SIGCONT 19 -#define TARGET_SIGCHLD 20 -#define TARGET_SIGTTIN 21 -#define TARGET_SIGTTOU 22 -#define TARGET_SIGIO 23 -#define TARGET_SIGXCPU 24 -#define TARGET_SIGXFSZ 25 -#define TARGET_SIGVTALRM 26 -#define TARGET_SIGPROF 27 -#define TARGET_SIGWINCH 28 -#define TARGET_SIGPWR 29 /* actually SIGINFO */ -#define TARGET_SIGUSR1 30 -#define TARGET_SIGUSR2 31 -#define TARGET_SIGRTMIN 32 - -#define TARGET_SIG_BLOCK 1 -#define TARGET_SIG_UNBLOCK 2 -#define TARGET_SIG_SETMASK 3 - -#elif defined(TARGET_SPARC) - -#define TARGET_SIGHUP 1 -#define TARGET_SIGINT 2 -#define TARGET_SIGQUIT 3 -#define TARGET_SIGILL 4 -#define TARGET_SIGTRAP 5 -#define TARGET_SIGABRT 6 -#define TARGET_SIGIOT 6 -#define TARGET_SIGSTKFLT 7 /* actually EMT */ -#define TARGET_SIGFPE 8 -#define TARGET_SIGKILL 9 -#define TARGET_SIGBUS 10 -#define TARGET_SIGSEGV 11 -#define TARGET_SIGSYS 12 -#define TARGET_SIGPIPE 13 -#define TARGET_SIGALRM 14 -#define TARGET_SIGTERM 15 -#define TARGET_SIGURG 16 -#define TARGET_SIGSTOP 17 -#define TARGET_SIGTSTP 18 -#define TARGET_SIGCONT 19 -#define TARGET_SIGCHLD 20 -#define TARGET_SIGTTIN 21 -#define TARGET_SIGTTOU 22 -#define TARGET_SIGIO 23 -#define TARGET_SIGXCPU 24 -#define TARGET_SIGXFSZ 25 -#define TARGET_SIGVTALRM 26 -#define TARGET_SIGPROF 27 -#define TARGET_SIGWINCH 28 -#define TARGET_SIGPWR 29 -#define TARGET_SIGUSR1 30 -#define TARGET_SIGUSR2 31 -#define TARGET_SIGRTMIN 32 - -#define TARGET_SIG_BLOCK 0x01 /* for blocking signals */ -#define TARGET_SIG_UNBLOCK 0x02 /* for unblocking signals */ -#define TARGET_SIG_SETMASK 0x04 /* for setting the signal mask */ - -#elif defined(TARGET_MIPS) - -#define TARGET_SIGHUP 1 /* Hangup (POSIX). */ -#define TARGET_SIGINT 2 /* Interrupt (ANSI). */ -#define TARGET_SIGQUIT 3 /* Quit (POSIX). */ -#define TARGET_SIGILL 4 /* Illegal instruction (ANSI). */ -#define TARGET_SIGTRAP 5 /* Trace trap (POSIX). */ -#define TARGET_SIGIOT 6 /* IOT trap (4.2 BSD). */ -#define TARGET_SIGABRT TARGET_SIGIOT /* Abort (ANSI). */ -#define TARGET_SIGEMT 7 -#define TARGET_SIGSTKFLT 7 /* XXX: incorrect */ -#define TARGET_SIGFPE 8 /* Floating-point exception (ANSI). */ -#define TARGET_SIGKILL 9 /* Kill, unblockable (POSIX). */ -#define TARGET_SIGBUS 10 /* BUS error (4.2 BSD). */ -#define TARGET_SIGSEGV 11 /* Segmentation violation (ANSI). */ -#define TARGET_SIGSYS 12 -#define TARGET_SIGPIPE 13 /* Broken pipe (POSIX). */ -#define TARGET_SIGALRM 14 /* Alarm clock (POSIX). */ -#define TARGET_SIGTERM 15 /* Termination (ANSI). */ -#define TARGET_SIGUSR1 16 /* User-defined signal 1 (POSIX). */ -#define TARGET_SIGUSR2 17 /* User-defined signal 2 (POSIX). */ -#define TARGET_SIGCHLD 18 /* Child status has changed (POSIX). */ -#define TARGET_SIGCLD TARGET_SIGCHLD /* Same as TARGET_SIGCHLD (System V). */ -#define TARGET_SIGPWR 19 /* Power failure restart (System V). */ -#define TARGET_SIGWINCH 20 /* Window size change (4.3 BSD, Sun). */ -#define TARGET_SIGURG 21 /* Urgent condition on socket (4.2 BSD). */ -#define TARGET_SIGIO 22 /* I/O now possible (4.2 BSD). */ -#define TARGET_SIGPOLL TARGET_SIGIO /* Pollable event occurred (System V). */ -#define TARGET_SIGSTOP 23 /* Stop, unblockable (POSIX). */ -#define TARGET_SIGTSTP 24 /* Keyboard stop (POSIX). */ -#define TARGET_SIGCONT 25 /* Continue (POSIX). */ -#define TARGET_SIGTTIN 26 /* Background read from tty (POSIX). */ -#define TARGET_SIGTTOU 27 /* Background write to tty (POSIX). */ -#define TARGET_SIGVTALRM 28 /* Virtual alarm clock (4.2 BSD). */ -#define TARGET_SIGPROF 29 /* Profiling alarm clock (4.2 BSD). */ -#define TARGET_SIGXCPU 30 /* CPU limit exceeded (4.2 BSD). */ -#define TARGET_SIGXFSZ 31 /* File size limit exceeded (4.2 BSD). */ -#define TARGET_SIGRTMIN 32 - -#define TARGET_SIG_BLOCK 1 /* for blocking signals */ -#define TARGET_SIG_UNBLOCK 2 /* for unblocking signals */ -#define TARGET_SIG_SETMASK 3 /* for setting the signal mask */ - -#else - -/* OpenRISC Using the general signals */ -#define TARGET_SIGHUP 1 -#define TARGET_SIGINT 2 -#define TARGET_SIGQUIT 3 -#define TARGET_SIGILL 4 -#define TARGET_SIGTRAP 5 -#define TARGET_SIGABRT 6 -#define TARGET_SIGIOT 6 -#define TARGET_SIGBUS 7 -#define TARGET_SIGFPE 8 -#define TARGET_SIGKILL 9 -#define TARGET_SIGUSR1 10 -#define TARGET_SIGSEGV 11 -#define TARGET_SIGUSR2 12 -#define TARGET_SIGPIPE 13 -#define TARGET_SIGALRM 14 -#define TARGET_SIGTERM 15 -#define TARGET_SIGSTKFLT 16 -#define TARGET_SIGCHLD 17 -#define TARGET_SIGCONT 18 -#define TARGET_SIGSTOP 19 -#define TARGET_SIGTSTP 20 -#define TARGET_SIGTTIN 21 -#define TARGET_SIGTTOU 22 -#define TARGET_SIGURG 23 -#define TARGET_SIGXCPU 24 -#define TARGET_SIGXFSZ 25 -#define TARGET_SIGVTALRM 26 -#define TARGET_SIGPROF 27 -#define TARGET_SIGWINCH 28 -#define TARGET_SIGIO 29 -#define TARGET_SIGPWR 30 -#define TARGET_SIGSYS 31 -#define TARGET_SIGRTMIN 32 - -#define TARGET_SIG_BLOCK 0 /* for blocking signals */ -#define TARGET_SIG_UNBLOCK 1 /* for unblocking signals */ -#define TARGET_SIG_SETMASK 2 /* for setting the signal mask */ - -#endif - -#if defined(TARGET_ALPHA) -struct target_old_sigaction { - abi_ulong _sa_handler; - abi_ulong sa_mask; - int32_t sa_flags; -}; - -struct target_rt_sigaction { - abi_ulong _sa_handler; - abi_ulong sa_flags; - target_sigset_t sa_mask; -}; - -/* This is the struct used inside the kernel. The ka_restorer - field comes from the 5th argument to sys_rt_sigaction. */ -struct target_sigaction { - abi_ulong _sa_handler; - abi_ulong sa_flags; - target_sigset_t sa_mask; - abi_ulong sa_restorer; -}; -#elif defined(TARGET_MIPS) -struct target_sigaction { - uint32_t sa_flags; -#if defined(TARGET_ABI_MIPSN32) - uint32_t _sa_handler; -#else - abi_ulong _sa_handler; -#endif - target_sigset_t sa_mask; -}; -#else -struct target_old_sigaction { - abi_ulong _sa_handler; - abi_ulong sa_mask; - abi_ulong sa_flags; - abi_ulong sa_restorer; -}; - -struct target_sigaction { - abi_ulong _sa_handler; - abi_ulong sa_flags; - abi_ulong sa_restorer; - target_sigset_t sa_mask; -}; -#endif - -typedef union target_sigval { - int sival_int; - abi_ulong sival_ptr; -} target_sigval_t; -#if 0 -#if defined (TARGET_SPARC) -typedef struct { - struct { - abi_ulong psr; - abi_ulong pc; - abi_ulong npc; - abi_ulong y; - abi_ulong u_regs[16]; /* globals and ins */ - } si_regs; - int si_mask; -} __siginfo_t; - -typedef struct { - unsigned long si_float_regs [32]; - unsigned long si_fsr; - unsigned long si_fpqdepth; - struct { - unsigned long *insn_addr; - unsigned long insn; - } si_fpqueue [16]; -} __siginfo_fpu_t; -#endif -#endif - -#define TARGET_SI_MAX_SIZE 128 - -#if TARGET_ABI_BITS == 32 -#define TARGET_SI_PREAMBLE_SIZE (3 * sizeof(int)) -#else -#define TARGET_SI_PREAMBLE_SIZE (4 * sizeof(int)) -#endif - -#define TARGET_SI_PAD_SIZE ((TARGET_SI_MAX_SIZE - TARGET_SI_PREAMBLE_SIZE) / sizeof(int)) - -typedef struct target_siginfo { -#ifdef TARGET_MIPS - int si_signo; - int si_code; - int si_errno; -#else - int si_signo; - int si_errno; - int si_code; -#endif - - union { - int _pad[TARGET_SI_PAD_SIZE]; - - /* kill() */ - struct { - pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ - } _kill; - - /* POSIX.1b timers */ - struct { - unsigned int _timer1; - unsigned int _timer2; - } _timer; - - /* POSIX.1b signals */ - struct { - pid_t _pid; /* sender's pid */ - uid_t _uid; /* sender's uid */ - target_sigval_t _sigval; - } _rt; - - /* SIGCHLD */ - struct { - pid_t _pid; /* which child */ - uid_t _uid; /* sender's uid */ - int _status; /* exit code */ - target_clock_t _utime; - target_clock_t _stime; - } _sigchld; - - /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ - struct { - abi_ulong _addr; /* faulting insn/memory ref. */ - } _sigfault; - - /* SIGPOLL */ - struct { - int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ - int _fd; - } _sigpoll; - } _sifields; -} target_siginfo_t; - -/* - * si_code values - * Digital reserves positive values for kernel-generated signals. - */ -#define TARGET_SI_USER 0 /* sent by kill, sigsend, raise */ -#define TARGET_SI_KERNEL 0x80 /* sent by the kernel from somewhere */ -#define TARGET_SI_QUEUE -1 /* sent by sigqueue */ -#define TARGET_SI_TIMER -2 /* sent by timer expiration */ -#define TARGET_SI_MESGQ -3 /* sent by real time mesq state change */ -#define TARGET_SI_ASYNCIO -4 /* sent by AIO completion */ -#define TARGET_SI_SIGIO -5 /* sent by queued SIGIO */ - -/* - * SIGILL si_codes - */ -#define TARGET_ILL_ILLOPC (1) /* illegal opcode */ -#define TARGET_ILL_ILLOPN (2) /* illegal operand */ -#define TARGET_ILL_ILLADR (3) /* illegal addressing mode */ -#define TARGET_ILL_ILLTRP (4) /* illegal trap */ -#define TARGET_ILL_PRVOPC (5) /* privileged opcode */ -#define TARGET_ILL_PRVREG (6) /* privileged register */ -#define TARGET_ILL_COPROC (7) /* coprocessor error */ -#define TARGET_ILL_BADSTK (8) /* internal stack error */ -#ifdef TARGET_TILEGX -#define TARGET_ILL_DBLFLT (9) /* double fault */ -#define TARGET_ILL_HARDWALL (10) /* user networks hardwall violation */ -#endif - -/* - * SIGFPE si_codes - */ -#define TARGET_FPE_INTDIV (1) /* integer divide by zero */ -#define TARGET_FPE_INTOVF (2) /* integer overflow */ -#define TARGET_FPE_FLTDIV (3) /* floating point divide by zero */ -#define TARGET_FPE_FLTOVF (4) /* floating point overflow */ -#define TARGET_FPE_FLTUND (5) /* floating point underflow */ -#define TARGET_FPE_FLTRES (6) /* floating point inexact result */ -#define TARGET_FPE_FLTINV (7) /* floating point invalid operation */ -#define TARGET_FPE_FLTSUB (8) /* subscript out of range */ -#define TARGET_NSIGFPE 8 - -/* - * SIGSEGV si_codes - */ -#define TARGET_SEGV_MAPERR (1) /* address not mapped to object */ -#define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped object */ -#define TARGET_SEGV_BNDERR (3) /* failed address bound checks */ - -/* - * SIGBUS si_codes - */ -#define TARGET_BUS_ADRALN (1) /* invalid address alignment */ -#define TARGET_BUS_ADRERR (2) /* non-existent physical address */ -#define TARGET_BUS_OBJERR (3) /* object specific hardware error */ -/* hardware memory error consumed on a machine check: action required */ -#define TARGET_BUS_MCEERR_AR (4) -/* hardware memory error detected in process but not consumed: action optional*/ -#define TARGET_BUS_MCEERR_AO (5) - -/* - * SIGTRAP si_codes - */ -#define TARGET_TRAP_BRKPT (1) /* process breakpoint */ -#define TARGET_TRAP_TRACE (2) /* process trace trap */ -#define TARGET_TRAP_BRANCH (3) /* process taken branch trap */ -#define TARGET_TRAP_HWBKPT (4) /* hardware breakpoint/watchpoint */ - -#endif /* defined(TARGET_I386) || defined(TARGET_ARM) */ - -struct target_rlimit { - abi_ulong rlim_cur; - abi_ulong rlim_max; -}; - -#if defined(TARGET_ALPHA) -#define TARGET_RLIM_INFINITY 0x7fffffffffffffffull -#elif defined(TARGET_MIPS) || (defined(TARGET_SPARC) && TARGET_ABI_BITS == 32) -#define TARGET_RLIM_INFINITY 0x7fffffffUL -#else -#define TARGET_RLIM_INFINITY ((abi_ulong)-1) -#endif - -#if defined(TARGET_MIPS) -#define TARGET_RLIMIT_CPU 0 -#define TARGET_RLIMIT_FSIZE 1 -#define TARGET_RLIMIT_DATA 2 -#define TARGET_RLIMIT_STACK 3 -#define TARGET_RLIMIT_CORE 4 -#define TARGET_RLIMIT_RSS 7 -#define TARGET_RLIMIT_NPROC 8 -#define TARGET_RLIMIT_NOFILE 5 -#define TARGET_RLIMIT_MEMLOCK 9 -#define TARGET_RLIMIT_AS 6 -#define TARGET_RLIMIT_LOCKS 10 -#define TARGET_RLIMIT_SIGPENDING 11 -#define TARGET_RLIMIT_MSGQUEUE 12 -#define TARGET_RLIMIT_NICE 13 -#define TARGET_RLIMIT_RTPRIO 14 -#else -#define TARGET_RLIMIT_CPU 0 -#define TARGET_RLIMIT_FSIZE 1 -#define TARGET_RLIMIT_DATA 2 -#define TARGET_RLIMIT_STACK 3 -#define TARGET_RLIMIT_CORE 4 -#define TARGET_RLIMIT_RSS 5 -#if defined(TARGET_SPARC) -#define TARGET_RLIMIT_NOFILE 6 -#define TARGET_RLIMIT_NPROC 7 -#else -#define TARGET_RLIMIT_NPROC 6 -#define TARGET_RLIMIT_NOFILE 7 -#endif -#define TARGET_RLIMIT_MEMLOCK 8 -#define TARGET_RLIMIT_AS 9 -#define TARGET_RLIMIT_LOCKS 10 -#define TARGET_RLIMIT_SIGPENDING 11 -#define TARGET_RLIMIT_MSGQUEUE 12 -#define TARGET_RLIMIT_NICE 13 -#define TARGET_RLIMIT_RTPRIO 14 -#endif - -struct target_pollfd { - int fd; /* file descriptor */ - short events; /* requested events */ - short revents; /* returned events */ -}; - -/* virtual terminal ioctls */ -#define TARGET_KIOCSOUND 0x4B2F /* start sound generation (0 for off) */ -#define TARGET_KDMKTONE 0x4B30 /* generate tone */ -#define TARGET_KDGKBTYPE 0x4b33 -#define TARGET_KDSETMODE 0x4b3a -#define TARGET_KDGKBMODE 0x4b44 -#define TARGET_KDSKBMODE 0x4b45 -#define TARGET_KDGKBENT 0x4B46 /* gets one entry in translation table */ -#define TARGET_KDGKBSENT 0x4B48 /* gets one function key string entry */ -#define TARGET_KDGKBLED 0x4B64 /* get led flags (not lights) */ -#define TARGET_KDSKBLED 0x4B65 /* set led flags (not lights) */ -#define TARGET_KDGETLED 0x4B31 /* return current led state */ -#define TARGET_KDSETLED 0x4B32 /* set led state [lights, not flags] */ -#define TARGET_KDSIGACCEPT 0x4B4E - -#define TARGET_SIOCATMARK 0x8905 - -/* Networking ioctls */ -#define TARGET_SIOCADDRT 0x890B /* add routing table entry */ -#define TARGET_SIOCDELRT 0x890C /* delete routing table entry */ -#define TARGET_SIOCGIFNAME 0x8910 /* get iface name */ -#define TARGET_SIOCSIFLINK 0x8911 /* set iface channel */ -#define TARGET_SIOCGIFCONF 0x8912 /* get iface list */ -#define TARGET_SIOCGIFFLAGS 0x8913 /* get flags */ -#define TARGET_SIOCSIFFLAGS 0x8914 /* set flags */ -#define TARGET_SIOCGIFADDR 0x8915 /* get PA address */ -#define TARGET_SIOCSIFADDR 0x8916 /* set PA address */ -#define TARGET_SIOCGIFDSTADDR 0x8917 /* get remote PA address */ -#define TARGET_SIOCSIFDSTADDR 0x8918 /* set remote PA address */ -#define TARGET_SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ -#define TARGET_SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ -#define TARGET_SIOCGIFNETMASK 0x891b /* get network PA mask */ -#define TARGET_SIOCSIFNETMASK 0x891c /* set network PA mask */ -#define TARGET_SIOCGIFMETRIC 0x891d /* get metric */ -#define TARGET_SIOCSIFMETRIC 0x891e /* set metric */ -#define TARGET_SIOCGIFMEM 0x891f /* get memory address (BSD) */ -#define TARGET_SIOCSIFMEM 0x8920 /* set memory address (BSD) */ -#define TARGET_SIOCGIFMTU 0x8921 /* get MTU size */ -#define TARGET_SIOCSIFMTU 0x8922 /* set MTU size */ -#define TARGET_SIOCSIFHWADDR 0x8924 /* set hardware address (NI) */ -#define TARGET_SIOCGIFENCAP 0x8925 /* get/set slip encapsulation */ -#define TARGET_SIOCSIFENCAP 0x8926 -#define TARGET_SIOCGIFHWADDR 0x8927 /* Get hardware address */ -#define TARGET_SIOCGIFSLAVE 0x8929 /* Driver slaving support */ -#define TARGET_SIOCSIFSLAVE 0x8930 -#define TARGET_SIOCADDMULTI 0x8931 /* Multicast address lists */ -#define TARGET_SIOCDELMULTI 0x8932 -#define TARGET_SIOCGIFINDEX 0x8933 - -/* Bridging control calls */ -#define TARGET_SIOCGIFBR 0x8940 /* Bridging support */ -#define TARGET_SIOCSIFBR 0x8941 /* Set bridging options */ - -#define TARGET_SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */ -#define TARGET_SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */ - -/* ARP cache control calls. */ -#define TARGET_OLD_SIOCDARP 0x8950 /* old delete ARP table entry */ -#define TARGET_OLD_SIOCGARP 0x8951 /* old get ARP table entry */ -#define TARGET_OLD_SIOCSARP 0x8952 /* old set ARP table entry */ -#define TARGET_SIOCDARP 0x8953 /* delete ARP table entry */ -#define TARGET_SIOCGARP 0x8954 /* get ARP table entry */ -#define TARGET_SIOCSARP 0x8955 /* set ARP table entry */ - -/* RARP cache control calls. */ -#define TARGET_SIOCDRARP 0x8960 /* delete RARP table entry */ -#define TARGET_SIOCGRARP 0x8961 /* get RARP table entry */ -#define TARGET_SIOCSRARP 0x8962 /* set RARP table entry */ - -/* Driver configuration calls */ -#define TARGET_SIOCGIFMAP 0x8970 /* Get device parameters */ -#define TARGET_SIOCSIFMAP 0x8971 /* Set device parameters */ - -/* DLCI configuration calls */ -#define TARGET_SIOCADDDLCI 0x8980 /* Create new DLCI device */ -#define TARGET_SIOCDELDLCI 0x8981 /* Delete DLCI device */ - -/* From <linux/wireless.h> */ - -#define TARGET_SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ - -/* From <linux/fs.h> */ - -#define TARGET_BLKROSET TARGET_IO(0x12,93) /* set device read-only (0 = read-write) */ -#define TARGET_BLKROGET TARGET_IO(0x12,94) /* get read-only status (0 = read_write) */ -#define TARGET_BLKRRPART TARGET_IO(0x12,95) /* re-read partition table */ -#define TARGET_BLKGETSIZE TARGET_IO(0x12,96) /* return device size /512 (long *arg) */ -#define TARGET_BLKFLSBUF TARGET_IO(0x12,97) /* flush buffer cache */ -#define TARGET_BLKRASET TARGET_IO(0x12,98) /* Set read ahead for block device */ -#define TARGET_BLKRAGET TARGET_IO(0x12,99) /* get current read ahead setting */ -#define TARGET_BLKFRASET TARGET_IO(0x12,100)/* set filesystem (mm/filemap.c) read-ahead */ -#define TARGET_BLKFRAGET TARGET_IO(0x12,101)/* get filesystem (mm/filemap.c) read-ahead */ -#define TARGET_BLKSECTSET TARGET_IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */ -#define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */ -#define TARGET_BLKSSZGET TARGET_IO(0x12,104)/* get block device sector size */ -#define TARGET_BLKPG TARGET_IO(0x12,105)/* Partition table and disk geometry handling */ -/* A jump here: 108-111 have been used for various private purposes. */ -#define TARGET_BLKBSZGET TARGET_IOR(0x12, 112, abi_ulong) -#define TARGET_BLKBSZSET TARGET_IOW(0x12, 113, abi_ulong) -#define TARGET_BLKGETSIZE64 TARGET_IOR(0x12,114,abi_ulong) - /* return device size in bytes - (u64 *arg) */ -#define TARGET_FIBMAP TARGET_IO(0x00,1) /* bmap access */ -#define TARGET_FIGETBSZ TARGET_IO(0x00,2) /* get the block size used for bmap */ -#define TARGET_FS_IOC_FIEMAP TARGET_IOWR('f',11,struct fiemap) - -/* cdrom commands */ -#define TARGET_CDROMPAUSE 0x5301 /* Pause Audio Operation */ -#define TARGET_CDROMRESUME 0x5302 /* Resume paused Audio Operation */ -#define TARGET_CDROMPLAYMSF 0x5303 /* Play Audio MSF (struct cdrom_msf) */ -#define TARGET_CDROMPLAYTRKIND 0x5304 /* Play Audio Track/index - (struct cdrom_ti) */ -#define TARGET_CDROMREADTOCHDR 0x5305 /* Read TOC header - (struct cdrom_tochdr) */ -#define TARGET_CDROMREADTOCENTRY 0x5306 /* Read TOC entry - (struct cdrom_tocentry) */ -#define TARGET_CDROMSTOP 0x5307 /* Stop the cdrom drive */ -#define TARGET_CDROMSTART 0x5308 /* Start the cdrom drive */ -#define TARGET_CDROMEJECT 0x5309 /* Ejects the cdrom media */ -#define TARGET_CDROMVOLCTRL 0x530a /* Control output volume - (struct cdrom_volctrl) */ -#define TARGET_CDROMSUBCHNL 0x530b /* Read subchannel data - (struct cdrom_subchnl) */ -#define TARGET_CDROMREADMODE2 0x530c /* Read TARGET_CDROM mode 2 data (2336 Bytes) - (struct cdrom_read) */ -#define TARGET_CDROMREADMODE1 0x530d /* Read TARGET_CDROM mode 1 data (2048 Bytes) - (struct cdrom_read) */ -#define TARGET_CDROMREADAUDIO 0x530e /* (struct cdrom_read_audio) */ -#define TARGET_CDROMEJECT_SW 0x530f /* enable(1)/disable(0) auto-ejecting */ -#define TARGET_CDROMMULTISESSION 0x5310 /* Obtain the start-of-last-session - address of multi session disks - (struct cdrom_multisession) */ -#define TARGET_CDROM_GET_MCN 0x5311 /* Obtain the "Universal Product Code" - if available (struct cdrom_mcn) */ -#define TARGET_CDROM_GET_UPC TARGET_CDROM_GET_MCN /* This one is deprecated, - but here anyway for compatibility */ -#define TARGET_CDROMRESET 0x5312 /* hard-reset the drive */ -#define TARGET_CDROMVOLREAD 0x5313 /* Get the drive's volume setting - (struct cdrom_volctrl) */ -#define TARGET_CDROMREADRAW 0x5314 /* read data in raw mode (2352 Bytes) - (struct cdrom_read) */ -/* - * These ioctls are used only used in aztcd.c and optcd.c - */ -#define TARGET_CDROMREADCOOKED 0x5315 /* read data in cooked mode */ -#define TARGET_CDROMSEEK 0x5316 /* seek msf address */ - -/* - * This ioctl is only used by the scsi-cd driver. - It is for playing audio in logical block addressing mode. - */ -#define TARGET_CDROMPLAYBLK 0x5317 /* (struct cdrom_blk) */ - -/* - * These ioctls are only used in optcd.c - */ -#define TARGET_CDROMREADALL 0x5318 /* read all 2646 bytes */ - -/* - * These ioctls are (now) only in ide-cd.c for controlling - * drive spindown time. They should be implemented in the - * Uniform driver, via generic packet commands, GPCMD_MODE_SELECT_10, - * GPCMD_MODE_SENSE_10 and the GPMODE_POWER_PAGE... - * -Erik - */ -#define TARGET_CDROMGETSPINDOWN 0x531d -#define TARGET_CDROMSETSPINDOWN 0x531e - -/* - * These ioctls are implemented through the uniform CD-ROM driver - * They _will_ be adopted by all CD-ROM drivers, when all the CD-ROM - * drivers are eventually ported to the uniform CD-ROM driver interface. - */ -#define TARGET_CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */ -#define TARGET_CDROM_SET_OPTIONS 0x5320 /* Set behavior options */ -#define TARGET_CDROM_CLEAR_OPTIONS 0x5321 /* Clear behavior options */ -#define TARGET_CDROM_SELECT_SPEED 0x5322 /* Set the CD-ROM speed */ -#define TARGET_CDROM_SELECT_DISC 0x5323 /* Select disc (for juke-boxes) */ -#define TARGET_CDROM_MEDIA_CHANGED 0x5325 /* Check is media changed */ -#define TARGET_CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */ -#define TARGET_CDROM_DISC_STATUS 0x5327 /* Get disc type, etc. */ -#define TARGET_CDROM_CHANGER_NSLOTS 0x5328 /* Get number of slots */ -#define TARGET_CDROM_LOCKDOOR 0x5329 /* lock or unlock door */ -#define TARGET_CDROM_DEBUG 0x5330 /* Turn debug messages on/off */ -#define TARGET_CDROM_GET_CAPABILITY 0x5331 /* get capabilities */ - -/* Note that scsi/scsi_ioctl.h also uses 0x5382 - 0x5386. - * Future CDROM ioctls should be kept below 0x537F - */ - -/* This ioctl is only used by sbpcd at the moment */ -#define TARGET_CDROMAUDIOBUFSIZ 0x5382 /* set the audio buffer size */ - /* conflict with SCSI_IOCTL_GET_IDLUN */ - -/* DVD-ROM Specific ioctls */ -#define TARGET_DVD_READ_STRUCT 0x5390 /* Read structure */ -#define TARGET_DVD_WRITE_STRUCT 0x5391 /* Write structure */ -#define TARGET_DVD_AUTH 0x5392 /* Authentication */ - -#define TARGET_CDROM_SEND_PACKET 0x5393 /* send a packet to the drive */ -#define TARGET_CDROM_NEXT_WRITABLE 0x5394 /* get next writable block */ -#define TARGET_CDROM_LAST_WRITTEN 0x5395 /* get last block written on disc */ - -/* HD commands */ - -/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x030n/0x031n */ -#define TARGET_HDIO_GETGEO 0x0301 /* get device geometry */ -#define TARGET_HDIO_GET_UNMASKINTR 0x0302 /* get current unmask setting */ -#define TARGET_HDIO_GET_MULTCOUNT 0x0304 /* get current IDE blockmode setting */ -#define TARGET_HDIO_GET_KEEPSETTINGS 0x0308 /* get keep-settings-on-reset flag */ -#define TARGET_HDIO_GET_32BIT 0x0309 /* get current io_32bit setting */ -#define TARGET_HDIO_GET_NOWERR 0x030a /* get ignore-write-error flag */ -#define TARGET_HDIO_GET_DMA 0x030b /* get use-dma flag */ -#define TARGET_HDIO_GET_IDENTITY 0x030d /* get IDE identification info */ -#define TARGET_HDIO_DRIVE_CMD 0x031f /* execute a special drive command */ - -/* hd/ide ctl's that pass (arg) non-ptr values are numbered 0x032n/0x033n */ -#define TARGET_HDIO_SET_MULTCOUNT 0x0321 /* change IDE blockmode */ -#define TARGET_HDIO_SET_UNMASKINTR 0x0322 /* permit other irqs during I/O */ -#define TARGET_HDIO_SET_KEEPSETTINGS 0x0323 /* keep ioctl settings on reset */ -#define TARGET_HDIO_SET_32BIT 0x0324 /* change io_32bit flags */ -#define TARGET_HDIO_SET_NOWERR 0x0325 /* change ignore-write-error flag */ -#define TARGET_HDIO_SET_DMA 0x0326 /* change use-dma flag */ -#define TARGET_HDIO_SET_PIO_MODE 0x0327 /* reconfig interface to new speed */ - -/* loop ioctls */ -#define TARGET_LOOP_SET_FD 0x4C00 -#define TARGET_LOOP_CLR_FD 0x4C01 -#define TARGET_LOOP_SET_STATUS 0x4C02 -#define TARGET_LOOP_GET_STATUS 0x4C03 -#define TARGET_LOOP_SET_STATUS64 0x4C04 -#define TARGET_LOOP_GET_STATUS64 0x4C05 -#define TARGET_LOOP_CHANGE_FD 0x4C06 - -/* fb ioctls */ -#define TARGET_FBIOGET_VSCREENINFO 0x4600 -#define TARGET_FBIOPUT_VSCREENINFO 0x4601 -#define TARGET_FBIOGET_FSCREENINFO 0x4602 -#define TARGET_FBIOGETCMAP 0x4604 -#define TARGET_FBIOPUTCMAP 0x4605 -#define TARGET_FBIOPAN_DISPLAY 0x4606 -#define TARGET_FBIOGET_CON2FBMAP 0x460F -#define TARGET_FBIOPUT_CON2FBMAP 0x4610 - -/* vt ioctls */ -#define TARGET_VT_OPENQRY 0x5600 -#define TARGET_VT_GETSTATE 0x5603 -#define TARGET_VT_ACTIVATE 0x5606 -#define TARGET_VT_WAITACTIVE 0x5607 -#define TARGET_VT_LOCKSWITCH 0x560b -#define TARGET_VT_UNLOCKSWITCH 0x560c -#define TARGET_VT_GETMODE 0x5601 -#define TARGET_VT_SETMODE 0x5602 -#define TARGET_VT_RELDISP 0x5605 -#define TARGET_VT_DISALLOCATE 0x5608 - -/* device mapper */ -#define TARGET_DM_VERSION TARGET_IOWRU(0xfd, 0x00) -#define TARGET_DM_REMOVE_ALL TARGET_IOWRU(0xfd, 0x01) -#define TARGET_DM_LIST_DEVICES TARGET_IOWRU(0xfd, 0x02) -#define TARGET_DM_DEV_CREATE TARGET_IOWRU(0xfd, 0x03) -#define TARGET_DM_DEV_REMOVE TARGET_IOWRU(0xfd, 0x04) -#define TARGET_DM_DEV_RENAME TARGET_IOWRU(0xfd, 0x05) -#define TARGET_DM_DEV_SUSPEND TARGET_IOWRU(0xfd, 0x06) -#define TARGET_DM_DEV_STATUS TARGET_IOWRU(0xfd, 0x07) -#define TARGET_DM_DEV_WAIT TARGET_IOWRU(0xfd, 0x08) -#define TARGET_DM_TABLE_LOAD TARGET_IOWRU(0xfd, 0x09) -#define TARGET_DM_TABLE_CLEAR TARGET_IOWRU(0xfd, 0x0a) -#define TARGET_DM_TABLE_DEPS TARGET_IOWRU(0xfd, 0x0b) -#define TARGET_DM_TABLE_STATUS TARGET_IOWRU(0xfd, 0x0c) -#define TARGET_DM_LIST_VERSIONS TARGET_IOWRU(0xfd, 0x0d) -#define TARGET_DM_TARGET_MSG TARGET_IOWRU(0xfd, 0x0e) -#define TARGET_DM_DEV_SET_GEOMETRY TARGET_IOWRU(0xfd, 0x0f) - -/* from asm/termbits.h */ - -#define TARGET_NCC 8 -struct target_termio { - unsigned short c_iflag; /* input mode flags */ - unsigned short c_oflag; /* output mode flags */ - unsigned short c_cflag; /* control mode flags */ - unsigned short c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCC]; /* control characters */ -}; - -struct target_winsize { - unsigned short ws_row; - unsigned short ws_col; - unsigned short ws_xpixel; - unsigned short ws_ypixel; -}; - -#include "termbits.h" - -#if defined(TARGET_MIPS) -#define TARGET_PROT_SEM 0x10 -#else -#define TARGET_PROT_SEM 0x08 -#endif - -/* Common */ -#define TARGET_MAP_SHARED 0x01 /* Share changes */ -#define TARGET_MAP_PRIVATE 0x02 /* Changes are private */ -#define TARGET_MAP_TYPE 0x0f /* Mask for type of mapping */ - -/* Target specific */ -#if defined(TARGET_MIPS) -#define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */ -#define TARGET_MAP_ANONYMOUS 0x0800 /* don't use a file */ -#define TARGET_MAP_GROWSDOWN 0x1000 /* stack-like segment */ -#define TARGET_MAP_DENYWRITE 0x2000 /* ETXTBSY */ -#define TARGET_MAP_EXECUTABLE 0x4000 /* mark it as an executable */ -#define TARGET_MAP_LOCKED 0x8000 /* pages are locked */ -#define TARGET_MAP_NORESERVE 0x0400 /* don't check for reservations */ -#define TARGET_MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ -#define TARGET_MAP_NONBLOCK 0x20000 /* do not block on IO */ -#elif defined(TARGET_PPC) -#define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */ -#define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */ -#define TARGET_MAP_GROWSDOWN 0x0100 /* stack-like segment */ -#define TARGET_MAP_DENYWRITE 0x0800 /* ETXTBSY */ -#define TARGET_MAP_EXECUTABLE 0x1000 /* mark it as an executable */ -#define TARGET_MAP_LOCKED 0x0080 /* pages are locked */ -#define TARGET_MAP_NORESERVE 0x0040 /* don't check for reservations */ -#define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ -#define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */ -#elif defined(TARGET_ALPHA) -#define TARGET_MAP_ANONYMOUS 0x10 /* don't use a file */ -#define TARGET_MAP_FIXED 0x100 /* Interpret addr exactly */ -#define TARGET_MAP_GROWSDOWN 0x01000 /* stack-like segment */ -#define TARGET_MAP_DENYWRITE 0x02000 /* ETXTBSY */ -#define TARGET_MAP_EXECUTABLE 0x04000 /* mark it as an executable */ -#define TARGET_MAP_LOCKED 0x08000 /* lock the mapping */ -#define TARGET_MAP_NORESERVE 0x10000 /* no check for reservations */ -#define TARGET_MAP_POPULATE 0x20000 /* pop (prefault) pagetables */ -#define TARGET_MAP_NONBLOCK 0x40000 /* do not block on IO */ -#else -#define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */ -#define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */ -#define TARGET_MAP_GROWSDOWN 0x0100 /* stack-like segment */ -#define TARGET_MAP_DENYWRITE 0x0800 /* ETXTBSY */ -#define TARGET_MAP_EXECUTABLE 0x1000 /* mark it as an executable */ -#define TARGET_MAP_LOCKED 0x2000 /* pages are locked */ -#define TARGET_MAP_NORESERVE 0x4000 /* don't check for reservations */ -#define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ -#define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */ -#define TARGET_MAP_UNINITIALIZED 0x4000000 /* for anonymous mmap, memory could be uninitialized */ -#endif - -#if (defined(TARGET_I386) && defined(TARGET_ABI32)) \ - || (defined(TARGET_ARM) && defined(TARGET_ABI32)) \ - || defined(TARGET_CRIS) || defined(TARGET_UNICORE32) -struct target_stat { - unsigned short st_dev; - unsigned short __pad1; - abi_ulong st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned short __pad2; - abi_ulong st_size; - abi_ulong st_blksize; - abi_ulong st_blocks; - abi_ulong target_st_atime; - abi_ulong __unused1; - abi_ulong target_st_mtime; - abi_ulong __unused2; - abi_ulong target_st_ctime; - abi_ulong __unused3; - abi_ulong __unused4; - abi_ulong __unused5; -}; - -/* This matches struct stat64 in glibc2.1, hence the absolutely - * insane amounts of padding around dev_t's. - */ -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - unsigned short st_dev; - unsigned char __pad0[10]; - -#define TARGET_STAT64_HAS_BROKEN_ST_INO 1 - abi_ulong __st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - abi_ulong st_uid; - abi_ulong st_gid; - - unsigned short st_rdev; - unsigned char __pad3[10]; - - long long st_size; - abi_ulong st_blksize; - - abi_ulong st_blocks; /* Number 512-byte blocks allocated. */ - abi_ulong __pad4; /* future possible st_blocks high bits */ - - abi_ulong target_st_atime; - abi_ulong __pad5; - - abi_ulong target_st_mtime; - abi_ulong __pad6; - - abi_ulong target_st_ctime; - abi_ulong __pad7; /* will be high 32 bits of ctime someday */ - - unsigned long long st_ino; -} QEMU_PACKED; - -#ifdef TARGET_ARM -#define TARGET_HAS_STRUCT_STAT64 -struct target_eabi_stat64 { - unsigned long long st_dev; - unsigned int __pad1; - abi_ulong __st_ino; - unsigned int st_mode; - unsigned int st_nlink; - - abi_ulong st_uid; - abi_ulong st_gid; - - unsigned long long st_rdev; - unsigned int __pad2[2]; - - long long st_size; - abi_ulong st_blksize; - unsigned int __pad3; - unsigned long long st_blocks; - - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - - unsigned long long st_ino; -} QEMU_PACKED; -#endif - -#elif defined(TARGET_SPARC64) && !defined(TARGET_ABI32) -struct target_stat { - unsigned int st_dev; - abi_ulong st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned int st_rdev; - abi_long st_size; - abi_long target_st_atime; - abi_long target_st_mtime; - abi_long target_st_ctime; - abi_long st_blksize; - abi_long st_blocks; - abi_ulong __unused4[2]; -}; - -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - unsigned char __pad0[6]; - unsigned short st_dev; - - uint64_t st_ino; - uint64_t st_nlink; - - unsigned int st_mode; - - unsigned int st_uid; - unsigned int st_gid; - - unsigned char __pad2[6]; - unsigned short st_rdev; - - int64_t st_size; - int64_t st_blksize; - - unsigned char __pad4[4]; - unsigned int st_blocks; - - abi_ulong target_st_atime; - abi_ulong __unused1; - - abi_ulong target_st_mtime; - abi_ulong __unused2; - - abi_ulong target_st_ctime; - abi_ulong __unused3; - - abi_ulong __unused4[3]; -}; - -#elif defined(TARGET_SPARC) - -struct target_stat { - unsigned short st_dev; - abi_ulong st_ino; - unsigned short st_mode; - short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - abi_long st_size; - abi_long target_st_atime; - abi_ulong __unused1; - abi_long target_st_mtime; - abi_ulong __unused2; - abi_long target_st_ctime; - abi_ulong __unused3; - abi_long st_blksize; - abi_long st_blocks; - abi_ulong __unused4[2]; -}; - -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - unsigned char __pad0[6]; - unsigned short st_dev; - - uint64_t st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - unsigned int st_uid; - unsigned int st_gid; - - unsigned char __pad2[6]; - unsigned short st_rdev; - - unsigned char __pad3[8]; - - int64_t st_size; - unsigned int st_blksize; - - unsigned char __pad4[8]; - unsigned int st_blocks; - - unsigned int target_st_atime; - unsigned int __unused1; - - unsigned int target_st_mtime; - unsigned int __unused2; - - unsigned int target_st_ctime; - unsigned int __unused3; - - unsigned int __unused4; - unsigned int __unused5; -}; - -#elif defined(TARGET_PPC) - -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) - abi_ulong st_nlink; - unsigned int st_mode; -#else - unsigned int st_mode; - unsigned short st_nlink; -#endif - unsigned int st_uid; - unsigned int st_gid; - abi_ulong st_rdev; - abi_ulong st_size; - abi_ulong st_blksize; - abi_ulong st_blocks; - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - abi_ulong __unused4; - abi_ulong __unused5; -#if defined(TARGET_PPC64) && !defined(TARGET_ABI32) - abi_ulong __unused6; -#endif -}; - -#if !defined(TARGET_PPC64) || defined(TARGET_ABI32) -#define TARGET_HAS_STRUCT_STAT64 -struct QEMU_PACKED target_stat64 { - unsigned long long st_dev; - unsigned long long st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned long long st_rdev; - unsigned long long __pad0; - long long st_size; - int st_blksize; - unsigned int __pad1; - long long st_blocks; /* Number 512-byte blocks allocated. */ - int target_st_atime; - unsigned int target_st_atime_nsec; - int target_st_mtime; - unsigned int target_st_mtime_nsec; - int target_st_ctime; - unsigned int target_st_ctime_nsec; - unsigned int __unused4; - unsigned int __unused5; -}; -#endif - -#elif defined(TARGET_MICROBLAZE) - -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - unsigned int st_mode; - unsigned short st_nlink; - unsigned int st_uid; - unsigned int st_gid; - abi_ulong st_rdev; - abi_ulong st_size; - abi_ulong st_blksize; - abi_ulong st_blocks; - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - abi_ulong __unused4; - abi_ulong __unused5; -}; - -/* FIXME: Microblaze no-mmu user-space has a difference stat64 layout... */ -#define TARGET_HAS_STRUCT_STAT64 -struct QEMU_PACKED target_stat64 { - uint64_t st_dev; -#define TARGET_STAT64_HAS_BROKEN_ST_INO 1 - uint32_t pad0; - uint32_t __st_ino; - - uint32_t st_mode; - uint32_t st_nlink; - uint32_t st_uid; - uint32_t st_gid; - uint64_t st_rdev; - uint64_t __pad1; - - int64_t st_size; - int32_t st_blksize; - uint32_t __pad2; - int64_t st_blocks; /* Number 512-byte blocks allocated. */ - - int target_st_atime; - unsigned int target_st_atime_nsec; - int target_st_mtime; - unsigned int target_st_mtime_nsec; - int target_st_ctime; - unsigned int target_st_ctime_nsec; - uint64_t st_ino; -}; - -#elif defined(TARGET_M68K) - -struct target_stat { - unsigned short st_dev; - unsigned short __pad1; - abi_ulong st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned short __pad2; - abi_ulong st_size; - abi_ulong st_blksize; - abi_ulong st_blocks; - abi_ulong target_st_atime; - abi_ulong __unused1; - abi_ulong target_st_mtime; - abi_ulong __unused2; - abi_ulong target_st_ctime; - abi_ulong __unused3; - abi_ulong __unused4; - abi_ulong __unused5; -}; - -/* This matches struct stat64 in glibc2.1, hence the absolutely - * insane amounts of padding around dev_t's. - */ -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - unsigned long long st_dev; - unsigned char __pad1[2]; - -#define TARGET_STAT64_HAS_BROKEN_ST_INO 1 - abi_ulong __st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - abi_ulong st_uid; - abi_ulong st_gid; - - unsigned long long st_rdev; - unsigned char __pad3[2]; - - long long st_size; - abi_ulong st_blksize; - - abi_ulong __pad4; /* future possible st_blocks high bits */ - abi_ulong st_blocks; /* Number 512-byte blocks allocated. */ - - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - - unsigned long long st_ino; -} QEMU_PACKED; - -#elif defined(TARGET_ABI_MIPSN64) - -/* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ -struct target_stat { - unsigned int st_dev; - unsigned int st_pad0[3]; /* Reserved for st_dev expansion */ - - abi_ulong st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - int st_uid; - int st_gid; - - unsigned int st_rdev; - unsigned int st_pad1[3]; /* Reserved for st_rdev expansion */ - - abi_ulong st_size; - - /* - * Actually this should be timestruc_t st_atime, st_mtime and st_ctime - * but we don't have it under Linux. - */ - unsigned int target_st_atime; - unsigned int target_st_atime_nsec; - - unsigned int target_st_mtime; - unsigned int target_st_mtime_nsec; - - unsigned int target_st_ctime; - unsigned int target_st_ctime_nsec; - - unsigned int st_blksize; - unsigned int st_pad2; - - abi_ulong st_blocks; -}; - -#elif defined(TARGET_ABI_MIPSN32) - -struct target_stat { - abi_ulong st_dev; - abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */ - uint64_t st_ino; - unsigned int st_mode; - unsigned int st_nlink; - int st_uid; - int st_gid; - abi_ulong st_rdev; - abi_ulong st_pad1[3]; /* Reserved for st_rdev expansion */ - int64_t st_size; - abi_long target_st_atime; - abi_ulong target_st_atime_nsec; /* Reserved for st_atime expansion */ - abi_long target_st_mtime; - abi_ulong target_st_mtime_nsec; /* Reserved for st_mtime expansion */ - abi_long target_st_ctime; - abi_ulong target_st_ctime_nsec; /* Reserved for st_ctime expansion */ - abi_ulong st_blksize; - abi_ulong st_pad2; - int64_t st_blocks; -}; - -#elif defined(TARGET_ABI_MIPSO32) - -struct target_stat { - unsigned st_dev; - abi_long st_pad1[3]; /* Reserved for network id */ - abi_ulong st_ino; - unsigned int st_mode; - unsigned int st_nlink; - int st_uid; - int st_gid; - unsigned st_rdev; - abi_long st_pad2[2]; - abi_long st_size; - abi_long st_pad3; - /* - * Actually this should be timestruc_t st_atime, st_mtime and st_ctime - * but we don't have it under Linux. - */ - abi_long target_st_atime; - abi_long target_st_atime_nsec; - abi_long target_st_mtime; - abi_long target_st_mtime_nsec; - abi_long target_st_ctime; - abi_long target_st_ctime_nsec; - abi_long st_blksize; - abi_long st_blocks; - abi_long st_pad4[14]; -}; - -/* - * This matches struct stat64 in glibc2.1, hence the absolutely insane - * amounts of padding around dev_t's. The memory layout is the same as of - * struct stat of the 64-bit kernel. - */ - -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - abi_ulong st_dev; - abi_ulong st_pad0[3]; /* Reserved for st_dev expansion */ - - uint64_t st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - int st_uid; - int st_gid; - - abi_ulong st_rdev; - abi_ulong st_pad1[3]; /* Reserved for st_rdev expansion */ - - int64_t st_size; - - /* - * Actually this should be timestruc_t st_atime, st_mtime and st_ctime - * but we don't have it under Linux. - */ - abi_long target_st_atime; - abi_ulong target_st_atime_nsec; /* Reserved for st_atime expansion */ - - abi_long target_st_mtime; - abi_ulong target_st_mtime_nsec; /* Reserved for st_mtime expansion */ - - abi_long target_st_ctime; - abi_ulong target_st_ctime_nsec; /* Reserved for st_ctime expansion */ - - abi_ulong st_blksize; - abi_ulong st_pad2; - - int64_t st_blocks; -}; - -#elif defined(TARGET_ALPHA) - -struct target_stat { - unsigned int st_dev; - unsigned int st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned int st_rdev; - abi_long st_size; - abi_ulong target_st_atime; - abi_ulong target_st_mtime; - abi_ulong target_st_ctime; - unsigned int st_blksize; - unsigned int st_blocks; - unsigned int st_flags; - unsigned int st_gen; -}; - -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - abi_ulong st_dev; - abi_ulong st_ino; - abi_ulong st_rdev; - abi_long st_size; - abi_ulong st_blocks; - - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; - unsigned int st_blksize; - unsigned int st_nlink; - unsigned int __pad0; - - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - abi_long __unused[3]; -}; - -#elif defined(TARGET_SH4) - -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - abi_ulong st_rdev; - abi_ulong st_size; - abi_ulong st_blksize; - abi_ulong st_blocks; - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - abi_ulong __unused4; - abi_ulong __unused5; -}; - -/* This matches struct stat64 in glibc2.1, hence the absolutely - * insane amounts of padding around dev_t's. - */ -#define TARGET_HAS_STRUCT_STAT64 -struct QEMU_PACKED target_stat64 { - unsigned long long st_dev; - unsigned char __pad0[4]; - -#define TARGET_STAT64_HAS_BROKEN_ST_INO 1 - abi_ulong __st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - abi_ulong st_uid; - abi_ulong st_gid; - - unsigned long long st_rdev; - unsigned char __pad3[4]; - - long long st_size; - abi_ulong st_blksize; - - unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ - - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - - unsigned long long st_ino; -}; - -#elif defined(TARGET_I386) && !defined(TARGET_ABI32) -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - abi_ulong st_nlink; - - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; - unsigned int __pad0; - abi_ulong st_rdev; - abi_long st_size; - abi_long st_blksize; - abi_long st_blocks; /* Number 512-byte blocks allocated. */ - - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - - abi_long __unused[3]; -}; -#elif defined(TARGET_S390X) -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - abi_ulong st_nlink; - unsigned int st_mode; - unsigned int st_uid; - unsigned int st_gid; - unsigned int __pad1; - abi_ulong st_rdev; - abi_ulong st_size; - abi_ulong target_st_atime; - abi_ulong target_st_atime_nsec; - abi_ulong target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_ulong target_st_ctime; - abi_ulong target_st_ctime_nsec; - abi_ulong st_blksize; - abi_long st_blocks; - abi_ulong __unused[3]; -}; -#elif defined(TARGET_AARCH64) -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - abi_ulong st_rdev; - abi_ulong _pad1; - abi_long st_size; - int st_blksize; - int __pad2; - abi_long st_blocks; - abi_long target_st_atime; - abi_ulong target_st_atime_nsec; - abi_long target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_long target_st_ctime; - abi_ulong target_st_ctime_nsec; - unsigned int __unused[2]; -}; -#elif defined(TARGET_OPENRISC) || defined(TARGET_TILEGX) - -/* These are the asm-generic versions of the stat and stat64 structures */ - -struct target_stat { - abi_ulong st_dev; - abi_ulong st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - abi_ulong st_rdev; - abi_ulong __pad1; - abi_long st_size; - int st_blksize; - int __pad2; - abi_long st_blocks; - abi_long target_st_atime; - abi_ulong target_st_atime_nsec; - abi_long target_st_mtime; - abi_ulong target_st_mtime_nsec; - abi_long target_st_ctime; - abi_ulong target_st_ctime_nsec; - unsigned int __unused4; - unsigned int __unused5; -}; - -#define TARGET_HAS_STRUCT_STAT64 -struct target_stat64 { - uint64_t st_dev; - uint64_t st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - uint64_t st_rdev; - uint64_t __pad1; - int64_t st_size; - int st_blksize; - int __pad2; - int64_t st_blocks; - int target_st_atime; - unsigned int target_st_atime_nsec; - int target_st_mtime; - unsigned int target_st_mtime_nsec; - int target_st_ctime; - unsigned int target_st_ctime_nsec; - unsigned int __unused4; - unsigned int __unused5; -}; - -#else -#error unsupported CPU -#endif - -typedef struct { - int val[2]; -} target_fsid_t; - -#ifdef TARGET_MIPS -#ifdef TARGET_ABI_MIPSN32 -struct target_statfs { - int32_t f_type; - int32_t f_bsize; - int32_t f_frsize; /* Fragment size - unsupported */ - int32_t f_blocks; - int32_t f_bfree; - int32_t f_files; - int32_t f_ffree; - int32_t f_bavail; - - /* Linux specials */ - target_fsid_t f_fsid; - int32_t f_namelen; - int32_t f_spare[6]; -}; -#else -struct target_statfs { - abi_long f_type; - abi_long f_bsize; - abi_long f_frsize; /* Fragment size - unsupported */ - abi_long f_blocks; - abi_long f_bfree; - abi_long f_files; - abi_long f_ffree; - abi_long f_bavail; - - /* Linux specials */ - target_fsid_t f_fsid; - abi_long f_namelen; - abi_long f_spare[6]; -}; -#endif - -struct target_statfs64 { - uint32_t f_type; - uint32_t f_bsize; - uint32_t f_frsize; /* Fragment size - unsupported */ - uint32_t __pad; - uint64_t f_blocks; - uint64_t f_bfree; - uint64_t f_files; - uint64_t f_ffree; - uint64_t f_bavail; - target_fsid_t f_fsid; - uint32_t f_namelen; - uint32_t f_spare[6]; -}; -#elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \ - defined(TARGET_SPARC64) || defined(TARGET_AARCH64)) && \ - !defined(TARGET_ABI32) -struct target_statfs { - abi_long f_type; - abi_long f_bsize; - abi_long f_blocks; - abi_long f_bfree; - abi_long f_bavail; - abi_long f_files; - abi_long f_ffree; - target_fsid_t f_fsid; - abi_long f_namelen; - abi_long f_frsize; - abi_long f_spare[5]; -}; - -struct target_statfs64 { - abi_long f_type; - abi_long f_bsize; - abi_long f_blocks; - abi_long f_bfree; - abi_long f_bavail; - abi_long f_files; - abi_long f_ffree; - target_fsid_t f_fsid; - abi_long f_namelen; - abi_long f_frsize; - abi_long f_spare[5]; -}; -#elif defined(TARGET_S390X) -struct target_statfs { - int32_t f_type; - int32_t f_bsize; - abi_long f_blocks; - abi_long f_bfree; - abi_long f_bavail; - abi_long f_files; - abi_long f_ffree; - kernel_fsid_t f_fsid; - int32_t f_namelen; - int32_t f_frsize; - int32_t f_spare[5]; -}; - -struct target_statfs64 { - int32_t f_type; - int32_t f_bsize; - abi_long f_blocks; - abi_long f_bfree; - abi_long f_bavail; - abi_long f_files; - abi_long f_ffree; - kernel_fsid_t f_fsid; - int32_t f_namelen; - int32_t f_frsize; - int32_t f_spare[5]; -}; -#else -struct target_statfs { - uint32_t f_type; - uint32_t f_bsize; - uint32_t f_blocks; - uint32_t f_bfree; - uint32_t f_bavail; - uint32_t f_files; - uint32_t f_ffree; - target_fsid_t f_fsid; - uint32_t f_namelen; - uint32_t f_frsize; - uint32_t f_spare[5]; -}; - -struct target_statfs64 { - uint32_t f_type; - uint32_t f_bsize; - uint64_t f_blocks; - uint64_t f_bfree; - uint64_t f_bavail; - uint64_t f_files; - uint64_t f_ffree; - target_fsid_t f_fsid; - uint32_t f_namelen; - uint32_t f_frsize; - uint32_t f_spare[5]; -}; -#endif - - -#define TARGET_F_DUPFD 0 /* dup */ -#define TARGET_F_GETFD 1 /* get close_on_exec */ -#define TARGET_F_SETFD 2 /* set/clear close_on_exec */ -#define TARGET_F_GETFL 3 /* get file->f_flags */ -#define TARGET_F_SETFL 4 /* set file->f_flags */ - -#if defined(TARGET_ALPHA) -#define TARGET_F_GETLK 7 -#define TARGET_F_SETLK 8 -#define TARGET_F_SETLKW 9 -#define TARGET_F_SETOWN 5 /* for sockets. */ -#define TARGET_F_GETOWN 6 /* for sockets. */ - -#define TARGET_F_RDLCK 1 -#define TARGET_F_WRLCK 2 -#define TARGET_F_UNLCK 8 -#define TARGET_F_EXLCK 16 -#define TARGET_F_SHLCK 32 -#elif defined(TARGET_MIPS) -#define TARGET_F_GETLK 14 -#define TARGET_F_SETLK 6 -#define TARGET_F_SETLKW 7 -#define TARGET_F_SETOWN 24 /* for sockets. */ -#define TARGET_F_GETOWN 25 /* for sockets. */ -#else -#define TARGET_F_GETLK 5 -#define TARGET_F_SETLK 6 -#define TARGET_F_SETLKW 7 -#define TARGET_F_SETOWN 8 /* for sockets. */ -#define TARGET_F_GETOWN 9 /* for sockets. */ -#endif -#define TARGET_F_SETOWN_EX 15 -#define TARGET_F_GETOWN_EX 16 - -#ifndef TARGET_F_RDLCK -#define TARGET_F_RDLCK 0 -#define TARGET_F_WRLCK 1 -#define TARGET_F_UNLCK 2 -#endif - -#ifndef TARGET_F_EXLCK -#define TARGET_F_EXLCK 4 -#define TARGET_F_SHLCK 8 -#endif - - -#define TARGET_F_SETSIG 10 /* for sockets. */ -#define TARGET_F_GETSIG 11 /* for sockets. */ - -#if defined(TARGET_MIPS) -#define TARGET_F_GETLK64 33 /* using 'struct flock64' */ -#define TARGET_F_SETLK64 34 -#define TARGET_F_SETLKW64 35 -#else -#define TARGET_F_GETLK64 12 /* using 'struct flock64' */ -#define TARGET_F_SETLK64 13 -#define TARGET_F_SETLKW64 14 -#endif - -#define TARGET_F_LINUX_SPECIFIC_BASE 1024 -#define TARGET_F_SETLEASE (TARGET_F_LINUX_SPECIFIC_BASE + 0) -#define TARGET_F_GETLEASE (TARGET_F_LINUX_SPECIFIC_BASE + 1) -#define TARGET_F_DUPFD_CLOEXEC (TARGET_F_LINUX_SPECIFIC_BASE + 6) -#define TARGET_F_NOTIFY (TARGET_F_LINUX_SPECIFIC_BASE+2) - -#if defined(TARGET_ALPHA) -#define TARGET_O_NONBLOCK 04 -#define TARGET_O_APPEND 010 -#define TARGET_O_CREAT 01000 /* not fcntl */ -#define TARGET_O_TRUNC 02000 /* not fcntl */ -#define TARGET_O_EXCL 04000 /* not fcntl */ -#define TARGET_O_NOCTTY 010000 /* not fcntl */ -#define TARGET_O_DSYNC 040000 -#define TARGET_O_LARGEFILE 0 /* not necessary, always 64-bit */ -#define TARGET_O_DIRECTORY 0100000 /* must be a directory */ -#define TARGET_O_NOFOLLOW 0200000 /* don't follow links */ -#define TARGET_O_DIRECT 02000000 /* direct disk access hint */ -#define TARGET_O_NOATIME 04000000 -#define TARGET_O_CLOEXEC 010000000 -#define TARGET___O_SYNC 020000000 -#define TARGET_O_PATH 040000000 -#elif defined(TARGET_ARM) || defined(TARGET_M68K) -#define TARGET_O_DIRECTORY 040000 /* must be a directory */ -#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */ -#define TARGET_O_DIRECT 0200000 /* direct disk access hint */ -#define TARGET_O_LARGEFILE 0400000 -#elif defined(TARGET_MIPS) -#define TARGET_O_APPEND 0x0008 -#define TARGET_O_DSYNC 0x0010 -#define TARGET_O_NONBLOCK 0x0080 -#define TARGET_O_CREAT 0x0100 /* not fcntl */ -#define TARGET_O_TRUNC 0x0200 /* not fcntl */ -#define TARGET_O_EXCL 0x0400 /* not fcntl */ -#define TARGET_O_NOCTTY 0x0800 /* not fcntl */ -#define TARGET_FASYNC 0x1000 /* fcntl, for BSD compatibility */ -#define TARGET_O_LARGEFILE 0x2000 /* allow large file opens */ -#define TARGET___O_SYNC 0x4000 -#define TARGET_O_DIRECT 0x8000 /* direct disk access hint */ -#elif defined (TARGET_PPC) -#define TARGET_O_DIRECTORY 040000 /* must be a directory */ -#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */ -#define TARGET_O_LARGEFILE 0200000 -#define TARGET_O_DIRECT 0400000 /* direct disk access hint */ -#elif defined (TARGET_SPARC) -#define TARGET_O_APPEND 0x0008 -#define TARGET_FASYNC 0x0040 /* fcntl, for BSD compatibility */ -#define TARGET_O_CREAT 0x0200 /* not fcntl */ -#define TARGET_O_TRUNC 0x0400 /* not fcntl */ -#define TARGET_O_EXCL 0x0800 /* not fcntl */ -#define TARGET_O_DSYNC 0x2000 -#define TARGET_O_NONBLOCK 0x4000 -# ifdef TARGET_SPARC64 -# define TARGET_O_NDELAY 0x0004 -# else -# define TARGET_O_NDELAY (0x0004 | TARGET_O_NONBLOCK) -# endif -#define TARGET_O_NOCTTY 0x8000 /* not fcntl */ -#define TARGET_O_LARGEFILE 0x40000 -#define TARGET_O_DIRECT 0x100000 /* direct disk access hint */ -#define TARGET_O_NOATIME 0x200000 -#define TARGET_O_CLOEXEC 0x400000 -#define TARGET___O_SYNC 0x800000 -#define TARGET_O_PATH 0x1000000 -#endif - -/* <asm-generic/fcntl.h> values follow. */ -#define TARGET_O_ACCMODE 0003 -#define TARGET_O_RDONLY 00 -#define TARGET_O_WRONLY 01 -#define TARGET_O_RDWR 02 -#ifndef TARGET_O_CREAT -#define TARGET_O_CREAT 0100 /* not fcntl */ -#endif -#ifndef TARGET_O_EXCL -#define TARGET_O_EXCL 0200 /* not fcntl */ -#endif -#ifndef TARGET_O_NOCTTY -#define TARGET_O_NOCTTY 0400 /* not fcntl */ -#endif -#ifndef TARGET_O_TRUNC -#define TARGET_O_TRUNC 01000 /* not fcntl */ -#endif -#ifndef TARGET_O_APPEND -#define TARGET_O_APPEND 02000 -#endif -#ifndef TARGET_O_NONBLOCK -#define TARGET_O_NONBLOCK 04000 -#endif -#ifndef TARGET_O_DSYNC -#define TARGET_O_DSYNC 010000 -#endif -#ifndef TARGET_FASYNC -#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */ -#endif -#ifndef TARGET_O_DIRECT -#define TARGET_O_DIRECT 040000 /* direct disk access hint */ -#endif -#ifndef TARGET_O_LARGEFILE -#define TARGET_O_LARGEFILE 0100000 -#endif -#ifndef TARGET_O_DIRECTORY -#define TARGET_O_DIRECTORY 0200000 /* must be a directory */ -#endif -#ifndef TARGET_O_NOFOLLOW -#define TARGET_O_NOFOLLOW 0400000 /* don't follow links */ -#endif -#ifndef TARGET_O_NOATIME -#define TARGET_O_NOATIME 01000000 -#endif -#ifndef TARGET_O_CLOEXEC -#define TARGET_O_CLOEXEC 02000000 -#endif -#ifndef TARGET___O_SYNC -#define TARGET___O_SYNC 04000000 -#endif -#ifndef TARGET_O_PATH -#define TARGET_O_PATH 010000000 -#endif -#ifndef TARGET_O_NDELAY -#define TARGET_O_NDELAY TARGET_O_NONBLOCK -#endif -#ifndef TARGET_O_SYNC -#define TARGET_O_SYNC (TARGET___O_SYNC | TARGET_O_DSYNC) -#endif - -struct target_flock { - short l_type; - short l_whence; - abi_ulong l_start; - abi_ulong l_len; - int l_pid; -}; - -struct target_flock64 { - short l_type; - short l_whence; -#if defined(TARGET_PPC) || defined(TARGET_X86_64) || defined(TARGET_MIPS) \ - || defined(TARGET_SPARC) || defined(TARGET_HPPA) \ - || defined(TARGET_MICROBLAZE) || defined(TARGET_TILEGX) - int __pad; -#endif - unsigned long long l_start; - unsigned long long l_len; - int l_pid; -} QEMU_PACKED; - -#ifdef TARGET_ARM -struct target_eabi_flock64 { - short l_type; - short l_whence; - int __pad; - unsigned long long l_start; - unsigned long long l_len; - int l_pid; -} QEMU_PACKED; -#endif - -struct target_f_owner_ex { - int type; /* Owner type of ID. */ - int pid; /* ID of owner. */ -}; - -/* soundcard defines */ -/* XXX: convert them all to arch independent entries */ -#define TARGET_SNDCTL_COPR_HALT TARGET_IOWR('C', 7, int); -#define TARGET_SNDCTL_COPR_LOAD 0xcfb04301 -#define TARGET_SNDCTL_COPR_RCODE 0xc0144303 -#define TARGET_SNDCTL_COPR_RCVMSG 0x8fa44309 -#define TARGET_SNDCTL_COPR_RDATA 0xc0144302 -#define TARGET_SNDCTL_COPR_RESET 0x00004300 -#define TARGET_SNDCTL_COPR_RUN 0xc0144306 -#define TARGET_SNDCTL_COPR_SENDMSG 0xcfa44308 -#define TARGET_SNDCTL_COPR_WCODE 0x40144305 -#define TARGET_SNDCTL_COPR_WDATA 0x40144304 -#define TARGET_SNDCTL_DSP_RESET TARGET_IO('P', 0) -#define TARGET_SNDCTL_DSP_SYNC TARGET_IO('P', 1) -#define TARGET_SNDCTL_DSP_SPEED TARGET_IOWR('P', 2, int) -#define TARGET_SNDCTL_DSP_STEREO TARGET_IOWR('P', 3, int) -#define TARGET_SNDCTL_DSP_GETBLKSIZE TARGET_IOWR('P', 4, int) -#define TARGET_SNDCTL_DSP_SETFMT TARGET_IOWR('P', 5, int) -#define TARGET_SNDCTL_DSP_CHANNELS TARGET_IOWR('P', 6, int) -#define TARGET_SOUND_PCM_WRITE_FILTER TARGET_IOWR('P', 7, int) -#define TARGET_SNDCTL_DSP_POST TARGET_IO('P', 8) -#define TARGET_SNDCTL_DSP_SUBDIVIDE TARGET_IOWR('P', 9, int) -#define TARGET_SNDCTL_DSP_SETFRAGMENT TARGET_IOWR('P',10, int) -#define TARGET_SNDCTL_DSP_GETFMTS TARGET_IOR('P', 11, int) -#define TARGET_SNDCTL_DSP_GETOSPACE TARGET_IORU('P',12) -#define TARGET_SNDCTL_DSP_GETISPACE TARGET_IORU('P',13) -#define TARGET_SNDCTL_DSP_GETCAPS TARGET_IOR('P', 15, int) -#define TARGET_SNDCTL_DSP_GETTRIGGER TARGET_IOR('P',16, int) -#define TARGET_SNDCTL_DSP_GETIPTR TARGET_IORU('P',17) -#define TARGET_SNDCTL_DSP_GETOPTR TARGET_IORU('P',18) -#define TARGET_SNDCTL_DSP_MAPINBUF TARGET_IORU('P', 19) -#define TARGET_SNDCTL_DSP_MAPOUTBUF TARGET_IORU('P', 20) -#define TARGET_SNDCTL_DSP_NONBLOCK 0x0000500e -#define TARGET_SNDCTL_DSP_SAMPLESIZE 0xc0045005 -#define TARGET_SNDCTL_DSP_SETDUPLEX 0x00005016 -#define TARGET_SNDCTL_DSP_SETSYNCRO 0x00005015 -#define TARGET_SNDCTL_DSP_SETTRIGGER 0x40045010 -#define TARGET_SNDCTL_FM_4OP_ENABLE 0x4004510f -#define TARGET_SNDCTL_FM_LOAD_INSTR 0x40285107 -#define TARGET_SNDCTL_MIDI_INFO 0xc074510c -#define TARGET_SNDCTL_MIDI_MPUCMD 0xc0216d02 -#define TARGET_SNDCTL_MIDI_MPUMODE 0xc0046d01 -#define TARGET_SNDCTL_MIDI_PRETIME 0xc0046d00 -#define TARGET_SNDCTL_PMGR_ACCESS 0xcfb85110 -#define TARGET_SNDCTL_PMGR_IFACE 0xcfb85001 -#define TARGET_SNDCTL_SEQ_CTRLRATE 0xc0045103 -#define TARGET_SNDCTL_SEQ_GETINCOUNT 0x80045105 -#define TARGET_SNDCTL_SEQ_GETOUTCOUNT 0x80045104 -#define TARGET_SNDCTL_SEQ_NRMIDIS 0x8004510b -#define TARGET_SNDCTL_SEQ_NRSYNTHS 0x8004510a -#define TARGET_SNDCTL_SEQ_OUTOFBAND 0x40085112 -#define TARGET_SNDCTL_SEQ_PANIC 0x00005111 -#define TARGET_SNDCTL_SEQ_PERCMODE 0x40045106 -#define TARGET_SNDCTL_SEQ_RESET 0x00005100 -#define TARGET_SNDCTL_SEQ_RESETSAMPLES 0x40045109 -#define TARGET_SNDCTL_SEQ_SYNC 0x00005101 -#define TARGET_SNDCTL_SEQ_TESTMIDI 0x40045108 -#define TARGET_SNDCTL_SEQ_THRESHOLD 0x4004510d -#define TARGET_SNDCTL_SEQ_TRESHOLD 0x4004510d -#define TARGET_SNDCTL_SYNTH_INFO 0xc08c5102 -#define TARGET_SNDCTL_SYNTH_MEMAVL 0xc004510e -#define TARGET_SNDCTL_TMR_CONTINUE 0x00005404 -#define TARGET_SNDCTL_TMR_METRONOME 0x40045407 -#define TARGET_SNDCTL_TMR_SELECT 0x40045408 -#define TARGET_SNDCTL_TMR_SOURCE 0xc0045406 -#define TARGET_SNDCTL_TMR_START 0x00005402 -#define TARGET_SNDCTL_TMR_STOP 0x00005403 -#define TARGET_SNDCTL_TMR_TEMPO 0xc0045405 -#define TARGET_SNDCTL_TMR_TIMEBASE 0xc0045401 -#define TARGET_SOUND_PCM_READ_RATE 0x80045002 -#define TARGET_SOUND_PCM_READ_CHANNELS 0x80045006 -#define TARGET_SOUND_PCM_READ_BITS 0x80045005 -#define TARGET_SOUND_PCM_READ_FILTER 0x80045007 -#define TARGET_SOUND_MIXER_INFO TARGET_IOR ('M', 101, mixer_info) -#define TARGET_SOUND_MIXER_ACCESS 0xc0804d66 -#define TARGET_SOUND_MIXER_PRIVATE1 TARGET_IOWR('M', 111, int) -#define TARGET_SOUND_MIXER_PRIVATE2 TARGET_IOWR('M', 112, int) -#define TARGET_SOUND_MIXER_PRIVATE3 TARGET_IOWR('M', 113, int) -#define TARGET_SOUND_MIXER_PRIVATE4 TARGET_IOWR('M', 114, int) -#define TARGET_SOUND_MIXER_PRIVATE5 TARGET_IOWR('M', 115, int) - -#define TARGET_MIXER_READ(dev) TARGET_IOR('M', dev, int) - -#define TARGET_SOUND_MIXER_READ_VOLUME TARGET_MIXER_READ(SOUND_MIXER_VOLUME) -#define TARGET_SOUND_MIXER_READ_BASS TARGET_MIXER_READ(SOUND_MIXER_BASS) -#define TARGET_SOUND_MIXER_READ_TREBLE TARGET_MIXER_READ(SOUND_MIXER_TREBLE) -#define TARGET_SOUND_MIXER_READ_SYNTH TARGET_MIXER_READ(SOUND_MIXER_SYNTH) -#define TARGET_SOUND_MIXER_READ_PCM TARGET_MIXER_READ(SOUND_MIXER_PCM) -#define TARGET_SOUND_MIXER_READ_SPEAKER TARGET_MIXER_READ(SOUND_MIXER_SPEAKER) -#define TARGET_SOUND_MIXER_READ_LINE TARGET_MIXER_READ(SOUND_MIXER_LINE) -#define TARGET_SOUND_MIXER_READ_MIC TARGET_MIXER_READ(SOUND_MIXER_MIC) -#define TARGET_SOUND_MIXER_READ_CD TARGET_MIXER_READ(SOUND_MIXER_CD) -#define TARGET_SOUND_MIXER_READ_IMIX TARGET_MIXER_READ(SOUND_MIXER_IMIX) -#define TARGET_SOUND_MIXER_READ_ALTPCM TARGET_MIXER_READ(SOUND_MIXER_ALTPCM) -#define TARGET_SOUND_MIXER_READ_RECLEV TARGET_MIXER_READ(SOUND_MIXER_RECLEV) -#define TARGET_SOUND_MIXER_READ_IGAIN TARGET_MIXER_READ(SOUND_MIXER_IGAIN) -#define TARGET_SOUND_MIXER_READ_OGAIN TARGET_MIXER_READ(SOUND_MIXER_OGAIN) -#define TARGET_SOUND_MIXER_READ_LINE1 TARGET_MIXER_READ(SOUND_MIXER_LINE1) -#define TARGET_SOUND_MIXER_READ_LINE2 TARGET_MIXER_READ(SOUND_MIXER_LINE2) -#define TARGET_SOUND_MIXER_READ_LINE3 TARGET_MIXER_READ(SOUND_MIXER_LINE3) - -/* Obsolete macros */ -#define TARGET_SOUND_MIXER_READ_MUTE TARGET_MIXER_READ(SOUND_MIXER_MUTE) -#define TARGET_SOUND_MIXER_READ_ENHANCE TARGET_MIXER_READ(SOUND_MIXER_ENHANCE) -#define TARGET_SOUND_MIXER_READ_LOUD TARGET_MIXER_READ(SOUND_MIXER_LOUD) - -#define TARGET_SOUND_MIXER_READ_RECSRC TARGET_MIXER_READ(SOUND_MIXER_RECSRC) -#define TARGET_SOUND_MIXER_READ_DEVMASK TARGET_MIXER_READ(SOUND_MIXER_DEVMASK) -#define TARGET_SOUND_MIXER_READ_RECMASK TARGET_MIXER_READ(SOUND_MIXER_RECMASK) -#define TARGET_SOUND_MIXER_READ_STEREODEVS TARGET_MIXER_READ(SOUND_MIXER_STEREODEVS) -#define TARGET_SOUND_MIXER_READ_CAPS TARGET_MIXER_READ(SOUND_MIXER_CAPS) - -#define TARGET_MIXER_WRITE(dev) TARGET_IOWR('M', dev, int) - -#define TARGET_SOUND_MIXER_WRITE_VOLUME TARGET_MIXER_WRITE(SOUND_MIXER_VOLUME) -#define TARGET_SOUND_MIXER_WRITE_BASS TARGET_MIXER_WRITE(SOUND_MIXER_BASS) -#define TARGET_SOUND_MIXER_WRITE_TREBLE TARGET_MIXER_WRITE(SOUND_MIXER_TREBLE) -#define TARGET_SOUND_MIXER_WRITE_SYNTH TARGET_MIXER_WRITE(SOUND_MIXER_SYNTH) -#define TARGET_SOUND_MIXER_WRITE_PCM TARGET_MIXER_WRITE(SOUND_MIXER_PCM) -#define TARGET_SOUND_MIXER_WRITE_SPEAKER TARGET_MIXER_WRITE(SOUND_MIXER_SPEAKER) -#define TARGET_SOUND_MIXER_WRITE_LINE TARGET_MIXER_WRITE(SOUND_MIXER_LINE) -#define TARGET_SOUND_MIXER_WRITE_MIC TARGET_MIXER_WRITE(SOUND_MIXER_MIC) -#define TARGET_SOUND_MIXER_WRITE_CD TARGET_MIXER_WRITE(SOUND_MIXER_CD) -#define TARGET_SOUND_MIXER_WRITE_IMIX TARGET_MIXER_WRITE(SOUND_MIXER_IMIX) -#define TARGET_SOUND_MIXER_WRITE_ALTPCM TARGET_MIXER_WRITE(SOUND_MIXER_ALTPCM) -#define TARGET_SOUND_MIXER_WRITE_RECLEV TARGET_MIXER_WRITE(SOUND_MIXER_RECLEV) -#define TARGET_SOUND_MIXER_WRITE_IGAIN TARGET_MIXER_WRITE(SOUND_MIXER_IGAIN) -#define TARGET_SOUND_MIXER_WRITE_OGAIN TARGET_MIXER_WRITE(SOUND_MIXER_OGAIN) -#define TARGET_SOUND_MIXER_WRITE_LINE1 TARGET_MIXER_WRITE(SOUND_MIXER_LINE1) -#define TARGET_SOUND_MIXER_WRITE_LINE2 TARGET_MIXER_WRITE(SOUND_MIXER_LINE2) -#define TARGET_SOUND_MIXER_WRITE_LINE3 TARGET_MIXER_WRITE(SOUND_MIXER_LINE3) - -/* Obsolete macros */ -#define TARGET_SOUND_MIXER_WRITE_MUTE TARGET_MIXER_WRITE(SOUND_MIXER_MUTE) -#define TARGET_SOUND_MIXER_WRITE_ENHANCE TARGET_MIXER_WRITE(SOUND_MIXER_ENHANCE) -#define TARGET_SOUND_MIXER_WRITE_LOUD TARGET_MIXER_WRITE(SOUND_MIXER_LOUD) - -#define TARGET_SOUND_MIXER_WRITE_RECSRC TARGET_MIXER_WRITE(SOUND_MIXER_RECSRC) - -/* vfat ioctls */ -#define TARGET_VFAT_IOCTL_READDIR_BOTH TARGET_IORU('r', 1) -#define TARGET_VFAT_IOCTL_READDIR_SHORT TARGET_IORU('r', 2) - -#define TARGET_MTIOCTOP TARGET_IOW('m', 1, struct mtop) -#define TARGET_MTIOCGET TARGET_IOR('m', 2, struct mtget) -#define TARGET_MTIOCPOS TARGET_IOR('m', 3, struct mtpos) - -struct target_sysinfo { - abi_long uptime; /* Seconds since boot */ - abi_ulong loads[3]; /* 1, 5, and 15 minute load averages */ - abi_ulong totalram; /* Total usable main memory size */ - abi_ulong freeram; /* Available memory size */ - abi_ulong sharedram; /* Amount of shared memory */ - abi_ulong bufferram; /* Memory used by buffers */ - abi_ulong totalswap; /* Total swap space size */ - abi_ulong freeswap; /* swap space still available */ - unsigned short procs; /* Number of current processes */ - unsigned short pad; /* explicit padding for m68k */ - abi_ulong totalhigh; /* Total high memory size */ - abi_ulong freehigh; /* Available high memory size */ - unsigned int mem_unit; /* Memory unit size in bytes */ - char _f[20-2*sizeof(abi_long)-sizeof(int)]; /* Padding: libc5 uses this.. */ -}; - -struct linux_dirent { - long d_ino; - unsigned long d_off; - unsigned short d_reclen; - char d_name[256]; /* We must not include limits.h! */ -}; - -struct linux_dirent64 { - uint64_t d_ino; - int64_t d_off; - unsigned short d_reclen; - unsigned char d_type; - char d_name[256]; -}; - -struct target_mq_attr { - abi_long mq_flags; - abi_long mq_maxmsg; - abi_long mq_msgsize; - abi_long mq_curmsgs; -}; - -#include "socket.h" - -#include "errno_defs.h" - -#define FUTEX_WAIT 0 -#define FUTEX_WAKE 1 -#define FUTEX_FD 2 -#define FUTEX_REQUEUE 3 -#define FUTEX_CMP_REQUEUE 4 -#define FUTEX_WAKE_OP 5 -#define FUTEX_LOCK_PI 6 -#define FUTEX_UNLOCK_PI 7 -#define FUTEX_TRYLOCK_PI 8 -#define FUTEX_WAIT_BITSET 9 -#define FUTEX_WAKE_BITSET 10 - -#define FUTEX_PRIVATE_FLAG 128 -#define FUTEX_CLOCK_REALTIME 256 -#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME) - -#ifdef CONFIG_EPOLL -#if defined(TARGET_X86_64) -#define TARGET_EPOLL_PACKED QEMU_PACKED -#else -#define TARGET_EPOLL_PACKED -#endif - -typedef union target_epoll_data { - abi_ulong ptr; - abi_int fd; - abi_uint u32; - abi_ullong u64; -} target_epoll_data_t; - -struct target_epoll_event { - abi_uint events; - target_epoll_data_t data; -} TARGET_EPOLL_PACKED; -#endif -struct target_rlimit64 { - uint64_t rlim_cur; - uint64_t rlim_max; -}; - -struct target_ucred { - uint32_t pid; - uint32_t uid; - uint32_t gid; -}; - -#endif - -typedef int32_t target_timer_t; - -#define TARGET_SIGEV_MAX_SIZE 64 - -/* This is architecture-specific but most architectures use the default */ -#ifdef TARGET_MIPS -#define TARGET_SIGEV_PREAMBLE_SIZE (sizeof(int32_t) * 2 + sizeof(abi_long)) -#else -#define TARGET_SIGEV_PREAMBLE_SIZE (sizeof(int32_t) * 2 \ - + sizeof(target_sigval_t)) -#endif - -#define TARGET_SIGEV_PAD_SIZE ((TARGET_SIGEV_MAX_SIZE \ - - TARGET_SIGEV_PREAMBLE_SIZE) \ - / sizeof(int32_t)) - -struct target_sigevent { - target_sigval_t sigev_value; - int32_t sigev_signo; - int32_t sigev_notify; - union { - int32_t _pad[TARGET_SIGEV_PAD_SIZE]; - int32_t _tid; - - struct { - void (*_function)(sigval_t); - void *_attribute; - } _sigev_thread; - } _sigev_un; -}; - -struct target_user_cap_header { - uint32_t version; - int pid; -}; - -struct target_user_cap_data { - uint32_t effective; - uint32_t permitted; - uint32_t inheritable; -}; diff --git a/qemu/linux-user/syscall_types.h b/qemu/linux-user/syscall_types.h deleted file mode 100644 index 1fd4ee0bf..000000000 --- a/qemu/linux-user/syscall_types.h +++ /dev/null @@ -1,255 +0,0 @@ -STRUCT_SPECIAL(termios) - -STRUCT(winsize, - TYPE_SHORT, TYPE_SHORT, TYPE_SHORT, TYPE_SHORT) - -STRUCT(serial_multiport_struct, - TYPE_INT, TYPE_INT, TYPE_CHAR, TYPE_CHAR, TYPE_INT, TYPE_CHAR, TYPE_CHAR, - TYPE_INT, TYPE_CHAR, TYPE_CHAR, TYPE_INT, TYPE_CHAR, TYPE_CHAR, TYPE_INT, - MK_ARRAY(TYPE_INT, 32)) - -STRUCT(serial_icounter_struct, - TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, MK_ARRAY(TYPE_INT, 16)) - -STRUCT(sockaddr, - TYPE_SHORT, MK_ARRAY(TYPE_CHAR, 14)) - -STRUCT(rtentry, - TYPE_ULONG, MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), - TYPE_SHORT, TYPE_SHORT, TYPE_ULONG, TYPE_PTRVOID, TYPE_SHORT, TYPE_PTRVOID, - TYPE_ULONG, TYPE_ULONG, TYPE_SHORT) - -STRUCT(ifmap, - TYPE_ULONG, TYPE_ULONG, TYPE_SHORT, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, - /* Spare 3 bytes */ - TYPE_CHAR, TYPE_CHAR, TYPE_CHAR) - -/* The *_ifreq_list arrays deal with the fact that struct ifreq has unions */ - -STRUCT(sockaddr_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), MK_STRUCT(STRUCT_sockaddr)) - -STRUCT(short_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), TYPE_SHORT) - -STRUCT(int_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), TYPE_INT) - -STRUCT(ifmap_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), MK_STRUCT(STRUCT_ifmap)) - -STRUCT(char_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), - MK_ARRAY(TYPE_CHAR, IFNAMSIZ)) - -STRUCT(ptr_ifreq, - MK_ARRAY(TYPE_CHAR, IFNAMSIZ), TYPE_PTRVOID) - -STRUCT(ifconf, - TYPE_INT, TYPE_PTRVOID) - -STRUCT(arpreq, - MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr), - MK_ARRAY(TYPE_CHAR, 16)) - -STRUCT(arpreq_old, - MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr)) - -STRUCT(cdrom_read_audio, - TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_INT, TYPE_PTRVOID, - TYPE_NULL) - -STRUCT(hd_geometry, - TYPE_CHAR, TYPE_CHAR, TYPE_SHORT, TYPE_ULONG) - -STRUCT(dirent, - TYPE_LONG, TYPE_LONG, TYPE_SHORT, MK_ARRAY(TYPE_CHAR, 256)) - -STRUCT(kbentry, - TYPE_CHAR, TYPE_CHAR, TYPE_SHORT) - -STRUCT(kbsentry, - TYPE_CHAR, MK_ARRAY(TYPE_CHAR, 512)) - -STRUCT(audio_buf_info, - TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT) - -STRUCT(count_info, - TYPE_INT, TYPE_INT, TYPE_INT) - -STRUCT(buffmem_desc, - TYPE_PTRVOID, TYPE_INT) - -STRUCT(mixer_info, - MK_ARRAY(TYPE_CHAR, 16), MK_ARRAY(TYPE_CHAR, 32), TYPE_INT, MK_ARRAY(TYPE_INT, 10)) - -/* loop device ioctls */ -STRUCT(loop_info, - TYPE_INT, /* lo_number */ - TYPE_OLDDEVT, /* lo_device */ - TYPE_ULONG, /* lo_inode */ - TYPE_OLDDEVT, /* lo_rdevice */ - TYPE_INT, /* lo_offset */ - TYPE_INT, /* lo_encrypt_type */ - TYPE_INT, /* lo_encrypt_key_size */ - TYPE_INT, /* lo_flags */ - MK_ARRAY(TYPE_CHAR, 64), /* lo_name */ - MK_ARRAY(TYPE_CHAR, 32), /* lo_encrypt_key */ - MK_ARRAY(TYPE_ULONG, 2), /* lo_init */ - MK_ARRAY(TYPE_CHAR, 4)) /* reserved */ - -STRUCT(loop_info64, - TYPE_ULONGLONG, /* lo_device */ - TYPE_ULONGLONG, /* lo_inode */ - TYPE_ULONGLONG, /* lo_rdevice */ - TYPE_ULONGLONG, /* lo_offset */ - TYPE_ULONG, /* lo_number */ - TYPE_ULONG, /* lo_encrypt_type */ - TYPE_ULONG, /* lo_encrypt_key_size */ - TYPE_ULONG, /* lo_flags */ - MK_ARRAY(TYPE_CHAR, 64), /* lo_name */ - MK_ARRAY(TYPE_CHAR, 64), /* lo_crypt_name */ - MK_ARRAY(TYPE_CHAR, 32), /* lo_encrypt_key */ - MK_ARRAY(TYPE_ULONGLONG, 2)) /* lo_init */ - -/* mag tape ioctls */ -STRUCT(mtop, TYPE_SHORT, TYPE_INT) -STRUCT(mtget, TYPE_LONG, TYPE_LONG, TYPE_LONG, TYPE_LONG, TYPE_LONG, - TYPE_INT, TYPE_INT) -STRUCT(mtpos, TYPE_LONG) - -STRUCT(fb_fix_screeninfo, - MK_ARRAY(TYPE_CHAR, 16), /* id */ - TYPE_ULONG, /* smem_start */ - TYPE_INT, /* smem_len */ - TYPE_INT, /* type */ - TYPE_INT, /* type_aux */ - TYPE_INT, /* visual */ - TYPE_SHORT, /* xpanstep */ - TYPE_SHORT, /* ypanstep */ - TYPE_SHORT, /* ywrapstep */ - TYPE_INT, /* line_length */ - TYPE_ULONG, /* mmio_start */ - TYPE_INT, /* mmio_len */ - TYPE_INT, /* accel */ - MK_ARRAY(TYPE_CHAR, 3)) /* reserved */ - -STRUCT(fb_var_screeninfo, - TYPE_INT, /* xres */ - TYPE_INT, /* yres */ - TYPE_INT, /* xres_virtual */ - TYPE_INT, /* yres_virtual */ - TYPE_INT, /* xoffset */ - TYPE_INT, /* yoffset */ - TYPE_INT, /* bits_per_pixel */ - TYPE_INT, /* grayscale */ - MK_ARRAY(TYPE_INT, 3), /* red */ - MK_ARRAY(TYPE_INT, 3), /* green */ - MK_ARRAY(TYPE_INT, 3), /* blue */ - MK_ARRAY(TYPE_INT, 3), /* transp */ - TYPE_INT, /* nonstd */ - TYPE_INT, /* activate */ - TYPE_INT, /* height */ - TYPE_INT, /* width */ - TYPE_INT, /* accel_flags */ - TYPE_INT, /* pixclock */ - TYPE_INT, /* left_margin */ - TYPE_INT, /* right_margin */ - TYPE_INT, /* upper_margin */ - TYPE_INT, /* lower_margin */ - TYPE_INT, /* hsync_len */ - TYPE_INT, /* vsync_len */ - TYPE_INT, /* sync */ - TYPE_INT, /* vmode */ - TYPE_INT, /* rotate */ - MK_ARRAY(TYPE_INT, 5)) /* reserved */ - -STRUCT(fb_cmap, - TYPE_INT, /* start */ - TYPE_INT, /* len */ - TYPE_PTRVOID, /* red */ - TYPE_PTRVOID, /* green */ - TYPE_PTRVOID, /* blue */ - TYPE_PTRVOID) /* transp */ - -STRUCT(fb_con2fbmap, - TYPE_INT, /* console */ - TYPE_INT) /* framebuffer */ - - -STRUCT(vt_stat, - TYPE_SHORT, /* v_active */ - TYPE_SHORT, /* v_signal */ - TYPE_SHORT) /* v_state */ - -STRUCT(vt_mode, - TYPE_CHAR, /* mode */ - TYPE_CHAR, /* waitv */ - TYPE_SHORT, /* relsig */ - TYPE_SHORT, /* acqsig */ - TYPE_SHORT) /* frsig */ - -STRUCT(dm_ioctl, - MK_ARRAY(TYPE_INT, 3), /* version */ - TYPE_INT, /* data_size */ - TYPE_INT, /* data_start */ - TYPE_INT, /* target_count*/ - TYPE_INT, /* open_count */ - TYPE_INT, /* flags */ - TYPE_INT, /* event_nr */ - TYPE_INT, /* padding */ - TYPE_ULONGLONG, /* dev */ - MK_ARRAY(TYPE_CHAR, 128), /* name */ - MK_ARRAY(TYPE_CHAR, 129), /* uuid */ - MK_ARRAY(TYPE_CHAR, 7)) /* data */ - -STRUCT(dm_target_spec, - TYPE_ULONGLONG, /* sector_start */ - TYPE_ULONGLONG, /* length */ - TYPE_INT, /* status */ - TYPE_INT, /* next */ - MK_ARRAY(TYPE_CHAR, 16)) /* target_type */ - -STRUCT(dm_target_deps, - TYPE_INT, /* count */ - TYPE_INT) /* padding */ - -STRUCT(dm_name_list, - TYPE_ULONGLONG, /* dev */ - TYPE_INT) /* next */ - -STRUCT(dm_target_versions, - TYPE_INT, /* next */ - MK_ARRAY(TYPE_INT, 3)) /* version*/ - -STRUCT(dm_target_msg, - TYPE_ULONGLONG) /* sector */ - -STRUCT(fiemap_extent, - TYPE_ULONGLONG, /* fe_logical */ - TYPE_ULONGLONG, /* fe_physical */ - TYPE_ULONGLONG, /* fe_length */ - MK_ARRAY(TYPE_ULONGLONG, 2), /* fe_reserved64[2] */ - TYPE_INT, /* fe_flags */ - MK_ARRAY(TYPE_INT, 3)) /* fe_reserved[3] */ - -STRUCT(fiemap, - TYPE_ULONGLONG, /* fm_start */ - TYPE_ULONGLONG, /* fm_length */ - TYPE_INT, /* fm_flags */ - TYPE_INT, /* fm_mapped_extents */ - TYPE_INT, /* fm_extent_count */ - TYPE_INT) /* fm_reserved */ - -STRUCT(blkpg_partition, - TYPE_LONGLONG, /* start */ - TYPE_LONGLONG, /* length */ - TYPE_INT, /* pno */ - MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */ - MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */ - -STRUCT(blkpg_ioctl_arg, - TYPE_INT, /* op */ - TYPE_INT, /* flags */ - TYPE_INT, /* datalen */ - TYPE_PTRVOID) /* data */ diff --git a/qemu/linux-user/target_flat.h b/qemu/linux-user/target_flat.h deleted file mode 100644 index 0ba6bdd12..000000000 --- a/qemu/linux-user/target_flat.h +++ /dev/null @@ -1,10 +0,0 @@ -/* If your arch needs to do custom stuff, create your own target_flat.h - * header file in linux-user/<your arch>/ - */ -#define flat_argvp_envp_on_stack() 1 -#define flat_reloc_valid(reloc, size) ((reloc) <= (size)) -#define flat_old_ram_flag(flag) (flag) -#define flat_get_relocate_addr(relval) (relval) -#define flat_get_addr_from_rp(rp, relval, flags, persistent) (rp) -#define flat_set_persistent(relval, persistent) (*persistent) -#define flat_put_addr_at_rp(rp, addr, relval) put_user_ual(addr, rp) diff --git a/qemu/linux-user/tilegx/syscall_nr.h b/qemu/linux-user/tilegx/syscall_nr.h deleted file mode 100644 index 87fb72c55..000000000 --- a/qemu/linux-user/tilegx/syscall_nr.h +++ /dev/null @@ -1,328 +0,0 @@ -#ifndef TILEGX_SYSCALL_NR -#define TILEGX_SYSCALL_NR - -/* - * Copy from linux kernel asm-generic/unistd.h, which tilegx uses. - */ -#define TARGET_NR_io_setup 0 -#define TARGET_NR_io_destroy 1 -#define TARGET_NR_io_submit 2 -#define TARGET_NR_io_cancel 3 -#define TARGET_NR_io_getevents 4 -#define TARGET_NR_setxattr 5 -#define TARGET_NR_lsetxattr 6 -#define TARGET_NR_fsetxattr 7 -#define TARGET_NR_getxattr 8 -#define TARGET_NR_lgetxattr 9 -#define TARGET_NR_fgetxattr 10 -#define TARGET_NR_listxattr 11 -#define TARGET_NR_llistxattr 12 -#define TARGET_NR_flistxattr 13 -#define TARGET_NR_removexattr 14 -#define TARGET_NR_lremovexattr 15 -#define TARGET_NR_fremovexattr 16 -#define TARGET_NR_getcwd 17 -#define TARGET_NR_lookup_dcookie 18 -#define TARGET_NR_eventfd2 19 -#define TARGET_NR_epoll_create1 20 -#define TARGET_NR_epoll_ctl 21 -#define TARGET_NR_epoll_pwait 22 -#define TARGET_NR_dup 23 -#define TARGET_NR_dup3 24 -#define TARGET_NR_fcntl 25 -#define TARGET_NR_inotify_init1 26 -#define TARGET_NR_inotify_add_watch 27 -#define TARGET_NR_inotify_rm_watch 28 -#define TARGET_NR_ioctl 29 -#define TARGET_NR_ioprio_set 30 -#define TARGET_NR_ioprio_get 31 -#define TARGET_NR_flock 32 -#define TARGET_NR_mknodat 33 -#define TARGET_NR_mkdirat 34 -#define TARGET_NR_unlinkat 35 -#define TARGET_NR_symlinkat 36 -#define TARGET_NR_linkat 37 -#define TARGET_NR_renameat 38 -#define TARGET_NR_umount2 39 -#define TARGET_NR_mount 40 -#define TARGET_NR_pivot_root 41 -#define TARGET_NR_nfsservctl 42 -#define TARGET_NR_statfs 43 -#define TARGET_NR_fstatfs 44 -#define TARGET_NR_truncate 45 -#define TARGET_NR_ftruncate 46 -#define TARGET_NR_fallocate 47 -#define TARGET_NR_faccessat 48 -#define TARGET_NR_chdir 49 -#define TARGET_NR_fchdir 50 -#define TARGET_NR_chroot 51 -#define TARGET_NR_fchmod 52 -#define TARGET_NR_fchmodat 53 -#define TARGET_NR_fchownat 54 -#define TARGET_NR_fchown 55 -#define TARGET_NR_openat 56 -#define TARGET_NR_close 57 -#define TARGET_NR_vhangup 58 -#define TARGET_NR_pipe2 59 -#define TARGET_NR_quotactl 60 -#define TARGET_NR_getdents64 61 -#define TARGET_NR_lseek 62 -#define TARGET_NR_read 63 -#define TARGET_NR_write 64 -#define TARGET_NR_readv 65 -#define TARGET_NR_writev 66 -#define TARGET_NR_pread64 67 -#define TARGET_NR_pwrite64 68 -#define TARGET_NR_preadv 69 -#define TARGET_NR_pwritev 70 -#define TARGET_NR_sendfile 71 -#define TARGET_NR_pselect6 72 -#define TARGET_NR_ppoll 73 -#define TARGET_NR_signalfd4 74 -#define TARGET_NR_vmsplice 75 -#define TARGET_NR_splice 76 -#define TARGET_NR_tee 77 -#define TARGET_NR_readlinkat 78 -#define TARGET_NR_fstatat64 79 /* let syscall.c known */ -#define TARGET_NR_fstat 80 -#define TARGET_NR_sync 81 -#define TARGET_NR_fsync 82 -#define TARGET_NR_fdatasync 83 -#define TARGET_NR_sync_file_range 84 /* For tilegx, no range2 */ -#define TARGET_NR_timerfd_create 85 -#define TARGET_NR_timerfd_settime 86 -#define TARGET_NR_timerfd_gettime 87 -#define TARGET_NR_utimensat 88 -#define TARGET_NR_acct 89 -#define TARGET_NR_capget 90 -#define TARGET_NR_capset 91 -#define TARGET_NR_personality 92 -#define TARGET_NR_exit 93 -#define TARGET_NR_exit_group 94 -#define TARGET_NR_waitid 95 -#define TARGET_NR_set_tid_address 96 -#define TARGET_NR_unshare 97 -#define TARGET_NR_futex 98 -#define TARGET_NR_set_robust_list 99 -#define TARGET_NR_get_robust_list 100 -#define TARGET_NR_nanosleep 101 -#define TARGET_NR_getitimer 102 -#define TARGET_NR_setitimer 103 -#define TARGET_NR_kexec_load 104 -#define TARGET_NR_init_module 105 -#define TARGET_NR_delete_module 106 -#define TARGET_NR_timer_create 107 -#define TARGET_NR_timer_gettime 108 -#define TARGET_NR_timer_getoverrun 109 -#define TARGET_NR_timer_settime 110 -#define TARGET_NR_timer_delete 111 -#define TARGET_NR_clock_settime 112 -#define TARGET_NR_clock_gettime 113 -#define TARGET_NR_clock_getres 114 -#define TARGET_NR_clock_nanosleep 115 -#define TARGET_NR_syslog 116 -#define TARGET_NR_ptrace 117 -#define TARGET_NR_sched_setparam 118 -#define TARGET_NR_sched_setscheduler 119 -#define TARGET_NR_sched_getscheduler 120 -#define TARGET_NR_sched_getparam 121 -#define TARGET_NR_sched_setaffinity 122 -#define TARGET_NR_sched_getaffinity 123 -#define TARGET_NR_sched_yield 124 -#define TARGET_NR_sched_get_priority_max 125 -#define TARGET_NR_sched_get_priority_min 126 -#define TARGET_NR_sched_rr_get_interval 127 -#define TARGET_NR_restart_syscall 128 -#define TARGET_NR_kill 129 -#define TARGET_NR_tkill 130 -#define TARGET_NR_tgkill 131 -#define TARGET_NR_sigaltstack 132 -#define TARGET_NR_rt_sigsuspend 133 -#define TARGET_NR_rt_sigaction 134 -#define TARGET_NR_rt_sigprocmask 135 -#define TARGET_NR_rt_sigpending 136 -#define TARGET_NR_rt_sigtimedwait 137 -#define TARGET_NR_rt_sigqueueinfo 138 -#define TARGET_NR_rt_sigreturn 139 -#define TARGET_NR_setpriority 140 -#define TARGET_NR_getpriority 141 -#define TARGET_NR_reboot 142 -#define TARGET_NR_setregid 143 -#define TARGET_NR_setgid 144 -#define TARGET_NR_setreuid 145 -#define TARGET_NR_setuid 146 -#define TARGET_NR_setresuid 147 -#define TARGET_NR_getresuid 148 -#define TARGET_NR_setresgid 149 -#define TARGET_NR_getresgid 150 -#define TARGET_NR_setfsuid 151 -#define TARGET_NR_setfsgid 152 -#define TARGET_NR_times 153 -#define TARGET_NR_setpgid 154 -#define TARGET_NR_getpgid 155 -#define TARGET_NR_getsid 156 -#define TARGET_NR_setsid 157 -#define TARGET_NR_getgroups 158 -#define TARGET_NR_setgroups 159 -#define TARGET_NR_uname 160 -#define TARGET_NR_sethostname 161 -#define TARGET_NR_setdomainname 162 -#define TARGET_NR_getrlimit 163 -#define TARGET_NR_setrlimit 164 -#define TARGET_NR_getrusage 165 -#define TARGET_NR_umask 166 -#define TARGET_NR_prctl 167 -#define TARGET_NR_getcpu 168 -#define TARGET_NR_gettimeofday 169 -#define TARGET_NR_settimeofday 170 -#define TARGET_NR_adjtimex 171 -#define TARGET_NR_getpid 172 -#define TARGET_NR_getppid 173 -#define TARGET_NR_getuid 174 -#define TARGET_NR_geteuid 175 -#define TARGET_NR_getgid 176 -#define TARGET_NR_getegid 177 -#define TARGET_NR_gettid 178 -#define TARGET_NR_sysinfo 179 -#define TARGET_NR_mq_open 180 -#define TARGET_NR_mq_unlink 181 -#define TARGET_NR_mq_timedsend 182 -#define TARGET_NR_mq_timedreceive 183 -#define TARGET_NR_mq_notify 184 -#define TARGET_NR_mq_getsetattr 185 -#define TARGET_NR_msgget 186 -#define TARGET_NR_msgctl 187 -#define TARGET_NR_msgrcv 188 -#define TARGET_NR_msgsnd 189 -#define TARGET_NR_semget 190 -#define TARGET_NR_semctl 191 -#define TARGET_NR_semtimedop 192 -#define TARGET_NR_semop 193 -#define TARGET_NR_shmget 194 -#define TARGET_NR_shmctl 195 -#define TARGET_NR_shmat 196 -#define TARGET_NR_shmdt 197 -#define TARGET_NR_socket 198 -#define TARGET_NR_socketpair 199 -#define TARGET_NR_bind 200 -#define TARGET_NR_listen 201 -#define TARGET_NR_accept 202 -#define TARGET_NR_connect 203 -#define TARGET_NR_getsockname 204 -#define TARGET_NR_getpeername 205 -#define TARGET_NR_sendto 206 -#define TARGET_NR_recvfrom 207 -#define TARGET_NR_setsockopt 208 -#define TARGET_NR_getsockopt 209 -#define TARGET_NR_shutdown 210 -#define TARGET_NR_sendmsg 211 -#define TARGET_NR_recvmsg 212 -#define TARGET_NR_readahead 213 -#define TARGET_NR_brk 214 -#define TARGET_NR_munmap 215 -#define TARGET_NR_mremap 216 -#define TARGET_NR_add_key 217 -#define TARGET_NR_request_key 218 -#define TARGET_NR_keyctl 219 -#define TARGET_NR_clone 220 -#define TARGET_NR_execve 221 -#define TARGET_NR_mmap 222 -#define TARGET_NR_fadvise64 223 -#define TARGET_NR_swapon 224 -#define TARGET_NR_swapoff 225 -#define TARGET_NR_mprotect 226 -#define TARGET_NR_msync 227 -#define TARGET_NR_mlock 228 -#define TARGET_NR_munlock 229 -#define TARGET_NR_mlockall 230 -#define TARGET_NR_munlockall 231 -#define TARGET_NR_mincore 232 -#define TARGET_NR_madvise 233 -#define TARGET_NR_remap_file_pages 234 -#define TARGET_NR_mbind 235 -#define TARGET_NR_get_mempolicy 236 -#define TARGET_NR_set_mempolicy 237 -#define TARGET_NR_migrate_pages 238 -#define TARGET_NR_move_pages 239 -#define TARGET_NR_rt_tgsigqueueinfo 240 -#define TARGET_NR_perf_event_open 241 -#define TARGET_NR_accept4 242 -#define TARGET_NR_recvmmsg 243 - -#define TARGET_NR_arch_specific_syscall 244 -#define TARGET_NR_cacheflush 245 /* tilegx own syscall */ - -#define TARGET_NR_wait4 260 -#define TARGET_NR_prlimit64 261 -#define TARGET_NR_fanotify_init 262 -#define TARGET_NR_fanotify_mark 263 -#define TARGET_NR_name_to_handle_at 264 -#define TARGET_NR_open_by_handle_at 265 -#define TARGET_NR_clock_adjtime 266 -#define TARGET_NR_syncfs 267 -#define TARGET_NR_setns 268 -#define TARGET_NR_sendmmsg 269 -#define TARGET_NR_process_vm_readv 270 -#define TARGET_NR_process_vm_writev 271 -#define TARGET_NR_kcmp 272 -#define TARGET_NR_finit_module 273 -#define TARGET_NR_sched_setattr 274 -#define TARGET_NR_sched_getattr 275 -#define TARGET_NR_renameat2 276 -#define TARGET_NR_seccomp 277 -#define TARGET_NR_getrandom 278 -#define TARGET_NR_memfd_create 279 -#define TARGET_NR_bpf 280 -#define TARGET_NR_execveat 281 -#define TARGET_NR_userfaultfd 282 -#define TARGET_NR_membarrier 283 -#define TARGET_NR_mlock2 284 -#define TARGET_NR_copy_file_range 285 - -#define TARGET_NR_open 1024 -#define TARGET_NR_link 1025 -#define TARGET_NR_unlink 1026 -#define TARGET_NR_mknod 1027 -#define TARGET_NR_chmod 1028 -#define TARGET_NR_chown 1029 -#define TARGET_NR_mkdir 1030 -#define TARGET_NR_rmdir 1031 -#define TARGET_NR_lchown 1032 -#define TARGET_NR_access 1033 -#define TARGET_NR_rename 1034 -#define TARGET_NR_readlink 1035 -#define TARGET_NR_symlink 1036 -#define TARGET_NR_utimes 1037 -#define TARGET_NR_stat64 1038 /* let syscall.c known */ -#define TARGET_NR_lstat 1039 - -#define TARGET_NR_pipe 1040 -#define TARGET_NR_dup2 1041 -#define TARGET_NR_epoll_create 1042 -#define TARGET_NR_inotify_init 1043 -#define TARGET_NR_eventfd 1044 -#define TARGET_NR_signalfd 1045 - -#define TARGET_NR_alarm 1059 -#define TARGET_NR_getpgrp 1060 -#define TARGET_NR_pause 1061 -#define TARGET_NR_time 1062 -#define TARGET_NR_utime 1063 -#define TARGET_NR_creat 1064 -#define TARGET_NR_getdents 1065 -#define TARGET_NR_futimesat 1066 -#define TARGET_NR_select 1067 -#define TARGET_NR_poll 1068 -#define TARGET_NR_epoll_wait 1069 -#define TARGET_NR_ustat 1070 -#define TARGET_NR_vfork 1071 -#define TARGET_NR_oldwait4 1072 -#define TARGET_NR_recv 1073 -#define TARGET_NR_send 1074 -#define TARGET_NR_bdflush 1075 -#define TARGET_NR_umount 1076 -#define TARGET_NR_uselib 1077 -#define TARGET_NR__sysctl 1078 -#define TARGET_NR_fork 1079 - -#endif diff --git a/qemu/linux-user/tilegx/target_cpu.h b/qemu/linux-user/tilegx/target_cpu.h deleted file mode 100644 index c96e81d05..000000000 --- a/qemu/linux-user/tilegx/target_cpu.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * TILE-Gx specific CPU ABI and functions for linux-user - * - * Copyright (c) 2015 Chen Gang - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUTLGState *env, target_ulong newsp) -{ - if (newsp) { - env->regs[TILEGX_R_SP] = newsp; - } - env->regs[TILEGX_R_RE] = 0; -} - -static inline void cpu_set_tls(CPUTLGState *env, target_ulong newtls) -{ - env->regs[TILEGX_R_TP] = newtls; -} - -#endif diff --git a/qemu/linux-user/tilegx/target_signal.h b/qemu/linux-user/tilegx/target_signal.h deleted file mode 100644 index b595f985c..000000000 --- a/qemu/linux-user/tilegx/target_signal.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_int ss_flags; - abi_ulong ss_size; -} target_stack_t; - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUTLGState *state) -{ - return state->regs[TILEGX_R_SP]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/tilegx/target_structs.h b/qemu/linux-user/tilegx/target_structs.h deleted file mode 100644 index 7d3ff782f..000000000 --- a/qemu/linux-user/tilegx/target_structs.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * TILE-Gx specific structures for linux-user - * - * Copyright (c) 2015 Chen Gang - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_uint mode; /* Read/write permission. */ - abi_ushort __seq; /* Sequence number. */ -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ - abi_ulong shm_dtime; /* time of last shmdt() */ - abi_ulong shm_ctime; /* time of last change by shmctl() */ - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ushort shm_nattch; /* number of current attaches */ - abi_ushort shm_unused; /* compatibility */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/tilegx/target_syscall.h b/qemu/linux-user/tilegx/target_syscall.h deleted file mode 100644 index a938d4e90..000000000 --- a/qemu/linux-user/tilegx/target_syscall.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef TILEGX_SYSCALLS_H -#define TILEGX_SYSCALLS_H - -#define UNAME_MACHINE "tilegx" -#define UNAME_MINIMUM_RELEASE "3.19" - -#define MMAP_SHIFT TARGET_PAGE_BITS - -#define TILEGX_IS_ERRNO(ret) \ - ((ret) > 0xfffffffffffff000ULL) /* errno is 0 -- 4096 */ - -typedef uint64_t tilegx_reg_t; - -struct target_pt_regs { - - union { - /* Saved main processor registers; 56..63 are special. */ - tilegx_reg_t regs[56]; - struct { - tilegx_reg_t __regs[53]; - tilegx_reg_t tp; /* aliases regs[TREG_TP] */ - tilegx_reg_t sp; /* aliases regs[TREG_SP] */ - tilegx_reg_t lr; /* aliases regs[TREG_LR] */ - }; - }; - - /* Saved special registers. */ - tilegx_reg_t pc; /* stored in EX_CONTEXT_K_0 */ - tilegx_reg_t ex1; /* stored in EX_CONTEXT_K_1 (PL and ICS bit) */ - tilegx_reg_t faultnum; /* fault number (INT_SWINT_1 for syscall) */ - tilegx_reg_t orig_r0; /* r0 at syscall entry, else zero */ - tilegx_reg_t flags; /* flags (see below) */ - tilegx_reg_t cmpexch; /* value of CMPEXCH_VALUE SPR at interrupt */ - tilegx_reg_t pad[2]; -}; - -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -/* For faultnum */ -#define TARGET_INT_SWINT_1 14 - -#endif diff --git a/qemu/linux-user/tilegx/termbits.h b/qemu/linux-user/tilegx/termbits.h deleted file mode 100644 index 91ec23654..000000000 --- a/qemu/linux-user/tilegx/termbits.h +++ /dev/null @@ -1,274 +0,0 @@ -#ifndef TILEGX_TERMBITS_H -#define TILEGX_TERMBITS_H - -/* From asm-generic/termbits.h, which is used by tilegx */ - -#define TARGET_NCCS 19 -struct target_termios { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ -}; - -struct target_termios2 { - unsigned int c_iflag; /* input mode flags */ - unsigned int c_oflag; /* output mode flags */ - unsigned int c_cflag; /* control mode flags */ - unsigned int c_lflag; /* local mode flags */ - unsigned char c_line; /* line discipline */ - unsigned char c_cc[TARGET_NCCS]; /* control characters */ - unsigned int c_ispeed; /* input speed */ - unsigned int c_ospeed; /* output speed */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA TARGET_B19200 -#define TARGET_EXTB TARGET_B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -#define TARGET_IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 -#define TARGET_EXTPROC 0200000 - -/* tcflow() and TCXONC use these */ -#define TARGET_TCOOFF 0 -#define TARGET_TCOON 1 -#define TARGET_TCIOFF 2 -#define TARGET_TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TARGET_TCIFLUSH 0 -#define TARGET_TCOFLUSH 1 -#define TARGET_TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TARGET_TCSANOW 0 -#define TARGET_TCSADRAIN 1 -#define TARGET_TCSAFLUSH 2 - -/* From asm-generic/ioctls.h, which is used by tilegx */ - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ TARGET_FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 -#define TARGET_TIOCSBRK 0x5427 -#define TARGET_TIOCCBRK 0x5428 -#define TARGET_TIOCGSID 0x5429 -#define TARGET_TCGETS2 TARGET_IOR('T', 0x2A, struct termios2) -#define TARGET_TCSETS2 TARGET_IOW('T', 0x2B, struct termios2) -#define TARGET_TCSETSW2 TARGET_IOW('T', 0x2C, struct termios2) -#define TARGET_TCSETSF2 TARGET_IOW('T', 0x2D, struct termios2) -#define TARGET_TIOCGRS485 0x542E -#define TARGET_TIOCSRS485 0x542F -#define TARGET_TIOCGPTN TARGET_IOR('T', 0x30, unsigned int) -#define TARGET_TIOCSPTLCK TARGET_IOW('T', 0x31, int) -#define TARGET_TIOCGDEV TARGET_IOR('T', 0x32, unsigned int) -#define TARGET_TCGETX 0x5432 -#define TARGET_TCSETX 0x5433 -#define TARGET_TCSETXF 0x5434 -#define TARGET_TCSETXW 0x5435 -#define TARGET_TIOCSIG TARGET_IOW('T', 0x36, int) -#define TARGET_TIOCVHANGUP 0x5437 -#define TARGET_TIOCGPKT TARGET_IOR('T', 0x38, int) -#define TARGET_TIOCGPTLCK TARGET_IOR('T', 0x39, int) -#define TARGET_TIOCGEXCL TARGET_IOR('T', 0x40, int) - -#define TARGET_FIONCLEX 0x5450 -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 -#define TARGET_TIOCSERGETLSR 0x5459 -#define TARGET_TIOCSERGETMULTI 0x545A -#define TARGET_TIOCSERSETMULTI 0x545B - -#define TARGET_TIOCMIWAIT 0x545C -#define TARGET_TIOCGICOUNT 0x545D -#define TARGET_FIOQSIZE 0x5460 - -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 -#define TARGET_TIOCPKT_IOCTL 64 - -#define TARGET_TIOCSER_TEMT 0x01 - -#endif diff --git a/qemu/linux-user/uaccess.c b/qemu/linux-user/uaccess.c deleted file mode 100644 index 0a5c0b0b2..000000000 --- a/qemu/linux-user/uaccess.c +++ /dev/null @@ -1,65 +0,0 @@ -/* User memory access */ -#include "qemu/osdep.h" -#include "qemu/cutils.h" - -#include "qemu.h" - -/* copy_from_user() and copy_to_user() are usually used to copy data - * buffers between the target and host. These internally perform - * locking/unlocking of the memory. - */ -abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len) -{ - abi_long ret = 0; - void *ghptr; - - if ((ghptr = lock_user(VERIFY_READ, gaddr, len, 1))) { - memcpy(hptr, ghptr, len); - unlock_user(ghptr, gaddr, 0); - } else - ret = -TARGET_EFAULT; - - return ret; -} - - -abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len) -{ - abi_long ret = 0; - void *ghptr; - - if ((ghptr = lock_user(VERIFY_WRITE, gaddr, len, 0))) { - memcpy(ghptr, hptr, len); - unlock_user(ghptr, gaddr, len); - } else - ret = -TARGET_EFAULT; - - return ret; -} - -/* Return the length of a string in target memory or -TARGET_EFAULT if - access error */ -abi_long target_strlen(abi_ulong guest_addr1) -{ - uint8_t *ptr; - abi_ulong guest_addr; - int max_len, len; - - guest_addr = guest_addr1; - for(;;) { - max_len = TARGET_PAGE_SIZE - (guest_addr & ~TARGET_PAGE_MASK); - ptr = lock_user(VERIFY_READ, guest_addr, max_len, 1); - if (!ptr) - return -TARGET_EFAULT; - len = qemu_strnlen((const char *)ptr, max_len); - unlock_user(ptr, guest_addr, 0); - guest_addr += len; - /* we don't allow wrapping or integer overflow */ - if (guest_addr == 0 || - (guest_addr - guest_addr1) > 0x7fffffff) - return -TARGET_EFAULT; - if (len != max_len) - break; - } - return guest_addr - guest_addr1; -} diff --git a/qemu/linux-user/uname.c b/qemu/linux-user/uname.c deleted file mode 100644 index 313b79dba..000000000 --- a/qemu/linux-user/uname.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * cpu to uname machine name map - * - * Copyright (c) 2009 Loïc Minier - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "qemu/osdep.h" - -#include "qemu.h" -//#include "qemu-common.h" -#include "uname.h" - -/* return highest utsname machine name for emulated instruction set - * - * NB: the default emulated CPU ("any") might not match any existing CPU, e.g. - * on ARM it has all features turned on, so there is no perfect arch string to - * return here */ -const char *cpu_to_uname_machine(void *cpu_env) -{ -#if defined(TARGET_ARM) && !defined(TARGET_AARCH64) - - /* utsname machine name on linux arm is CPU arch name + endianness, e.g. - * armv7l; to get a list of CPU arch names from the linux source, use: - * grep arch_name: -A1 linux/arch/arm/mm/proc-*.S - * see arch/arm/kernel/setup.c: setup_processor() - */ - - /* in theory, endianness is configurable on some ARM CPUs, but this isn't - * used in user mode emulation */ -#ifdef TARGET_WORDS_BIGENDIAN -#define utsname_suffix "b" -#else -#define utsname_suffix "l" -#endif - if (arm_feature(cpu_env, ARM_FEATURE_V7)) - return "armv7" utsname_suffix; - if (arm_feature(cpu_env, ARM_FEATURE_V6)) - return "armv6" utsname_suffix; - /* earliest emulated CPU is ARMv5TE; qemu can emulate the 1026, but not its - * Jazelle support */ - return "armv5te" utsname_suffix; -#elif defined(TARGET_I386) && !defined(TARGET_X86_64) - /* see arch/x86/kernel/cpu/bugs.c: check_bugs(), 386, 486, 586, 686 */ - CPUState *cpu = ENV_GET_CPU((CPUX86State *)cpu_env); - int family = object_property_get_int(OBJECT(cpu), "family", NULL); - if (family == 4) { - return "i486"; - } - if (family == 5) { - return "i586"; - } - return "i686"; -#else - /* default is #define-d in each arch/ subdir */ - return UNAME_MACHINE; -#endif -} - - -#define COPY_UTSNAME_FIELD(dest, src) \ - do { \ - /* __NEW_UTS_LEN doesn't include terminating null */ \ - (void) strncpy((dest), (src), __NEW_UTS_LEN); \ - (dest)[__NEW_UTS_LEN] = '\0'; \ - } while (0) - -int sys_uname(struct new_utsname *buf) -{ - struct utsname uts_buf; - - if (uname(&uts_buf) < 0) - return (-1); - - /* - * Just in case these have some differences, we - * translate utsname to new_utsname (which is the - * struct linux kernel uses). - */ - - memset(buf, 0, sizeof(*buf)); - COPY_UTSNAME_FIELD(buf->sysname, uts_buf.sysname); - COPY_UTSNAME_FIELD(buf->nodename, uts_buf.nodename); - COPY_UTSNAME_FIELD(buf->release, uts_buf.release); - COPY_UTSNAME_FIELD(buf->version, uts_buf.version); - COPY_UTSNAME_FIELD(buf->machine, uts_buf.machine); -#ifdef _GNU_SOURCE - COPY_UTSNAME_FIELD(buf->domainname, uts_buf.domainname); -#endif - return (0); - -#undef COPY_UTSNAME_FIELD -} - -static int relstr_to_int(const char *s) -{ - /* Convert a uname release string like "2.6.18" to an integer - * of the form 0x020612. (Beware that 0x020612 is *not* 2.6.12.) - */ - int i, n, tmp; - - tmp = 0; - for (i = 0; i < 3; i++) { - n = 0; - while (*s >= '0' && *s <= '9') { - n *= 10; - n += *s - '0'; - s++; - } - tmp = (tmp << 8) + n; - if (*s == '.') { - s++; - } - } - return tmp; -} - -int get_osversion(void) -{ - static int osversion; - struct new_utsname buf; - const char *s; - - if (osversion) - return osversion; - if (qemu_uname_release && *qemu_uname_release) { - s = qemu_uname_release; - } else { - if (sys_uname(&buf)) - return 0; - s = buf.release; - } - osversion = relstr_to_int(s); - return osversion; -} - -void init_qemu_uname_release(void) -{ - /* Initialize qemu_uname_release for later use. - * If the host kernel is too old and the user hasn't asked for - * a specific fake version number, we might want to fake a minimum - * target kernel version. - */ - struct new_utsname buf; - - if (qemu_uname_release && *qemu_uname_release) { - return; - } - - if (sys_uname(&buf)) { - return; - } - - if (relstr_to_int(buf.release) < relstr_to_int(UNAME_MINIMUM_RELEASE)) { - qemu_uname_release = UNAME_MINIMUM_RELEASE; - } -} diff --git a/qemu/linux-user/uname.h b/qemu/linux-user/uname.h deleted file mode 100644 index cc62e76cc..000000000 --- a/qemu/linux-user/uname.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef UNAME_H -#define UNAME_H 1 - -#include <sys/utsname.h> -#include <linux/utsname.h> - -const char *cpu_to_uname_machine(void *cpu_env); -int sys_uname(struct new_utsname *buf); - -#endif /* UNAME _H */ diff --git a/qemu/linux-user/unicore32/syscall_nr.h b/qemu/linux-user/unicore32/syscall_nr.h deleted file mode 100644 index 486b8c45a..000000000 --- a/qemu/linux-user/unicore32/syscall_nr.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - * This file contains the system call numbers for UniCore32 oldabi. - * - * Copyright (C) 2010-2011 GUAN Xue-tao - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#define TARGET_NR_restart_syscall 0 -#define TARGET_NR_exit 1 -#define TARGET_NR_fork 2 -#define TARGET_NR_read 3 -#define TARGET_NR_write 4 -#define TARGET_NR_open 5 -#define TARGET_NR_close 6 -#define TARGET_NR_waitpid 7 -#define TARGET_NR_creat 8 -#define TARGET_NR_link 9 -#define TARGET_NR_unlink 10 -#define TARGET_NR_execve 11 -#define TARGET_NR_chdir 12 -#define TARGET_NR_time 13 -#define TARGET_NR_mknod 14 -#define TARGET_NR_chmod 15 -#define TARGET_NR_lchown 16 -#define TARGET_NR_break 17 - /* 18 */ -#define TARGET_NR_lseek 19 -#define TARGET_NR_getpid 20 -#define TARGET_NR_mount 21 -#define TARGET_NR_umount 22 -#define TARGET_NR_setuid 23 -#define TARGET_NR_getuid 24 -#define TARGET_NR_stime 25 -#define TARGET_NR_ptrace 26 -#define TARGET_NR_alarm 27 - /* 28 */ -#define TARGET_NR_pause 29 -#define TARGET_NR_utime 30 -#define TARGET_NR_stty 31 -#define TARGET_NR_gtty 32 -#define TARGET_NR_access 33 -#define TARGET_NR_nice 34 -#define TARGET_NR_ftime 35 -#define TARGET_NR_sync 36 -#define TARGET_NR_kill 37 -#define TARGET_NR_rename 38 -#define TARGET_NR_mkdir 39 -#define TARGET_NR_rmdir 40 -#define TARGET_NR_dup 41 -#define TARGET_NR_pipe 42 -#define TARGET_NR_times 43 -#define TARGET_NR_prof 44 -#define TARGET_NR_brk 45 -#define TARGET_NR_setgid 46 -#define TARGET_NR_getgid 47 -#define TARGET_NR_signal 48 -#define TARGET_NR_geteuid 49 -#define TARGET_NR_getegid 50 -#define TARGET_NR_acct 51 -#define TARGET_NR_umount2 52 -#define TARGET_NR_lock 53 -#define TARGET_NR_ioctl 54 -#define TARGET_NR_fcntl 55 -#define TARGET_NR_mpx 56 -#define TARGET_NR_setpgid 57 -#define TARGET_NR_ulimit 58 - /* 59 */ -#define TARGET_NR_umask 60 -#define TARGET_NR_chroot 61 -#define TARGET_NR_ustat 62 -#define TARGET_NR_dup2 63 -#define TARGET_NR_getppid 64 -#define TARGET_NR_getpgrp 65 -#define TARGET_NR_setsid 66 -#define TARGET_NR_sigaction 67 -#define TARGET_NR_sgetmask 68 -#define TARGET_NR_ssetmask 69 -#define TARGET_NR_setreuid 70 -#define TARGET_NR_setregid 71 -#define TARGET_NR_sigsuspend 72 -#define TARGET_NR_sigpending 73 -#define TARGET_NR_sethostname 74 -#define TARGET_NR_setrlimit 75 -#define TARGET_NR_getrlimit 76 -#define TARGET_NR_getrusage 77 -#define TARGET_NR_gettimeofday 78 -#define TARGET_NR_settimeofday 79 -#define TARGET_NR_getgroups 80 -#define TARGET_NR_setgroups 81 -#define TARGET_NR_select 82 -#define TARGET_NR_symlink 83 - /* 84 */ -#define TARGET_NR_readlink 85 -#define TARGET_NR_uselib 86 -#define TARGET_NR_swapon 87 -#define TARGET_NR_reboot 88 -#define TARGET_NR_readdir 89 -#define TARGET_NR_mmap 90 -#define TARGET_NR_munmap 91 -#define TARGET_NR_truncate 92 -#define TARGET_NR_ftruncate 93 -#define TARGET_NR_fchmod 94 -#define TARGET_NR_fchown 95 -#define TARGET_NR_getpriority 96 -#define TARGET_NR_setpriority 97 -#define TARGET_NR_profil 98 -#define TARGET_NR_statfs 99 -#define TARGET_NR_fstatfs 100 -#define TARGET_NR_ioperm 101 -#define TARGET_NR_socketcall 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_setitimer 104 -#define TARGET_NR_getitimer 105 -#define TARGET_NR_stat 106 -#define TARGET_NR_lstat 107 -#define TARGET_NR_fstat 108 - /* 109 */ - /* 110 */ -#define TARGET_NR_vhangup 111 -#define TARGET_NR_idle 112 -#define TARGET_NR_syscall 113 -#define TARGET_NR_wait4 114 -#define TARGET_NR_swapoff 115 -#define TARGET_NR_sysinfo 116 -#define TARGET_NR_ipc 117 -#define TARGET_NR_fsync 118 -#define TARGET_NR_sigreturn 119 -#define TARGET_NR_clone 120 -#define TARGET_NR_setdomainname 121 -#define TARGET_NR_uname 122 -#define TARGET_NR_modify_ldt 123 -#define TARGET_NR_adjtimex 124 -#define TARGET_NR_mprotect 125 -#define TARGET_NR_sigprocmask 126 -#define TARGET_NR_create_module 127 -#define TARGET_NR_init_module 128 -#define TARGET_NR_delete_module 129 -#define TARGET_NR_get_kernel_syms 130 -#define TARGET_NR_quotactl 131 -#define TARGET_NR_getpgid 132 -#define TARGET_NR_fchdir 133 -#define TARGET_NR_bdflush 134 -#define TARGET_NR_sysfs 135 -#define TARGET_NR_personality 136 -#define TARGET_NR_afs_syscall 137 -#define TARGET_NR_setfsuid 138 -#define TARGET_NR_setfsgid 139 -#define TARGET_NR__llseek 140 -#define TARGET_NR_getdents 141 -#define TARGET_NR__newselect 142 -#define TARGET_NR_flock 143 -#define TARGET_NR_msync 144 -#define TARGET_NR_readv 145 -#define TARGET_NR_writev 146 -#define TARGET_NR_getsid 147 -#define TARGET_NR_fdatasync 148 -#define TARGET_NR__sysctl 149 -#define TARGET_NR_mlock 150 -#define TARGET_NR_munlock 151 -#define TARGET_NR_mlockall 152 -#define TARGET_NR_munlockall 153 -#define TARGET_NR_sched_setparam 154 -#define TARGET_NR_sched_getparam 155 -#define TARGET_NR_sched_setscheduler 156 -#define TARGET_NR_sched_getscheduler 157 -#define TARGET_NR_sched_yield 158 -#define TARGET_NR_sched_get_priority_max 159 -#define TARGET_NR_sched_get_priority_min 160 -#define TARGET_NR_sched_rr_get_interval 161 -#define TARGET_NR_nanosleep 162 -#define TARGET_NR_mremap 163 -#define TARGET_NR_setresuid 164 -#define TARGET_NR_getresuid 165 -#define TARGET_NR_vm86 166 -#define TARGET_NR_query_module 167 -#define TARGET_NR_poll 168 -#define TARGET_NR_nfsservctl 169 -#define TARGET_NR_setresgid 170 -#define TARGET_NR_getresgid 171 -#define TARGET_NR_prctl 172 -#define TARGET_NR_rt_sigreturn 173 -#define TARGET_NR_rt_sigaction 174 -#define TARGET_NR_rt_sigprocmask 175 -#define TARGET_NR_rt_sigpending 176 -#define TARGET_NR_rt_sigtimedwait 177 -#define TARGET_NR_rt_sigqueueinfo 178 -#define TARGET_NR_rt_sigsuspend 179 -#define TARGET_NR_pread64 180 -#define TARGET_NR_pwrite64 181 -#define TARGET_NR_chown 182 -#define TARGET_NR_getcwd 183 -#define TARGET_NR_capget 184 -#define TARGET_NR_capset 185 -#define TARGET_NR_sigaltstack 186 -#define TARGET_NR_sendfile 187 - /* 188 */ - /* 189 */ -#define TARGET_NR_vfork 190 -#define TARGET_NR_ugetrlimit 191 -#define TARGET_NR_mmap2 192 -#define TARGET_NR_truncate64 193 -#define TARGET_NR_ftruncate64 194 -#define TARGET_NR_stat64 195 -#define TARGET_NR_lstat64 196 -#define TARGET_NR_fstat64 197 -#define TARGET_NR_lchown32 198 -#define TARGET_NR_getuid32 199 -#define TARGET_NR_getgid32 200 -#define TARGET_NR_geteuid32 201 -#define TARGET_NR_getegid32 202 -#define TARGET_NR_setreuid32 203 -#define TARGET_NR_setregid32 204 -#define TARGET_NR_getgroups32 205 -#define TARGET_NR_setgroups32 206 -#define TARGET_NR_fchown32 207 -#define TARGET_NR_setresuid32 208 -#define TARGET_NR_getresuid32 209 -#define TARGET_NR_setresgid32 210 -#define TARGET_NR_getresgid32 211 -#define TARGET_NR_chown32 212 -#define TARGET_NR_setuid32 213 -#define TARGET_NR_setgid32 214 -#define TARGET_NR_setfsuid32 215 -#define TARGET_NR_setfsgid32 216 -#define TARGET_NR_getdents64 217 -#define TARGET_NR_pivot_root 218 -#define TARGET_NR_mincore 219 -#define TARGET_NR_madvise 220 -#define TARGET_NR_fcntl64 221 - /* 222 */ - /* 223 */ -#define TARGET_NR_gettid 224 -#define TARGET_NR_readahead 225 -#define TARGET_NR_setxattr 226 -#define TARGET_NR_lsetxattr 227 -#define TARGET_NR_fsetxattr 228 -#define TARGET_NR_getxattr 229 -#define TARGET_NR_lgetxattr 230 -#define TARGET_NR_fgetxattr 231 -#define TARGET_NR_listxattr 232 -#define TARGET_NR_llistxattr 233 -#define TARGET_NR_flistxattr 234 -#define TARGET_NR_removexattr 235 -#define TARGET_NR_lremovexattr 236 -#define TARGET_NR_fremovexattr 237 -#define TARGET_NR_tkill 238 -#define TARGET_NR_sendfile64 239 -#define TARGET_NR_futex 240 -#define TARGET_NR_sched_setaffinity 241 -#define TARGET_NR_sched_getaffinity 242 -#define TARGET_NR_io_setup 243 -#define TARGET_NR_io_destroy 244 -#define TARGET_NR_io_getevents 245 -#define TARGET_NR_io_submit 246 -#define TARGET_NR_io_cancel 247 -#define TARGET_NR_exit_group 248 -#define TARGET_NR_lookup_dcookie 249 -#define TARGET_NR_epoll_create 250 -#define TARGET_NR_epoll_ctl 251 -#define TARGET_NR_epoll_wait 252 -#define TARGET_NR_remap_file_pages 253 - /* 254 */ - /* 255 */ - /* 256 */ -#define TARGET_NR_set_tid_address 256 -#define TARGET_NR_timer_create 257 -#define TARGET_NR_timer_settime 258 -#define TARGET_NR_timer_gettime 259 -#define TARGET_NR_timer_getoverrun 260 -#define TARGET_NR_timer_delete 261 -#define TARGET_NR_clock_settime 262 -#define TARGET_NR_clock_gettime 263 -#define TARGET_NR_clock_getres 264 -#define TARGET_NR_clock_nanosleep 265 -#define TARGET_NR_statfs64 266 -#define TARGET_NR_fstatfs64 267 -#define TARGET_NR_tgkill 268 -#define TARGET_NR_utimes 269 -#define TARGET_NR_fadvise64_64 270 -#define TARGET_NR_pciconfig_iobase 271 -#define TARGET_NR_pciconfig_read 272 -#define TARGET_NR_pciconfig_write 273 -#define TARGET_NR_mq_open 274 -#define TARGET_NR_mq_unlink 275 -#define TARGET_NR_mq_timedsend 276 -#define TARGET_NR_mq_timedreceive 277 -#define TARGET_NR_mq_notify 278 -#define TARGET_NR_mq_getsetattr 279 -#define TARGET_NR_waitid 280 -#define TARGET_NR_socket 281 -#define TARGET_NR_bind 282 -#define TARGET_NR_connect 283 -#define TARGET_NR_listen 284 -#define TARGET_NR_accept 285 -#define TARGET_NR_getsockname 286 -#define TARGET_NR_getpeername 287 -#define TARGET_NR_socketpair 288 -#define TARGET_NR_send 289 -#define TARGET_NR_sendto 290 -#define TARGET_NR_recv 291 -#define TARGET_NR_recvfrom 292 -#define TARGET_NR_shutdown 293 -#define TARGET_NR_setsockopt 294 -#define TARGET_NR_getsockopt 295 -#define TARGET_NR_sendmsg 296 -#define TARGET_NR_recvmsg 297 -#define TARGET_NR_semop 298 -#define TARGET_NR_semget 299 -#define TARGET_NR_semctl 300 -#define TARGET_NR_msgsnd 301 -#define TARGET_NR_msgrcv 302 -#define TARGET_NR_msgget 303 -#define TARGET_NR_msgctl 304 -#define TARGET_NR_shmat 305 -#define TARGET_NR_shmdt 306 -#define TARGET_NR_shmget 307 -#define TARGET_NR_shmctl 308 -#define TARGET_NR_add_key 309 -#define TARGET_NR_request_key 310 -#define TARGET_NR_keyctl 311 -#define TARGET_NR_semtimedop 312 -#define TARGET_NR_vserver 313 -#define TARGET_NR_ioprio_set 314 -#define TARGET_NR_ioprio_get 315 -#define TARGET_NR_inotify_init 316 -#define TARGET_NR_inotify_add_watch 317 -#define TARGET_NR_inotify_rm_watch 318 -#define TARGET_NR_mbind 319 -#define TARGET_NR_get_mempolicy 320 -#define TARGET_NR_set_mempolicy 321 -#define TARGET_NR_openat 322 -#define TARGET_NR_mkdirat 323 -#define TARGET_NR_mknodat 324 -#define TARGET_NR_fchownat 325 -#define TARGET_NR_futimesat 326 -#define TARGET_NR_fstatat64 327 -#define TARGET_NR_unlinkat 328 -#define TARGET_NR_renameat 329 -#define TARGET_NR_linkat 330 -#define TARGET_NR_symlinkat 331 -#define TARGET_NR_readlinkat 332 -#define TARGET_NR_fchmodat 333 -#define TARGET_NR_faccessat 334 - /* 335 */ - /* 336 */ -#define TARGET_NR_unshare 337 -#define TARGET_NR_set_robust_list 338 -#define TARGET_NR_get_robust_list 339 -#define TARGET_NR_splice 340 -#define TARGET_NR_sync_file_range2 341 -#define TARGET_NR_tee 342 -#define TARGET_NR_vmsplice 343 -#define TARGET_NR_move_pages 344 -#define TARGET_NR_getcpu 345 - /* 346 */ -#define TARGET_NR_kexec_load 347 -#define TARGET_NR_utimensat 348 -#define TARGET_NR_signalfd 349 -#define TARGET_NR_timerfd 350 -#define TARGET_NR_eventfd 351 -#define TARGET_NR_fallocate 352 -#define TARGET_NR_timerfd_settime 353 -#define TARGET_NR_timerfd_gettime 354 -#define TARGET_NR_signalfd4 355 -#define TARGET_NR_eventfd2 356 -#define TARGET_NR_epoll_create1 357 -#define TARGET_NR_dup3 358 -#define TARGET_NR_pipe2 359 -#define TARGET_NR_inotify_init1 360 diff --git a/qemu/linux-user/unicore32/target_cpu.h b/qemu/linux-user/unicore32/target_cpu.h deleted file mode 100644 index fb7908719..000000000 --- a/qemu/linux-user/unicore32/target_cpu.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * UniCore32 specific CPU ABI and functions for linux-user - * - * Copyright (C) 2010-2012 Guan Xuetao - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation, or (at your option) any - * later version. See the COPYING file in the top-level directory. - */ -#ifndef TARGET_CPU_H -#define TARGET_CPU_H - -static inline void cpu_clone_regs(CPUUniCore32State *env, target_ulong newsp) -{ - if (newsp) { - env->regs[29] = newsp; - } - env->regs[0] = 0; -} - -static inline void cpu_set_tls(CPUUniCore32State *env, target_ulong newtls) -{ - env->regs[16] = newtls; -} - -#endif diff --git a/qemu/linux-user/unicore32/target_signal.h b/qemu/linux-user/unicore32/target_signal.h deleted file mode 100644 index 7c442381a..000000000 --- a/qemu/linux-user/unicore32/target_signal.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2010-2011 GUAN Xue-tao - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -/* this struct defines a stack used during syscall handling */ -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_ulong ss_flags; - abi_ulong ss_size; -} target_stack_t; - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -static inline abi_ulong get_sp_from_cpustate(CPUUniCore32State *state) -{ - return state->regs[29]; -} - - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/unicore32/target_structs.h b/qemu/linux-user/unicore32/target_structs.h deleted file mode 100644 index 789369503..000000000 --- a/qemu/linux-user/unicore32/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * UniCore32 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/unicore32/target_syscall.h b/qemu/linux-user/unicore32/target_syscall.h deleted file mode 100644 index 385a97562..000000000 --- a/qemu/linux-user/unicore32/target_syscall.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2010-2011 GUAN Xue-tao - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#ifndef __UC32_SYSCALL_H__ -#define __UC32_SYSCALL_H__ -struct target_pt_regs { - abi_ulong uregs[34]; -}; - -#define UC32_REG_pc uregs[31] -#define UC32_REG_lr uregs[30] -#define UC32_REG_sp uregs[29] -#define UC32_REG_ip uregs[28] -#define UC32_REG_fp uregs[27] -#define UC32_REG_26 uregs[26] -#define UC32_REG_25 uregs[25] -#define UC32_REG_24 uregs[24] -#define UC32_REG_23 uregs[23] -#define UC32_REG_22 uregs[22] -#define UC32_REG_21 uregs[21] -#define UC32_REG_20 uregs[20] -#define UC32_REG_19 uregs[19] -#define UC32_REG_18 uregs[18] -#define UC32_REG_17 uregs[17] -#define UC32_REG_16 uregs[16] -#define UC32_REG_15 uregs[15] -#define UC32_REG_14 uregs[14] -#define UC32_REG_13 uregs[13] -#define UC32_REG_12 uregs[12] -#define UC32_REG_11 uregs[11] -#define UC32_REG_10 uregs[10] -#define UC32_REG_09 uregs[9] -#define UC32_REG_08 uregs[8] -#define UC32_REG_07 uregs[7] -#define UC32_REG_06 uregs[6] -#define UC32_REG_05 uregs[5] -#define UC32_REG_04 uregs[4] -#define UC32_REG_03 uregs[3] -#define UC32_REG_02 uregs[2] -#define UC32_REG_01 uregs[1] -#define UC32_REG_00 uregs[0] -#define UC32_REG_asr uregs[32] -#define UC32_REG_ORIG_00 uregs[33] - -#define UC32_SYSCALL_BASE 0x900000 -#define UC32_SYSCALL_ARCH_BASE 0xf0000 -#define UC32_SYSCALL_NR_set_tls (UC32_SYSCALL_ARCH_BASE + 5) - -#define UNAME_MACHINE "UniCore-II" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* __UC32_SYSCALL_H__ */ diff --git a/qemu/linux-user/unicore32/termbits.h b/qemu/linux-user/unicore32/termbits.h deleted file mode 100644 index a5fcd64ab..000000000 --- a/qemu/linux-user/unicore32/termbits.h +++ /dev/null @@ -1,2 +0,0 @@ -/* NOTE: exactly the same as i386 */ -#include "../i386/termbits.h" diff --git a/qemu/linux-user/vm86.c b/qemu/linux-user/vm86.c deleted file mode 100644 index 3829b9a67..000000000 --- a/qemu/linux-user/vm86.c +++ /dev/null @@ -1,490 +0,0 @@ -/* - * vm86 linux syscall support - * - * Copyright (c) 2003 Fabrice Bellard - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ -#include "qemu/osdep.h" - -#include "qemu.h" - -//#define DEBUG_VM86 - -#ifdef DEBUG_VM86 -# define LOG_VM86(...) qemu_log(__VA_ARGS__); -#else -# define LOG_VM86(...) do { } while (0) -#endif - - -#define set_flags(X,new,mask) \ -((X) = ((X) & ~(mask)) | ((new) & (mask))) - -#define SAFE_MASK (0xDD5) -#define RETURN_MASK (0xDFF) - -static inline int is_revectored(int nr, struct target_revectored_struct *bitmap) -{ - return (((uint8_t *)bitmap)[nr >> 3] >> (nr & 7)) & 1; -} - -static inline void vm_putw(CPUX86State *env, uint32_t segptr, - unsigned int reg16, unsigned int val) -{ - cpu_stw_data(env, segptr + (reg16 & 0xffff), val); -} - -static inline void vm_putl(CPUX86State *env, uint32_t segptr, - unsigned int reg16, unsigned int val) -{ - cpu_stl_data(env, segptr + (reg16 & 0xffff), val); -} - -static inline unsigned int vm_getb(CPUX86State *env, - uint32_t segptr, unsigned int reg16) -{ - return cpu_ldub_data(env, segptr + (reg16 & 0xffff)); -} - -static inline unsigned int vm_getw(CPUX86State *env, - uint32_t segptr, unsigned int reg16) -{ - return cpu_lduw_data(env, segptr + (reg16 & 0xffff)); -} - -static inline unsigned int vm_getl(CPUX86State *env, - uint32_t segptr, unsigned int reg16) -{ - return cpu_ldl_data(env, segptr + (reg16 & 0xffff)); -} - -void save_v86_state(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - struct target_vm86plus_struct * target_v86; - - if (!lock_user_struct(VERIFY_WRITE, target_v86, ts->target_v86, 0)) - /* FIXME - should return an error */ - return; - /* put the VM86 registers in the userspace register structure */ - target_v86->regs.eax = tswap32(env->regs[R_EAX]); - target_v86->regs.ebx = tswap32(env->regs[R_EBX]); - target_v86->regs.ecx = tswap32(env->regs[R_ECX]); - target_v86->regs.edx = tswap32(env->regs[R_EDX]); - target_v86->regs.esi = tswap32(env->regs[R_ESI]); - target_v86->regs.edi = tswap32(env->regs[R_EDI]); - target_v86->regs.ebp = tswap32(env->regs[R_EBP]); - target_v86->regs.esp = tswap32(env->regs[R_ESP]); - target_v86->regs.eip = tswap32(env->eip); - target_v86->regs.cs = tswap16(env->segs[R_CS].selector); - target_v86->regs.ss = tswap16(env->segs[R_SS].selector); - target_v86->regs.ds = tswap16(env->segs[R_DS].selector); - target_v86->regs.es = tswap16(env->segs[R_ES].selector); - target_v86->regs.fs = tswap16(env->segs[R_FS].selector); - target_v86->regs.gs = tswap16(env->segs[R_GS].selector); - set_flags(env->eflags, ts->v86flags, VIF_MASK | ts->v86mask); - target_v86->regs.eflags = tswap32(env->eflags); - unlock_user_struct(target_v86, ts->target_v86, 1); - LOG_VM86("save_v86_state: eflags=%08x cs:ip=%04x:%04x\n", - env->eflags, env->segs[R_CS].selector, env->eip); - - /* restore 32 bit registers */ - env->regs[R_EAX] = ts->vm86_saved_regs.eax; - env->regs[R_EBX] = ts->vm86_saved_regs.ebx; - env->regs[R_ECX] = ts->vm86_saved_regs.ecx; - env->regs[R_EDX] = ts->vm86_saved_regs.edx; - env->regs[R_ESI] = ts->vm86_saved_regs.esi; - env->regs[R_EDI] = ts->vm86_saved_regs.edi; - env->regs[R_EBP] = ts->vm86_saved_regs.ebp; - env->regs[R_ESP] = ts->vm86_saved_regs.esp; - env->eflags = ts->vm86_saved_regs.eflags; - env->eip = ts->vm86_saved_regs.eip; - - cpu_x86_load_seg(env, R_CS, ts->vm86_saved_regs.cs); - cpu_x86_load_seg(env, R_SS, ts->vm86_saved_regs.ss); - cpu_x86_load_seg(env, R_DS, ts->vm86_saved_regs.ds); - cpu_x86_load_seg(env, R_ES, ts->vm86_saved_regs.es); - cpu_x86_load_seg(env, R_FS, ts->vm86_saved_regs.fs); - cpu_x86_load_seg(env, R_GS, ts->vm86_saved_regs.gs); -} - -/* return from vm86 mode to 32 bit. The vm86() syscall will return - 'retval' */ -static inline void return_to_32bit(CPUX86State *env, int retval) -{ - LOG_VM86("return_to_32bit: ret=0x%x\n", retval); - save_v86_state(env); - env->regs[R_EAX] = retval; -} - -static inline int set_IF(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - - ts->v86flags |= VIF_MASK; - if (ts->v86flags & VIP_MASK) { - return_to_32bit(env, TARGET_VM86_STI); - return 1; - } - return 0; -} - -static inline void clear_IF(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - - ts->v86flags &= ~VIF_MASK; -} - -static inline void clear_TF(CPUX86State *env) -{ - env->eflags &= ~TF_MASK; -} - -static inline void clear_AC(CPUX86State *env) -{ - env->eflags &= ~AC_MASK; -} - -static inline int set_vflags_long(unsigned long eflags, CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - - set_flags(ts->v86flags, eflags, ts->v86mask); - set_flags(env->eflags, eflags, SAFE_MASK); - if (eflags & IF_MASK) - return set_IF(env); - else - clear_IF(env); - return 0; -} - -static inline int set_vflags_short(unsigned short flags, CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - - set_flags(ts->v86flags, flags, ts->v86mask & 0xffff); - set_flags(env->eflags, flags, SAFE_MASK); - if (flags & IF_MASK) - return set_IF(env); - else - clear_IF(env); - return 0; -} - -static inline unsigned int get_vflags(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - unsigned int flags; - - flags = env->eflags & RETURN_MASK; - if (ts->v86flags & VIF_MASK) - flags |= IF_MASK; - flags |= IOPL_MASK; - return flags | (ts->v86flags & ts->v86mask); -} - -#define ADD16(reg, val) reg = (reg & ~0xffff) | ((reg + (val)) & 0xffff) - -/* handle VM86 interrupt (NOTE: the CPU core currently does not - support TSS interrupt revectoring, so this code is always executed) */ -static void do_int(CPUX86State *env, int intno) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - uint32_t int_addr, segoffs, ssp; - unsigned int sp; - - if (env->segs[R_CS].selector == TARGET_BIOSSEG) - goto cannot_handle; - if (is_revectored(intno, &ts->vm86plus.int_revectored)) - goto cannot_handle; - if (intno == 0x21 && is_revectored((env->regs[R_EAX] >> 8) & 0xff, - &ts->vm86plus.int21_revectored)) - goto cannot_handle; - int_addr = (intno << 2); - segoffs = cpu_ldl_data(env, int_addr); - if ((segoffs >> 16) == TARGET_BIOSSEG) - goto cannot_handle; - LOG_VM86("VM86: emulating int 0x%x. CS:IP=%04x:%04x\n", - intno, segoffs >> 16, segoffs & 0xffff); - /* save old state */ - ssp = env->segs[R_SS].selector << 4; - sp = env->regs[R_ESP] & 0xffff; - vm_putw(env, ssp, sp - 2, get_vflags(env)); - vm_putw(env, ssp, sp - 4, env->segs[R_CS].selector); - vm_putw(env, ssp, sp - 6, env->eip); - ADD16(env->regs[R_ESP], -6); - /* goto interrupt handler */ - env->eip = segoffs & 0xffff; - cpu_x86_load_seg(env, R_CS, segoffs >> 16); - clear_TF(env); - clear_IF(env); - clear_AC(env); - return; - cannot_handle: - LOG_VM86("VM86: return to 32 bits int 0x%x\n", intno); - return_to_32bit(env, TARGET_VM86_INTx | (intno << 8)); -} - -void handle_vm86_trap(CPUX86State *env, int trapno) -{ - if (trapno == 1 || trapno == 3) { - return_to_32bit(env, TARGET_VM86_TRAP + (trapno << 8)); - } else { - do_int(env, trapno); - } -} - -#define CHECK_IF_IN_TRAP() \ - if ((ts->vm86plus.vm86plus.flags & TARGET_vm86dbg_active) && \ - (ts->vm86plus.vm86plus.flags & TARGET_vm86dbg_TFpendig)) \ - newflags |= TF_MASK - -#define VM86_FAULT_RETURN \ - if ((ts->vm86plus.vm86plus.flags & TARGET_force_return_for_pic) && \ - (ts->v86flags & (IF_MASK | VIF_MASK))) \ - return_to_32bit(env, TARGET_VM86_PICRETURN); \ - return - -void handle_vm86_fault(CPUX86State *env) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - uint32_t csp, ssp; - unsigned int ip, sp, newflags, newip, newcs, opcode, intno; - int data32, pref_done; - - csp = env->segs[R_CS].selector << 4; - ip = env->eip & 0xffff; - - ssp = env->segs[R_SS].selector << 4; - sp = env->regs[R_ESP] & 0xffff; - - LOG_VM86("VM86 exception %04x:%08x\n", - env->segs[R_CS].selector, env->eip); - - data32 = 0; - pref_done = 0; - do { - opcode = vm_getb(env, csp, ip); - ADD16(ip, 1); - switch (opcode) { - case 0x66: /* 32-bit data */ data32=1; break; - case 0x67: /* 32-bit address */ break; - case 0x2e: /* CS */ break; - case 0x3e: /* DS */ break; - case 0x26: /* ES */ break; - case 0x36: /* SS */ break; - case 0x65: /* GS */ break; - case 0x64: /* FS */ break; - case 0xf2: /* repnz */ break; - case 0xf3: /* rep */ break; - default: pref_done = 1; - } - } while (!pref_done); - - /* VM86 mode */ - switch(opcode) { - case 0x9c: /* pushf */ - if (data32) { - vm_putl(env, ssp, sp - 4, get_vflags(env)); - ADD16(env->regs[R_ESP], -4); - } else { - vm_putw(env, ssp, sp - 2, get_vflags(env)); - ADD16(env->regs[R_ESP], -2); - } - env->eip = ip; - VM86_FAULT_RETURN; - - case 0x9d: /* popf */ - if (data32) { - newflags = vm_getl(env, ssp, sp); - ADD16(env->regs[R_ESP], 4); - } else { - newflags = vm_getw(env, ssp, sp); - ADD16(env->regs[R_ESP], 2); - } - env->eip = ip; - CHECK_IF_IN_TRAP(); - if (data32) { - if (set_vflags_long(newflags, env)) - return; - } else { - if (set_vflags_short(newflags, env)) - return; - } - VM86_FAULT_RETURN; - - case 0xcd: /* int */ - intno = vm_getb(env, csp, ip); - ADD16(ip, 1); - env->eip = ip; - if (ts->vm86plus.vm86plus.flags & TARGET_vm86dbg_active) { - if ( (ts->vm86plus.vm86plus.vm86dbg_intxxtab[intno >> 3] >> - (intno &7)) & 1) { - return_to_32bit(env, TARGET_VM86_INTx + (intno << 8)); - return; - } - } - do_int(env, intno); - break; - - case 0xcf: /* iret */ - if (data32) { - newip = vm_getl(env, ssp, sp) & 0xffff; - newcs = vm_getl(env, ssp, sp + 4) & 0xffff; - newflags = vm_getl(env, ssp, sp + 8); - ADD16(env->regs[R_ESP], 12); - } else { - newip = vm_getw(env, ssp, sp); - newcs = vm_getw(env, ssp, sp + 2); - newflags = vm_getw(env, ssp, sp + 4); - ADD16(env->regs[R_ESP], 6); - } - env->eip = newip; - cpu_x86_load_seg(env, R_CS, newcs); - CHECK_IF_IN_TRAP(); - if (data32) { - if (set_vflags_long(newflags, env)) - return; - } else { - if (set_vflags_short(newflags, env)) - return; - } - VM86_FAULT_RETURN; - - case 0xfa: /* cli */ - env->eip = ip; - clear_IF(env); - VM86_FAULT_RETURN; - - case 0xfb: /* sti */ - env->eip = ip; - if (set_IF(env)) - return; - VM86_FAULT_RETURN; - - default: - /* real VM86 GPF exception */ - return_to_32bit(env, TARGET_VM86_UNKNOWN); - break; - } -} - -int do_vm86(CPUX86State *env, long subfunction, abi_ulong vm86_addr) -{ - CPUState *cs = CPU(x86_env_get_cpu(env)); - TaskState *ts = cs->opaque; - struct target_vm86plus_struct * target_v86; - int ret; - - switch (subfunction) { - case TARGET_VM86_REQUEST_IRQ: - case TARGET_VM86_FREE_IRQ: - case TARGET_VM86_GET_IRQ_BITS: - case TARGET_VM86_GET_AND_RESET_IRQ: - gemu_log("qemu: unsupported vm86 subfunction (%ld)\n", subfunction); - ret = -TARGET_EINVAL; - goto out; - case TARGET_VM86_PLUS_INSTALL_CHECK: - /* NOTE: on old vm86 stuff this will return the error - from verify_area(), because the subfunction is - interpreted as (invalid) address to vm86_struct. - So the installation check works. - */ - ret = 0; - goto out; - } - - /* save current CPU regs */ - ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */ - ts->vm86_saved_regs.ebx = env->regs[R_EBX]; - ts->vm86_saved_regs.ecx = env->regs[R_ECX]; - ts->vm86_saved_regs.edx = env->regs[R_EDX]; - ts->vm86_saved_regs.esi = env->regs[R_ESI]; - ts->vm86_saved_regs.edi = env->regs[R_EDI]; - ts->vm86_saved_regs.ebp = env->regs[R_EBP]; - ts->vm86_saved_regs.esp = env->regs[R_ESP]; - ts->vm86_saved_regs.eflags = env->eflags; - ts->vm86_saved_regs.eip = env->eip; - ts->vm86_saved_regs.cs = env->segs[R_CS].selector; - ts->vm86_saved_regs.ss = env->segs[R_SS].selector; - ts->vm86_saved_regs.ds = env->segs[R_DS].selector; - ts->vm86_saved_regs.es = env->segs[R_ES].selector; - ts->vm86_saved_regs.fs = env->segs[R_FS].selector; - ts->vm86_saved_regs.gs = env->segs[R_GS].selector; - - ts->target_v86 = vm86_addr; - if (!lock_user_struct(VERIFY_READ, target_v86, vm86_addr, 1)) - return -TARGET_EFAULT; - /* build vm86 CPU state */ - ts->v86flags = tswap32(target_v86->regs.eflags); - env->eflags = (env->eflags & ~SAFE_MASK) | - (tswap32(target_v86->regs.eflags) & SAFE_MASK) | VM_MASK; - - ts->vm86plus.cpu_type = tswapal(target_v86->cpu_type); - switch (ts->vm86plus.cpu_type) { - case TARGET_CPU_286: - ts->v86mask = 0; - break; - case TARGET_CPU_386: - ts->v86mask = NT_MASK | IOPL_MASK; - break; - case TARGET_CPU_486: - ts->v86mask = AC_MASK | NT_MASK | IOPL_MASK; - break; - default: - ts->v86mask = ID_MASK | AC_MASK | NT_MASK | IOPL_MASK; - break; - } - - env->regs[R_EBX] = tswap32(target_v86->regs.ebx); - env->regs[R_ECX] = tswap32(target_v86->regs.ecx); - env->regs[R_EDX] = tswap32(target_v86->regs.edx); - env->regs[R_ESI] = tswap32(target_v86->regs.esi); - env->regs[R_EDI] = tswap32(target_v86->regs.edi); - env->regs[R_EBP] = tswap32(target_v86->regs.ebp); - env->regs[R_ESP] = tswap32(target_v86->regs.esp); - env->eip = tswap32(target_v86->regs.eip); - cpu_x86_load_seg(env, R_CS, tswap16(target_v86->regs.cs)); - cpu_x86_load_seg(env, R_SS, tswap16(target_v86->regs.ss)); - cpu_x86_load_seg(env, R_DS, tswap16(target_v86->regs.ds)); - cpu_x86_load_seg(env, R_ES, tswap16(target_v86->regs.es)); - cpu_x86_load_seg(env, R_FS, tswap16(target_v86->regs.fs)); - cpu_x86_load_seg(env, R_GS, tswap16(target_v86->regs.gs)); - ret = tswap32(target_v86->regs.eax); /* eax will be restored at - the end of the syscall */ - memcpy(&ts->vm86plus.int_revectored, - &target_v86->int_revectored, 32); - memcpy(&ts->vm86plus.int21_revectored, - &target_v86->int21_revectored, 32); - ts->vm86plus.vm86plus.flags = tswapal(target_v86->vm86plus.flags); - memcpy(&ts->vm86plus.vm86plus.vm86dbg_intxxtab, - target_v86->vm86plus.vm86dbg_intxxtab, 32); - unlock_user_struct(target_v86, vm86_addr, 0); - - LOG_VM86("do_vm86: cs:ip=%04x:%04x\n", - env->segs[R_CS].selector, env->eip); - /* now the virtual CPU is ready for vm86 execution ! */ - out: - return ret; -} diff --git a/qemu/linux-user/x86_64/syscall_nr.h b/qemu/linux-user/x86_64/syscall_nr.h deleted file mode 100644 index 16397b3e8..000000000 --- a/qemu/linux-user/x86_64/syscall_nr.h +++ /dev/null @@ -1,327 +0,0 @@ -#define TARGET_NR_read 0 -#define TARGET_NR_write 1 -#define TARGET_NR_open 2 -#define TARGET_NR_close 3 -#define TARGET_NR_stat 4 -#define TARGET_NR_fstat 5 -#define TARGET_NR_lstat 6 -#define TARGET_NR_poll 7 -#define TARGET_NR_lseek 8 -#define TARGET_NR_mmap 9 -#define TARGET_NR_mprotect 10 -#define TARGET_NR_munmap 11 -#define TARGET_NR_brk 12 -#define TARGET_NR_rt_sigaction 13 -#define TARGET_NR_rt_sigprocmask 14 -#define TARGET_NR_rt_sigreturn 15 -#define TARGET_NR_ioctl 16 -#define TARGET_NR_pread64 17 -#define TARGET_NR_pwrite64 18 -#define TARGET_NR_readv 19 -#define TARGET_NR_writev 20 -#define TARGET_NR_access 21 -#define TARGET_NR_pipe 22 -#define TARGET_NR_select 23 -#define TARGET_NR_sched_yield 24 -#define TARGET_NR_mremap 25 -#define TARGET_NR_msync 26 -#define TARGET_NR_mincore 27 -#define TARGET_NR_madvise 28 -#define TARGET_NR_shmget 29 -#define TARGET_NR_shmat 30 -#define TARGET_NR_shmctl 31 -#define TARGET_NR_dup 32 -#define TARGET_NR_dup2 33 -#define TARGET_NR_pause 34 -#define TARGET_NR_nanosleep 35 -#define TARGET_NR_getitimer 36 -#define TARGET_NR_alarm 37 -#define TARGET_NR_setitimer 38 -#define TARGET_NR_getpid 39 -#define TARGET_NR_sendfile 40 -#define TARGET_NR_socket 41 -#define TARGET_NR_connect 42 -#define TARGET_NR_accept 43 -#define TARGET_NR_sendto 44 -#define TARGET_NR_recvfrom 45 -#define TARGET_NR_sendmsg 46 -#define TARGET_NR_recvmsg 47 -#define TARGET_NR_shutdown 48 -#define TARGET_NR_bind 49 -#define TARGET_NR_listen 50 -#define TARGET_NR_getsockname 51 -#define TARGET_NR_getpeername 52 -#define TARGET_NR_socketpair 53 -#define TARGET_NR_setsockopt 54 -#define TARGET_NR_getsockopt 55 -#define TARGET_NR_clone 56 -#define TARGET_NR_fork 57 -#define TARGET_NR_vfork 58 -#define TARGET_NR_execve 59 -#define TARGET_NR_exit 60 -#define TARGET_NR_wait4 61 -#define TARGET_NR_kill 62 -#define TARGET_NR_uname 63 -#define TARGET_NR_semget 64 -#define TARGET_NR_semop 65 -#define TARGET_NR_semctl 66 -#define TARGET_NR_shmdt 67 -#define TARGET_NR_msgget 68 -#define TARGET_NR_msgsnd 69 -#define TARGET_NR_msgrcv 70 -#define TARGET_NR_msgctl 71 -#define TARGET_NR_fcntl 72 -#define TARGET_NR_flock 73 -#define TARGET_NR_fsync 74 -#define TARGET_NR_fdatasync 75 -#define TARGET_NR_truncate 76 -#define TARGET_NR_ftruncate 77 -#define TARGET_NR_getdents 78 -#define TARGET_NR_getcwd 79 -#define TARGET_NR_chdir 80 -#define TARGET_NR_fchdir 81 -#define TARGET_NR_rename 82 -#define TARGET_NR_mkdir 83 -#define TARGET_NR_rmdir 84 -#define TARGET_NR_creat 85 -#define TARGET_NR_link 86 -#define TARGET_NR_unlink 87 -#define TARGET_NR_symlink 88 -#define TARGET_NR_readlink 89 -#define TARGET_NR_chmod 90 -#define TARGET_NR_fchmod 91 -#define TARGET_NR_chown 92 -#define TARGET_NR_fchown 93 -#define TARGET_NR_lchown 94 -#define TARGET_NR_umask 95 -#define TARGET_NR_gettimeofday 96 -#define TARGET_NR_getrlimit 97 -#define TARGET_NR_getrusage 98 -#define TARGET_NR_sysinfo 99 -#define TARGET_NR_times 100 -#define TARGET_NR_ptrace 101 -#define TARGET_NR_getuid 102 -#define TARGET_NR_syslog 103 -#define TARGET_NR_getgid 104 -#define TARGET_NR_setuid 105 -#define TARGET_NR_setgid 106 -#define TARGET_NR_geteuid 107 -#define TARGET_NR_getegid 108 -#define TARGET_NR_setpgid 109 -#define TARGET_NR_getppid 110 -#define TARGET_NR_getpgrp 111 -#define TARGET_NR_setsid 112 -#define TARGET_NR_setreuid 113 -#define TARGET_NR_setregid 114 -#define TARGET_NR_getgroups 115 -#define TARGET_NR_setgroups 116 -#define TARGET_NR_setresuid 117 -#define TARGET_NR_getresuid 118 -#define TARGET_NR_setresgid 119 -#define TARGET_NR_getresgid 120 -#define TARGET_NR_getpgid 121 -#define TARGET_NR_setfsuid 122 -#define TARGET_NR_setfsgid 123 -#define TARGET_NR_getsid 124 -#define TARGET_NR_capget 125 -#define TARGET_NR_capset 126 -#define TARGET_NR_rt_sigpending 127 -#define TARGET_NR_rt_sigtimedwait 128 -#define TARGET_NR_rt_sigqueueinfo 129 -#define TARGET_NR_rt_sigsuspend 130 -#define TARGET_NR_sigaltstack 131 -#define TARGET_NR_utime 132 -#define TARGET_NR_mknod 133 -#define TARGET_NR_uselib 134 -#define TARGET_NR_personality 135 -#define TARGET_NR_ustat 136 -#define TARGET_NR_statfs 137 -#define TARGET_NR_fstatfs 138 -#define TARGET_NR_sysfs 139 -#define TARGET_NR_getpriority 140 -#define TARGET_NR_setpriority 141 -#define TARGET_NR_sched_setparam 142 -#define TARGET_NR_sched_getparam 143 -#define TARGET_NR_sched_setscheduler 144 -#define TARGET_NR_sched_getscheduler 145 -#define TARGET_NR_sched_get_priority_max 146 -#define TARGET_NR_sched_get_priority_min 147 -#define TARGET_NR_sched_rr_get_interval 148 -#define TARGET_NR_mlock 149 -#define TARGET_NR_munlock 150 -#define TARGET_NR_mlockall 151 -#define TARGET_NR_munlockall 152 -#define TARGET_NR_vhangup 153 -#define TARGET_NR_modify_ldt 154 -#define TARGET_NR_pivot_root 155 -#define TARGET_NR__sysctl 156 -#define TARGET_NR_prctl 157 -#define TARGET_NR_arch_prctl 158 -#define TARGET_NR_adjtimex 159 -#define TARGET_NR_setrlimit 160 -#define TARGET_NR_chroot 161 -#define TARGET_NR_sync 162 -#define TARGET_NR_acct 163 -#define TARGET_NR_settimeofday 164 -#define TARGET_NR_mount 165 -#define TARGET_NR_umount2 166 -#define TARGET_NR_swapon 167 -#define TARGET_NR_swapoff 168 -#define TARGET_NR_reboot 169 -#define TARGET_NR_sethostname 170 -#define TARGET_NR_setdomainname 171 -#define TARGET_NR_iopl 172 -#define TARGET_NR_ioperm 173 -#define TARGET_NR_create_module 174 -#define TARGET_NR_init_module 175 -#define TARGET_NR_delete_module 176 -#define TARGET_NR_get_kernel_syms 177 -#define TARGET_NR_query_module 178 -#define TARGET_NR_quotactl 179 -#define TARGET_NR_nfsservctl 180 -#define TARGET_NR_getpmsg 181 /* reserved for LiS/STREAMS */ -#define TARGET_NR_putpmsg 182 /* reserved for LiS/STREAMS */ -#define TARGET_NR_afs_syscall 183 /* reserved for AFS */ -#define TARGET_NR_tuxcall 184 /* reserved for tux */ -#define TARGET_NR_security 185 -#define TARGET_NR_gettid 186 -#define TARGET_NR_readahead 187 -#define TARGET_NR_setxattr 188 -#define TARGET_NR_lsetxattr 189 -#define TARGET_NR_fsetxattr 190 -#define TARGET_NR_getxattr 191 -#define TARGET_NR_lgetxattr 192 -#define TARGET_NR_fgetxattr 193 -#define TARGET_NR_listxattr 194 -#define TARGET_NR_llistxattr 195 -#define TARGET_NR_flistxattr 196 -#define TARGET_NR_removexattr 197 -#define TARGET_NR_lremovexattr 198 -#define TARGET_NR_fremovexattr 199 -#define TARGET_NR_tkill 200 -#define TARGET_NR_time 201 -#define TARGET_NR_futex 202 -#define TARGET_NR_sched_setaffinity 203 -#define TARGET_NR_sched_getaffinity 204 -#define TARGET_NR_set_thread_area 205 -#define TARGET_NR_io_setup 206 -#define TARGET_NR_io_destroy 207 -#define TARGET_NR_io_getevents 208 -#define TARGET_NR_io_submit 209 -#define TARGET_NR_io_cancel 210 -#define TARGET_NR_get_thread_area 211 -#define TARGET_NR_lookup_dcookie 212 -#define TARGET_NR_epoll_create 213 -#define TARGET_NR_epoll_ctl_old 214 -#define TARGET_NR_epoll_wait_old 215 -#define TARGET_NR_remap_file_pages 216 -#define TARGET_NR_getdents64 217 -#define TARGET_NR_set_tid_address 218 -#define TARGET_NR_restart_syscall 219 -#define TARGET_NR_semtimedop 220 -#define TARGET_NR_fadvise64 221 -#define TARGET_NR_timer_create 222 -#define TARGET_NR_timer_settime 223 -#define TARGET_NR_timer_gettime 224 -#define TARGET_NR_timer_getoverrun 225 -#define TARGET_NR_timer_delete 226 -#define TARGET_NR_clock_settime 227 -#define TARGET_NR_clock_gettime 228 -#define TARGET_NR_clock_getres 229 -#define TARGET_NR_clock_nanosleep 230 -#define TARGET_NR_exit_group 231 -#define TARGET_NR_epoll_wait 232 -#define TARGET_NR_epoll_ctl 233 -#define TARGET_NR_tgkill 234 -#define TARGET_NR_utimes 235 -#define TARGET_NR_vserver 236 -#define TARGET_NR_mbind 237 -#define TARGET_NR_set_mempolicy 238 -#define TARGET_NR_get_mempolicy 239 -#define TARGET_NR_mq_open 240 -#define TARGET_NR_mq_unlink 241 -#define TARGET_NR_mq_timedsend 242 -#define TARGET_NR_mq_timedreceive 243 -#define TARGET_NR_mq_notify 244 -#define TARGET_NR_mq_getsetattr 245 -#define TARGET_NR_kexec_load 246 -#define TARGET_NR_waitid 247 -#define TARGET_NR_add_key 248 -#define TARGET_NR_request_key 249 -#define TARGET_NR_keyctl 250 -#define TARGET_NR_ioprio_set 251 -#define TARGET_NR_ioprio_get 252 -#define TARGET_NR_inotify_init 253 -#define TARGET_NR_inotify_add_watch 254 -#define TARGET_NR_inotify_rm_watch 255 -#define TARGET_NR_migrate_pages 256 -#define TARGET_NR_openat 257 -#define TARGET_NR_mkdirat 258 -#define TARGET_NR_mknodat 259 -#define TARGET_NR_fchownat 260 -#define TARGET_NR_futimesat 261 -#define TARGET_NR_newfstatat 262 -#define TARGET_NR_unlinkat 263 -#define TARGET_NR_renameat 264 -#define TARGET_NR_linkat 265 -#define TARGET_NR_symlinkat 266 -#define TARGET_NR_readlinkat 267 -#define TARGET_NR_fchmodat 268 -#define TARGET_NR_faccessat 269 -#define TARGET_NR_pselect6 270 -#define TARGET_NR_ppoll 271 -#define TARGET_NR_unshare 272 -#define TARGET_NR_set_robust_list 273 -#define TARGET_NR_get_robust_list 274 -#define TARGET_NR_splice 275 -#define TARGET_NR_tee 276 -#define TARGET_NR_sync_file_range 277 -#define TARGET_NR_vmsplice 278 -#define TARGET_NR_move_pages 279 -#define TARGET_NR_utimensat 280 -#define TARGET_NR_epoll_pwait 281 -#define TARGET_NR_signalfd 282 -#define TARGET_NR_timerfd_create 283 -#define TARGET_NR_eventfd 284 -#define TARGET_NR_fallocate 285 -#define TARGET_NR_timerfd_settime 286 -#define TARGET_NR_timerfd_gettime 287 -#define TARGET_NR_accept4 288 -#define TARGET_NR_signalfd4 289 -#define TARGET_NR_eventfd2 290 -#define TARGET_NR_epoll_create1 291 -#define TARGET_NR_dup3 292 -#define TARGET_NR_pipe2 293 -#define TARGET_NR_inotify_init1 294 -#define TARGET_NR_preadv 295 -#define TARGET_NR_pwritev 296 -#define TARGET_NR_rt_tgsigqueueinfo 297 -#define TARGET_NR_perf_event_open 298 -#define TARGET_NR_recvmmsg 299 -#define TARGET_NR_fanotify_init 300 -#define TARGET_NR_fanotify_mark 301 -#define TARGET_NR_prlimit64 302 -#define TARGET_NR_name_to_handle_at 303 -#define TARGET_NR_open_by_handle_at 304 -#define TARGET_NR_clock_adjtime 305 -#define TARGET_NR_syncfs 306 -#define TARGET_NR_sendmmsg 307 -#define TARGET_NR_setns 308 -#define TARGET_NR_getcpu 309 -#define TARGET_NR_process_vm_readv 310 -#define TARGET_NR_process_vm_writev 311 -#define TARGET_NR_kcmp 312 -#define TARGET_NR_finit_module 313 -#define TARGET_NR_sched_setattr 314 -#define TARGET_NR_sched_getattr 315 -#define TARGET_NR_renameat2 316 -#define TARGET_NR_seccomp 317 -#define TARGET_NR_getrandom 318 -#define TARGET_NR_memfd_create 319 -#define TARGET_NR_kexec_file_load 320 -#define TARGET_NR_bpf 321 -#define TARGET_NR_execveat 322 -#define TARGET_NR_userfaultfd 323 -#define TARGET_NR_membarrier 324 -#define TARGET_NR_mlock2 325 -#define TARGET_NR_copy_file_range 326 diff --git a/qemu/linux-user/x86_64/target_cpu.h b/qemu/linux-user/x86_64/target_cpu.h deleted file mode 100644 index 9ec7cbb7a..000000000 --- a/qemu/linux-user/x86_64/target_cpu.h +++ /dev/null @@ -1 +0,0 @@ -#include "../i386/target_cpu.h" diff --git a/qemu/linux-user/x86_64/target_signal.h b/qemu/linux-user/x86_64/target_signal.h deleted file mode 100644 index 9baf7fbeb..000000000 --- a/qemu/linux-user/x86_64/target_signal.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TARGET_SIGNAL_H -#define TARGET_SIGNAL_H - -#include "cpu.h" - -/* this struct defines a stack used during syscall handling */ - -typedef struct target_sigaltstack { - abi_ulong ss_sp; - abi_long ss_flags; - abi_ulong ss_size; -} target_stack_t; - - -/* - * sigaltstack controls - */ -#define TARGET_SS_ONSTACK 1 -#define TARGET_SS_DISABLE 2 - -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_SIGSTKSZ 8192 - -static inline abi_ulong get_sp_from_cpustate(CPUX86State *state) -{ - return state->regs[R_ESP]; -} - -#endif /* TARGET_SIGNAL_H */ diff --git a/qemu/linux-user/x86_64/target_structs.h b/qemu/linux-user/x86_64/target_structs.h deleted file mode 100644 index d93405614..000000000 --- a/qemu/linux-user/x86_64/target_structs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * X86-64 specific structures for linux-user - * - * Copyright (c) 2013 Fabrice Bellard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ -#ifndef TARGET_STRUCTS_H -#define TARGET_STRUCTS_H - -struct target_ipc_perm { - abi_int __key; /* Key. */ - abi_uint uid; /* Owner's user ID. */ - abi_uint gid; /* Owner's group ID. */ - abi_uint cuid; /* Creator's user ID. */ - abi_uint cgid; /* Creator's group ID. */ - abi_ushort mode; /* Read/write permission. */ - abi_ushort __pad1; - abi_ushort __seq; /* Sequence number. */ - abi_ushort __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* operation permission struct */ - abi_long shm_segsz; /* size of segment in bytes */ - abi_ulong shm_atime; /* time of last shmat() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused1; -#endif - abi_ulong shm_dtime; /* time of last shmdt() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused2; -#endif - abi_ulong shm_ctime; /* time of last change by shmctl() */ -#if TARGET_ABI_BITS == 32 - abi_ulong __unused3; -#endif - abi_int shm_cpid; /* pid of creator */ - abi_int shm_lpid; /* pid of last shmop */ - abi_ulong shm_nattch; /* number of current attaches */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#endif diff --git a/qemu/linux-user/x86_64/target_syscall.h b/qemu/linux-user/x86_64/target_syscall.h deleted file mode 100644 index feecd32d5..000000000 --- a/qemu/linux-user/x86_64/target_syscall.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef TARGET_SYSCALL_H -#define TARGET_SYSCALL_H - -#define __USER_CS (0x33) -#define __USER_DS (0x2B) - -struct target_pt_regs { - abi_ulong r15; - abi_ulong r14; - abi_ulong r13; - abi_ulong r12; - abi_ulong rbp; - abi_ulong rbx; -/* arguments: non interrupts/non tracing syscalls only save up to here */ - abi_ulong r11; - abi_ulong r10; - abi_ulong r9; - abi_ulong r8; - abi_ulong rax; - abi_ulong rcx; - abi_ulong rdx; - abi_ulong rsi; - abi_ulong rdi; - abi_ulong orig_rax; -/* end of arguments */ -/* cpu exception frame or undefined */ - abi_ulong rip; - abi_ulong cs; - abi_ulong eflags; - abi_ulong rsp; - abi_ulong ss; -/* top of stack page */ -}; - -/* Maximum number of LDT entries supported. */ -#define TARGET_LDT_ENTRIES 8192 -/* The size of each LDT entry. */ -#define TARGET_LDT_ENTRY_SIZE 8 - -#define TARGET_GDT_ENTRIES 16 -#define TARGET_GDT_ENTRY_TLS_ENTRIES 3 -#define TARGET_GDT_ENTRY_TLS_MIN 12 -#define TARGET_GDT_ENTRY_TLS_MAX 14 - -#if 0 // Redefine this -struct target_modify_ldt_ldt_s { - unsigned int entry_number; - abi_ulong base_addr; - unsigned int limit; - unsigned int seg_32bit:1; - unsigned int contents:2; - unsigned int read_exec_only:1; - unsigned int limit_in_pages:1; - unsigned int seg_not_present:1; - unsigned int useable:1; - unsigned int lm:1; -}; -#else -struct target_modify_ldt_ldt_s { - unsigned int entry_number; - abi_ulong base_addr; - unsigned int limit; - unsigned int flags; -}; -#endif - -struct target_ipc64_perm -{ - int key; - uint32_t uid; - uint32_t gid; - uint32_t cuid; - uint32_t cgid; - unsigned short mode; - unsigned short __pad1; - unsigned short seq; - unsigned short __pad2; - abi_ulong __unused1; - abi_ulong __unused2; -}; - -struct target_msqid64_ds { - struct target_ipc64_perm msg_perm; - unsigned int msg_stime; /* last msgsnd time */ - unsigned int msg_rtime; /* last msgrcv time */ - unsigned int msg_ctime; /* last change time */ - abi_ulong msg_cbytes; /* current number of bytes on queue */ - abi_ulong msg_qnum; /* number of messages in queue */ - abi_ulong msg_qbytes; /* max number of bytes on queue */ - unsigned int msg_lspid; /* pid of last msgsnd */ - unsigned int msg_lrpid; /* last receive pid */ - abi_ulong __unused4; - abi_ulong __unused5; -}; - -#define UNAME_MACHINE "x86_64" -#define UNAME_MINIMUM_RELEASE "2.6.32" - -#define TARGET_ARCH_SET_GS 0x1001 -#define TARGET_ARCH_SET_FS 0x1002 -#define TARGET_ARCH_GET_FS 0x1003 -#define TARGET_ARCH_GET_GS 0x1004 -#define TARGET_MINSIGSTKSZ 2048 -#define TARGET_MLOCKALL_MCL_CURRENT 1 -#define TARGET_MLOCKALL_MCL_FUTURE 2 - -#endif /* TARGET_SYSCALL_H */ diff --git a/qemu/linux-user/x86_64/termbits.h b/qemu/linux-user/x86_64/termbits.h deleted file mode 100644 index 1c3445c6a..000000000 --- a/qemu/linux-user/x86_64/termbits.h +++ /dev/null @@ -1,247 +0,0 @@ -#define TARGET_NCCS 19 - -typedef unsigned char target_cc_t; -typedef unsigned int target_speed_t; -typedef unsigned int target_tcflag_t; -struct target_termios { - target_tcflag_t c_iflag; /* input mode flags */ - target_tcflag_t c_oflag; /* output mode flags */ - target_tcflag_t c_cflag; /* control mode flags */ - target_tcflag_t c_lflag; /* local mode flags */ - target_cc_t c_line; /* line discipline */ - target_cc_t c_cc[TARGET_NCCS]; /* control characters */ -}; - -/* c_cc characters */ -#define TARGET_VINTR 0 -#define TARGET_VQUIT 1 -#define TARGET_VERASE 2 -#define TARGET_VKILL 3 -#define TARGET_VEOF 4 -#define TARGET_VTIME 5 -#define TARGET_VMIN 6 -#define TARGET_VSWTC 7 -#define TARGET_VSTART 8 -#define TARGET_VSTOP 9 -#define TARGET_VSUSP 10 -#define TARGET_VEOL 11 -#define TARGET_VREPRINT 12 -#define TARGET_VDISCARD 13 -#define TARGET_VWERASE 14 -#define TARGET_VLNEXT 15 -#define TARGET_VEOL2 16 - -/* c_iflag bits */ -#define TARGET_IGNBRK 0000001 -#define TARGET_BRKINT 0000002 -#define TARGET_IGNPAR 0000004 -#define TARGET_PARMRK 0000010 -#define TARGET_INPCK 0000020 -#define TARGET_ISTRIP 0000040 -#define TARGET_INLCR 0000100 -#define TARGET_IGNCR 0000200 -#define TARGET_ICRNL 0000400 -#define TARGET_IUCLC 0001000 -#define TARGET_IXON 0002000 -#define TARGET_IXANY 0004000 -#define TARGET_IXOFF 0010000 -#define TARGET_IMAXBEL 0020000 -#define TARGET_IUTF8 0040000 - -/* c_oflag bits */ -#define TARGET_OPOST 0000001 -#define TARGET_OLCUC 0000002 -#define TARGET_ONLCR 0000004 -#define TARGET_OCRNL 0000010 -#define TARGET_ONOCR 0000020 -#define TARGET_ONLRET 0000040 -#define TARGET_OFILL 0000100 -#define TARGET_OFDEL 0000200 -#define TARGET_NLDLY 0000400 -#define TARGET_NL0 0000000 -#define TARGET_NL1 0000400 -#define TARGET_CRDLY 0003000 -#define TARGET_CR0 0000000 -#define TARGET_CR1 0001000 -#define TARGET_CR2 0002000 -#define TARGET_CR3 0003000 -#define TARGET_TABDLY 0014000 -#define TARGET_TAB0 0000000 -#define TARGET_TAB1 0004000 -#define TARGET_TAB2 0010000 -#define TARGET_TAB3 0014000 -#define TARGET_XTABS 0014000 -#define TARGET_BSDLY 0020000 -#define TARGET_BS0 0000000 -#define TARGET_BS1 0020000 -#define TARGET_VTDLY 0040000 -#define TARGET_VT0 0000000 -#define TARGET_VT1 0040000 -#define TARGET_FFDLY 0100000 -#define TARGET_FF0 0000000 -#define TARGET_FF1 0100000 - -/* c_cflag bit meaning */ -#define TARGET_CBAUD 0010017 -#define TARGET_B0 0000000 /* hang up */ -#define TARGET_B50 0000001 -#define TARGET_B75 0000002 -#define TARGET_B110 0000003 -#define TARGET_B134 0000004 -#define TARGET_B150 0000005 -#define TARGET_B200 0000006 -#define TARGET_B300 0000007 -#define TARGET_B600 0000010 -#define TARGET_B1200 0000011 -#define TARGET_B1800 0000012 -#define TARGET_B2400 0000013 -#define TARGET_B4800 0000014 -#define TARGET_B9600 0000015 -#define TARGET_B19200 0000016 -#define TARGET_B38400 0000017 -#define TARGET_EXTA B19200 -#define TARGET_EXTB B38400 -#define TARGET_CSIZE 0000060 -#define TARGET_CS5 0000000 -#define TARGET_CS6 0000020 -#define TARGET_CS7 0000040 -#define TARGET_CS8 0000060 -#define TARGET_CSTOPB 0000100 -#define TARGET_CREAD 0000200 -#define TARGET_PARENB 0000400 -#define TARGET_PARODD 0001000 -#define TARGET_HUPCL 0002000 -#define TARGET_CLOCAL 0004000 -#define TARGET_CBAUDEX 0010000 -#define TARGET_BOTHER 0010000 /* non standard rate */ -#define TARGET_B57600 0010001 -#define TARGET_B115200 0010002 -#define TARGET_B230400 0010003 -#define TARGET_B460800 0010004 -#define TARGET_B500000 0010005 -#define TARGET_B576000 0010006 -#define TARGET_B921600 0010007 -#define TARGET_B1000000 0010010 -#define TARGET_B1152000 0010011 -#define TARGET_B1500000 0010012 -#define TARGET_B2000000 0010013 -#define TARGET_B2500000 0010014 -#define TARGET_B3000000 0010015 -#define TARGET_B3500000 0010016 -#define TARGET_B4000000 0010017 -#define TARGET_CIBAUD 002003600000 /* input baud rate */ -#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ -#define TARGET_CRTSCTS 020000000000 /* flow control */ - -#define TARGET_IBSHIFT 8 /* Shift from CBAUD to CIBAUD */ - -/* c_lflag bits */ -#define TARGET_ISIG 0000001 -#define TARGET_ICANON 0000002 -#define TARGET_XCASE 0000004 -#define TARGET_ECHO 0000010 -#define TARGET_ECHOE 0000020 -#define TARGET_ECHOK 0000040 -#define TARGET_ECHONL 0000100 -#define TARGET_NOFLSH 0000200 -#define TARGET_TOSTOP 0000400 -#define TARGET_ECHOCTL 0001000 -#define TARGET_ECHOPRT 0002000 -#define TARGET_ECHOKE 0004000 -#define TARGET_FLUSHO 0010000 -#define TARGET_PENDIN 0040000 -#define TARGET_IEXTEN 0100000 - -/* tcflow() and TCXONC use these */ -#define TARGET_TCOOFF 0 -#define TARGET_TCOON 1 -#define TARGET_TCIOFF 2 -#define TARGET_TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TARGET_TCIFLUSH 0 -#define TARGET_TCOFLUSH 1 -#define TARGET_TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TARGET_TCSANOW 0 -#define TARGET_TCSADRAIN 1 -#define TARGET_TCSAFLUSH 2 - -#define TARGET_TCGETS 0x5401 -#define TARGET_TCSETS 0x5402 -#define TARGET_TCSETSW 0x5403 -#define TARGET_TCSETSF 0x5404 -#define TARGET_TCGETA 0x5405 -#define TARGET_TCSETA 0x5406 -#define TARGET_TCSETAW 0x5407 -#define TARGET_TCSETAF 0x5408 -#define TARGET_TCSBRK 0x5409 -#define TARGET_TCXONC 0x540A -#define TARGET_TCFLSH 0x540B -#define TARGET_TIOCEXCL 0x540C -#define TARGET_TIOCNXCL 0x540D -#define TARGET_TIOCSCTTY 0x540E -#define TARGET_TIOCGPGRP 0x540F -#define TARGET_TIOCSPGRP 0x5410 -#define TARGET_TIOCOUTQ 0x5411 -#define TARGET_TIOCSTI 0x5412 -#define TARGET_TIOCGWINSZ 0x5413 -#define TARGET_TIOCSWINSZ 0x5414 -#define TARGET_TIOCMGET 0x5415 -#define TARGET_TIOCMBIS 0x5416 -#define TARGET_TIOCMBIC 0x5417 -#define TARGET_TIOCMSET 0x5418 -#define TARGET_TIOCGSOFTCAR 0x5419 -#define TARGET_TIOCSSOFTCAR 0x541A -#define TARGET_FIONREAD 0x541B -#define TARGET_TIOCINQ FIONREAD -#define TARGET_TIOCLINUX 0x541C -#define TARGET_TIOCCONS 0x541D -#define TARGET_TIOCGSERIAL 0x541E -#define TARGET_TIOCSSERIAL 0x541F -#define TARGET_TIOCPKT 0x5420 -#define TARGET_FIONBIO 0x5421 -#define TARGET_TIOCNOTTY 0x5422 -#define TARGET_TIOCSETD 0x5423 -#define TARGET_TIOCGETD 0x5424 -#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ -#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ -#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ -#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ -#define TARGET_TCGETS2 _IOR('T',0x2A, struct termios2) -#define TARGET_TCSETS2 _IOW('T',0x2B, struct termios2) -#define TARGET_TCSETSW2 _IOW('T',0x2C, struct termios2) -#define TARGET_TCSETSF2 _IOW('T',0x2D, struct termios2) -#define TARGET_TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ -#define TARGET_TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ - -#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ -#define TARGET_FIOCLEX 0x5451 -#define TARGET_FIOASYNC 0x5452 -#define TARGET_TIOCSERCONFIG 0x5453 -#define TARGET_TIOCSERGWILD 0x5454 -#define TARGET_TIOCSERSWILD 0x5455 -#define TARGET_TIOCGLCKTRMIOS 0x5456 -#define TARGET_TIOCSLCKTRMIOS 0x5457 -#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ -#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ -#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ -#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ - -#define TARGET_TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ -#define TARGET_TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ -#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ -#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ -#define TARGET_FIOQSIZE 0x5460 - -/* Used for packet mode */ -#define TARGET_TIOCPKT_DATA 0 -#define TARGET_TIOCPKT_FLUSHREAD 1 -#define TARGET_TIOCPKT_FLUSHWRITE 2 -#define TARGET_TIOCPKT_STOP 4 -#define TARGET_TIOCPKT_START 8 -#define TARGET_TIOCPKT_NOSTOP 16 -#define TARGET_TIOCPKT_DOSTOP 32 - -#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ |