void x86_emu_init(void) { union { unsigned int as_uint; unsigned char as_uchar[4]; } endian; /* Endian check */ endian.as_uint = 0x33221100; if (endian.as_uchar[0]) fatal("%s: host machine is not little endian", __FUNCTION__); /* Register architecture */ x86_emu_arch = arch_list_register("x86", "x86"); x86_emu_arch->sim_kind = x86_emu_sim_kind; /* Host types */ M2S_HOST_GUEST_MATCH(sizeof(long long), 8); M2S_HOST_GUEST_MATCH(sizeof(int), 4); M2S_HOST_GUEST_MATCH(sizeof(short), 2); /* Initialization */ x86_sys_init(); x86_isa_init(); /* Create */ x86_emu = xcalloc(1, sizeof(struct x86_emu_t)); /* Event for context IPC reports */ EV_X86_CTX_IPC_REPORT = esim_register_event_with_name(x86_ctx_ipc_report_handler, "x86_ctx_ipc_report"); /* Initialize */ x86_emu->current_pid = 1000; /* Initial assigned pid */ x86_emu->timer = m2s_timer_create("x86 emulation timer"); /* Initialize mutex for variables controlling calls to 'x86_emu_process_events()' */ pthread_mutex_init(&x86_emu->process_events_mutex, NULL); /* Initialize GPU emulators */ x86_emu->gpu_kind = x86_emu_gpu_evergreen; #ifdef HAVE_OPENGL /* GLUT */ x86_glut_init(); #endif /* OpenGL */ x86_opengl_init(); }
static void mips_sys_stat_host_to_guest(struct sim_stat64_t *guest, struct stat *host) { M2S_HOST_GUEST_MATCH(sizeof(struct sim_stat64_t), 96); memset(guest, 0, sizeof(struct sim_stat64_t)); guest->dev = host->st_dev; guest->__ino = host->st_ino; guest->mode = host->st_mode; guest->nlink = host->st_nlink; guest->uid = host->st_uid; guest->gid = host->st_gid; guest->rdev = host->st_rdev; guest->size = host->st_size; guest->blksize = host->st_blksize; guest->blocks = host->st_blocks; guest->atime = host->st_atime; guest->mtime = host->st_mtime; guest->ctime = host->st_ctime; guest->ino = host->st_ino; mips_sys_debug(" stat64 structure:\n"); mips_sys_debug(" dev=%lld, ino=%lld, mode=%d, nlink=%d\n", guest->dev, guest->ino, guest->mode, guest->nlink); mips_sys_debug(" uid=%d, gid=%d, rdev=%lld\n", guest->uid, guest->gid, guest->rdev); mips_sys_debug(" size=%lld, blksize=%d, blocks=%lld\n", guest->size, guest->blksize, guest->blocks); }
void mips_sys_init(void) { /* Host constants for 'errno' must match */ M2S_HOST_GUEST_MATCH(EPERM, SIM_EPERM); M2S_HOST_GUEST_MATCH(ENOENT, SIM_ENOENT); M2S_HOST_GUEST_MATCH(ESRCH, SIM_ESRCH); M2S_HOST_GUEST_MATCH(EINTR, SIM_EINTR); M2S_HOST_GUEST_MATCH(EIO, SIM_EIO); M2S_HOST_GUEST_MATCH(ENXIO, SIM_ENXIO); M2S_HOST_GUEST_MATCH(E2BIG, SIM_E2BIG); M2S_HOST_GUEST_MATCH(ENOEXEC, SIM_ENOEXEC); M2S_HOST_GUEST_MATCH(EBADF, SIM_EBADF); M2S_HOST_GUEST_MATCH(ECHILD, SIM_ECHILD); M2S_HOST_GUEST_MATCH(EAGAIN, SIM_EAGAIN); M2S_HOST_GUEST_MATCH(ENOMEM, SIM_ENOMEM); M2S_HOST_GUEST_MATCH(EACCES, SIM_EACCES); M2S_HOST_GUEST_MATCH(EFAULT, SIM_EFAULT); M2S_HOST_GUEST_MATCH(ENOTBLK, SIM_ENOTBLK); M2S_HOST_GUEST_MATCH(EBUSY, SIM_EBUSY); M2S_HOST_GUEST_MATCH(EEXIST, SIM_EEXIST); M2S_HOST_GUEST_MATCH(EXDEV, SIM_EXDEV); M2S_HOST_GUEST_MATCH(ENODEV, SIM_ENODEV); M2S_HOST_GUEST_MATCH(ENOTDIR, SIM_ENOTDIR); M2S_HOST_GUEST_MATCH(EISDIR, SIM_EISDIR); M2S_HOST_GUEST_MATCH(EINVAL, SIM_EINVAL); M2S_HOST_GUEST_MATCH(ENFILE, SIM_ENFILE); M2S_HOST_GUEST_MATCH(EMFILE, SIM_EMFILE); M2S_HOST_GUEST_MATCH(ENOTTY, SIM_ENOTTY); M2S_HOST_GUEST_MATCH(ETXTBSY, SIM_ETXTBSY); M2S_HOST_GUEST_MATCH(EFBIG, SIM_EFBIG); M2S_HOST_GUEST_MATCH(ENOSPC, SIM_ENOSPC); M2S_HOST_GUEST_MATCH(ESPIPE, SIM_ESPIPE); M2S_HOST_GUEST_MATCH(EROFS, SIM_EROFS); M2S_HOST_GUEST_MATCH(EMLINK, SIM_EMLINK); M2S_HOST_GUEST_MATCH(EPIPE, SIM_EPIPE); M2S_HOST_GUEST_MATCH(EDOM, SIM_EDOM); M2S_HOST_GUEST_MATCH(ERANGE, SIM_ERANGE); }