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

📄 syscall.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
            data->cpu_subtype = CPU_SUBTYPE_POWERPC_750;            DPRINTF("cpu_subtype changed to 0x%x(ppc_all)\n", data->cpu_subtype);#else# error target not supported#endif            break;        }        case 202: /* host_page_size */        {            mig_reply_error_t *err = (mig_reply_error_t *)hdr;            uint32_t *pagesize = (uint32_t *)(err+1);            DPRINTF("pagesize = %d\n", *pagesize);            break;        }        default: break;    }    swap_mach_msg(hdr, bswap_out);    return ret;}long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,                uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,                uint32_t arg8){    extern uint32_t mach_reply_port();    long ret = 0;    arg1 = tswap32(arg1);    arg2 = tswap32(arg2);    arg3 = tswap32(arg3);    arg4 = tswap32(arg4);    arg5 = tswap32(arg5);    arg6 = tswap32(arg6);    arg7 = tswap32(arg7);    arg8 = tswap32(arg8);    DPRINTF("mach syscall %d : " , num);    switch(num) {    /* see xnu/osfmk/mach/syscall_sw.h */    case -26:        DPRINTF("mach_reply_port()\n");        ret = mach_reply_port();        break;    case -27:        DPRINTF("mach_thread_self()\n");        ret = mach_thread_self();        break;    case -28:        DPRINTF("mach_task_self()\n");        ret = mach_task_self();        break;    case -29:        DPRINTF("mach_host_self()\n");        ret = mach_host_self();        break;    case -31:        DPRINTF("mach_msg_trap(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",                arg1, arg2, arg3, arg4, arg5, arg6, arg7);        ret = target_mach_msg_trap((mach_msg_header_t *)arg1, arg2, arg3, arg4, arg5, arg6, arg7);        break;/* may need more translation if target arch is different from host */#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))    case -33:        DPRINTF("semaphore_signal_trap(0x%x)\n", arg1);        ret = semaphore_signal_trap(arg1);        break;    case -34:        DPRINTF("semaphore_signal_all_trap(0x%x)\n", arg1);        ret = semaphore_signal_all_trap(arg1);        break;    case -35:        DPRINTF("semaphore_signal_thread_trap(0x%x)\n", arg1, arg2);        ret = semaphore_signal_thread_trap(arg1,arg2);        break;#endif    case -36:        DPRINTF("semaphore_wait_trap(0x%x)\n", arg1);        extern int semaphore_wait_trap(int); // XXX: is there any header for that?        ret = semaphore_wait_trap(arg1);        break;/* may need more translation if target arch is different from host */#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))    case -37:        DPRINTF("semaphore_wait_signal_trap(0x%x, 0x%x)\n", arg1, arg2);        ret = semaphore_wait_signal_trap(arg1,arg2);        break;#endif    case -43:        DPRINTF("map_fd(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",                arg1, arg2, arg3, arg4, arg5);        ret = map_fd(arg1, arg2, (void*)arg3, arg4, arg5);        tswap32s((uint32_t*)arg3);        break;/* may need more translation if target arch is different from host */#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))    case -61:        DPRINTF("syscall_thread_switch(0x%x, 0x%x, 0x%x)\n",                arg1, arg2, arg3);        ret = syscall_thread_switch(arg1, arg2, arg3);  // just a hint to the scheduler; can drop?        break;#endif    case -89:        DPRINTF("mach_timebase_info(0x%x)\n", arg1);        struct mach_timebase_info info;        ret = mach_timebase_info(&info);        if(!is_error(ret))        {            struct mach_timebase_info *outInfo = (void*)arg1;            outInfo->numer = tswap32(info.numer);            outInfo->denom = tswap32(info.denom);        }        break;    case -90:        DPRINTF("mach_wait_until()\n");        extern int mach_wait_until(uint64_t); // XXX: is there any header for that?        ret = mach_wait_until(((uint64_t)arg2<<32) | (uint64_t)arg1);        break;    case -91:        DPRINTF("mk_timer_create()\n");        extern int mk_timer_create(); // XXX: is there any header for that?        ret = mk_timer_create();        break;    case -92:        DPRINTF("mk_timer_destroy()\n");        extern int mk_timer_destroy(int); // XXX: is there any header for that?        ret = mk_timer_destroy(arg1);        break;    case -93:        DPRINTF("mk_timer_create()\n");        extern int mk_timer_arm(int, uint64_t); // XXX: is there any header for that?        ret = mk_timer_arm(arg1, ((uint64_t)arg3<<32) | (uint64_t)arg2);        break;    case -94:        DPRINTF("mk_timer_cancel()\n");        extern int mk_timer_cancel(int, uint64_t *); // XXX: is there any header for that?        ret = mk_timer_cancel(arg1, (uint64_t *)arg2);        if((!is_error(ret)) && arg2)            tswap64s((uint64_t *)arg2);        break;    default:        gemu_log("qemu: Unsupported mach syscall: %d(0x%x)\n", num, num);        gdb_handlesig (cpu_env, SIGTRAP);        exit(0);        break;    }    return ret;}/* ------------------------------------------------------------   thread type syscall handling*/long do_thread_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,                uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,                uint32_t arg8){    extern uint32_t cthread_set_self(uint32_t);    extern uint32_t processor_facilities_used();    long ret = 0;    arg1 = tswap32(arg1);    arg2 = tswap32(arg2);    arg3 = tswap32(arg3);    arg4 = tswap32(arg4);    arg5 = tswap32(arg5);    arg6 = tswap32(arg6);    arg7 = tswap32(arg7);    arg8 = tswap32(arg8);    DPRINTF("thread syscall %d : " , num);    switch(num) {#ifdef TARGET_I386    case 0x3:#endif    case 0x7FF1: /* cthread_set_self */        DPRINTF("cthread_set_self(0x%x)\n", (unsigned int)arg1);        ret = cthread_set_self(arg1);#ifdef TARGET_I386        /* we need to update the LDT with the address of the thread */        write_dt((void *)(((CPUX86State *) cpu_env)->ldt.base + (4 * sizeof(uint64_t))), arg1, 1,                 DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |                 (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));        /* New i386 convention, %gs should be set to our this LDT entry */        cpu_x86_load_seg(cpu_env, R_GS, 0x27);        /* Old i386 convention, the kernel returns the selector for the cthread (pre-10.4.8?)*/        ret = 0x27;#endif        break;    case 0x7FF2: /* Called the super-fast pthread_self handler by the apple guys */        DPRINTF("pthread_self()\n");        ret = (uint32_t)pthread_self();        break;    case 0x7FF3:        DPRINTF("processor_facilities_used()\n");#ifdef __i386__        qerror("processor_facilities_used: not implemented!\n");#else        ret = (uint32_t)processor_facilities_used();#endif        break;    default:        gemu_log("qemu: Unsupported thread syscall: %d(0x%x)\n", num, num);        gdb_handlesig (cpu_env, SIGTRAP);        exit(0);        break;    }    return ret;}/* ------------------------------------------------------------   ioctl handling*/static inline void byteswap_termios(struct termios *t){    tswap32s((uint32_t*)&t->c_iflag);    tswap32s((uint32_t*)&t->c_oflag);    tswap32s((uint32_t*)&t->c_cflag);    tswap32s((uint32_t*)&t->c_lflag);    /* 20 (char) bytes then */    tswap32s((uint32_t*)&t->c_ispeed);    tswap32s((uint32_t*)&t->c_ospeed);}static inline void byteswap_winsize(struct winsize *w){    tswap16s(&w->ws_row);    tswap16s(&w->ws_col);    tswap16s(&w->ws_xpixel);    tswap16s(&w->ws_ypixel);}#define STRUCT(name, list...) STRUCT_ ## name,#define STRUCT_SPECIAL(name) STRUCT_ ## name,enum {#include "ioctls_types.h"};#undef STRUCT#undef STRUCT_SPECIAL#define STRUCT(name, list...) const argtype struct_ ## name ## _def[] = { list, TYPE_NULL };#define STRUCT_SPECIAL(name)#include "ioctls_types.h"#undef STRUCT#undef STRUCT_SPECIALtypedef struct IOCTLEntry {    unsigned int target_cmd;    unsigned int host_cmd;    const char *name;    int access;    const argtype arg_type[5];} IOCTLEntry;#define IOC_R 0x0001#define IOC_W 0x0002#define IOC_RW (IOC_R | IOC_W)#define MAX_STRUCT_SIZE 4096IOCTLEntry ioctl_entries[] = {#define IOCTL(cmd, access, types...) \    { cmd, cmd, #cmd, access, { types } },#include "ioctls.h"    { 0, 0, },};/* ??? Implement proper locking for ioctls.  */static long do_ioctl(long fd, long cmd, long arg){    const IOCTLEntry *ie;    const argtype *arg_type;    int 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", cmd);            return -ENOSYS;        }        if (ie->target_cmd == cmd)            break;        ie++;    }    arg_type = ie->arg_type;#if defined(DEBUG)    gemu_log("ioctl: cmd=0x%04lx (%s)\n", cmd, ie->name);#endif    switch(arg_type[0]) {    case TYPE_NULL:        /* no argument */        ret = get_errno(ioctl(fd, ie->host_cmd));        break;    case TYPE_PTRVOID:    case TYPE_INT:        /* int argment */        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(arg, target_size, 0);                thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);                unlock_user(argptr, arg, target_size);            }            break;        case IOC_W:            argptr = lock_user(arg, target_size, 1);            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(arg, target_size, 1);            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(arg, target_size, 0);                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", cmd, arg_type[0]);        ret = -ENOSYS;        break;    }    return ret;}/* ------------------------------------------------------------   Unix syscall handling*/static inline void byteswap_attrlist(struct attrlist *a){    tswap16s(&a->bitmapcount);    tswap16s(&a->reserved);    tswap32s(&a->commonattr);    tswap32s(&a->volattr);    tswap32s(&a->dirattr);    tswap32s(&a->fileattr);    tswap32s(&a->forkattr);}struct attrbuf_header {    unsigned long length;};static inline void byteswap_attrbuf(struct attrbuf_header *attrbuf, struct attrlist *attrlist){    DPRINTF("attrBuf.lenght %lx\n", attrbuf->length);}static inline void byteswap_statfs(struct statfs *s){    tswap16s((uint16_t*)&s->f_otype);    tswap16s((uint16_t*)&s->f_oflags);    tswap32s((uint32_t*)&s->f_bsize);    tswap32s((uint32_t*)&s->f_iosize);    tswap32s((uint32_t*)&s->f_blocks);    tswap32s((uint32_t*)&s->f_bfree);    tswap32s((uint32_t*)&s->f_bavail);    tswap32s((uint32_t*)&s->f_files);    tswap32s((uint32_t*)&s->f_ffree);    tswap32s((uint32_t*)&s->f_fsid.val[0]);    tswap32s((uint32_t*)&s->f_fsid.val[1]);    tswap16s((uint16_t*)&s->f_reserved1);    tswap16s((uint16_t*)&s->f_type);    tswap32s((uint32_t*)&s->f_flags);}static inline void byteswap_stat(struct stat *s){    tswap32s((uint32_t*)&s->st_dev);    tswap32s(&s->st_ino);    tswap16s(&s->st_mode);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -