📄 syscall.c.svn-base
字号:
} } 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){ abi_long ret; const int n = sizeof(abi_ulong); switch(num) { case SOCKOP_socket: { int domain, type, protocol; if (get_user_s32(domain, vptr) || get_user_s32(type, vptr + n) || get_user_s32(protocol, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_socket(domain, type, protocol); } break; case SOCKOP_bind: { int sockfd; abi_ulong target_addr; socklen_t addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(target_addr, vptr + n) || get_user_u32(addrlen, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_bind(sockfd, target_addr, addrlen); } break; case SOCKOP_connect: { int sockfd; abi_ulong target_addr; socklen_t addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(target_addr, vptr + n) || get_user_u32(addrlen, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_connect(sockfd, target_addr, addrlen); } break; case SOCKOP_listen: { int sockfd, backlog; if (get_user_s32(sockfd, vptr) || get_user_s32(backlog, vptr + n)) return -TARGET_EFAULT; ret = get_errno(listen(sockfd, backlog)); } break; case SOCKOP_accept: { int sockfd; abi_ulong target_addr, target_addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(target_addr, vptr + n) || get_user_u32(target_addrlen, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_accept(sockfd, target_addr, target_addrlen); } break; case SOCKOP_getsockname: { int sockfd; abi_ulong target_addr, target_addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(target_addr, vptr + n) || get_user_u32(target_addrlen, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_getsockname(sockfd, target_addr, target_addrlen); } break; case SOCKOP_getpeername: { int sockfd; abi_ulong target_addr, target_addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(target_addr, vptr + n) || get_user_u32(target_addrlen, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_getpeername(sockfd, target_addr, target_addrlen); } break; case SOCKOP_socketpair: { int domain, type, protocol; abi_ulong tab; if (get_user_s32(domain, vptr) || get_user_s32(type, vptr + n) || get_user_s32(protocol, vptr + 2 * n) || get_user_ual(tab, vptr + 3 * n)) return -TARGET_EFAULT; ret = do_socketpair(domain, type, protocol, tab); } break; case SOCKOP_send: { int sockfd; abi_ulong msg; size_t len; int flags; if (get_user_s32(sockfd, vptr) || get_user_ual(msg, vptr + n) || get_user_ual(len, vptr + 2 * n) || get_user_s32(flags, vptr + 3 * n)) return -TARGET_EFAULT; ret = do_sendto(sockfd, msg, len, flags, 0, 0); } break; case SOCKOP_recv: { int sockfd; abi_ulong msg; size_t len; int flags; if (get_user_s32(sockfd, vptr) || get_user_ual(msg, vptr + n) || get_user_ual(len, vptr + 2 * n) || get_user_s32(flags, vptr + 3 * n)) return -TARGET_EFAULT; ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); } break; case SOCKOP_sendto: { int sockfd; abi_ulong msg; size_t len; int flags; abi_ulong addr; socklen_t addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(msg, vptr + n) || get_user_ual(len, vptr + 2 * n) || get_user_s32(flags, vptr + 3 * n) || get_user_ual(addr, vptr + 4 * n) || get_user_u32(addrlen, vptr + 5 * n)) return -TARGET_EFAULT; ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); } break; case SOCKOP_recvfrom: { int sockfd; abi_ulong msg; size_t len; int flags; abi_ulong addr; socklen_t addrlen; if (get_user_s32(sockfd, vptr) || get_user_ual(msg, vptr + n) || get_user_ual(len, vptr + 2 * n) || get_user_s32(flags, vptr + 3 * n) || get_user_ual(addr, vptr + 4 * n) || get_user_u32(addrlen, vptr + 5 * n)) return -TARGET_EFAULT; ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); } break; case SOCKOP_shutdown: { int sockfd, how; if (get_user_s32(sockfd, vptr) || get_user_s32(how, vptr + n)) return -TARGET_EFAULT; ret = get_errno(shutdown(sockfd, how)); } break; case SOCKOP_sendmsg: case SOCKOP_recvmsg: { int fd; abi_ulong target_msg; int flags; if (get_user_s32(fd, vptr) || get_user_ual(target_msg, vptr + n) || get_user_s32(flags, vptr + 2 * n)) return -TARGET_EFAULT; ret = do_sendrecvmsg(fd, target_msg, flags, (num == SOCKOP_sendmsg)); } break; case SOCKOP_setsockopt: { int sockfd; int level; int optname; abi_ulong optval; socklen_t optlen; if (get_user_s32(sockfd, vptr) || get_user_s32(level, vptr + n) || get_user_s32(optname, vptr + 2 * n) || get_user_ual(optval, vptr + 3 * n) || get_user_u32(optlen, vptr + 4 * n)) return -TARGET_EFAULT; ret = do_setsockopt(sockfd, level, optname, optval, optlen); } break; case SOCKOP_getsockopt: { int sockfd; int level; int optname; abi_ulong optval; socklen_t optlen; if (get_user_s32(sockfd, vptr) || get_user_s32(level, vptr + n) || get_user_s32(optname, vptr + 2 * n) || get_user_ual(optval, vptr + 3 * n) || get_user_u32(optlen, vptr + 4 * n)) return -TARGET_EFAULT; ret = do_getsockopt(sockfd, level, optname, optval, optlen); } break; default: gemu_log("Unsupported socketcall: %d\n", num); ret = -TARGET_ENOSYS; break; } return ret;}#endif#ifdef TARGET_NR_ipc#define N_SHM_REGIONS 32static struct shm_region { abi_ulong start; abi_ulong size;} shm_regions[N_SHM_REGIONS];struct target_ipc_perm{ abi_long __key; abi_ulong uid; abi_ulong gid; abi_ulong cuid; abi_ulong cgid; unsigned short int mode; unsigned short int __pad1; unsigned short int __seq; unsigned short int __pad2; abi_ulong __unused1; abi_ulong __unused2;};struct target_semid_ds{ struct target_ipc_perm sem_perm; abi_ulong sem_otime; abi_ulong __unused1; abi_ulong sem_ctime; abi_ulong __unused2; 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 = tswapl(target_ip->__key); host_ip->uid = tswapl(target_ip->uid); host_ip->gid = tswapl(target_ip->gid); host_ip->cuid = tswapl(target_ip->cuid); host_ip->cgid = tswapl(target_ip->cgid); host_ip->mode = tswapl(target_ip->mode); 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 = tswapl(host_ip->__key); target_ip->uid = tswapl(host_ip->uid); target_ip->gid = tswapl(host_ip->gid); target_ip->cuid = tswapl(host_ip->cuid); target_ip->cgid = tswapl(host_ip->cgid); target_ip->mode = tswapl(host_ip->mode); 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; target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr); host_sd->sem_nsems = tswapl(target_sd->sem_nsems); host_sd->sem_otime = tswapl(target_sd->sem_otime); host_sd->sem_ctime = tswapl(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; host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm)); target_sd->sem_nsems = tswapl(host_sd->sem_nsems); target_sd->sem_otime = tswapl(host_sd->sem_otime); target_sd->sem_ctime = tswapl(host_sd->sem_ctime); unlock_user_struct(target_sd, target_addr, 1); return 0;}union semun { int val; struct semid_ds *buf; unsigned short *array;};union target_semun { int val; abi_long buf; unsigned short int *array;};static inline abi_long target_to_host_semun(int cmd, union semun *host_su, abi_ulong target_addr, struct semid_ds *ds){ union target_semun *target_su; switch( cmd ) { case IPC_STAT: case IPC_SET: if (!lock_user_struct(VERIFY_READ, target_su, target_addr, 1)) return -TARGET_EFAULT; target_to_host_semid_ds(ds,target_su->buf); host_su->buf = ds; unlock_user_struct(target_su, target_addr, 0); break; case GETVAL: case SETVAL: if (!lock_user_struct(VERIFY_READ, target_su, target_addr, 1)) return -TARGET_EFAULT; host_su->val = tswapl(target_su->val); unlock_user_struct(target_su, target_addr, 0); break; case GETALL: case SETALL: if (!lock_user_struct(VERIFY_READ, target_su, target_addr, 1)) return -TARGET_EFAULT; *host_su->array = tswap16(*target_su->array); unlock_user_struct(target_su, target_addr, 0); break; default: gemu_log("semun operation not fully supported: %d\n", (int)cmd); } return 0;}static inline abi_long host_to_target_semun(int cmd, abi_ulong target_addr, union semun *host_su, struct semid_ds *ds){ union target_semun *target_su; switch( cmd ) { case IPC_STAT: case IPC_SET: if (lock_user_struct(VERIFY_WRITE, target_su, target_addr, 0)) return -TARGET_EFAULT; host_to_target_semid_ds(target_su->buf,ds); unlock_user_struct(target_su, target_addr, 1); break; case GETVAL:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -