⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syscall.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
            }        }        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 + -