diff options
Diffstat (limited to 'emulators/qemu-devel/files/patch-z2-bsd-user-cognet-sson-002')
-rw-r--r-- | emulators/qemu-devel/files/patch-z2-bsd-user-cognet-sson-002 | 8355 |
1 files changed, 0 insertions, 8355 deletions
diff --git a/emulators/qemu-devel/files/patch-z2-bsd-user-cognet-sson-002 b/emulators/qemu-devel/files/patch-z2-bsd-user-cognet-sson-002 deleted file mode 100644 index b20df377ebde..000000000000 --- a/emulators/qemu-devel/files/patch-z2-bsd-user-cognet-sson-002 +++ /dev/null @@ -1,8355 +0,0 @@ -#diff --git a/Makefile b/Makefile -#index 5fa0f1d..55e151e 100644 -#--- a/Makefile -#+++ b/Makefile -#@@ -65,7 +65,8 @@ CLANG_CFLAGS_AS+= -no-integrated-as -# -# .if ${PORT_OPTIONS:MX86_TARGETS} -# .if ${PORT_OPTIONS:MBSD_USER} -#-CONFIGURE_ARGS+= --target-list=i386-softmmu,x86_64-softmmu,i386-bsd-user,x86_64-bsd-user,sparc-bsd-user,sparc64-bsd-user,arm-bsd-user -#+#CONFIGURE_ARGS+= --target-list=i386-softmmu,x86_64-softmmu,i386-bsd-user,x86_64-bsd-user,sparc-bsd-user,sparc64-bsd-user,arm-bsd-user,armeb-bsd-user,mips-bsd-user,mipsel-bsd-user -#+CONFIGURE_ARGS+= --target-list=arm-bsd-user,armeb-bsd-user,mips-bsd-user,mipsel-bsd-user,mips64-bsd-user -# .else -# CONFIGURE_ARGS+= --target-list=i386-softmmu,x86_64-softmmu -# .endif -#@@ -106,6 +107,8 @@ CONFIGURE_ARGS+= --prefix=${PREFIX} --cc=${CC} --enable-docs \ -# --disable-linux-user --disable-linux-aio \ -# --disable-kvm --disable-xen \ -# --smbd=${LOCALBASE}/sbin/smbd \ -#+ --enable-debug \ -#+ --enable-debug-info \ -# --extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"${PREFIX}\\\" -# -# .if empty(PORT_OPTIONS:MSDL) -diff --git a/bsd-user/arm/target_signal.h b/bsd-user/arm/target_signal.h -index 1b644cc..19cc188 100644 ---- a/bsd-user/arm/target_signal.h -+++ b/bsd-user/arm/target_signal.h -@@ -3,17 +3,12 @@ - - #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; -- - static inline abi_ulong get_sp_from_cpustate(CPUARMState *state) - { - return state->regs[13]; - } - -+#define TARGET_MINSIGSTKSZ (1024 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ - #endif /* TARGET_SIGNAL_H */ -diff --git a/bsd-user/arm/target_vmparam.h b/bsd-user/arm/target_vmparam.h -new file mode 100644 -index 0000000..0427244 ---- /dev/null -+++ b/bsd-user/arm/target_vmparam.h -@@ -0,0 +1,28 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+ /* KERNBASE - 512 MB */ -+#define TARGET_VM_MAXUSER_ADDRESS (0xc0000000 - (512 * 1024 * 1024)) -+#define TARGET_USRSTACK TARGET_VM_MAXUSER_ADDRESS -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+#endif /* _TARGET_VMPARAM_H_ */ -diff --git a/bsd-user/bsdload.c b/bsd-user/bsdload.c -index 2abc713..dcf6f66 100644 ---- a/bsd-user/bsdload.c -+++ b/bsd-user/bsdload.c -@@ -53,7 +53,7 @@ static int count(char ** vec) - return(i); - } - --static int prepare_binprm(struct linux_binprm *bprm) -+static int prepare_binprm(struct bsd_binprm *bprm) - { - struct stat st; - int mode; -@@ -155,33 +155,33 @@ abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp, - } - - int loader_exec(const char * filename, char ** argv, char ** envp, -- struct target_pt_regs * regs, struct image_info *infop) -+ struct target_pt_regs * regs, struct image_info *infop, -+ struct bsd_binprm *bprm) - { -- struct linux_binprm bprm; - int retval; - int i; - -- bprm.p = TARGET_PAGE_SIZE*MAX_ARG_PAGES-sizeof(unsigned int); -+ bprm->p = TARGET_PAGE_SIZE*MAX_ARG_PAGES /*-sizeof(unsigned int) XXX */; - for (i=0 ; i<MAX_ARG_PAGES ; i++) /* clear page-table */ -- bprm.page[i] = NULL; -+ bprm->page[i] = NULL; - retval = open(filename, O_RDONLY); - if (retval < 0) - return retval; -- bprm.fd = retval; -- bprm.filename = (char *)filename; -- bprm.argc = count(argv); -- bprm.argv = argv; -- bprm.envc = count(envp); -- bprm.envp = envp; -+ bprm->fd = retval; -+ bprm->filename = (char *)filename; -+ bprm->argc = count(argv); -+ bprm->argv = argv; -+ bprm->envc = count(envp); -+ bprm->envp = envp; - -- retval = prepare_binprm(&bprm); -+ 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,regs,infop); -+ if (bprm->buf[0] == 0x7f -+ && bprm->buf[1] == 'E' -+ && bprm->buf[2] == 'L' -+ && bprm->buf[3] == 'F') { -+ retval = load_elf_binary(bprm,regs,infop); - } else { - fprintf(stderr, "Unknown binary format\n"); - return -1; -@@ -196,7 +196,7 @@ int loader_exec(const char * filename, char ** argv, char ** envp, - - /* Something went wrong, return the inode and free the argument pages*/ - for (i=0 ; i<MAX_ARG_PAGES ; i++) { -- g_free(bprm.page[i]); -+ g_free(bprm->page[i]); - } - return(retval); - } -diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c -index 993dcf7..15cf3a6 100644 ---- a/bsd-user/elfload.c -+++ b/bsd-user/elfload.c -@@ -9,6 +9,8 @@ - #include <stdlib.h> - #include <string.h> - -+#include <sys/param.h> -+ - #include "qemu.h" - #include "disas.h" - -@@ -93,6 +95,7 @@ enum { - - #ifdef TARGET_I386 - -+#ifndef __FreeBSD__ - #define ELF_PLATFORM get_elf_platform() - - static const char *get_elf_platform(void) -@@ -112,6 +115,7 @@ static uint32_t get_elf_hwcap(void) - { - return thread_env->cpuid_features; - } -+#endif /* ! __FreeBSD__ */ - - #ifdef TARGET_X86_64 - #define ELF_START_MMAP 0x2aaaaab000ULL -@@ -378,13 +382,14 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info * - - #ifdef TARGET_MIPS - --#define ELF_START_MMAP 0x80000000 - - #define elf_check_arch(x) ( (x) == EM_MIPS ) - --#ifdef TARGET_MIPS64 -+#if defined(TARGET_MIPS64) -+#define ELF_START_MMAP 0x2aaaaab000ULL - #define ELF_CLASS ELFCLASS64 - #else -+#define ELF_START_MMAP 0x80000000 - #define ELF_CLASS ELFCLASS32 - #endif - #ifdef TARGET_WORDS_BIGENDIAN -@@ -396,9 +401,10 @@ static inline void init_thread(struct target_pt_regs *_regs, struct image_info * - - 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; -+ regs->regs[25] = regs->cp0_epc = infop->entry; /* t9 = pc = entry */ -+ regs->regs[4] = regs->regs[29] = infop->start_stack; /* a0 = sp = start_stack */ - } - - #define USE_ELF_CORE_DUMP -@@ -576,30 +582,38 @@ static void bswap_ehdr(struct elfhdr *ehdr) - bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ - } - --static void bswap_phdr(struct elf_phdr *phdr) -+static void bswap_phdr(struct elf_phdr *phdr, int phnum) - { -- bswap32s(&phdr->p_type); /* Segment type */ -- 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 */ -- bswap32s(&phdr->p_flags); /* Segment flags */ -- bswaptls(&phdr->p_align); /* Segment alignment */ -+ 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) -+static void bswap_shdr(struct elf_shdr *shdr, int shnum) - { -- 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); -+ 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) -@@ -609,7 +623,14 @@ static void bswap_sym(struct elf_sym *sym) - bswaptls(&sym->st_size); - bswap16s(&sym->st_shndx); - } --#endif -+ -+#else /* ! BSWAP_NEEDED */ -+ -+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 /* ! BSWAP_NEEDED */ - - /* - * 'copy_elf_strings()' copies argument/envelope strings from user -@@ -666,7 +687,26 @@ static abi_ulong copy_elf_strings(int argc,char ** argv, void **page, - return p; - } - --static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm, -+#if defined(TARGET_MIPS64) -+static inline int -+install_sigtramp(abi_ulong offset, unsigned sigf_uc, unsigned syscall) -+{ -+ int i; -+ uint32_t sigtramp_code[] = { -+ 0x67A40000 + sigf_uc, /* daddu $a0, $sp, (sigf_uc) */ -+ 0x24020000 + syscall, /* li $v0, (syscall) */ -+ 0x0000000C, /* syscall */ -+ 0x0000000D /* break */ -+ }; -+ -+ for(i = 0; i < 4; i++) -+ tswap32s(&sigtramp_code[i]); -+ -+ return (memcpy_to_target(offset, sigtramp_code, TARGET_SZSIGCODE)); -+} -+#endif -+ -+static abi_ulong setup_arg_pages(abi_ulong p, struct bsd_binprm *bprm, - struct image_info *info) - { - abi_ulong stack_base, size, error; -@@ -678,7 +718,13 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm, - size = x86_stack_size; - if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE) - size = MAX_ARG_PAGES*TARGET_PAGE_SIZE; -- error = target_mmap(0, -+ -+#ifdef TARGET_USRSTACK -+ stack_base = TARGET_USRSTACK - size; -+#else -+ stack_base = (abi_ulong)0; -+#endif -+ error = target_mmap(stack_base, - size + qemu_host_page_size, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON, -@@ -690,6 +736,113 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm, - /* we reserve one extra page at the top of the stack as guard */ - target_mprotect(error + size, qemu_host_page_size, PROT_NONE); - -+#if defined(__FreeBSD__) -+ /* -+ * The inital FreeBSD stack looks like follows: -+ * (see kern/kern_exec.c exec_copyout_strings() ) -+ * -+ * Hi Address -> char **ps_argvstr (struct ps_strings for ps, w, etc.) -+ * unsigned ps_nargvstr -+ * char **ps_envstr -+ * PS_STRINGS -> unsigned ps_nenvstr -+ * -+ * machine dependent sigcode (sv_sigcode of size -+ * sv_szsigcode) -+ * -+ * execpath (absolute image path for rtld) -+ * -+ * SSP Canary (sizeof(long) * 8) -+ * -+ * page sizes array (usually sizeof(u_long) ) -+ * -+ * "destp" -> argv, env strings (up to 262144 bytes) -+ */ -+ -+ { -+ abi_ulong stack_hi_addr; -+ size_t execpath_len; -+ abi_ulong destp; -+ struct target_ps_strings ps_strs; -+ char canary[sizeof(abi_long) * 8]; -+ char execpath[PATH_MAX]; -+ -+ stack_hi_addr = p = error + size; -+ -+ /* Save some space for ps_strings. */ -+ p -= sizeof(struct target_ps_strings); -+ -+#if TARGET_SZSIGCODE > 0 -+ /* Add machine depedent sigcode. */ -+ p -= TARGET_SZSIGCODE; -+ /* XXX - check return value of memcpy_to_target() for failure */ -+ install_sigtramp( p, (unsigned)offsetof(struct target_sigframe, -+ sf_uc), TARGET_FREEBSD_NR_sigreturn); -+#endif -+ -+ /* Add execpath for rtld. */ -+ if (strlen(bprm->filename)) { -+ /* XXX - check return value of realpath() */ -+ realpath(bprm->filename, execpath); -+ execpath_len = strlen(execpath) + 1; -+ } else -+ execpath_len = 0; -+ -+ if (execpath_len) { -+ p -= roundup(execpath_len, sizeof(abi_ulong)); -+ /* XXX - check return value of memcpy_to_target() */ -+ memcpy_to_target(p, execpath, execpath_len); -+ } -+ -+ /* Add canary for SSP. */ -+ arc4random_buf(canary, sizeof(canary)); -+ p -= roundup(sizeof(canary), sizeof(abi_ulong)); -+ /* XXX - check return value of memcpy_to_target(). */ -+ memcpy_to_target(p, canary, sizeof(canary)); -+ -+ /* Add page sizes array. */ -+ p -= sizeof(abi_ulong); -+ /* XXX - check return value of put_user_ual(). */ -+ put_user_ual(TARGET_PAGE_SIZE, p); -+ -+ p = destp = p - TARGET_SPACE_USRSPACE - TARGET_ARG_MAX; -+ -+ /* XXX should check strlen(argv and envp strings) < TARGET_ARG_MAX */ -+ -+ /* -+ * Add argv strings. Note that the argv[] vectors are added by -+ * loader_build_argptr() -+ */ -+ i = bprm->argc; -+ while (i-- > 0) { -+ size_t len = strlen(bprm->argv[i]) + 1; -+ /* XXX - check return value of memcpy_to_target(). */ -+ memcpy_to_target(destp, bprm->argv[i], len); -+ destp += len; -+ } -+ ps_strs.ps_argvstr = tswapl(destp); -+ ps_strs.ps_nargvstr = tswap32(bprm->argc); -+ -+ /* -+ * Add env strings. Note that the envp[] vectors are added by -+ * loader_build_argptr(). -+ */ -+ i = bprm->envc; -+ while(i-- > 0) { -+ size_t len = strlen(bprm->envp[i]) + 1; -+ /* XXX - check return value of memcpy_to_target(). */ -+ memcpy_to_target(destp, bprm->envp[i], len); -+ destp += len; -+ } -+ ps_strs.ps_envstr = tswapl(destp); -+ ps_strs.ps_nenvstr = tswap32(bprm->envc); -+ -+ /* XXX - check return value of memcpy_to_target(). */ -+ memcpy_to_target(stack_hi_addr - sizeof(ps_strs), &ps_strs, -+ sizeof(ps_strs)); -+ } -+ -+#else -+ - stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE; - p += stack_base; - -@@ -702,6 +855,8 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm, - } - stack_base += TARGET_PAGE_SIZE; - } -+#endif -+ - return p; - } - -@@ -769,11 +924,14 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, - { - abi_ulong sp; - int size; -+#ifndef __FreeBSD__ - abi_ulong u_platform; - const char *k_platform; -+#endif - const int n = sizeof(elf_addr_t); - - sp = p; -+#ifndef __FreeBSD__ - u_platform = 0; - k_platform = ELF_PLATFORM; - if (k_platform) { -@@ -783,22 +941,28 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, - /* FIXME - check return value of memcpy_to_target() for failure */ - memcpy_to_target(sp, k_platform, len); - } -+#endif /* ! __FreeBSD__ */ - /* - * Force 16 byte _final_ alignment here for generality. - */ - sp = sp &~ (abi_ulong)15; -+#ifdef __FreeBSD__ -+ size = 0; -+#else - size = (DLINFO_ITEMS + 1) * 2; - if (k_platform) - size += 2; - #ifdef DLINFO_ARCH_ITEMS - size += DLINFO_ARCH_ITEMS * 2; - #endif -+#endif /* ! __FreeBSD__ */ - size += envc + argc + 2; - size += (!ibcs ? 3 : 1); /* argc itself */ - size *= n; - if (size & 15) - sp -= 16 - (size & 15); - -+#ifndef __FreeBSD__ - /* This is correct because Linux defines - * elf_addr_t as Elf32_Off / Elf64_Off - */ -@@ -833,6 +997,7 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc, - ARCH_DLINFO; - #endif - #undef NEW_AUX_ENT -+#endif /* ! __FreeBSD__ */ - - sp = loader_build_argptr(envc, argc, sp, p, !ibcs); - return sp; -@@ -856,9 +1021,7 @@ static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex, - last_bss = 0; - error = 0; - --#ifdef BSWAP_NEEDED - bswap_ehdr(interp_elf_ex); --#endif - /* First of all, some simple consistency checks */ - if ((interp_elf_ex->e_type != ET_EXEC && - interp_elf_ex->e_type != ET_DYN) || -@@ -899,12 +1062,7 @@ static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex, - free (elf_phdata); - return retval; - } --#ifdef BSWAP_NEEDED -- eppnt = elf_phdata; -- for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) { -- bswap_phdr(eppnt); -- } --#endif -+ bswap_phdr(elf_phdata, interp_elf_ex->e_phnum); - - if (interp_elf_ex->e_type == ET_DYN) { - /* in order to avoid hardcoding the interpreter load -@@ -1049,9 +1207,7 @@ static void load_symbols(struct elfhdr *hdr, int fd) - for (i = 0; i < hdr->e_shnum; i++) { - if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr)) - return; --#ifdef BSWAP_NEEDED -- bswap_shdr(&sechdr); --#endif -+ bswap_shdr(&sechdr, 1); - if (sechdr.sh_type == SHT_SYMTAB) { - symtab = sechdr; - lseek(fd, hdr->e_shoff -@@ -1059,9 +1215,7 @@ static void load_symbols(struct elfhdr *hdr, int fd) - if (read(fd, &strtab, sizeof(strtab)) - != sizeof(strtab)) - return; --#ifdef BSWAP_NEEDED -- bswap_shdr(&strtab); --#endif -+ bswap_shdr(&strtab, 1); - goto found; - } - } -@@ -1094,9 +1248,7 @@ static void load_symbols(struct elfhdr *hdr, int fd) - - i = 0; - while (i < nsyms) { --#ifdef BSWAP_NEEDED - bswap_sym(syms + i); --#endif - // Throw away entries which we do not need. - if (syms[i].st_shndx == SHN_UNDEF || - syms[i].st_shndx >= SHN_LORESERVE || -@@ -1148,7 +1300,7 @@ static void load_symbols(struct elfhdr *hdr, int fd) - syminfos = s; - } - --int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, -+int load_elf_binary(struct bsd_binprm * bprm, struct target_pt_regs * regs, - struct image_info * info) - { - struct elfhdr elf_ex; -@@ -1178,9 +1330,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - load_addr = 0; - load_bias = 0; - elf_ex = *((struct elfhdr *) bprm->buf); /* exec-header */ --#ifdef BSWAP_NEEDED - bswap_ehdr(&elf_ex); --#endif - - /* First of all, some simple consistency checks */ - if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) || -@@ -1188,12 +1338,14 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - return -ENOEXEC; - } - -+#ifndef __FreeBSD__ - bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p); - bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p); - bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p); - if (!bprm->p) { - retval = -E2BIG; - } -+#endif /* ! __FreeBSD__ */ - - /* Now read in all of the header information */ - elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum); -@@ -1214,12 +1366,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - return -errno; - } - --#ifdef BSWAP_NEEDED -- elf_ppnt = elf_phdata; -- for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) { -- bswap_phdr(elf_ppnt); -- } --#endif -+ bswap_phdr(elf_phdata, elf_ex.e_phnum); - elf_ppnt = elf_phdata; - - elf_bss = 0; -@@ -1229,9 +1376,9 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - elf_stack = ~((abi_ulong)0UL); - elf_interpreter = NULL; - start_code = ~((abi_ulong)0UL); -- end_code = 0; -- start_data = 0; -- end_data = 0; -+ end_code = (abi_ulong)0UL; -+ start_data = (abi_ulong)0UL; -+ end_data = (abi_ulong)0UL; - interp_ex.a_info = 0; - - for(i=0;i < elf_ex.e_phnum; i++) { -@@ -1431,7 +1578,7 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - perror("mmap"); - exit(-1); - } -- load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr); -+ load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr); - } - - error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr), -@@ -1541,12 +1688,13 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - padzero(elf_bss, elf_brk); - - #if 0 -- printf("(start_brk) %x\n" , info->start_brk); -- printf("(end_code) %x\n" , info->end_code); -- printf("(start_code) %x\n" , info->start_code); -- printf("(end_data) %x\n" , info->end_data); -- printf("(start_stack) %x\n" , info->start_stack); -- printf("(brk) %x\n" , info->brk); -+ printf("(start_brk) 0x" TARGET_FMT_lx "\n" , info->start_brk); -+ printf("(end_code) 0x" TARGET_FMT_lx "\n" , info->end_code); -+ printf("(start_code) 0x" TARGET_FMT_lx "\n" , info->start_code); -+ printf("(start_data) 0x" TARGET_FMT_lx "\n" , info->start_data); -+ printf("(end_data) 0x" TARGET_FMT_lx "\n" , info->end_data); -+ printf("(start_stack) 0x" TARGET_FMT_lx "\n" , info->start_stack); -+ printf("(brk) 0x" TARGET_FMT_lx "\n" , info->brk); - #endif - - if ( info->personality == PER_SVR4 ) -@@ -1561,6 +1709,11 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, - - info->entry = elf_entry; - -+#ifdef USE_ELF_CORE_DUMP -+ /* bprm->core_dump = &elf_core_dump; */ -+ bprm->core_dump = NULL; -+#endif -+ - return 0; - } - -diff --git a/bsd-user/freebsd/syscall_nr.h b/bsd-user/freebsd/syscall_nr.h -index 36336ab..e46571f 100644 ---- a/bsd-user/freebsd/syscall_nr.h -+++ b/bsd-user/freebsd/syscall_nr.h -@@ -1,373 +1,448 @@ - /* - * System call numbers. - * -- * $FreeBSD: src/sys/sys/syscall.h,v 1.224 2008/08/24 21:23:08 rwatson Exp $ -- * created from FreeBSD: head/sys/kern/syscalls.master 182123 2008-08-24 21:20:35Z rwatson -+ * created from FreeBSD: releng/9.1/sys/kern/syscalls.master 229723 2012-01-06 19:29:16Z jhb - */ - --#define TARGET_FREEBSD_NR_syscall 0 --#define TARGET_FREEBSD_NR_exit 1 --#define TARGET_FREEBSD_NR_fork 2 --#define TARGET_FREEBSD_NR_read 3 --#define TARGET_FREEBSD_NR_write 4 --#define TARGET_FREEBSD_NR_open 5 --#define TARGET_FREEBSD_NR_close 6 --#define TARGET_FREEBSD_NR_wait4 7 --#define TARGET_FREEBSD_NR_link 9 --#define TARGET_FREEBSD_NR_unlink 10 --#define TARGET_FREEBSD_NR_chdir 12 --#define TARGET_FREEBSD_NR_fchdir 13 --#define TARGET_FREEBSD_NR_mknod 14 --#define TARGET_FREEBSD_NR_chmod 15 --#define TARGET_FREEBSD_NR_chown 16 --#define TARGET_FREEBSD_NR_break 17 --#define TARGET_FREEBSD_NR_freebsd4_getfsstat 18 --#define TARGET_FREEBSD_NR_getpid 20 --#define TARGET_FREEBSD_NR_mount 21 --#define TARGET_FREEBSD_NR_unmount 22 --#define TARGET_FREEBSD_NR_setuid 23 --#define TARGET_FREEBSD_NR_getuid 24 --#define TARGET_FREEBSD_NR_geteuid 25 --#define TARGET_FREEBSD_NR_ptrace 26 --#define TARGET_FREEBSD_NR_recvmsg 27 --#define TARGET_FREEBSD_NR_sendmsg 28 --#define TARGET_FREEBSD_NR_recvfrom 29 --#define TARGET_FREEBSD_NR_accept 30 --#define TARGET_FREEBSD_NR_getpeername 31 --#define TARGET_FREEBSD_NR_getsockname 32 --#define TARGET_FREEBSD_NR_access 33 --#define TARGET_FREEBSD_NR_chflags 34 --#define TARGET_FREEBSD_NR_fchflags 35 --#define TARGET_FREEBSD_NR_sync 36 --#define TARGET_FREEBSD_NR_kill 37 --#define TARGET_FREEBSD_NR_getppid 39 --#define TARGET_FREEBSD_NR_dup 41 --#define TARGET_FREEBSD_NR_pipe 42 --#define TARGET_FREEBSD_NR_getegid 43 --#define TARGET_FREEBSD_NR_profil 44 --#define TARGET_FREEBSD_NR_ktrace 45 --#define TARGET_FREEBSD_NR_getgid 47 --#define TARGET_FREEBSD_NR_getlogin 49 --#define TARGET_FREEBSD_NR_setlogin 50 --#define TARGET_FREEBSD_NR_acct 51 --#define TARGET_FREEBSD_NR_sigaltstack 53 --#define TARGET_FREEBSD_NR_ioctl 54 --#define TARGET_FREEBSD_NR_reboot 55 --#define TARGET_FREEBSD_NR_revoke 56 --#define TARGET_FREEBSD_NR_symlink 57 --#define TARGET_FREEBSD_NR_readlink 58 --#define TARGET_FREEBSD_NR_execve 59 --#define TARGET_FREEBSD_NR_umask 60 --#define TARGET_FREEBSD_NR_chroot 61 --#define TARGET_FREEBSD_NR_msync 65 --#define TARGET_FREEBSD_NR_vfork 66 --#define TARGET_FREEBSD_NR_sbrk 69 --#define TARGET_FREEBSD_NR_sstk 70 --#define TARGET_FREEBSD_NR_vadvise 72 --#define TARGET_FREEBSD_NR_munmap 73 --#define TARGET_FREEBSD_NR_mprotect 74 --#define TARGET_FREEBSD_NR_madvise 75 --#define TARGET_FREEBSD_NR_mincore 78 --#define TARGET_FREEBSD_NR_getgroups 79 --#define TARGET_FREEBSD_NR_setgroups 80 --#define TARGET_FREEBSD_NR_getpgrp 81 --#define TARGET_FREEBSD_NR_setpgid 82 --#define TARGET_FREEBSD_NR_setitimer 83 --#define TARGET_FREEBSD_NR_swapon 85 --#define TARGET_FREEBSD_NR_getitimer 86 --#define TARGET_FREEBSD_NR_getdtablesize 89 --#define TARGET_FREEBSD_NR_dup2 90 --#define TARGET_FREEBSD_NR_fcntl 92 --#define TARGET_FREEBSD_NR_select 93 --#define TARGET_FREEBSD_NR_fsync 95 --#define TARGET_FREEBSD_NR_setpriority 96 --#define TARGET_FREEBSD_NR_socket 97 --#define TARGET_FREEBSD_NR_connect 98 --#define TARGET_FREEBSD_NR_getpriority 100 --#define TARGET_FREEBSD_NR_bind 104 --#define TARGET_FREEBSD_NR_setsockopt 105 --#define TARGET_FREEBSD_NR_listen 106 --#define TARGET_FREEBSD_NR_gettimeofday 116 --#define TARGET_FREEBSD_NR_getrusage 117 --#define TARGET_FREEBSD_NR_getsockopt 118 --#define TARGET_FREEBSD_NR_readv 120 --#define TARGET_FREEBSD_NR_writev 121 --#define TARGET_FREEBSD_NR_settimeofday 122 --#define TARGET_FREEBSD_NR_fchown 123 --#define TARGET_FREEBSD_NR_fchmod 124 --#define TARGET_FREEBSD_NR_setreuid 126 --#define TARGET_FREEBSD_NR_setregid 127 --#define TARGET_FREEBSD_NR_rename 128 --#define TARGET_FREEBSD_NR_flock 131 --#define TARGET_FREEBSD_NR_mkfifo 132 --#define TARGET_FREEBSD_NR_sendto 133 --#define TARGET_FREEBSD_NR_shutdown 134 --#define TARGET_FREEBSD_NR_socketpair 135 --#define TARGET_FREEBSD_NR_mkdir 136 --#define TARGET_FREEBSD_NR_rmdir 137 --#define TARGET_FREEBSD_NR_utimes 138 --#define TARGET_FREEBSD_NR_adjtime 140 --#define TARGET_FREEBSD_NR_setsid 147 --#define TARGET_FREEBSD_NR_quotactl 148 --#define TARGET_FREEBSD_NR_nlm_syscall 154 --#define TARGET_FREEBSD_NR_nfssvc 155 --#define TARGET_FREEBSD_NR_freebsd4_statfs 157 --#define TARGET_FREEBSD_NR_freebsd4_fstatfs 158 --#define TARGET_FREEBSD_NR_lgetfh 160 --#define TARGET_FREEBSD_NR_getfh 161 --#define TARGET_FREEBSD_NR_getdomainname 162 --#define TARGET_FREEBSD_NR_setdomainname 163 --#define TARGET_FREEBSD_NR_uname 164 --#define TARGET_FREEBSD_NR_sysarch 165 --#define TARGET_FREEBSD_NR_rtprio 166 --#define TARGET_FREEBSD_NR_semsys 169 --#define TARGET_FREEBSD_NR_msgsys 170 --#define TARGET_FREEBSD_NR_shmsys 171 --#define TARGET_FREEBSD_NR_freebsd6_pread 173 --#define TARGET_FREEBSD_NR_freebsd6_pwrite 174 --#define TARGET_FREEBSD_NR_setfib 175 --#define TARGET_FREEBSD_NR_ntp_adjtime 176 --#define TARGET_FREEBSD_NR_setgid 181 --#define TARGET_FREEBSD_NR_setegid 182 --#define TARGET_FREEBSD_NR_seteuid 183 --#define TARGET_FREEBSD_NR_stat 188 --#define TARGET_FREEBSD_NR_fstat 189 --#define TARGET_FREEBSD_NR_lstat 190 --#define TARGET_FREEBSD_NR_pathconf 191 --#define TARGET_FREEBSD_NR_fpathconf 192 --#define TARGET_FREEBSD_NR_getrlimit 194 --#define TARGET_FREEBSD_NR_setrlimit 195 --#define TARGET_FREEBSD_NR_getdirentries 196 --#define TARGET_FREEBSD_NR_freebsd6_mmap 197 --#define TARGET_FREEBSD_NR___syscall 198 --#define TARGET_FREEBSD_NR_freebsd6_lseek 199 --#define TARGET_FREEBSD_NR_freebsd6_truncate 200 --#define TARGET_FREEBSD_NR_freebsd6_ftruncate 201 --#define TARGET_FREEBSD_NR___sysctl 202 --#define TARGET_FREEBSD_NR_mlock 203 --#define TARGET_FREEBSD_NR_munlock 204 --#define TARGET_FREEBSD_NR_undelete 205 --#define TARGET_FREEBSD_NR_futimes 206 --#define TARGET_FREEBSD_NR_getpgid 207 --#define TARGET_FREEBSD_NR_poll 209 --#define TARGET_FREEBSD_NR___semctl 220 --#define TARGET_FREEBSD_NR_semget 221 --#define TARGET_FREEBSD_NR_semop 222 --#define TARGET_FREEBSD_NR_msgctl 224 --#define TARGET_FREEBSD_NR_msgget 225 --#define TARGET_FREEBSD_NR_msgsnd 226 --#define TARGET_FREEBSD_NR_msgrcv 227 --#define TARGET_FREEBSD_NR_shmat 228 --#define TARGET_FREEBSD_NR_shmctl 229 --#define TARGET_FREEBSD_NR_shmdt 230 --#define TARGET_FREEBSD_NR_shmget 231 --#define TARGET_FREEBSD_NR_clock_gettime 232 --#define TARGET_FREEBSD_NR_clock_settime 233 --#define TARGET_FREEBSD_NR_clock_getres 234 --#define TARGET_FREEBSD_NR_ktimer_create 235 --#define TARGET_FREEBSD_NR_ktimer_delete 236 --#define TARGET_FREEBSD_NR_ktimer_settime 237 --#define TARGET_FREEBSD_NR_ktimer_gettime 238 --#define TARGET_FREEBSD_NR_ktimer_getoverrun 239 --#define TARGET_FREEBSD_NR_nanosleep 240 --#define TARGET_FREEBSD_NR_ntp_gettime 248 --#define TARGET_FREEBSD_NR_minherit 250 --#define TARGET_FREEBSD_NR_rfork 251 --#define TARGET_FREEBSD_NR_openbsd_poll 252 --#define TARGET_FREEBSD_NR_issetugid 253 --#define TARGET_FREEBSD_NR_lchown 254 --#define TARGET_FREEBSD_NR_aio_read 255 --#define TARGET_FREEBSD_NR_aio_write 256 --#define TARGET_FREEBSD_NR_lio_listio 257 --#define TARGET_FREEBSD_NR_getdents 272 --#define TARGET_FREEBSD_NR_lchmod 274 --#define TARGET_FREEBSD_NR_netbsd_lchown 275 --#define TARGET_FREEBSD_NR_lutimes 276 --#define TARGET_FREEBSD_NR_netbsd_msync 277 --#define TARGET_FREEBSD_NR_nstat 278 --#define TARGET_FREEBSD_NR_nfstat 279 --#define TARGET_FREEBSD_NR_nlstat 280 --#define TARGET_FREEBSD_NR_preadv 289 --#define TARGET_FREEBSD_NR_pwritev 290 --#define TARGET_FREEBSD_NR_freebsd4_fhstatfs 297 --#define TARGET_FREEBSD_NR_fhopen 298 --#define TARGET_FREEBSD_NR_fhstat 299 --#define TARGET_FREEBSD_NR_modnext 300 --#define TARGET_FREEBSD_NR_modstat 301 --#define TARGET_FREEBSD_NR_modfnext 302 --#define TARGET_FREEBSD_NR_modfind 303 --#define TARGET_FREEBSD_NR_kldload 304 --#define TARGET_FREEBSD_NR_kldunload 305 --#define TARGET_FREEBSD_NR_kldfind 306 --#define TARGET_FREEBSD_NR_kldnext 307 --#define TARGET_FREEBSD_NR_kldstat 308 --#define TARGET_FREEBSD_NR_kldfirstmod 309 --#define TARGET_FREEBSD_NR_getsid 310 --#define TARGET_FREEBSD_NR_setresuid 311 --#define TARGET_FREEBSD_NR_setresgid 312 --#define TARGET_FREEBSD_NR_aio_return 314 --#define TARGET_FREEBSD_NR_aio_suspend 315 --#define TARGET_FREEBSD_NR_aio_cancel 316 --#define TARGET_FREEBSD_NR_aio_error 317 --#define TARGET_FREEBSD_NR_oaio_read 318 --#define TARGET_FREEBSD_NR_oaio_write 319 --#define TARGET_FREEBSD_NR_olio_listio 320 --#define TARGET_FREEBSD_NR_yield 321 --#define TARGET_FREEBSD_NR_mlockall 324 --#define TARGET_FREEBSD_NR_munlockall 325 --#define TARGET_FREEBSD_NR___getcwd 326 --#define TARGET_FREEBSD_NR_sched_setparam 327 --#define TARGET_FREEBSD_NR_sched_getparam 328 --#define TARGET_FREEBSD_NR_sched_setscheduler 329 --#define TARGET_FREEBSD_NR_sched_getscheduler 330 --#define TARGET_FREEBSD_NR_sched_yield 331 --#define TARGET_FREEBSD_NR_sched_get_priority_max 332 --#define TARGET_FREEBSD_NR_sched_get_priority_min 333 --#define TARGET_FREEBSD_NR_sched_rr_get_interval 334 --#define TARGET_FREEBSD_NR_utrace 335 --#define TARGET_FREEBSD_NR_freebsd4_sendfile 336 --#define TARGET_FREEBSD_NR_kldsym 337 --#define TARGET_FREEBSD_NR_jail 338 --#define TARGET_FREEBSD_NR_sigprocmask 340 --#define TARGET_FREEBSD_NR_sigsuspend 341 --#define TARGET_FREEBSD_NR_freebsd4_sigaction 342 --#define TARGET_FREEBSD_NR_sigpending 343 --#define TARGET_FREEBSD_NR_freebsd4_sigreturn 344 --#define TARGET_FREEBSD_NR_sigtimedwait 345 --#define TARGET_FREEBSD_NR_sigwaitinfo 346 --#define TARGET_FREEBSD_NR___acl_get_file 347 --#define TARGET_FREEBSD_NR___acl_set_file 348 --#define TARGET_FREEBSD_NR___acl_get_fd 349 --#define TARGET_FREEBSD_NR___acl_set_fd 350 --#define TARGET_FREEBSD_NR___acl_delete_file 351 --#define TARGET_FREEBSD_NR___acl_delete_fd 352 --#define TARGET_FREEBSD_NR___acl_aclcheck_file 353 --#define TARGET_FREEBSD_NR___acl_aclcheck_fd 354 --#define TARGET_FREEBSD_NR_extattrctl 355 --#define TARGET_FREEBSD_NR_extattr_set_file 356 --#define TARGET_FREEBSD_NR_extattr_get_file 357 --#define TARGET_FREEBSD_NR_extattr_delete_file 358 --#define TARGET_FREEBSD_NR_aio_waitcomplete 359 --#define TARGET_FREEBSD_NR_getresuid 360 --#define TARGET_FREEBSD_NR_getresgid 361 --#define TARGET_FREEBSD_NR_kqueue 362 --#define TARGET_FREEBSD_NR_kevent 363 --#define TARGET_FREEBSD_NR_extattr_set_fd 371 --#define TARGET_FREEBSD_NR_extattr_get_fd 372 --#define TARGET_FREEBSD_NR_extattr_delete_fd 373 --#define TARGET_FREEBSD_NR___setugid 374 --#define TARGET_FREEBSD_NR_nfsclnt 375 --#define TARGET_FREEBSD_NR_eaccess 376 --#define TARGET_FREEBSD_NR_nmount 378 --#define TARGET_FREEBSD_NR___mac_get_proc 384 --#define TARGET_FREEBSD_NR___mac_set_proc 385 --#define TARGET_FREEBSD_NR___mac_get_fd 386 --#define TARGET_FREEBSD_NR___mac_get_file 387 --#define TARGET_FREEBSD_NR___mac_set_fd 388 --#define TARGET_FREEBSD_NR___mac_set_file 389 --#define TARGET_FREEBSD_NR_kenv 390 --#define TARGET_FREEBSD_NR_lchflags 391 --#define TARGET_FREEBSD_NR_uuidgen 392 --#define TARGET_FREEBSD_NR_sendfile 393 --#define TARGET_FREEBSD_NR_mac_syscall 394 --#define TARGET_FREEBSD_NR_getfsstat 395 --#define TARGET_FREEBSD_NR_statfs 396 --#define TARGET_FREEBSD_NR_fstatfs 397 --#define TARGET_FREEBSD_NR_fhstatfs 398 --#define TARGET_FREEBSD_NR_ksem_close 400 --#define TARGET_FREEBSD_NR_ksem_post 401 --#define TARGET_FREEBSD_NR_ksem_wait 402 --#define TARGET_FREEBSD_NR_ksem_trywait 403 --#define TARGET_FREEBSD_NR_ksem_init 404 --#define TARGET_FREEBSD_NR_ksem_open 405 --#define TARGET_FREEBSD_NR_ksem_unlink 406 --#define TARGET_FREEBSD_NR_ksem_getvalue 407 --#define TARGET_FREEBSD_NR_ksem_destroy 408 --#define TARGET_FREEBSD_NR___mac_get_pid 409 --#define TARGET_FREEBSD_NR___mac_get_link 410 --#define TARGET_FREEBSD_NR___mac_set_link 411 --#define TARGET_FREEBSD_NR_extattr_set_link 412 --#define TARGET_FREEBSD_NR_extattr_get_link 413 --#define TARGET_FREEBSD_NR_extattr_delete_link 414 --#define TARGET_FREEBSD_NR___mac_execve 415 --#define TARGET_FREEBSD_NR_sigaction 416 --#define TARGET_FREEBSD_NR_sigreturn 417 --#define TARGET_FREEBSD_NR_getcontext 421 --#define TARGET_FREEBSD_NR_setcontext 422 --#define TARGET_FREEBSD_NR_swapcontext 423 --#define TARGET_FREEBSD_NR_swapoff 424 --#define TARGET_FREEBSD_NR___acl_get_link 425 --#define TARGET_FREEBSD_NR___acl_set_link 426 --#define TARGET_FREEBSD_NR___acl_delete_link 427 --#define TARGET_FREEBSD_NR___acl_aclcheck_link 428 --#define TARGET_FREEBSD_NR_sigwait 429 --#define TARGET_FREEBSD_NR_thr_create 430 --#define TARGET_FREEBSD_NR_thr_exit 431 --#define TARGET_FREEBSD_NR_thr_self 432 --#define TARGET_FREEBSD_NR_thr_kill 433 --#define TARGET_FREEBSD_NR__umtx_lock 434 --#define TARGET_FREEBSD_NR__umtx_unlock 435 --#define TARGET_FREEBSD_NR_jail_attach 436 --#define TARGET_FREEBSD_NR_extattr_list_fd 437 --#define TARGET_FREEBSD_NR_extattr_list_file 438 --#define TARGET_FREEBSD_NR_extattr_list_link 439 --#define TARGET_FREEBSD_NR_ksem_timedwait 441 --#define TARGET_FREEBSD_NR_thr_suspend 442 --#define TARGET_FREEBSD_NR_thr_wake 443 --#define TARGET_FREEBSD_NR_kldunloadf 444 --#define TARGET_FREEBSD_NR_audit 445 --#define TARGET_FREEBSD_NR_auditon 446 --#define TARGET_FREEBSD_NR_getauid 447 --#define TARGET_FREEBSD_NR_setauid 448 --#define TARGET_FREEBSD_NR_getaudit 449 --#define TARGET_FREEBSD_NR_setaudit 450 --#define TARGET_FREEBSD_NR_getaudit_addr 451 --#define TARGET_FREEBSD_NR_setaudit_addr 452 --#define TARGET_FREEBSD_NR_auditctl 453 --#define TARGET_FREEBSD_NR__umtx_op 454 --#define TARGET_FREEBSD_NR_thr_new 455 --#define TARGET_FREEBSD_NR_sigqueue 456 --#define TARGET_FREEBSD_NR_kmq_open 457 --#define TARGET_FREEBSD_NR_kmq_setattr 458 --#define TARGET_FREEBSD_NR_kmq_timedreceive 459 --#define TARGET_FREEBSD_NR_kmq_timedsend 460 --#define TARGET_FREEBSD_NR_kmq_notify 461 --#define TARGET_FREEBSD_NR_kmq_unlink 462 --#define TARGET_FREEBSD_NR_abort2 463 --#define TARGET_FREEBSD_NR_thr_set_name 464 --#define TARGET_FREEBSD_NR_aio_fsync 465 --#define TARGET_FREEBSD_NR_rtprio_thread 466 --#define TARGET_FREEBSD_NR_sctp_peeloff 471 --#define TARGET_FREEBSD_NR_sctp_generic_sendmsg 472 --#define TARGET_FREEBSD_NR_sctp_generic_sendmsg_iov 473 --#define TARGET_FREEBSD_NR_sctp_generic_recvmsg 474 --#define TARGET_FREEBSD_NR_pread 475 --#define TARGET_FREEBSD_NR_pwrite 476 --#define TARGET_FREEBSD_NR_mmap 477 --#define TARGET_FREEBSD_NR_lseek 478 --#define TARGET_FREEBSD_NR_truncate 479 --#define TARGET_FREEBSD_NR_ftruncate 480 --#define TARGET_FREEBSD_NR_thr_kill2 481 --#define TARGET_FREEBSD_NR_shm_open 482 --#define TARGET_FREEBSD_NR_shm_unlink 483 --#define TARGET_FREEBSD_NR_cpuset 484 --#define TARGET_FREEBSD_NR_cpuset_setid 485 --#define TARGET_FREEBSD_NR_cpuset_getid 486 --#define TARGET_FREEBSD_NR_cpuset_getaffinity 487 --#define TARGET_FREEBSD_NR_cpuset_setaffinity 488 --#define TARGET_FREEBSD_NR_faccessat 489 --#define TARGET_FREEBSD_NR_fchmodat 490 --#define TARGET_FREEBSD_NR_fchownat 491 --#define TARGET_FREEBSD_NR_fexecve 492 --#define TARGET_FREEBSD_NR_fstatat 493 --#define TARGET_FREEBSD_NR_futimesat 494 --#define TARGET_FREEBSD_NR_linkat 495 --#define TARGET_FREEBSD_NR_mkdirat 496 --#define TARGET_FREEBSD_NR_mkfifoat 497 --#define TARGET_FREEBSD_NR_mknodat 498 --#define TARGET_FREEBSD_NR_openat 499 --#define TARGET_FREEBSD_NR_readlinkat 500 --#define TARGET_FREEBSD_NR_renameat 501 --#define TARGET_FREEBSD_NR_symlinkat 502 --#define TARGET_FREEBSD_NR_unlinkat 503 --#define TARGET_FREEBSD_NR_posix_openpt 504 -+#define TARGET_FREEBSD_NR_syscall 0 -+#define TARGET_FREEBSD_NR_exit 1 -+#define TARGET_FREEBSD_NR_fork 2 -+#define TARGET_FREEBSD_NR_read 3 -+#define TARGET_FREEBSD_NR_write 4 -+#define TARGET_FREEBSD_NR_open 5 -+#define TARGET_FREEBSD_NR_close 6 -+#define TARGET_FREEBSD_NR_wait4 7 -+ /* 8 is old creat */ -+#define TARGET_FREEBSD_NR_link 9 -+#define TARGET_FREEBSD_NR_unlink 10 -+ /* 11 is obsolete execv */ -+#define TARGET_FREEBSD_NR_chdir 12 -+#define TARGET_FREEBSD_NR_fchdir 13 -+#define TARGET_FREEBSD_NR_mknod 14 -+#define TARGET_FREEBSD_NR_chmod 15 -+#define TARGET_FREEBSD_NR_chown 16 -+#define TARGET_FREEBSD_NR_break 17 -+#define TARGET_FREEBSD_NR_freebsd4_getfsstat 18 -+ /* 19 is old lseek */ -+#define TARGET_FREEBSD_NR_getpid 20 -+#define TARGET_FREEBSD_NR_mount 21 -+#define TARGET_FREEBSD_NR_unmount 22 -+#define TARGET_FREEBSD_NR_setuid 23 -+#define TARGET_FREEBSD_NR_getuid 24 -+#define TARGET_FREEBSD_NR_geteuid 25 -+#define TARGET_FREEBSD_NR_ptrace 26 -+#define TARGET_FREEBSD_NR_recvmsg 27 -+#define TARGET_FREEBSD_NR_sendmsg 28 -+#define TARGET_FREEBSD_NR_recvfrom 29 -+#define TARGET_FREEBSD_NR_accept 30 -+#define TARGET_FREEBSD_NR_getpeername 31 -+#define TARGET_FREEBSD_NR_getsockname 32 -+#define TARGET_FREEBSD_NR_access 33 -+#define TARGET_FREEBSD_NR_chflags 34 -+#define TARGET_FREEBSD_NR_fchflags 35 -+#define TARGET_FREEBSD_NR_sync 36 -+#define TARGET_FREEBSD_NR_kill 37 -+ /* 38 is old stat */ -+#define TARGET_FREEBSD_NR_getppid 39 -+ /* 40 is old lstat */ -+#define TARGET_FREEBSD_NR_dup 41 -+#define TARGET_FREEBSD_NR_pipe 42 -+#define TARGET_FREEBSD_NR_getegid 43 -+#define TARGET_FREEBSD_NR_profil 44 -+#define TARGET_FREEBSD_NR_ktrace 45 -+ /* 46 is old sigaction */ -+#define TARGET_FREEBSD_NR_getgid 47 -+ /* 48 is old sigprocmask */ -+#define TARGET_FREEBSD_NR_getlogin 49 -+#define TARGET_FREEBSD_NR_setlogin 50 -+#define TARGET_FREEBSD_NR_acct 51 -+ /* 52 is old sigpending */ -+#define TARGET_FREEBSD_NR_sigaltstack 53 -+#define TARGET_FREEBSD_NR_ioctl 54 -+#define TARGET_FREEBSD_NR_reboot 55 -+#define TARGET_FREEBSD_NR_revoke 56 -+#define TARGET_FREEBSD_NR_symlink 57 -+#define TARGET_FREEBSD_NR_readlink 58 -+#define TARGET_FREEBSD_NR_execve 59 -+#define TARGET_FREEBSD_NR_umask 60 -+#define TARGET_FREEBSD_NR_chroot 61 -+ /* 62 is old fstat */ -+ /* 63 is old getkerninfo */ -+ /* 64 is old getpagesize */ -+#define TARGET_FREEBSD_NR_msync 65 -+#define TARGET_FREEBSD_NR_vfork 66 -+ /* 67 is obsolete vread */ -+ /* 68 is obsolete vwrite */ -+#define TARGET_FREEBSD_NR_sbrk 69 -+#define TARGET_FREEBSD_NR_sstk 70 -+ /* 71 is old mmap */ -+#define TARGET_FREEBSD_NR_vadvise 72 -+#define TARGET_FREEBSD_NR_munmap 73 -+#define TARGET_FREEBSD_NR_mprotect 74 -+#define TARGET_FREEBSD_NR_madvise 75 -+ /* 76 is obsolete vhangup */ -+ /* 77 is obsolete vlimit */ -+#define TARGET_FREEBSD_NR_mincore 78 -+#define TARGET_FREEBSD_NR_getgroups 79 -+#define TARGET_FREEBSD_NR_setgroups 80 -+#define TARGET_FREEBSD_NR_getpgrp 81 -+#define TARGET_FREEBSD_NR_setpgid 82 -+#define TARGET_FREEBSD_NR_setitimer 83 -+ /* 84 is old wait */ -+#define TARGET_FREEBSD_NR_swapon 85 -+#define TARGET_FREEBSD_NR_getitimer 86 -+ /* 87 is old gethostname */ -+ /* 88 is old sethostname */ -+#define TARGET_FREEBSD_NR_getdtablesize 89 -+#define TARGET_FREEBSD_NR_dup2 90 -+#define TARGET_FREEBSD_NR_fcntl 92 -+#define TARGET_FREEBSD_NR_select 93 -+#define TARGET_FREEBSD_NR_fsync 95 -+#define TARGET_FREEBSD_NR_setpriority 96 -+#define TARGET_FREEBSD_NR_socket 97 -+#define TARGET_FREEBSD_NR_connect 98 -+ /* 99 is old accept */ -+#define TARGET_FREEBSD_NR_getpriority 100 -+ /* 101 is old send */ -+ /* 102 is old recv */ -+ /* 103 is old sigreturn */ -+#define TARGET_FREEBSD_NR_bind 104 -+#define TARGET_FREEBSD_NR_setsockopt 105 -+#define TARGET_FREEBSD_NR_listen 106 -+ /* 107 is obsolete vtimes */ -+ /* 108 is old sigvec */ -+ /* 109 is old sigblock */ -+ /* 110 is old sigsetmask */ -+ /* 111 is old sigsuspend */ -+ /* 112 is old sigstack */ -+ /* 113 is old recvmsg */ -+ /* 114 is old sendmsg */ -+ /* 115 is obsolete vtrace */ -+#define TARGET_FREEBSD_NR_gettimeofday 116 -+#define TARGET_FREEBSD_NR_getrusage 117 -+#define TARGET_FREEBSD_NR_getsockopt 118 -+#define TARGET_FREEBSD_NR_readv 120 -+#define TARGET_FREEBSD_NR_writev 121 -+#define TARGET_FREEBSD_NR_settimeofday 122 -+#define TARGET_FREEBSD_NR_fchown 123 -+#define TARGET_FREEBSD_NR_fchmod 124 -+ /* 125 is old recvfrom */ -+#define TARGET_FREEBSD_NR_setreuid 126 -+#define TARGET_FREEBSD_NR_setregid 127 -+#define TARGET_FREEBSD_NR_rename 128 -+ /* 129 is old truncate */ -+ /* 130 is old ftruncate */ -+#define TARGET_FREEBSD_NR_flock 131 -+#define TARGET_FREEBSD_NR_mkfifo 132 -+#define TARGET_FREEBSD_NR_sendto 133 -+#define TARGET_FREEBSD_NR_shutdown 134 -+#define TARGET_FREEBSD_NR_socketpair 135 -+#define TARGET_FREEBSD_NR_mkdir 136 -+#define TARGET_FREEBSD_NR_rmdir 137 -+#define TARGET_FREEBSD_NR_utimes 138 -+ /* 139 is obsolete 4.2 sigreturn */ -+#define TARGET_FREEBSD_NR_adjtime 140 -+ /* 141 is old getpeername */ -+ /* 142 is old gethostid */ -+ /* 143 is old sethostid */ -+ /* 144 is old getrlimit */ -+ /* 145 is old setrlimit */ -+ /* 146 is old killpg */ -+#define TARGET_FREEBSD_NR_setsid 147 -+#define TARGET_FREEBSD_NR_quotactl 148 -+ /* 149 is old quota */ -+ /* 150 is old getsockname */ -+#define TARGET_FREEBSD_NR_nlm_syscall 154 -+#define TARGET_FREEBSD_NR_nfssvc 155 -+ /* 156 is old getdirentries */ -+#define TARGET_FREEBSD_NR_freebsd4_statfs 157 -+#define TARGET_FREEBSD_NR_freebsd4_fstatfs 158 -+#define TARGET_FREEBSD_NR_lgetfh 160 -+#define TARGET_FREEBSD_NR_getfh 161 -+#define TARGET_FREEBSD_NR_freebsd4_getdomainname 162 -+#define TARGET_FREEBSD_NR_freebsd4_setdomainname 163 -+#define TARGET_FREEBSD_NR_freebsd4_uname 164 -+#define TARGET_FREEBSD_NR_sysarch 165 -+#define TARGET_FREEBSD_NR_rtprio 166 -+#define TARGET_FREEBSD_NR_semsys 169 -+#define TARGET_FREEBSD_NR_msgsys 170 -+#define TARGET_FREEBSD_NR_shmsys 171 -+#define TARGET_FREEBSD_NR_freebsd6_pread 173 -+#define TARGET_FREEBSD_NR_freebsd6_pwrite 174 -+#define TARGET_FREEBSD_NR_setfib 175 -+#define TARGET_FREEBSD_NR_ntp_adjtime 176 -+#define TARGET_FREEBSD_NR_setgid 181 -+#define TARGET_FREEBSD_NR_setegid 182 -+#define TARGET_FREEBSD_NR_seteuid 183 -+#define TARGET_FREEBSD_NR_stat 188 -+#define TARGET_FREEBSD_NR_fstat 189 -+#define TARGET_FREEBSD_NR_lstat 190 -+#define TARGET_FREEBSD_NR_pathconf 191 -+#define TARGET_FREEBSD_NR_fpathconf 192 -+#define TARGET_FREEBSD_NR_getrlimit 194 -+#define TARGET_FREEBSD_NR_setrlimit 195 -+#define TARGET_FREEBSD_NR_getdirentries 196 -+#define TARGET_FREEBSD_NR_freebsd6_mmap 197 -+#define TARGET_FREEBSD_NR___syscall 198 -+#define TARGET_FREEBSD_NR_freebsd6_lseek 199 -+#define TARGET_FREEBSD_NR_freebsd6_truncate 200 -+#define TARGET_FREEBSD_NR_freebsd6_ftruncate 201 -+#define TARGET_FREEBSD_NR___sysctl 202 -+#define TARGET_FREEBSD_NR_mlock 203 -+#define TARGET_FREEBSD_NR_munlock 204 -+#define TARGET_FREEBSD_NR_undelete 205 -+#define TARGET_FREEBSD_NR_futimes 206 -+#define TARGET_FREEBSD_NR_getpgid 207 -+#define TARGET_FREEBSD_NR_poll 209 -+#define TARGET_FREEBSD_NR_freebsd7___semctl 220 -+#define TARGET_FREEBSD_NR_semget 221 -+#define TARGET_FREEBSD_NR_semop 222 -+#define TARGET_FREEBSD_NR_freebsd7_msgctl 224 -+#define TARGET_FREEBSD_NR_msgget 225 -+#define TARGET_FREEBSD_NR_msgsnd 226 -+#define TARGET_FREEBSD_NR_msgrcv 227 -+#define TARGET_FREEBSD_NR_shmat 228 -+#define TARGET_FREEBSD_NR_freebsd7_shmctl 229 -+#define TARGET_FREEBSD_NR_shmdt 230 -+#define TARGET_FREEBSD_NR_shmget 231 -+#define TARGET_FREEBSD_NR_clock_gettime 232 -+#define TARGET_FREEBSD_NR_clock_settime 233 -+#define TARGET_FREEBSD_NR_clock_getres 234 -+#define TARGET_FREEBSD_NR_ktimer_create 235 -+#define TARGET_FREEBSD_NR_ktimer_delete 236 -+#define TARGET_FREEBSD_NR_ktimer_settime 237 -+#define TARGET_FREEBSD_NR_ktimer_gettime 238 -+#define TARGET_FREEBSD_NR_ktimer_getoverrun 239 -+#define TARGET_FREEBSD_NR_nanosleep 240 -+#define TARGET_FREEBSD_NR_ntp_gettime 248 -+#define TARGET_FREEBSD_NR_minherit 250 -+#define TARGET_FREEBSD_NR_rfork 251 -+#define TARGET_FREEBSD_NR_openbsd_poll 252 -+#define TARGET_FREEBSD_NR_issetugid 253 -+#define TARGET_FREEBSD_NR_lchown 254 -+#define TARGET_FREEBSD_NR_aio_read 255 -+#define TARGET_FREEBSD_NR_aio_write 256 -+#define TARGET_FREEBSD_NR_lio_listio 257 -+#define TARGET_FREEBSD_NR_getdents 272 -+#define TARGET_FREEBSD_NR_lchmod 274 -+#define TARGET_FREEBSD_NR_netbsd_lchown 275 -+#define TARGET_FREEBSD_NR_lutimes 276 -+#define TARGET_FREEBSD_NR_netbsd_msync 277 -+#define TARGET_FREEBSD_NR_nstat 278 -+#define TARGET_FREEBSD_NR_nfstat 279 -+#define TARGET_FREEBSD_NR_nlstat 280 -+#define TARGET_FREEBSD_NR_preadv 289 -+#define TARGET_FREEBSD_NR_pwritev 290 -+#define TARGET_FREEBSD_NR_freebsd4_fhstatfs 297 -+#define TARGET_FREEBSD_NR_fhopen 298 -+#define TARGET_FREEBSD_NR_fhstat 299 -+#define TARGET_FREEBSD_NR_modnext 300 -+#define TARGET_FREEBSD_NR_modstat 301 -+#define TARGET_FREEBSD_NR_modfnext 302 -+#define TARGET_FREEBSD_NR_modfind 303 -+#define TARGET_FREEBSD_NR_kldload 304 -+#define TARGET_FREEBSD_NR_kldunload 305 -+#define TARGET_FREEBSD_NR_kldfind 306 -+#define TARGET_FREEBSD_NR_kldnext 307 -+#define TARGET_FREEBSD_NR_kldstat 308 -+#define TARGET_FREEBSD_NR_kldfirstmod 309 -+#define TARGET_FREEBSD_NR_getsid 310 -+#define TARGET_FREEBSD_NR_setresuid 311 -+#define TARGET_FREEBSD_NR_setresgid 312 -+ /* 313 is obsolete signanosleep */ -+#define TARGET_FREEBSD_NR_aio_return 314 -+#define TARGET_FREEBSD_NR_aio_suspend 315 -+#define TARGET_FREEBSD_NR_aio_cancel 316 -+#define TARGET_FREEBSD_NR_aio_error 317 -+#define TARGET_FREEBSD_NR_oaio_read 318 -+#define TARGET_FREEBSD_NR_oaio_write 319 -+#define TARGET_FREEBSD_NR_olio_listio 320 -+#define TARGET_FREEBSD_NR_yield 321 -+ /* 322 is obsolete thr_sleep */ -+ /* 323 is obsolete thr_wakeup */ -+#define TARGET_FREEBSD_NR_mlockall 324 -+#define TARGET_FREEBSD_NR_munlockall 325 -+#define TARGET_FREEBSD_NR___getcwd 326 -+#define TARGET_FREEBSD_NR_sched_setparam 327 -+#define TARGET_FREEBSD_NR_sched_getparam 328 -+#define TARGET_FREEBSD_NR_sched_setscheduler 329 -+#define TARGET_FREEBSD_NR_sched_getscheduler 330 -+#define TARGET_FREEBSD_NR_sched_yield 331 -+#define TARGET_FREEBSD_NR_sched_get_priority_max 332 -+#define TARGET_FREEBSD_NR_sched_get_priority_min 333 -+#define TARGET_FREEBSD_NR_sched_rr_get_interval 334 -+#define TARGET_FREEBSD_NR_utrace 335 -+#define TARGET_FREEBSD_NR_freebsd4_sendfile 336 -+#define TARGET_FREEBSD_NR_kldsym 337 -+#define TARGET_FREEBSD_NR_jail 338 -+#define TARGET_FREEBSD_NR_nnpfs_syscall 339 -+#define TARGET_FREEBSD_NR_sigprocmask 340 -+#define TARGET_FREEBSD_NR_sigsuspend 341 -+#define TARGET_FREEBSD_NR_freebsd4_sigaction 342 -+#define TARGET_FREEBSD_NR_sigpending 343 -+#define TARGET_FREEBSD_NR_freebsd4_sigreturn 344 -+#define TARGET_FREEBSD_NR_sigtimedwait 345 -+#define TARGET_FREEBSD_NR_sigwaitinfo 346 -+#define TARGET_FREEBSD_NR___acl_get_file 347 -+#define TARGET_FREEBSD_NR___acl_set_file 348 -+#define TARGET_FREEBSD_NR___acl_get_fd 349 -+#define TARGET_FREEBSD_NR___acl_set_fd 350 -+#define TARGET_FREEBSD_NR___acl_delete_file 351 -+#define TARGET_FREEBSD_NR___acl_delete_fd 352 -+#define TARGET_FREEBSD_NR___acl_aclcheck_file 353 -+#define TARGET_FREEBSD_NR___acl_aclcheck_fd 354 -+#define TARGET_FREEBSD_NR_extattrctl 355 -+#define TARGET_FREEBSD_NR_extattr_set_file 356 -+#define TARGET_FREEBSD_NR_extattr_get_file 357 -+#define TARGET_FREEBSD_NR_extattr_delete_file 358 -+#define TARGET_FREEBSD_NR_aio_waitcomplete 359 -+#define TARGET_FREEBSD_NR_getresuid 360 -+#define TARGET_FREEBSD_NR_getresgid 361 -+#define TARGET_FREEBSD_NR_kqueue 362 -+#define TARGET_FREEBSD_NR_kevent 363 -+#define TARGET_FREEBSD_NR_extattr_set_fd 371 -+#define TARGET_FREEBSD_NR_extattr_get_fd 372 -+#define TARGET_FREEBSD_NR_extattr_delete_fd 373 -+#define TARGET_FREEBSD_NR___setugid 374 -+#define TARGET_FREEBSD_NR_eaccess 376 -+#define TARGET_FREEBSD_NR_afs3_syscall 377 -+#define TARGET_FREEBSD_NR_nmount 378 -+#define TARGET_FREEBSD_NR___mac_get_proc 384 -+#define TARGET_FREEBSD_NR___mac_set_proc 385 -+#define TARGET_FREEBSD_NR___mac_get_fd 386 -+#define TARGET_FREEBSD_NR___mac_get_file 387 -+#define TARGET_FREEBSD_NR___mac_set_fd 388 -+#define TARGET_FREEBSD_NR___mac_set_file 389 -+#define TARGET_FREEBSD_NR_kenv 390 -+#define TARGET_FREEBSD_NR_lchflags 391 -+#define TARGET_FREEBSD_NR_uuidgen 392 -+#define TARGET_FREEBSD_NR_sendfile 393 -+#define TARGET_FREEBSD_NR_mac_syscall 394 -+#define TARGET_FREEBSD_NR_getfsstat 395 -+#define TARGET_FREEBSD_NR_statfs 396 -+#define TARGET_FREEBSD_NR_fstatfs 397 -+#define TARGET_FREEBSD_NR_fhstatfs 398 -+#define TARGET_FREEBSD_NR_ksem_close 400 -+#define TARGET_FREEBSD_NR_ksem_post 401 -+#define TARGET_FREEBSD_NR_ksem_wait 402 -+#define TARGET_FREEBSD_NR_ksem_trywait 403 -+#define TARGET_FREEBSD_NR_ksem_init 404 -+#define TARGET_FREEBSD_NR_ksem_open 405 -+#define TARGET_FREEBSD_NR_ksem_unlink 406 -+#define TARGET_FREEBSD_NR_ksem_getvalue 407 -+#define TARGET_FREEBSD_NR_ksem_destroy 408 -+#define TARGET_FREEBSD_NR___mac_get_pid 409 -+#define TARGET_FREEBSD_NR___mac_get_link 410 -+#define TARGET_FREEBSD_NR___mac_set_link 411 -+#define TARGET_FREEBSD_NR_extattr_set_link 412 -+#define TARGET_FREEBSD_NR_extattr_get_link 413 -+#define TARGET_FREEBSD_NR_extattr_delete_link 414 -+#define TARGET_FREEBSD_NR___mac_execve 415 -+#define TARGET_FREEBSD_NR_sigaction 416 -+#define TARGET_FREEBSD_NR_sigreturn 417 -+#define TARGET_FREEBSD_NR_getcontext 421 -+#define TARGET_FREEBSD_NR_setcontext 422 -+#define TARGET_FREEBSD_NR_swapcontext 423 -+#define TARGET_FREEBSD_NR_swapoff 424 -+#define TARGET_FREEBSD_NR___acl_get_link 425 -+#define TARGET_FREEBSD_NR___acl_set_link 426 -+#define TARGET_FREEBSD_NR___acl_delete_link 427 -+#define TARGET_FREEBSD_NR___acl_aclcheck_link 428 -+#define TARGET_FREEBSD_NR_sigwait 429 -+#define TARGET_FREEBSD_NR_thr_create 430 -+#define TARGET_FREEBSD_NR_thr_exit 431 -+#define TARGET_FREEBSD_NR_thr_self 432 -+#define TARGET_FREEBSD_NR_thr_kill 433 -+#define TARGET_FREEBSD_NR__umtx_lock 434 -+#define TARGET_FREEBSD_NR__umtx_unlock 435 -+#define TARGET_FREEBSD_NR_jail_attach 436 -+#define TARGET_FREEBSD_NR_extattr_list_fd 437 -+#define TARGET_FREEBSD_NR_extattr_list_file 438 -+#define TARGET_FREEBSD_NR_extattr_list_link 439 -+#define TARGET_FREEBSD_NR_ksem_timedwait 441 -+#define TARGET_FREEBSD_NR_thr_suspend 442 -+#define TARGET_FREEBSD_NR_thr_wake 443 -+#define TARGET_FREEBSD_NR_kldunloadf 444 -+#define TARGET_FREEBSD_NR_audit 445 -+#define TARGET_FREEBSD_NR_auditon 446 -+#define TARGET_FREEBSD_NR_getauid 447 -+#define TARGET_FREEBSD_NR_setauid 448 -+#define TARGET_FREEBSD_NR_getaudit 449 -+#define TARGET_FREEBSD_NR_setaudit 450 -+#define TARGET_FREEBSD_NR_getaudit_addr 451 -+#define TARGET_FREEBSD_NR_setaudit_addr 452 -+#define TARGET_FREEBSD_NR_auditctl 453 -+#define TARGET_FREEBSD_NR__umtx_op 454 -+#define TARGET_FREEBSD_NR_thr_new 455 -+#define TARGET_FREEBSD_NR_sigqueue 456 -+#define TARGET_FREEBSD_NR_kmq_open 457 -+#define TARGET_FREEBSD_NR_kmq_setattr 458 -+#define TARGET_FREEBSD_NR_kmq_timedreceive 459 -+#define TARGET_FREEBSD_NR_kmq_timedsend 460 -+#define TARGET_FREEBSD_NR_kmq_notify 461 -+#define TARGET_FREEBSD_NR_kmq_unlink 462 -+#define TARGET_FREEBSD_NR_abort2 463 -+#define TARGET_FREEBSD_NR_thr_set_name 464 -+#define TARGET_FREEBSD_NR_aio_fsync 465 -+#define TARGET_FREEBSD_NR_rtprio_thread 466 -+#define TARGET_FREEBSD_NR_sctp_peeloff 471 -+#define TARGET_FREEBSD_NR_sctp_generic_sendmsg 472 -+#define TARGET_FREEBSD_NR_sctp_generic_sendmsg_iov 473 -+#define TARGET_FREEBSD_NR_sctp_generic_recvmsg 474 -+#define TARGET_FREEBSD_NR_pread 475 -+#define TARGET_FREEBSD_NR_pwrite 476 -+#define TARGET_FREEBSD_NR_mmap 477 -+#define TARGET_FREEBSD_NR_lseek 478 -+#define TARGET_FREEBSD_NR_truncate 479 -+#define TARGET_FREEBSD_NR_ftruncate 480 -+#define TARGET_FREEBSD_NR_thr_kill2 481 -+#define TARGET_FREEBSD_NR_shm_open 482 -+#define TARGET_FREEBSD_NR_shm_unlink 483 -+#define TARGET_FREEBSD_NR_cpuset 484 -+#define TARGET_FREEBSD_NR_cpuset_setid 485 -+#define TARGET_FREEBSD_NR_cpuset_getid 486 -+#define TARGET_FREEBSD_NR_cpuset_getaffinity 487 -+#define TARGET_FREEBSD_NR_cpuset_setaffinity 488 -+#define TARGET_FREEBSD_NR_faccessat 489 -+#define TARGET_FREEBSD_NR_fchmodat 490 -+#define TARGET_FREEBSD_NR_fchownat 491 -+#define TARGET_FREEBSD_NR_fexecve 492 -+#define TARGET_FREEBSD_NR_fstatat 493 -+#define TARGET_FREEBSD_NR_futimesat 494 -+#define TARGET_FREEBSD_NR_linkat 495 -+#define TARGET_FREEBSD_NR_mkdirat 496 -+#define TARGET_FREEBSD_NR_mkfifoat 497 -+#define TARGET_FREEBSD_NR_mknodat 498 -+#define TARGET_FREEBSD_NR_openat 499 -+#define TARGET_FREEBSD_NR_readlinkat 500 -+#define TARGET_FREEBSD_NR_renameat 501 -+#define TARGET_FREEBSD_NR_symlinkat 502 -+#define TARGET_FREEBSD_NR_unlinkat 503 -+#define TARGET_FREEBSD_NR_posix_openpt 504 -+#define TARGET_FREEBSD_NR_gssd_syscall 505 -+#define TARGET_FREEBSD_NR_jail_get 506 -+#define TARGET_FREEBSD_NR_jail_set 507 -+#define TARGET_FREEBSD_NR_jail_remove 508 -+#define TARGET_FREEBSD_NR_closefrom 509 -+#define TARGET_FREEBSD_NR___semctl 510 -+#define TARGET_FREEBSD_NR_msgctl 511 -+#define TARGET_FREEBSD_NR_shmctl 512 -+#define TARGET_FREEBSD_NR_lpathconf 513 -+#define TARGET_FREEBSD_NR_cap_new 514 -+#define TARGET_FREEBSD_NR_cap_getrights 515 -+#define TARGET_FREEBSD_NR_cap_enter 516 -+#define TARGET_FREEBSD_NR_cap_getmode 517 -+#define TARGET_FREEBSD_NR_pdfork 518 -+#define TARGET_FREEBSD_NR_pdkill 519 -+#define TARGET_FREEBSD_NR_pdgetpid 520 -+#define TARGET_FREEBSD_NR_pselect 522 -+#define TARGET_FREEBSD_NR_getloginclass 523 -+#define TARGET_FREEBSD_NR_setloginclass 524 -+#define TARGET_FREEBSD_NR_rctl_get_racct 525 -+#define TARGET_FREEBSD_NR_rctl_get_rules 526 -+#define TARGET_FREEBSD_NR_rctl_get_limits 527 -+#define TARGET_FREEBSD_NR_rctl_add_rule 528 -+#define TARGET_FREEBSD_NR_rctl_remove_rule 529 -+#define TARGET_FREEBSD_NR_posix_fallocate 530 -+#define TARGET_FREEBSD_NR_posix_fadvise 531 -+#define TARGET_FREEBSD_NR_MAXSYSCALL 532 -diff --git a/bsd-user/i386/target_signal.h b/bsd-user/i386/target_signal.h -index 2ef36d1..285e7f9 100644 ---- a/bsd-user/i386/target_signal.h -+++ b/bsd-user/i386/target_signal.h -@@ -3,18 +3,12 @@ - - #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; -- -- - static inline abi_ulong get_sp_from_cpustate(CPUX86State *state) - { - return state->regs[R_ESP]; - } - -+#define TARGET_MINSIGSTKSZ (512 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ - #endif /* TARGET_SIGNAL_H */ -diff --git a/bsd-user/i386/target_vmparam.h b/bsd-user/i386/target_vmparam.h -new file mode 100644 -index 0000000..8fc98d5 ---- /dev/null -+++ b/bsd-user/i386/target_vmparam.h -@@ -0,0 +1,27 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+ -+#define TARGET_USRSTACK (0xbfc00000) -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+#endif /* _TARGET_VMPARAM_H_ */ -diff --git a/bsd-user/main.c b/bsd-user/main.c -index b4e42f3..146f022 100644 ---- a/bsd-user/main.c -+++ b/bsd-user/main.c -@@ -642,6 +642,243 @@ void cpu_loop(CPUARMState *env) - - #endif - -+#if defined(TARGET_MIPS) || defined(TARGET_MIPS64) -+ -+/* -+ * From sys/mips/mips/trap.c syscalls have the following stored away in the -+ * registers: -+ * -+ * v0(2): if either SYS___syscall (198) or SYS_syscall (0) then indirect syscall -+ * otherwise it is a direct syscall. -+ * -+ * If direct syscall: -+ * -+ * MIPS MIPS64 -+ * v0(2): v0(2) syscall # -+ * a0(4): a0(4) arg0 -+ * a1(5): a1(5) arg1 -+ * a2(6): a2(6) arg2 -+ * a3(7): a3(7) arg3 -+ * t4(12): a4(8) arg4 -+ * t5(13): a5(9) arg5 -+ * t6(14): a6(10) arg6 -+ * t7(15): a7(11) arg7 -+ * -+ * If indirect syscall: -+ * -+ * MIPS MIPS64 -+ * a0(4): a0(4) syscall # -+ * a1(5): a1(5) arg0 -+ * a2(6): a2(6) arg1 -+ * a3(7): a3(7) arg2 -+ * t4(12): a4(8) arg3 -+ * t5(13): a5(9) arg4 -+ * t6(14): a6(10) arg5 -+ * t7(15): a7(11) arg6 -+ * -+ */ -+ -+#include <sys/syscall.h> /* For SYS_[__]syscall, SYS_MAXSYSCALL */ -+ -+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); -+} -+ -+void cpu_loop(CPUMIPSState *env) -+{ -+ target_siginfo_t info; -+ int trapnr; -+ abi_long ret; -+ unsigned int syscall_num; -+ -+ for(;;) { -+ cpu_exec_start(env); -+ trapnr = cpu_mips_exec(env); -+ cpu_exec_end(env); -+ switch(trapnr) { -+ case EXCP_SYSCALL: /* syscall exception */ -+ syscall_num = env->active_tc.gpr[2]; /* v0 */ -+ env->active_tc.PC += 4; -+ if (syscall_num >= SYS_MAXSYSCALL) { -+ ret = -TARGET_ENOSYS; -+ } else { -+ if (SYS_syscall == syscall_num || -+ SYS___syscall == syscall_num) { -+#if defined(TARGET_MIPS64) -+ ret = do_freebsd_syscall(env, -+ env->active_tc.gpr[4],/* syscall #*/ -+ env->active_tc.gpr[5], /* arg0 */ -+ env->active_tc.gpr[6], /* arg1 */ -+ env->active_tc.gpr[7], /* arg2 */ -+ env->active_tc.gpr[8], /* arg3 */ -+ env->active_tc.gpr[9], /* arg4 */ -+ env->active_tc.gpr[10],/* arg5 */ -+ env->active_tc.gpr[11],/* arg6 */ -+ 0 /* no arg 7 */); -+ } else { -+ ret = do_freebsd_syscall(env, -+ syscall_num, -+ 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] -+ ); -+ -+#else /* ! TARGET_MIPS64 */ -+ /* indirect syscall */ -+ ret = do_freebsd_syscall(env, -+ env->active_tc.gpr[4],/* syscall #*/ -+ env->active_tc.gpr[5], /* a1/arg0 */ -+ env->active_tc.gpr[6], /* a2/arg1 */ -+ env->active_tc.gpr[7], /* a3/arg2 */ -+ env->active_tc.gpr[12],/* t4/arg3 */ -+ env->active_tc.gpr[13],/* t5/arg4 */ -+ env->active_tc.gpr[14],/* t6/arg5 */ -+ env->active_tc.gpr[15],/* t7/arg6 */ -+ 0 /* no arg7 */ ); -+ } else { -+ /* direct syscall */ -+ ret = do_freebsd_syscall(env, -+ syscall_num, -+ env->active_tc.gpr[4], /* a0/arg0 */ -+ env->active_tc.gpr[5], /* a1/arg1 */ -+ env->active_tc.gpr[6], /* a2/arg2 */ -+ env->active_tc.gpr[7], /* a3/arg3 */ -+ env->active_tc.gpr[12],/* t4/arg4 */ -+ env->active_tc.gpr[13],/* t5/arg5 */ -+ env->active_tc.gpr[14],/* t6/arg6 */ -+ env->active_tc.gpr[15] /* t7/arg7 */ -+ ); -+#endif /* ! TARGET_MIPS64 */ -+ } -+ } -+/* done_syscall: */ -+ if (-TARGET_QEMU_ESIGRETURN == ret) { -+ /* -+ * Returning from a successful sigreturn -+ * syscall. Avoid clobbering register state. -+ */ -+ break; -+ } -+ if ((unsigned int)ret >= (unsigned int)(-1133)) { -+ env->active_tc.gpr[7] = 1; -+ ret = -ret; -+ } else { -+ env->active_tc.gpr[7] = 0; -+ } -+ env->active_tc.gpr[2] = ret; /* v0 <- ret */ -+ break; -+ -+ case EXCP_TLBL: /* TLB miss on load */ -+ case EXCP_TLBS: /* TLB miss on store */ -+ case EXCP_AdEL: /* bad address on load */ -+ case EXCP_AdES: /* bad address on store */ -+ info.si_signo = TARGET_SIGSEGV; -+ info.si_errno = 0; -+ /* XXX: check env->error_code */ -+ info.si_code = TARGET_SEGV_MAPERR; -+ info.si_addr = env->CP0_BadVAddr; -+ queue_signal(env, info.si_signo, &info); -+ break; -+ -+ case EXCP_CpU: /* coprocessor unusable */ -+ case EXCP_RI: /* reserved instruction */ -+ info.si_signo = TARGET_SIGILL; -+ info.si_errno = 0; -+ info.si_code = 0; -+ queue_signal(env, info.si_signo, &info); -+ break; -+ -+ case EXCP_INTERRUPT: /* async interrupt */ -+ /* just indicate that signals should be handled asap */ -+ break; -+ -+ case EXCP_DEBUG: /* cpu stopped after a breakpoint */ -+ { -+ int sig; -+ -+ sig = gdb_handlesig(env, 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.si_addr = env->active_tc.PC; -+ queue_signal(env, info.si_signo, &info); -+ } -+ break; -+ -+ default: -+ fprintf(stderr, "qemu: unhandled CPU exception " -+ "0x%x - aborting\n", trapnr); -+ cpu_dump_state(env, stderr, fprintf, 0); -+ abort(); -+ } -+ process_pending_signals(env); -+ } -+} -+#endif /* defined(TARGET_MIPS) */ -+ - #ifdef TARGET_SPARC - #define SPARC64_STACK_BIAS 2047 - -@@ -969,6 +1206,15 @@ static void usage(void) - - THREAD CPUArchState *thread_env; - -+void stop_all_tasks(void) -+{ -+ /* -+ * We trust when using NPTL (pthreads) start_exclusive() handles thread -+ * stopping correctly. -+ */ -+ start_exclusive(); -+} -+ - /* Assumes contents are already zeroed. */ - void init_task_state(TaskState *ts) - { -@@ -990,6 +1236,7 @@ int main(int argc, char **argv) - const char *log_mask = NULL; - struct target_pt_regs regs1, *regs = ®s1; - struct image_info info1, *info = &info1; -+ struct bsd_binprm bprm; - TaskState ts1, *ts = &ts1; - CPUArchState *env; - int optind; -@@ -997,7 +1244,11 @@ int main(int argc, char **argv) - int gdbstub_port = 0; - char **target_environ, **wrk; - envlist_t *envlist = NULL; -+#ifdef __FreeBSD__ -+ bsd_type = target_freebsd; -+#else - bsd_type = target_openbsd; -+#endif - - if (argc <= 1) - usage(); -@@ -1141,6 +1392,8 @@ int main(int argc, char **argv) - /* 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); - -@@ -1151,6 +1404,12 @@ int main(int argc, char **argv) - #else - cpu_model = "qemu32"; - #endif -+#elif defined(TARGET_MIPS) || defined(TARGET_MIPS64) -+#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64) -+ cpu_model = "20Kc"; -+#else -+ cpu_model = "24Kf"; -+#endif - #elif defined(TARGET_SPARC) - #ifdef TARGET_SPARC64 - cpu_model = "TI UltraSparc II"; -@@ -1211,7 +1470,8 @@ int main(int argc, char **argv) - } - #endif /* CONFIG_USE_GUEST_BASE */ - -- if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) { -+ if (loader_exec(filename, argv+optind, target_environ, regs, info, -+ &bprm)!= 0) { - printf("Error loading %s\n", filename); - _exit(1); - } -@@ -1256,6 +1516,7 @@ int main(int argc, char **argv) - memset(ts, 0, sizeof(TaskState)); - init_task_state(ts); - ts->info = info; -+ ts->bprm = &bprm; - env->opaque = ts; - - #if defined(TARGET_I386) -@@ -1394,6 +1655,20 @@ int main(int argc, char **argv) - env->regs[i] = regs->uregs[i]; - } - } -+#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; -+ } -+#if defined(TARGET_MIPS64) -+ env->hflags |= MIPS_HFLAG_UX; -+#endif -+ } - #else - #error unsupported target CPU - #endif -diff --git a/bsd-user/mips/syscall.h b/bsd-user/mips/syscall.h -new file mode 100644 -index 0000000..8923556 ---- /dev/null -+++ b/bsd-user/mips/syscall.h -@@ -0,0 +1,21 @@ -+ -+/* 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; -+}; -+ -+#define UNAME_MACHINE "mips" -diff --git a/bsd-user/mips/target_signal.h b/bsd-user/mips/target_signal.h -new file mode 100644 -index 0000000..28871c3 ---- /dev/null -+++ b/bsd-user/mips/target_signal.h -@@ -0,0 +1,14 @@ -+#ifndef TARGET_SIGNAL_H -+#define TARGET_SIGNAL_H -+ -+#include "cpu.h" -+ -+#define TARGET_MINSIGSTKSZ (512 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ -+static inline abi_ulong get_sp_from_cpustate(CPUMIPSState *state) -+{ -+ return state->active_tc.gpr[29]; -+} -+ -+#endif /* TARGET_SIGNAL_H */ -diff --git a/bsd-user/mips/target_vmparam.h b/bsd-user/mips/target_vmparam.h -new file mode 100644 -index 0000000..9fca7f3 ---- /dev/null -+++ b/bsd-user/mips/target_vmparam.h -@@ -0,0 +1,30 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+#define TARGET_VM_MINUSER_ADDRESS (0x00000000) -+#define TARGET_VM_MAXUSER_ADDRESS (0x80000000) -+ -+#define TARGET_USRSTACK (TARGET_VM_MAXUSER_ADDRESS - TARGET_PAGE_SIZE) -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+ -+#endif /* _TARGET_VMPARAM_H_ */ -diff --git a/bsd-user/mips64/syscall.h b/bsd-user/mips64/syscall.h -new file mode 100644 -index 0000000..fca3634 ---- /dev/null -+++ b/bsd-user/mips64/syscall.h -@@ -0,0 +1,21 @@ -+ -+/* this struct defines the way the registers are stored on the -+ stack during a system call. */ -+ -+struct target_pt_regs { -+ /* 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; -+}; -+ -+/* Nasty hack: define a fake errno value for use by sigreturn. */ -+#define TARGET_QEMU_ESIGRETURN 255 -+ -+#define UNAME_MACHINE "mips64" -diff --git a/bsd-user/mips64/target_signal.h b/bsd-user/mips64/target_signal.h -new file mode 100644 -index 0000000..d671f4e ---- /dev/null -+++ b/bsd-user/mips64/target_signal.h -@@ -0,0 +1,17 @@ -+#ifndef TARGET_SIGNAL_H -+#define TARGET_SIGNAL_H -+ -+#include "cpu.h" -+ -+#define TARGET_MINSIGSTKSZ (512 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+#define TARGET_SZSIGCODE 16 -+ -+#define TARGET_UCONTEXT_MAGIC 0xACEDBADE -+ -+static inline abi_ulong get_sp_from_cpustate(CPUMIPSState *state) -+{ -+ return state->active_tc.gpr[29]; -+} -+ -+#endif /* TARGET_SIGNAL_H */ -diff --git a/bsd-user/mips64/target_vmparam.h b/bsd-user/mips64/target_vmparam.h -new file mode 100644 -index 0000000..47c2267 ---- /dev/null -+++ b/bsd-user/mips64/target_vmparam.h -@@ -0,0 +1,28 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+ -+#define TARGET_VM_MINUSER_ADDRESS (0x0000000000000000UL) -+#define TARGET_VM_MAXUSER_ADDRESS (0x0000008000000000UL) -+ -+#define TARGET_USRSTACK (TARGET_VM_MAXUSER_ADDRESS - TARGET_PAGE_SIZE) -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+#endif /* _TARGET_VMPARAM_H_ */ -diff --git a/bsd-user/mmap.c b/bsd-user/mmap.c -index 5d6cffc..9f42c27 100644 ---- a/bsd-user/mmap.c -+++ b/bsd-user/mmap.c -@@ -275,7 +275,8 @@ unsigned long last_brk; - */ - /* page_init() marks pages used by the host as reserved to be sure not - to use them. */ --static abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size) -+abi_ulong -+mmap_find_vma(abi_ulong start, abi_ulong size) - { - abi_ulong addr, addr1, addr_start; - int prot; -@@ -493,7 +494,7 @@ int target_munmap(abi_ulong start, abi_ulong len) - int prot, ret; - - #ifdef DEBUG_MMAP -- printf("munmap: start=0x%lx len=0x%lx\n", start, len); -+ printf("munmap: start=0x" TARGET_FMT_lx " len=0x" TARGET_FMT_lx "\n", start, len); - #endif - if (start & ~TARGET_PAGE_MASK) - return -EINVAL; -diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h ---- a/bsd-user/qemu.h -+++ b/bsd-user/qemu.h -@@ -20,9 +20,13 @@ enum BSDType { - }; - extern enum BSDType bsd_type; - -+abi_long memcpy_to_target(abi_ulong dest, const void *src, -+ unsigned long len); -+ - #include "syscall_defs.h" - #include "syscall.h" -+#include "target_vmparam.h" - #include "target_signal.h" - #include "exec/gdbstub.h" - - #if defined(CONFIG_USE_NPTL) -@@ -61,7 +65,7 @@ struct image_info { - - struct sigqueue { - struct sigqueue *next; -- //target_siginfo_t info; -+ target_siginfo_t info; - }; - - struct emulated_sigtable { -@@ -88,6 +92,7 @@ typedef struct TaskState { - uint32_t stack_base; - #endif - struct image_info *info; -+ struct bsd_binprm *bprm; - - struct emulated_sigtable sigtab[TARGET_NSIG]; - struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */ -@@ -98,6 +103,8 @@ typedef struct TaskState { - } __attribute__((aligned(16))) TaskState; - - void init_task_state(TaskState *ts); -+void task_settid(TaskState *); -+void stop_all_tasks(void); - extern const char *qemu_uname_release; - #if defined(CONFIG_USE_GUEST_BASE) - extern unsigned long mmap_min_addr; -@@ -115,7 +122,7 @@ extern unsigned long mmap_min_addr; - * This structure is used to hold the arguments that are - * used when loading binaries. - */ --struct linux_binprm { -+struct bsd_binprm { - char buf[128]; - void *page[MAX_ARG_PAGES]; - abi_ulong p; -@@ -125,21 +132,21 @@ struct linux_binprm { - 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(const char * filename, char ** argv, char ** envp, -- struct target_pt_regs * regs, struct image_info *infop); -+ struct target_pt_regs * regs, struct image_info *infop, -+ struct bsd_binprm *); - --int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, -+int load_elf_binary(struct bsd_binprm * bprm, struct target_pt_regs * regs, - struct image_info * info); --int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, -+int load_flt_binary(struct bsd_binprm * bprm, struct target_pt_regs * regs, - 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); -@@ -184,10 +191,12 @@ 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); --long do_sigreturn(CPUArchState *env); -+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, abi_ulong uc_addr); - long do_rt_sigreturn(CPUArchState *env); - abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp); - -@@ -203,6 +212,7 @@ int target_msync(abi_ulong start, abi_ul - extern unsigned long last_brk; - void mmap_lock(void); - void mmap_unlock(void); -+abi_ulong mmap_find_vma(abi_ulong, abi_ulong); - void cpu_list_lock(void); - void cpu_list_unlock(void); - #if defined(CONFIG_USE_NPTL) -diff --git a/bsd-user/signal.c b/bsd-user/signal.c -index 445f69e..0502a6a 100644 ---- a/bsd-user/signal.c -+++ b/bsd-user/signal.c -@@ -2,6 +2,7 @@ - * Emulation of BSD signals - * - * Copyright (c) 2003 - 2008 Fabrice Bellard -+ * Copyright (c) 2012 Stacey Son - * - * 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 -@@ -23,16 +24,1218 @@ - #include <unistd.h> - #include <signal.h> - #include <errno.h> -+#include <sys/types.h> -+#include <sys/time.h> -+#include <sys/resource.h> - - #include "qemu.h" - #include "target_signal.h" - --//#define DEBUG_SIGNAL -+// #define DEBUG_SIGNAL - --void signal_init(void) -+#ifndef _NSIG -+#define _NSIG 128 -+#endif -+ -+static target_stack_t target_sigaltstack_used = { -+ .ss_sp = 0, -+ .ss_size = 0, -+ .ss_flags = TARGET_SS_DISABLE, -+}; -+ -+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, */ -+ [SIGEMT] = TARGET_SIGEMT, -+ [SIGFPE] = TARGET_SIGFPE, -+ [SIGKILL] = TARGET_SIGKILL, -+ [SIGBUS] = TARGET_SIGBUS, -+ [SIGSEGV] = TARGET_SIGSEGV, -+ [SIGSYS] = TARGET_SIGSYS, -+ [SIGPIPE] = TARGET_SIGPIPE, -+ [SIGALRM] = TARGET_SIGALRM, -+ [SIGTERM] = TARGET_SIGTERM, -+ [SIGURG] = TARGET_SIGURG, -+ [SIGSTOP] = TARGET_SIGSTOP, -+ [SIGTSTP] = TARGET_SIGTSTP, -+ [SIGCONT] = TARGET_SIGCONT, -+ [SIGCHLD] = TARGET_SIGCHLD, -+ [SIGTTIN] = TARGET_SIGTTIN, -+ [SIGTTOU] = TARGET_SIGTTOU, -+ [SIGIO] = TARGET_SIGIO, -+ [SIGXCPU] = TARGET_SIGXCPU, -+ [SIGXFSZ] = TARGET_SIGXFSZ, -+ [SIGVTALRM] = TARGET_SIGVTALRM, -+ [SIGPROF] = TARGET_SIGPROF, -+ [SIGWINCH] = TARGET_SIGWINCH, -+ [SIGINFO] = TARGET_SIGINFO, -+ [SIGUSR1] = TARGET_SIGUSR1, -+ [SIGUSR2] = TARGET_SIGUSR2, -+#ifdef SIGTHR -+ [SIGTHR] = TARGET_SIGTHR, -+#endif -+ /* [SIGLWP] = TARGET_SIGLWP, */ -+#ifdef SIGLIBRT -+ [SIGLIBRT] = TARGET_SIGLIBRT, -+#endif -+ -+ /* -+ * The following 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 manual signal delivery -+ * multiplexed over a single host signal. -+ */ -+ [SIGRTMIN] = SIGRTMAX, -+ [SIGRTMAX] = SIGRTMIN, -+}; -+ -+static uint8_t target_to_host_signal_table[_NSIG]; -+ -+static struct target_sigaction sigact_table[TARGET_NSIG]; -+ -+static void host_signal_handler(int host_signum, siginfo_t *info, void *puc); -+ -+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 >= _NSIG) -+ return (sig); -+ return (host_to_target_signal_table[sig]); -+} -+ -+int -+target_to_host_signal(int sig) -+{ -+ -+ if (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)); - } - --void process_pending_signals(CPUArchState *cpu_env) -+static inline void -+target_sigaddset(target_sigset_t *set, int signum) - { -+ signum--; -+ uint32_t mask = (uint32_t)1 << (signum % TARGET_NSIG_BPW); -+ set->__bits[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->__bits[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->__bits[i] = tswap32(d1.__bits[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.__bits[i] = tswap32(s->__bits[i]); -+ target_to_host_sigset_internal(d, &s1); -+} -+ -+/* Siginfo conversion. */ -+static inline void -+host_to_target_siginfo_noswap(target_siginfo_t *tinfo, const siginfo_t *info) -+{ -+ int sig; -+ -+ sig = host_to_target_signal(info->si_signo); -+ tinfo->si_signo = sig; -+ tinfo->si_errno = info->si_errno; -+ tinfo->si_code = info->si_code; -+ tinfo->si_pid = info->si_pid; -+ tinfo->si_uid = info->si_uid; -+ tinfo->si_addr = (abi_ulong)(unsigned long)info->si_addr; -+ /* si_value is opaque to kernel */ -+ tinfo->si_value.sival_ptr = -+ (abi_ulong)(unsigned long)info->si_value.sival_ptr; -+ if (SIGILL == sig || SIGFPE == sig || SIGSEGV == sig || -+ SIGBUS == sig || SIGTRAP == sig) { -+ tinfo->_reason._fault._trapno = info->_reason._fault._trapno; -+#ifdef SIGPOLL -+ } else if (SIGPOLL == sig) { -+ tinfo->_reason._poll._band = info->_reason._poll._band; -+#endif -+ } else { -+ tinfo->_reason._timer._timerid = info->_reason._timer._timerid; -+ tinfo->_reason._timer._overrun = info->_reason._timer._overrun; -+ } -+} -+ -+static void -+tswap_siginfo(target_siginfo_t *tinfo, const target_siginfo_t *info) -+{ -+ int sig; -+ sig = info->si_signo; -+ tinfo->si_signo = tswap32(sig); -+ tinfo->si_errno = tswap32(info->si_errno); -+ tinfo->si_code = tswap32(info->si_code); -+ tinfo->si_pid = tswap32(info->si_pid); -+ tinfo->si_uid = tswap32(info->si_uid); -+ tinfo->si_addr = tswapal(info->si_addr); -+ if (SIGILL == sig || SIGFPE == sig || SIGSEGV == sig || -+ SIGBUS == sig || SIGTRAP == sig) { -+ tinfo->_reason._fault._trapno = -+ tswap32(info->_reason._fault._trapno); -+#ifdef SIGPOLL -+ } else if (SIGPOLL == sig) { -+ tinfo->_reason._poll._band = tswap32(info->_reason._poll._band); -+#endif -+ } else { -+ tinfo->_reason._timer._timerid = -+ tswap32(info->_reason._timer._timerid); -+ tinfo->_reason._timer._overrun = -+ tswap32(info->_reason._timer._overrun); -+ } -+} -+ -+void -+host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info) -+{ -+ -+ host_to_target_siginfo_noswap(tinfo, info); -+ tswap_siginfo(tinfo, tinfo); -+} -+ -+/* 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); -+ } -+} -+ -+/* Signal queue handling. */ -+static inline struct sigqueue * -+alloc_sigqueue(CPUArchState *env) -+{ -+ TaskState *ts = env->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) -+{ -+ -+ TaskState *ts = env->opaque; -+ q->next = ts->first_free; -+ ts->first_free = q; -+} -+ -+/* Abort execution with signal. */ -+static void QEMU_NORETURN -+force_sig(int target_sig) -+{ -+ TaskState *ts = (TaskState *)thread_env->opaque; -+ int host_sig, core_dumped = 0; -+ struct sigaction act; -+ -+ host_sig = target_to_host_signal(target_sig); -+ gdb_signalled(thread_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, thread_env) == 0); -+ } -+ if (core_dumped) { -+ struct rlimit nodump; -+ -+ /* -+ * We already dumped the core of target process, we don't want -+ * a coredump of qemu itself. -+ */ -+ getrlimit(RLIMIT_CORE, &nodump); -+ nodump.rlim_cur = 0; -+ (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. -+ */ -+ memset(&act, 0, sizeof(act)); -+ sigfillset(&act.sa_mask); -+ act.sa_handler = SIG_DFL; -+ sigaction(host_sig, &act, NULL); -+ -+ 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) -+{ -+ TaskState *ts = env->opaque; -+ struct emulated_sigtable *k; -+ struct sigqueue *q, **pq; -+ abi_ulong handler; -+ int queue; -+ -+ k = &ts->sigtab[sig - 1]; -+ queue = gdb_queuesig (); -+ handler = sigact_table[sig - 1]._sa_handler; -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "queue_signal: sig=%d handler=0x%lx flags=0x%x\n", sig, -+ handler, (uint32_t)sigact_table[sig - 1].sa_flags); -+#endif -+ if (!queue && (TARGET_SIG_DFL == handler)) { -+ if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || -+ sig == TARGET_SIGTTOU) { -+ kill(getpid(), SIGSTOP); -+ return (0); -+ } else { -+ if (sig != TARGET_SIGCHLD && -+ sig != TARGET_SIGURG && -+ sig != TARGET_SIGWINCH && -+ sig != TARGET_SIGCONT) { -+ force_sig(sig); -+ } else { -+ return (0); /* The signal was ignored. */ -+ } -+ } -+ } else if (!queue && (TARGET_SIG_IGN == handler)) { -+ return (0); /* Ignored signal. */ -+ } else if (!queue && (TARGET_SIG_ERR == handler)) { -+ force_sig(sig); -+ } else { -+ pq = &k->first; -+ -+ /* -+ * FreeBSD signals are always queued. -+ * Linux only queues real time signals. -+ * XXX this code is not thread safe. -+ */ -+ 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) -+{ -+ int sig; -+ target_siginfo_t tinfo; -+ -+ /* -+ * The CPU emulator uses some host signal to detect exceptions so -+ * 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 the target signal number. */ -+ sig = host_to_target_signal(host_signum); -+ if (sig < 1 || sig > TARGET_NSIG) -+ return; -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: got signal %d\n", sig); -+#endif -+ host_to_target_siginfo_noswap(&tinfo, info); -+ if (queue_signal(thread_env, sig, &tinfo) == 1) { -+ /* Interrupt the virtual CPU as soon as possible. */ -+ cpu_exit(thread_env); -+ } -+} -+ -+/* do_sigaltstack() returns target values and errnos. */ -+/* compare to kern/kern_sig.c sys_sigaltstack() and kern_sigaltstack() */ -+abi_long -+do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp) -+{ -+ int ret = 0; -+ target_stack_t ss, oss, *uss; -+ -+ if (uoss_addr) { -+ /* Save current signal stack params */ -+ oss.ss_sp = tswapl(target_sigaltstack_used.ss_sp); -+ oss.ss_size = tswapl(target_sigaltstack_used.ss_size); -+ oss.ss_flags = tswapl(sas_ss_flags(sp)); -+ } -+ -+ if (uss_addr) { -+ -+ if (!lock_user_struct(VERIFY_READ, uss, uss_addr, 1) || -+ __get_user(ss.ss_sp, &uss->ss_sp) || -+ __get_user(ss.ss_size, &uss->ss_size) || -+ __get_user(ss.ss_flags, &uss->ss_flags)) { -+ ret = -TARGET_EFAULT; -+ goto out; -+ } -+ unlock_user_struct(uss, uss_addr, 0); -+ -+ if (on_sig_stack(sp)) { -+ ret = -TARGET_EPERM; -+ goto out; -+ } -+ -+ if ((ss.ss_flags & ~TARGET_SS_DISABLE) != 0) { -+ ret = -TARGET_EINVAL; -+ goto out; -+ } -+ -+ if (!(ss.ss_flags & ~TARGET_SS_DISABLE)) { -+ if (ss.ss_size < TARGET_MINSIGSTKSZ) { -+ ret = -TARGET_ENOMEM; -+ goto out; -+ } -+ } else { -+ ss.ss_size = 0; -+ ss.ss_sp = 0; -+ } -+ -+ target_sigaltstack_used.ss_sp = ss.ss_sp; -+ target_sigaltstack_used.ss_size = ss.ss_size; -+ } -+ -+ if (uoss_addr) { -+ /* Copy out to user saved signal stack params */ -+ if (copy_to_user(uoss_addr, &oss, sizeof(oss))) { -+ ret = -TARGET_EFAULT; -+ goto out; -+ } -+ } -+ -+out: -+ return (ret); -+} -+ -+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); -+ } -+} -+ -+/* 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 || TARGET_SIGKILL == sig || -+ TARGET_SIGSTOP == sig) -+ return (-EINVAL); -+ k = &sigact_table[sig - 1]; -+#if defined(DEBUG_SIGNAL) -+ fprintf(stderr, "do_sigaction sig=%d act=%p, oact=%p\n", -+ sig, act, oact); -+#endif -+ if (oact) { -+ oact->_sa_handler = tswapal(k->_sa_handler); -+ oact->sa_flags = tswap32(k->sa_flags); -+ oact->sa_mask = k->sa_mask; -+ } -+ if (act) { -+ /* XXX: this is most likely not threadsafe. */ -+ k->_sa_handler = tswapal(act->_sa_handler); -+ k->sa_flags = tswap32(act->sa_flags); -+ k->sa_mask = act->sa_mask; -+ -+ /* Update the host signal state. */ -+ host_sig = target_to_host_signal(sig); -+ if (host_sig != SIGSEGV && host_sig != SIGBUS) { -+ memset(&act1, 0, sizeof(struct sigaction)); -+ sigfillset(&act1.sa_mask); -+ if (k->sa_flags & TARGET_SA_RESTART) -+ act1.sa_flags |= SA_RESTART; -+ /* -+ * Note: It is important to update the host kernel -+ * signal mask to avoid getting unexpected interrupted -+ * system calls. -+ */ -+ 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_flags = SA_SIGINFO; -+ act1.sa_sigaction = host_signal_handler; -+ } -+ ret = sigaction(host_sig, &act1, NULL); -+#if defined(DEBUG_SIGNAL) -+ fprintf(stderr, "sigaction (action = %p (host_signal_handler = %p)) returned: %d\n", act1.sa_sigaction, host_signal_handler, ret); -+#endif -+ } -+ } -+ return (ret); -+} -+ -+#if defined(TARGET_MIPS64) -+static inline int -+restore_sigmcontext(CPUMIPSState *regs, target_mcontext_t *mc) -+{ -+ int i, err = 0; -+ -+ for(i = 1; i < 32; i++) -+ err |= __get_user(regs->active_tc.gpr[i], -+ &mc->mc_regs[i]); -+ err |= __get_user(regs->CP0_EPC, &mc->mc_pc); -+ err |= __get_user(regs->active_tc.LO[0], &mc->mullo); -+ err |= __get_user(regs->active_tc.HI[0], &mc->mulhi); -+ err |= __get_user(regs->tls_value, &mc->mc_tls); /* XXX thread tls */ -+ -+#if 0 /* XXX */ -+ int used_fp = 0; -+ -+ err |= __get_user(used_fp, &mc->mc_fpused); -+ conditional_used_math(used_fp); -+ -+ preempt_disabled(); -+ if (used_math()) { -+ /* restore fpu context if we have used it before */ -+ own_fpu(); -+ err |= restore_fp_context(mc); -+ } else { -+ /* signal handler may have used FPU. Give it up. */ -+ lose_fpu(); -+ } -+ preempt_enable(); -+#endif -+ -+ return (err); -+} -+ -+static inline int -+setup_sigmcontext(CPUMIPSState *regs, target_mcontext_t *mc, int32_t oonstack) -+{ -+ int i, err = 0; -+ abi_long ucontext_magic = TARGET_UCONTEXT_MAGIC; -+ -+ err = __put_user(oonstack ? 1 : 0, &mc->mc_onstack); -+ err |= __put_user(regs->active_tc.PC, &mc->mc_pc); -+ err |= __put_user(regs->active_tc.LO[0], &mc->mullo); -+ err |= __put_user(regs->active_tc.HI[0], &mc->mulhi); -+ err |= __put_user(regs->tls_value, &mc->mc_tls); /* XXX thread tls */ -+ -+ err |= __put_user(ucontext_magic, &mc->mc_regs[0]); -+ for(i = 1; i < 32; i++) -+ err |= __put_user(regs->active_tc.gpr[i], &mc->mc_regs[i]); -+ -+ err |= __put_user(0, &mc->mc_fpused); -+ -+#if 0 /* XXX */ -+ err |= __put_user(used_math(), &mc->mc_fpused); -+ if (used_math()) -+ goto out; -+ -+ /* -+ * Save FPU state to signal context. Signal handler will "inherit" -+ * current FPU state. -+ */ -+ preempt_disable(); -+ -+ if (!is_fpu_owner()) { -+ own_fpu(); -+ for(i = 0; i < 33; i++) -+ err |= __put_user(regs->active_tc.fpregs[i], &mc->mc_fpregs[i]); -+ } -+ err |= save_fp_context(fg); -+ -+ preempt_enable(); -+out: -+#endif -+ return (err); -+} -+ -+static inline abi_ulong -+get_sigframe(struct target_sigaction *ka, CPUMIPSState *regs, size_t frame_size) -+{ -+ abi_ulong sp; -+ -+ /* Use default user stack */ -+ sp = regs->active_tc.gpr[29]; -+ -+ 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); -+} -+ -+/* compare to mips/mips/pm_machdep.c sendsig() */ -+static void setup_frame(int sig, struct target_sigaction *ka, -+ target_sigset_t *set, CPUMIPSState *regs) -+{ -+ struct target_sigframe *frame; -+ abi_ulong frame_addr; -+ int i; -+ -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "setup_frame()\n"); -+#endif -+ -+ frame_addr = get_sigframe(ka, regs, sizeof(*frame)); -+ if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) -+ goto give_sigsegv; -+ -+ if (setup_sigmcontext(regs, &frame->sf_uc.uc_mcontext, -+ ! on_sig_stack(frame_addr))) -+ goto give_sigsegv; -+ -+ for(i = 0; i < TARGET_NSIG_WORDS; i++) { -+ if (__put_user(set->__bits[i], &frame->sf_uc.uc_sigmask.__bits[i])) -+ goto give_sigsegv; -+ } -+ -+ /* fill in sigframe structure */ -+ if (__put_user(sig, &frame->sf_signum)) -+ goto give_sigsegv; -+ if (__put_user(0, &frame->sf_siginfo)) -+ goto give_sigsegv; -+ if (__put_user(0, &frame->sf_ucontext)) -+ goto give_sigsegv; -+ -+ /* fill in siginfo structure */ -+ if (__put_user(sig, &frame->sf_si.si_signo)) -+ goto give_sigsegv; -+ if (__put_user(TARGET_SA_SIGINFO, &frame->sf_si.si_code)) -+ goto give_sigsegv; -+ if (__put_user(regs->CP0_BadVAddr, &frame->sf_si.si_addr)) -+ goto give_sigsegv; -+ -+ /* -+ * Arguments to signal handler: -+ * a0 ($4) = signal number -+ * a1 ($5) = siginfo pointer -+ * a2 ($6) = ucontext pointer -+ * PC = signal handler pointer -+ * t9 ($25) = signal handler pointer -+ * $29 = point to sigframe struct -+ * ra ($31) = sigtramp at base of user stack -+ */ -+ regs->active_tc.gpr[ 4] = sig; -+ regs->active_tc.gpr[ 5] = frame_addr + -+ offsetof(struct target_sigframe, sf_si); -+ regs->active_tc.gpr[ 6] = frame_addr + -+ offsetof(struct target_sigframe, sf_uc); -+ regs->active_tc.gpr[25] = regs->active_tc.PC = ka->_sa_handler; -+ regs->active_tc.gpr[29] = frame_addr; -+ regs->active_tc.gpr[31] = TARGET_PS_STRINGS - TARGET_SZSIGCODE; -+ unlock_user_struct(frame, frame_addr, 1); -+ return; -+ -+give_sigsegv: -+ unlock_user_struct(frame, frame_addr, 1); -+ force_sig(TARGET_SIGSEGV); -+} -+ -+long -+do_sigreturn(CPUMIPSState *regs, abi_ulong uc_addr) -+{ -+ target_ucontext_t *ucontext; -+ sigset_t blocked; -+ target_sigset_t target_set; -+ int i; -+ -+#if defined(DEBUG_SIGNAL) -+ fprintf(stderr, "do_sigreturn\n"); -+#endif -+ if (!lock_user_struct(VERIFY_READ, ucontext, uc_addr, 1)) -+ goto badframe; -+ -+ for(i = 0; i < TARGET_NSIG_WORDS; i++) { -+ if (__get_user(target_set.__bits[i], &ucontext->uc_sigmask.__bits[i])) -+ goto badframe; -+ } -+ -+ if (restore_sigmcontext(regs, &ucontext->uc_mcontext)) -+ goto badframe; -+ -+ target_to_host_sigset_internal(&blocked, &target_set); -+ sigprocmask(SIG_SETMASK, &blocked, NULL); -+ -+ regs->active_tc.PC = regs->CP0_EPC; -+ regs->CP0_EPC = 0; /* XXX for nested signals ? */ -+ return (-TARGET_QEMU_ESIGRETURN); -+ -+badframe: -+ force_sig(TARGET_SIGSEGV); -+ return (0); -+} -+ -+#elif defined(TARGET_SPARC64) -+ -+extern abi_ulong sparc_user_sigtramp; -+ -+#define mc_flags mc_global[0] -+#define mc_sp mc_out[6] -+#define mc_fprs mc_local[0] -+#define mc_fsr mc_local[1] -+#define mc_qsr mc_local[2] -+#define mc_tnpc mc_in[0] -+#define mc_tpc mc_in[1] -+#define mc_tstate mc_in[2] -+#define mc_y mc_in[4] -+#define mc_wstate mc_in[5] -+ -+#define ureg_i0 regwptr[0 ] -+#define ureg_i1 regwptr[1 ] -+#define ureg_i2 regwptr[2 ] -+#define ureg_i3 regwptr[3 ] -+#define ureg_i4 regwptr[4 ] -+#define ureg_i5 regwptr[5 ] -+#define ureg_i6 regwptr[6 ] -+#define ureg_i7 regwptr[7 ] -+#define ureg_l0 regwptr[8 ] -+#define ureg_l1 regwptr[9 ] -+#define ureg_l2 regwptr[10] -+#define ureg_l3 regwptr[11] -+#define ureg_l4 regwptr[12] -+#define ureg_l5 regwptr[13] -+#define ureg_l6 regwptr[14] -+#define ureg_l7 regwptr[15] -+#define ureg_o0 regwptr[16] -+#define ureg_o1 regwptr[17] -+#define ureg_o2 regwptr[18] -+#define ureg_o3 regwptr[19] -+#define ureg_o4 regwptr[20] -+#define ureg_o5 regwptr[21] -+#define ureg_o6 regwptr[22] -+#define ureg_o7 regwptr[23] -+#define ureg_fp ureg_i6 -+#define ureg_sp ureg_o6 -+#define ureg_tnpc ureg_i0 -+#define ureg_tpc ureg_i1 -+ -+#define TARGET_FPRS_FEF (1 << 2) -+#define TARGET_MC_VERSION 1L -+ -+/* compare to sparc64/sparc64/machdep.c set_mcontext() */ -+static inline int -+restore_sigmcontext(CPUSPARCState *regs, target_mcontext_t *mc) -+{ -+ int err = 0; -+ -+ err |= __get_user(regs->gregs[1], &mc->mc_global[1]); -+ err |= __get_user(regs->gregs[2], &mc->mc_global[2]); -+ err |= __get_user(regs->gregs[3], &mc->mc_global[3]); -+ err |= __get_user(regs->gregs[4], &mc->mc_global[4]); -+ err |= __get_user(regs->gregs[5], &mc->mc_global[5]); -+ err |= __get_user(regs->gregs[6], &mc->mc_global[6]); -+ -+ err |= __get_user(regs->ureg_o0, &mc->mc_out[0]); -+ err |= __get_user(regs->ureg_o1, &mc->mc_out[1]); -+ err |= __get_user(regs->ureg_o2, &mc->mc_out[2]); -+ err |= __get_user(regs->ureg_o3, &mc->mc_out[3]); -+ err |= __get_user(regs->ureg_o4, &mc->mc_out[4]); -+ err |= __get_user(regs->ureg_o5, &mc->mc_out[5]); -+ err |= __get_user(regs->ureg_o6, &mc->mc_out[6]); -+ err |= __get_user(regs->ureg_o7, &mc->mc_out[0]); -+ -+ err |= __get_user(regs->ureg_l0, &mc->mc_fprs); /* mc_local[0] */ -+ err |= __get_user(regs->ureg_l1, &mc->mc_fsr); /* mc_local[1] */ -+ err |= __get_user(regs->ureg_l2, &mc->mc_qsr); /* mc_local[2] */ -+ -+ err |= __get_user(regs->ureg_i0, &mc->mc_tnpc); /* mc_in[0] */ -+ err |= __get_user(regs->ureg_i1, &mc->mc_tpc); /* mc_in[1] */ -+ err |= __get_user(regs->ureg_i2, &mc->mc_tstate);/* mc_in[2] */ -+ -+ err |= __get_user(regs->ureg_i4, &mc->mc_y); /* mc_in[4] */ -+ -+ /* XXX -+ if ((regs->ureg_l0 & TARGET_FPRS_FEF) != 0) { -+ regs->ureg_l0 = 0; -+ for(i = 0; i < 64; i++) -+ err |= __get_user(regs->fpr[i], &mc->mc_fp[i]); -+ } -+ */ -+ -+ return (err); -+} -+ -+/* compare to sparc64/sparc64/machdep.c get_mcontext() */ -+static inline int -+setup_sigmcontext(CPUSPARCState *regs, target_mcontext_t *mc) -+{ -+ int err = 0; -+ abi_ulong ver = TARGET_MC_VERSION; -+ -+ err |= __put_user(ver, &mc->mc_flags); /* aka. mc_global[0] */ -+ err |= __put_user(regs->gregs[1], &mc->mc_global[1]); -+ err |= __put_user(regs->gregs[2], &mc->mc_global[2]); -+ err |= __put_user(regs->gregs[3], &mc->mc_global[3]); -+ err |= __put_user(regs->gregs[4], &mc->mc_global[4]); -+ err |= __put_user(regs->gregs[5], &mc->mc_global[5]); -+ err |= __put_user(regs->gregs[6], &mc->mc_global[6]); -+ /* skip %g7 since it is used as the userland TLS register */ -+ -+ err |= __put_user(regs->ureg_o0, &mc->mc_out[0]); -+ err |= __put_user(regs->ureg_o1, &mc->mc_out[1]); -+ err |= __put_user(regs->ureg_o2, &mc->mc_out[2]); -+ err |= __put_user(regs->ureg_o3, &mc->mc_out[3]); -+ err |= __put_user(regs->ureg_o4, &mc->mc_out[4]); -+ err |= __put_user(regs->ureg_o5, &mc->mc_out[5]); -+ err |= __put_user(regs->ureg_o6, &mc->mc_out[6]); -+ err |= __put_user(regs->ureg_o7, &mc->mc_out[7]); -+ -+ err |= __put_user(regs->ureg_l0, &mc->mc_fprs); /* mc_local[0] */ -+ err |= __put_user(regs->ureg_l1, &mc->mc_fsr); /* mc_local[1] */ -+ err |= __put_user(regs->ureg_l2, &mc->mc_qsr); /* mc_local[2] */ -+ -+ err |= __put_user(regs->ureg_i0, &mc->mc_tnpc); /* mc_in[0] */ -+ err |= __put_user(regs->ureg_i1, &mc->mc_tpc); /* mc_in[1] */ -+ err |= __put_user(regs->ureg_i2, &mc->mc_tstate);/* mc_in[2] */ -+ -+ err |= __put_user(regs->ureg_i4, &mc->mc_y); /* mc_in[4] */ -+ -+ /* XXX -+ if ((regs->ureg_l0 & TARGET_FPRS_FEF) != 0) { -+ for(i = 0; i < 64; i++) -+ err |= __put_user(regs->fpr[i], &mc->mc_fp[i]); -+ } -+ */ -+ -+ return (err); -+} -+ -+static inline abi_ulong -+get_sigframe(struct target_sigaction *ka, CPUSPARCState *regs, size_t frame_size) -+{ -+ abi_ulong sp; -+ -+ /* Use default user stack */ -+ sp = regs->ureg_sp; -+ -+ 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); -+} -+ -+/* compare to sparc64/sparc64/machdep.c sendsig() */ -+static void setup_frame(int sig, struct target_sigaction *ka, -+ target_sigset_t *set, CPUSPARCState *regs) -+{ -+ struct target_sigframe *frame; -+ abi_ulong frame_addr; -+ int i; -+ -+ if (!sparc_user_sigtramp) { -+ /* No signal trampoline... kill the process. */ -+ fprintf(stderr, "setup_frame(): no sigtramp\n"); -+ force_sig(TARGET_SIGKILL); -+ } -+ -+ frame_addr = get_sigframe(ka, regs, sizeof(*frame)); -+ if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) -+ goto give_sigsegv; -+ -+ if (setup_sigmcontext(regs, &frame->sf_uc.uc_mcontext)) -+ goto give_sigsegv; -+ -+ for(i = 0; i < TARGET_NSIG_WORDS; i++) { -+ if (__put_user(set->__bits[i], &frame->sf_uc.uc_sigmask.__bits[i])) -+ goto give_sigsegv; -+ } -+ -+ /* Fill in siginfo structure */ -+ if (__put_user(sig, &frame->sf_si.si_signo)) -+ goto give_sigsegv; -+ if (__put_user(TARGET_SA_SIGINFO, &frame->sf_si.si_code)) -+ goto give_sigsegv; -+ -+ /* Arguments to signal handler: -+ * -+ * o0 = signal number -+ * o1 = pointer to siginfo struct -+ * o2 = pointer to ucontext struct -+ * o3 = (not used in new style) -+ * o4 = signal handler address (called by sigtramp) -+ */ -+ regs->ureg_o0 = sig; -+ regs->ureg_o1 = frame_addr + -+ offsetof(struct target_sigframe, sf_si); -+ regs->ureg_o2 = frame_addr + -+ offsetof(struct target_sigframe, sf_uc); -+ /* env->ureg_o3 used in the Old FreeBSD-style arguments. */ -+ regs->ureg_o4 = ka->_sa_handler; -+ -+ regs->ureg_tpc = sparc_user_sigtramp; -+ regs->ureg_tnpc = (regs->ureg_tpc + 4); -+ regs->ureg_sp = frame_addr - 2047 /* SPOFF */; -+ unlock_user_struct(frame, frame_addr, 1); -+ return; -+ -+give_sigsegv: -+ unlock_user_struct(frame, frame_addr, 1); -+ force_sig(TARGET_SIGSEGV); -+} -+ -+ -+long do_sigreturn(CPUSPARCState *regs, abi_ulong uc_addr) -+{ -+ target_ucontext_t *ucontext; -+ sigset_t blocked; -+ target_sigset_t target_set; -+ int i; -+ -+#if defined(DEBUG_SIGNAL) -+ fprintf(stderr, "do_sigreturn\n"); -+#endif -+ if (!lock_user_struct(VERIFY_READ, ucontext, uc_addr, 1)) -+ goto badframe; -+ -+ for(i = 0; i < TARGET_NSIG_WORDS; i++) { -+ if (__get_user(target_set.__bits[i], &ucontext->uc_sigmask.__bits[i])) -+ goto badframe; -+ } -+ -+ if (restore_sigmcontext(regs, &ucontext->uc_mcontext)) -+ goto badframe; -+ -+ target_to_host_sigset_internal(&blocked, &target_set); -+ sigprocmask(SIG_SETMASK, &blocked, NULL); -+ -+ return (-TARGET_QEMU_ESIGRETURN); -+ -+badframe: -+ force_sig(TARGET_SIGSEGV); -+ return (0); -+} -+ -+#else -+ -+static void -+setup_frame(int sig, struct target_sigaction *ka, target_sigset_t *set, -+ CPUArchState *env) -+{ -+ fprintf(stderr, "setup_frame: not implemented\n"); -+} -+ -+#if 0 -+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"); -+} -+#endif -+ -+long -+do_sigreturn(CPUArchState *env, abi_ulong uc_addr) -+{ -+ 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 -+signal_init(void) -+{ -+ struct sigaction act; -+ struct sigaction oact; -+ int i, j; -+ int host_sig; -+ -+ /* Generate the 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_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); -+ } -+ } -+} -+ -+void -+process_pending_signals(CPUArchState *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_env->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++; -+ } -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: process_pending_signals has no signals\n"); -+#endif -+ /* If no signal is pending then just return. */ -+ ts->signal_pending = 0; -+ return; -+ -+handle_signal: -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: process signal %d\n", sig); -+#endif -+ -+ /* Dequeue signal. */ -+ q = k->first; -+ k->first = q->next; -+ if (!k->first) -+ k->pending = 0; -+ -+ sig = gdb_handlesig (cpu_env, sig); -+ if (!sig) { -+ sa = NULL; -+ handler = TARGET_SIG_IGN; -+ } else { -+ sa = &sigact_table[sig - 1]; -+ handler = sa->_sa_handler; -+ } -+ -+ if (handler == TARGET_SIG_DFL) { -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: TARGET_SIG_DFL\n"); -+#endif -+ /* -+ * default handler : ignore some signal. The other are job -+ * control or fatal. -+ */ -+ if (TARGET_SIGTSTP == sig || TARGET_SIGTTIN == sig || -+ TARGET_SIGTTOU == sig) { -+ kill(getpid(),SIGSTOP); -+ } else if (TARGET_SIGCHLD != sig && TARGET_SIGURG != sig && -+ TARGET_SIGWINCH != sig && TARGET_SIGCONT != sig) { -+ force_sig(sig); -+ } -+ } else if (TARGET_SIG_IGN == handler) { -+ /* ignore sig */ -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: TARGET_SIG_IGN\n"); -+#endif -+ } else if (TARGET_SIG_ERR == handler) { -+#ifdef DEBUG_SIGNAL -+ fprintf(stderr, "qemu: TARGET_SIG_ERR\n"); -+#endif -+ 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 */ -+ 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 0 -+#if defined(TARGET_I386) && !defined(TARGET_X86_64) -+ /* if the CPU is in VM86 mode, we restore the 32 bit values */ -+ { -+ CPUX86State *env = cpu_env; -+ if (env->eflags & VM_MASK) -+ save_v86_state(env); -+ } -+#endif -+#endif -+ /* prepare the stack frame of the virtual CPU */ -+#if 0 /* XXX no rt for fbsd */ -+ if (sa->sa_flags & TARGET_SA_SIGINFO) -+ setup_rt_frame(sig, sa, &q->info, &target_old_set, -+ cpu_env); -+ else -+#endif -+ setup_frame(sig, sa, &target_old_set, cpu_env); -+ 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/bsd-user/socket.h b/bsd-user/socket.h -new file mode 100644 -index 0000000..c9e019b ---- /dev/null -+++ b/bsd-user/socket.h -@@ -0,0 +1,66 @@ -+/* -+ * Target socket definitions. -+ */ -+ -+/* -+ * Types -+ */ -+#define TARGET_SOCK_STREAM 1 /* stream socket */ -+#define TARGET_SOCK_DGRAM 2 /* datagram socket */ -+#define TARGET_SOCK_RAW 3 /* raw-protocol interface */ -+#define TARGET_SOCK_RDM 4 /* reliably-delivered message */ -+#define TARGET_SOCK_SEQPACKET 5 /* sequenced packet stream */ -+ -+ -+/* -+ * Option flags per-socket. -+ */ -+ -+#define TARGET_SO_DEBUG 0x0001 /* turn on debugging info recording */ -+#define TARGET_SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -+#define TARGET_SO_REUSEADDR 0x0004 /* allow local address reuse */ -+#define TARGET_SO_KEEPALIVE 0x0008 /* keep connections alive */ -+#define TARGET_SO_DONTROUTE 0x0010 /* just use interface addresses */ -+#define TARGET_SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ -+#define TARGET_SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ -+#define TARGET_SO_LINGER 0x0080 /* linger on close if data present */ -+#define TARGET_SO_OOBINLINE 0x0100 /* leave received OOB data in line */ -+#define TARGET_SO_REUSEPORT 0x0200 /* allow local address & port reuse */ -+#define TARGET_SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ -+#define TARGET_SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ -+#define TARGET_SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ -+#define TARGET_SO_BINTIME 0x2000 /* timestamp received dgram traffic */ -+#define TARGET_SO_NO_OFFLOAD 0x4000 /* socket cannot be offloaded */ -+#define TARGET_SO_NO_DDP 0x8000 /* disable direct data placement */ -+ -+/* -+ * Additional options, not kept in so_options. -+ */ -+#define TARGET_SO_SNDBUF 0x1001 /* send buffer size */ -+#define TARGET_SO_RCVBUF 0x1002 /* receive buffer size */ -+#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_ERROR 0x1007 /* get error status and clear */ -+#define TARGET_SO_TYPE 0x1008 /* get socket type */ -+#define TARGET_SO_LABEL 0x1009 /* socket's MAC label */ -+#define TARGET_SO_PEERLABEL 0x1010 /* socket's peer's MAC label */ -+#define TARGET_SO_LISTENQLIMIT 0x1011 /* socket's backlog limit */ -+#define TARGET_SO_LISTENQLEN 0x1012 /* socket's complete queue length */ -+#define TARGET_SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */ -+#define TARGET_SO_SETFIB 0x1014 /* use this FIB to route */ -+#define TARGET_SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ -+#define TARGET_SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */ -+ -+/* alias for SO_PROTOCOL (SunOS name) */ -+#define TARGET_SO_PROTOTYPE TARGET_SO_PROTOCOL -+ -+/* -+ * Level number for (get/set)sockopt() to apply to socket itself. -+ */ -+#define TARGET_SOL_SOCKET 0xffff /* options for socket level */ -+ -+#ifndef CMSG_ALIGN -+#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) ) -+#endif -diff --git a/bsd-user/sparc/target_signal.h b/bsd-user/sparc/target_signal.h -index 5b2abba..79dfc1e 100644 ---- a/bsd-user/sparc/target_signal.h -+++ b/bsd-user/sparc/target_signal.h -@@ -3,15 +3,6 @@ - - #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; -- -- - #ifndef UREG_I6 - #define UREG_I6 6 - #endif -@@ -19,6 +10,9 @@ typedef struct target_sigaltstack { - #define UREG_FP UREG_I6 - #endif - -+#define TARGET_MINSIGSTKSZ (512 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ - static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state) - { - return state->regwptr[UREG_FP]; -diff --git a/bsd-user/sparc/target_vmparam.h b/bsd-user/sparc/target_vmparam.h -new file mode 100644 -index 0000000..9494c46 ---- /dev/null -+++ b/bsd-user/sparc/target_vmparam.h -@@ -0,0 +1,23 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#define TARGET_USRSTACK 0 -+ -+#ifdef __FreeBSD__ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+#endif /* __FreeBSD__ */ -+ -+#endif /* _TARGET_VMPARAM_H_ */ -+ -diff --git a/bsd-user/sparc64/target_signal.h b/bsd-user/sparc64/target_signal.h -index 5b2abba..d3e58bb 100644 ---- a/bsd-user/sparc64/target_signal.h -+++ b/bsd-user/sparc64/target_signal.h -@@ -3,15 +3,6 @@ - - #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; -- -- - #ifndef UREG_I6 - #define UREG_I6 6 - #endif -@@ -19,6 +10,9 @@ typedef struct target_sigaltstack { - #define UREG_FP UREG_I6 - #endif - -+#define TARGET_MINSIGSTKSZ (1024 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ - static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state) - { - return state->regwptr[UREG_FP]; -diff --git a/bsd-user/sparc64/target_vmparam.h b/bsd-user/sparc64/target_vmparam.h -new file mode 100644 -index 0000000..12af063 ---- /dev/null -+++ b/bsd-user/sparc64/target_vmparam.h -@@ -0,0 +1,30 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+#define TARGET_VM_MINUSER_ADDRESS (0x0000000000000000UL) -+#define TARGET_VM_MAXUSER_ADDRESS (0x000007fe00000000UL) -+ -+#define TARGET_USRSTACK TARGET_VM_MAXUSER_ADDRESS -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+#endif /* _TARGET_VMPARAM_H_ */ -+ -diff --git a/bsd-user/syscall.c b/bsd-user/syscall.c -index 443b01a..c627c62 100644 ---- a/bsd-user/syscall.c -+++ b/bsd-user/syscall.c -@@ -2,6 +2,7 @@ - * BSD syscalls - * - * Copyright (c) 2003 - 2008 Fabrice Bellard -+ * Copyright (c) 2012 Stacey Son <sson@FreeBSD.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 -@@ -21,18 +22,37 @@ - #include <stdint.h> - #include <stdarg.h> - #include <string.h> -+#include <dirent.h> - #include <errno.h> - #include <unistd.h> - #include <fcntl.h> - #include <time.h> - #include <limits.h> -+#include <poll.h> - #include <sys/types.h> -+#include <sys/time.h> - #include <sys/mman.h> - #include <sys/syscall.h> - #include <sys/param.h> -+#include <sys/resource.h> - #include <sys/sysctl.h> -+#include <sys/event.h> -+#include <sys/mount.h> -+#include <sys/wait.h> -+#include <sys/socket.h> -+#ifdef __FreeBSD__ -+#include <sys/regression.h> -+#include <sys/procdesc.h> -+#endif -+#include <sys/un.h> -+#include <sys/ipc.h> -+#include <sys/sem.h> -+#include <sys/shm.h> -+#include <sys/msg.h> - #include <utime.h> - -+#include <netinet/in.h> -+ - #include "qemu.h" - #include "qemu-common.h" - -@@ -50,6 +70,13 @@ static inline abi_long get_errno(abi_long ret) - return ret; - } - -+static inline int -+host_to_target_errno(int err) -+{ -+ /* XXX need to translate host errnos here */ -+ return (err); -+} -+ - #define target_to_host_bitmask(x, tbl) (x) - - static inline int is_error(abi_long ret) -@@ -152,13 +179,65 @@ static abi_long do_freebsd_sysarch(CPUX86State *env, int op, abi_ulong parms) - #endif - - #ifdef TARGET_SPARC -+struct target_sparc_sigtramp_install_args { -+ abi_ulong sia_new; /* address of sigtramp code */ -+ abi_ulong sia_old; /* user address to store old sigtramp addr */ -+}; -+ -+abi_ulong sparc_user_sigtramp = 0; -+ - static abi_long do_freebsd_sysarch(void *env, int op, abi_ulong parms) - { -- /* XXX handle -- * TARGET_FREEBSD_SPARC_UTRAP_INSTALL, -- * TARGET_FREEBSD_SPARC_SIGTRAMP_INSTALL -- */ -- return -TARGET_EINVAL; -+ int ret = 0; -+ abi_ulong val, old; -+ /* -+ struct target_sparc_sigtramp_install_args *target_sigtramp_args; -+ */ -+ -+ -+ switch(op) { -+ case TARGET_SPARC_SIGTRAMP_INSTALL: -+ { -+ -+#if 0 -+ /* Sparc userland is giving us a new sigtramp code ptr. */ -+ if (!(target_sigtramp_args = lock_user(VERIFY_WRITE, parms, -+ sizeof(*target_sigtramp_args), 1))) { -+ ret = -TARGET_EFAULT; -+ } else { -+ if (target_sigtramp_args->sia_old) { -+ put_user_ual(sparc_user_sigtramp, -+ target_sigtramp_args->sia_old); -+ } -+ sparc_user_sigtramp = target_sigtramp_args->sia_new; -+ unlock_user(target_sigtramp_args, parms, 0); -+ -+ } -+#endif -+ val = sparc_user_sigtramp; -+ if (get_user(sparc_user_sigtramp, parms, abi_ulong)) { -+ return (-TARGET_EFAULT); -+ } -+ parms += sizeof(abi_ulong); -+ if (get_user(old, parms, abi_ulong)) { -+ return (-TARGET_EFAULT); -+ } -+ if (old) { -+ if (put_user(val, old, abi_ulong)) { -+ return (-TARGET_EFAULT); -+ } -+ } -+ } -+ break; -+ -+ case TARGET_SPARC_UTRAP_INSTALL: -+ /* XXX not currently handled */ -+ default: -+ ret = -TARGET_EINVAL; -+ break; -+ } -+ -+ return (ret); - } - #endif - -@@ -168,7 +247,17 @@ static abi_long do_freebsd_sysarch(void *env, int op, abi_ulong parms) - return -TARGET_EINVAL; - } - #endif -+ -+#ifdef TARGET_MIPS -+static abi_long do_freebsd_sysarch(void *env, int op, abi_ulong parms) -+{ -+ return -TARGET_EINVAL; -+} -+#endif -+ - #ifdef __FreeBSD__ -+extern int _getlogin(char *, int); -+ - /* - * XXX this uses the undocumented oidfmt interface to find the kind of - * a requested sysctl, see /sys/kern/kern_sysctl.c:sysctl_sysctl_oidfmt() -@@ -327,92 +416,3799 @@ static abi_long unlock_iovec(struct iovec *vec, abi_ulong target_addr, - return 0; - } - --/* 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_freebsd_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) -+static inline abi_long -+target_to_host_sockaddr(struct sockaddr *addr, abi_ulong target_addr, -+ socklen_t len) - { -- abi_long ret; -- void *p; -+ const socklen_t unix_maxlen = sizeof (struct sockaddr_un); -+ sa_family_t sa_family; -+ struct target_sockaddr *target_saddr; - --#ifdef DEBUG -- gemu_log("freebsd syscall %d\n", num); --#endif -- if(do_strace) -- print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); -+ target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); -+ if (!target_saddr) -+ return -TARGET_EFAULT; - -- switch(num) { -- case TARGET_FREEBSD_NR_exit: --#ifdef TARGET_GPROF -- _mcleanup(); -+ 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 will -+ * fix that here if needed. -+ */ -+ 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; -+ 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; -+ 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); -+ 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); -+ gemu_log("Host cmsg overflow\n"); -+ break; -+ } -+ 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 != TARGET_SOL_SOCKET || -+ cmsg->cmsg_type != SCM_RIGHTS) { -+ gemu_log("Unsupported ancillary data: %d/%d\n", -+ cmsg->cmsg_level, cmsg->cmsg_type); -+ memcpy(data, target_data, len); -+ } else { -+ int *fd = (int *)data; -+ int *target_fd = (int *)target_data; -+ int i, numfds = len / sizeof(int); -+ -+ for (i = 0; i < numfds; i++) -+ fd[i] = tswap32(target_fd[i]); -+ } -+ cmsg = CMSG_NXTHDR(msgh, cmsg); -+ target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg); -+ } -+ 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; -+ 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); -+ 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)); -+ -+ space += TARGET_CMSG_SPACE(len); -+ if (space > msg_controllen) { -+ space -= TARGET_CMSG_SPACE(len); -+ gemu_log("Target cmsg overflow\n"); -+ break; -+ } -+ target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level); -+ target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type); -+ target_cmsg->cmsg_len = tswapal(TARGET_CMSG_LEN(len)); -+ if ((cmsg->cmsg_level == TARGET_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++) -+ target_fd[i] = tswap32(fd[i]); -+ } else if ((cmsg->cmsg_level == TARGET_SOL_SOCKET) && -+ (cmsg->cmsg_type == SO_TIMESTAMP) && -+ (len == sizeof(struct timeval))) { -+ /* copy struct timeval to target */ -+ struct timeval *tv = (struct timeval *)data; -+ struct target_timeval *target_tv = -+ (struct target_timeval *)target_data; -+ target_tv->tv_sec = tswapal(tv->tv_sec); -+ target_tv->tv_usec = tswapal(tv->tv_usec); -+ } else { -+ gemu_log("Unsupported ancillary data: %d/%d\n", -+ cmsg->cmsg_level, cmsg->cmsg_type); -+ memcpy(target_data, data, len); -+ } -+ cmsg = CMSG_NXTHDR(msgh, cmsg); -+ target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg); -+ } -+ unlock_user(target_cmsg, target_cmsg_addr, space); -+ -+the_end: -+ target_msgh->msg_controllen = tswapal(space); -+ 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_MEMLOCK: -+ return RLIMIT_MEMLOCK; -+ -+ case TARGET_RLIMIT_NOFILE: -+ return RLIMIT_NOFILE; -+ -+ case TARGET_RLIMIT_NPROC: -+ return RLIMIT_NPROC; -+ -+ case TARGET_RLIMIT_RSS: -+ return RLIMIT_RSS; -+ -+ case TARGET_RLIMIT_SBSIZE: -+ return RLIMIT_SBSIZE; -+ -+ case TARGET_RLIMIT_STACK: -+ return RLIMIT_STACK; -+ -+ case TARGET_RLIMIT_SWAP: -+ return RLIMIT_SWAP; -+ -+ case TARGET_RLIMIT_NPTS: -+ return RLIMIT_NPTS; -+ -+ default: -+ return (code); -+ } -+} -+ -+static int -+target_to_host_fcntl_cmd(int cmd) -+{ -+ -+ switch(cmd) { -+ case TARGET_F_DUPFD: -+ return F_DUPFD; -+ -+ case TARGET_F_DUP2FD: -+ return F_DUP2FD; -+ -+ case TARGET_F_GETFD: -+ return F_GETFD; -+ -+ case TARGET_F_SETFD: -+ return F_SETFD; -+ -+ case TARGET_F_GETFL: -+ return F_GETFL; -+ -+ case TARGET_F_SETFL: -+ return F_SETFL; -+ -+ case TARGET_F_GETOWN: -+ return F_GETOWN; -+ -+ case TARGET_F_SETOWN: -+ return F_SETOWN; -+ -+ case TARGET_F_GETLK: -+ return F_GETLK; -+ -+ case TARGET_F_SETLK: -+ return F_SETLK; -+ -+ case TARGET_F_SETLKW: -+ return F_SETLKW; -+ -+ case TARGET_F_READAHEAD: -+ return F_READAHEAD; -+ -+ case TARGET_F_RDAHEAD: -+ return F_RDAHEAD; -+ -+ default: -+ return (cmd); -+ } -+} -+ -+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); -+} -+ -+/* -+ * Map host to target signal numbers for the wait family of syscalls. -+ * Assume all other status bits are the same. -+ */ -+static 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 inline abi_long -+copy_from_user_timeval(struct timeval *tv, abi_ulong target_tv_addr) -+{ -+ struct target_freebsd_timeval *target_tv; -+ -+ if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 0)) -+ 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, 1); -+ return (0); -+} -+ -+static inline abi_long -+target_to_host_timespec(struct timespec *ts, abi_ulong target_ts_addr) -+{ -+ struct target_freebsd_timespec *target_ts; -+ -+ if (!lock_user_struct(VERIFY_READ, target_ts, target_ts_addr, 0)) -+ return -TARGET_EFAULT; -+ __get_user(ts->tv_sec, &target_ts->tv_sec); -+ __get_user(ts->tv_nsec, &target_ts->tv_nsec); -+ unlock_user_struct(target_ts, target_ts_addr, 1); -+ return (0); -+} -+ -+static inline abi_long -+fbsd_copy_to_user_timeval(struct timeval *tv, abi_ulong target_tv_addr) -+{ -+ struct target_freebsd_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 -+host_to_target_timespec(abi_ulong target_ts_addr, struct timespec *ts) -+{ -+ struct target_freebsd_timespec *target_ts; -+ -+ if (!lock_user_struct(VERIFY_WRITE, target_ts, target_ts_addr, 0)) -+ return -TARGET_EFAULT; -+ __put_user(ts->tv_sec, &target_ts->tv_sec); -+ __put_user(ts->tv_nsec, &target_ts->tv_nsec); -+ unlock_user_struct(target_ts, target_ts_addr, 1); -+ return (0); -+} -+static inline abi_ulong -+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 |= ((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 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 -- gdb_exit(cpu_env, arg1); -- /* XXX: should free thread stack and CPU env */ -- _exit(arg1); -- ret = 0; /* avoid warning */ -- break; -- case TARGET_FREEBSD_NR_read: -- if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) -- goto efault; -- ret = get_errno(read(arg1, p, arg3)); -- unlock_user(p, arg2, ret); -- break; -- case TARGET_FREEBSD_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; -- case TARGET_FREEBSD_NR_writev: -- { -- int count = arg3; -- struct iovec *vec; -+} -+#else /* TARGET_ABI_BITS != 32 */ -+static inline uint64_t -+target_offset64(uint64_t word0, uint64_t word1) -+{ -+ return (word0); -+} -+#endif /* TARGET_ABI_BITS != 32 */ - -- vec = alloca(count * sizeof(struct iovec)); -- if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0) -- goto efault; -- ret = get_errno(writev(arg1, vec, count)); -- unlock_iovec(vec, arg2, count, 0); -- } -- break; -- case TARGET_FREEBSD_NR_open: -- if (!(p = lock_user_string(arg1))) -- goto efault; -- ret = get_errno(open(path(p), -- target_to_host_bitmask(arg2, fcntl_flags_tbl), -- arg3)); -- unlock_user(p, arg1, 0); -- break; -- case TARGET_FREEBSD_NR_mmap: -- ret = get_errno(target_mmap(arg1, arg2, arg3, -- target_to_host_bitmask(arg4, mmap_flags_tbl), -- arg5, -- arg6)); -- break; -- case TARGET_FREEBSD_NR_munmap: -- ret = get_errno(target_munmap(arg1, arg2)); -- break; -- case TARGET_FREEBSD_NR_mprotect: -- ret = get_errno(target_mprotect(arg1, arg2, arg3)); -- break; -- case TARGET_FREEBSD_NR_break: -- ret = do_obreak(arg1); -- break; --#ifdef __FreeBSD__ -- case TARGET_FREEBSD_NR___sysctl: -- ret = do_freebsd_sysctl(arg1, arg2, arg3, arg4, arg5, arg6); -- break; -+/* ARM EABI and MIPS expect 64bit types aligned even on pairs of registers */ -+#ifdef TARGET_ARM -+static inline int -+regpairs_aligned(void *cpu_env) { -+ -+ return ((((CPUARMState *)cpu_env)->eabi) == 1); -+} -+#elif defined(TARGET_MIPS) && TARGET_ABI_BITS == 32 -+static inline int -+regpairs_aligned(void *cpu_env) { return 1; } -+#else -+static inline int -+regpairs_aligned(void *cpu_env) { return 0; } - #endif -- case TARGET_FREEBSD_NR_sysarch: -- ret = do_freebsd_sysarch(cpu_env, arg1, arg2); -- break; -- case TARGET_FREEBSD_NR_syscall: -- case TARGET_FREEBSD_NR___syscall: -- ret = do_freebsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,arg7,arg8,0); -- break; -+ -+static inline abi_long -+unimplemented(int num) -+{ -+ -+ qemu_log("qemu: Unsupported syscall: %d\n", num); -+ return (-TARGET_ENOSYS); -+} -+ -+/* do_bind() must return target values and target errnos. */ -+static abi_long -+do_bind(int sockfd, abi_ulong target_addr, socklen_t addrlen) -+{ -+ abi_long ret; -+ void *addr; -+ -+ if ((int)addrlen < 0) -+ return (-TARGET_EINVAL); -+ -+ addr = alloca(addrlen + 1); -+ ret = target_to_host_sockaddr(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) -+{ -+ abi_long ret; -+ void *addr; -+ -+ if ((int)addrlen < 0) -+ return (-TARGET_EINVAL); -+ -+ addr = alloca(addrlen); -+ -+ ret = target_to_host_sockaddr(addr, target_addr, addrlen); -+ -+ if (ret) -+ return (ret); -+ -+ return (get_errno(connect(sockfd, addr, addrlen))); -+} -+ -+/* do_sendrecvmsg() must return target values and target errnos. */ -+static abi_long -+do_sendrecvmsg(int fd, abi_ulong target_msg, int flags, int send) -+{ -+ abi_long ret, len; -+ struct target_msghdr *msgp; -+ struct msghdr msg; -+ int count; -+ struct iovec *vec; -+ abi_ulong target_vec; -+ -+ if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE, msgp, -+ target_msg, send ? 1 : 0)) -+ return (-TARGET_EFAULT); -+ if (msgp->msg_name) { -+ msg.msg_namelen = tswap32(msgp->msg_namelen); -+ msg.msg_name = alloca(msg.msg_namelen); -+ ret = target_to_host_sockaddr(msg.msg_name, -+ tswapal(msgp->msg_name), msg.msg_namelen); -+ -+ if (ret) { -+ unlock_user_struct(msgp, target_msg, send ? 0 : 1); -+ return (ret); -+ } -+ } 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); -+ vec = alloca(count * sizeof(struct iovec)); -+ target_vec = tswapal(msgp->msg_iov); -+ lock_iovec(send ? VERIFY_READ : VERIFY_WRITE, vec, target_vec, count, -+ send); -+ msg.msg_iovlen = count; -+ msg.msg_iov = vec; -+ -+ if (send) { -+ ret = target_to_host_cmsg(&msg, msgp); -+ if (0 == ret) -+ 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); -+ unlock_user_struct(msgp, target_msg, send ? 0 : 1); -+ return (ret); -+} -+ -+/* do_accept() must return target values and target errnos. */ -+static abi_long -+do_accept(int fd, abi_ulong target_addr, abi_ulong target_addrlen_addr) -+{ -+ socklen_t addrlen; -+ void *addr; -+ abi_long ret; -+ -+ if (target_addr == 0) -+ return get_errno(accept(fd, NULL, NULL)); -+ -+ /* return 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(accept(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_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; -+ -+ 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); -+ ret = target_to_host_sockaddr(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); -+} -+ -+/* do_freebsd_select() must return target values and target errnos. */ -+static abi_long -+do_freebsd_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; -+ -+ if ((ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n)) != 0) -+ return (ret); -+ if ((ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n)) != 0) -+ return (ret); -+ if ((ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n)) != 0) -+ 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 && -+ fbsd_copy_to_user_timeval(&tv, target_tv_addr)) -+ return (-TARGET_EFAULT); -+ } -+ -+ return (ret); -+} -+ -+/* do_freebsd_pselect() must return target values and target errnos. */ -+static abi_long -+do_freebsd_pselect(int n, abi_ulong rfd_addr, abi_ulong wfd_addr, -+ abi_ulong efd_addr, abi_ulong ts_addr, abi_ulong set_addr) -+{ -+ fd_set rfds, wfds, efds; -+ fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; -+ sigset_t set, *set_ptr; -+ struct timespec ts, *ts_ptr; -+ void *p; -+ 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); -+ -+ /* Unlike select(), pselect() uses struct timespec instead of timeval */ -+ if (ts_addr) { -+ if (target_to_host_timespec(&ts, ts_addr)) -+ return (-TARGET_EFAULT); -+ ts_ptr = &ts; -+ } else { -+ ts_ptr = NULL; -+ } -+ -+ if (set_addr) { -+ if (!(p = lock_user(VERIFY_READ, set_addr, -+ sizeof(target_sigset_t), 1))) -+ return (-TARGET_EFAULT); -+ target_to_host_sigset(&set, p); -+ unlock_user(p, set_addr, 0); -+ set_ptr = &set; -+ } else { -+ set_ptr = NULL; -+ } -+ -+ ret = get_errno(pselect(n, rfds_ptr, wfds_ptr, efds_ptr, ts_ptr, -+ set_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 (ts_addr && host_to_target_timespec(ts_addr, &ts)) -+ return (-TARGET_EFAULT); -+ } -+ -+ 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_ACCEPTFILTER: -+ goto unimplemented; -+ -+ /* 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_REUSEPORT: -+ optname = SO_REUSEPORT; -+ 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_TIMESTAMP: -+ optname = SO_TIMESTAMP; -+ goto int_case; -+ -+ case TARGET_SO_RCVLOWAT: -+ optname = SO_RCVLOWAT; -+ goto int_case; -+ -+ case TARGET_SO_LISTENINCQLEN: -+ optname = SO_LISTENINCQLEN; -+ goto int_case; -+ -+ default: -+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 (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; -+ -+ } -+ break; -+ -+ default: -+unimplemented: -+ gemu_log("getsockopt level=%d optname=%d not yet supported\n", -+ level, optname); -+ ret = -TARGET_EOPNOTSUPP; -+ break; -+ } -+ return (ret); -+} -+ -+/* 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) -+{ -+ int val; -+ abi_long ret; -+ -+ switch(level) { -+ case TARGET_SOL_SOCKET: -+ switch (optname) { -+ /* Options with 'int' argument. */ -+ case TARGET_SO_DEBUG: -+ optname = SO_DEBUG; -+ break; -+ -+ case TARGET_SO_REUSEADDR: -+ optname = SO_REUSEADDR; -+ break; -+ -+ case TARGET_SO_REUSEPORT: -+ optname = SO_REUSEADDR; -+ break; -+ -+ case TARGET_SO_KEEPALIVE: -+ optname = SO_KEEPALIVE; -+ break; -+ -+ case TARGET_SO_DONTROUTE: -+ optname = SO_DONTROUTE; -+ break; -+ -+ case TARGET_SO_LINGER: -+ optname = SO_LINGER; -+ break; -+ -+ case TARGET_SO_BROADCAST: -+ optname = SO_BROADCAST; -+ break; -+ -+ case TARGET_SO_OOBINLINE: -+ optname = SO_OOBINLINE; -+ break; -+ -+ case TARGET_SO_SNDBUF: -+ optname = SO_SNDBUF; -+ break; -+ -+ case TARGET_SO_RCVBUF: -+ optname = SO_RCVBUF; -+ break; -+ -+ case TARGET_SO_SNDLOWAT: -+ optname = SO_RCVLOWAT; -+ break; -+ -+ case TARGET_SO_RCVLOWAT: -+ optname = SO_RCVLOWAT; -+ break; -+ -+ case TARGET_SO_SNDTIMEO: -+ optname = SO_SNDTIMEO; -+ break; -+ -+ case TARGET_SO_RCVTIMEO: -+ optname = SO_RCVTIMEO; -+ break; -+ -+ case TARGET_SO_ACCEPTFILTER: -+ goto unimplemented; -+ -+ case TARGET_SO_NOSIGPIPE: -+ optname = SO_NOSIGPIPE; -+ break; -+ -+ case TARGET_SO_TIMESTAMP: -+ optname = SO_TIMESTAMP; -+ break; -+ -+ case TARGET_SO_BINTIME: -+ optname = SO_BINTIME; -+ break; -+ -+ case TARGET_SO_ERROR: -+ optname = SO_ERROR; -+ break; -+ -+ case TARGET_SO_SETFIB: -+ optname = SO_ERROR; -+ break; -+ -+ case TARGET_SO_USER_COOKIE: -+ optname = SO_USER_COOKIE; -+ 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); -+} -+ -+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 semop(semid, sops, nsops); -+} -+ -+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 = malloc(nsems * sizeof(unsigned short)); -+ array = lock_user(VERIFY_READ, target_addr, -+ nsems*sizeof(unsigned short), 1); -+ if (!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]); -+ } -+ free(*host_array); -+ unlock_user(array, target_addr, 1); -+ -+ return (0); -+} -+ -+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->cuid = tswapal(target_ip->cuid); -+ host_ip->cgid = tswapal(target_ip->cgid); -+ host_ip->uid = tswapal(target_ip->uid); -+ host_ip->gid = tswapal(target_ip->gid); -+ host_ip->mode = tswap16(target_ip->mode); -+ host_ip->seq = tswap16(target_ip->seq); -+ host_ip->key = tswapal(target_ip->key); -+ 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->cuid = tswapal(host_ip->cuid); -+ target_ip->cgid = tswapal(host_ip->cgid); -+ target_ip->uid = tswapal(host_ip->uid); -+ target_ip->gid = tswapal(host_ip->gid); -+ target_ip->mode = tswap16(host_ip->mode); -+ target_ip->seq = tswap16(host_ip->seq); -+ target_ip->key = tswapal(host_ip->key); -+ 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); -+ /* sem_base is not used by kernel for IPC_STAT/IPC_SET */ -+ host_sd->sem_base = NULL; -+ 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); -+ /* sem_base is not used by kernel for IPC_STAT/IPC_SET */ -+ 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); -+} -+ -+static inline abi_long -+do_semctl(int semid, int semnum, int cmd, union target_semun target_su) -+{ -+ union semun arg; -+ struct semid_ds dsarg; -+ unsigned short *array = NULL; -+ abi_long ret = -TARGET_EINVAL; -+ abi_long err; -+ -+ cmd &= 0xff; -+ -+ switch( cmd ) { -+ case GETVAL: -+ case SETVAL: -+ arg.val = tswap32(target_su.val); -+ ret = get_errno(semctl(semid, semnum, cmd, arg)); -+ target_su.val = tswap32(arg.val); -+ 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: -+ 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_RMID: -+ case GETPID: -+ case GETNCNT: -+ case GETZCNT: -+ ret = get_errno(semctl(semid, semnum, cmd, NULL)); -+ break; -+ -+ default: -+ ret = -TARGET_EINVAL; -+ break; -+ } -+ return (ret); -+} -+ -+#define N_SHM_REGIONS 32 -+ -+static struct shm_regions { -+ abi_long start; -+ abi_long size; -+} shm_regions[N_SHM_REGIONS]; -+ -+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 the length */ -+ 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].start == 0) { -+ 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].start == shmaddr) { -+ shm_regions[i].start = 0; -+ page_set_flags(shmaddr, -+ shmaddr + shm_regions[i].size, 0); -+ break; -+ } -+ } -+ -+ return ( get_errno(shmdt(g2h(shmaddr))) ); -+} -+ -+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_lpid, &target_sd->shm_lpid); -+ __get_user(host_sd->shm_cpid, &target_sd->shm_cpid); -+ __get_user(host_sd->shm_nattch, &target_sd->shm_nattch); -+ __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); -+ 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_lpid, &target_sd->shm_lpid); -+ __put_user(host_sd->shm_cpid, &target_sd->shm_cpid); -+ __put_user(host_sd->shm_nattch, &target_sd->shm_nattch); -+ __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); -+ unlock_user_struct(target_sd, target_addr, 1); -+ return (0); -+} -+ -+static inline abi_long -+do_shmctl(int shmid, int cmd, abi_long buff) -+{ -+ struct shmid_ds dsarg; -+ abi_long ret = -TARGET_EINVAL; -+ -+ cmd &= 0xff; -+ -+ switch(cmd) { -+ case IPC_STAT: -+ case IPC_SET: -+ if (target_to_host_shmid_ds(&dsarg, buff)) -+ return (-TARGET_EFAULT); -+ ret = get_errno(shmctl(shmid, cmd, &dsarg)); -+ if (host_to_target_shmid_ds(buff, &dsarg)) -+ return (-TARGET_EFAULT); -+ break; -+ -+ case IPC_RMID: -+ ret = get_errno(shmctl(shmid, cmd, NULL)); -+ break; -+ -+ default: -+ ret = -TARGET_EINVAL; -+ break; -+ } -+ -+ return (ret); -+} -+ -+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); -+ -+ /* msg_first and msg_last are not used by IPC_SET/IPC_STAT in kernel. */ -+ host_md->msg_first = host_md->msg_last = NULL; -+ -+ 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); -+ 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); -+ 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); -+ -+ /* msg_first and msg_last are not used by IPC_SET/IPC_STAT in kernel. */ -+ 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); -+ 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); -+ unlock_user_struct(target_md, target_addr, 1); -+ -+ return (0); -+} -+ -+static inline abi_long -+do_msgctl(int msgid, int cmd, abi_long ptr) -+{ -+ struct msqid_ds dsarg; -+ abi_long ret = -TARGET_EINVAL; -+ -+ cmd &= 0xff; -+ -+ switch (cmd) { -+ case IPC_STAT: -+ case IPC_SET: -+ 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; -+ -+ default: -+ ret = -TARGET_EINVAL; -+ break; -+ } -+ return (ret); -+} -+ -+static inline abi_long -+do_msgsnd(int msqid, abi_long msgp, unsigned int msgsz, int msgflg) -+{ -+ struct target_msgbuf *target_mb; -+ struct mymsg *host_mb; -+ abi_long ret = 0; -+ -+ if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0)) -+ return (-TARGET_EFAULT); -+ -+ host_mb = malloc(msgsz+sizeof(long)); -+ 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)); -+ 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 mymsg *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, tswapal(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 void -+set_second_rval(CPUArchState *env, abi_ulong retval2) -+{ -+#if defined(TARGET_ALPHA) -+ ((CPUAlphaState *)env)->ir[IR_A4] = retval2; -+#elif defined(TARGET_ARM) -+ ((CPUARMState *)env)->regs[1] = retval2; -+#elif defined(TARGET_MIPS) -+ ((CPUMIPSState*)env)->active_tc.gpr[3] = retval2; -+#elif defined(TARGET_SH4) -+ ((CPUSH4State*)env)->gregs[1] = retval2; -+#elif defined(TARGET_X86_64) || defined(TARGET_I386) -+ ((CPUX86State*)env)->regs[R_EDX] = retval2; -+#elif defined(TARGET_SPARC64) || defined(TARGET_SPARC) -+ ((CPUSPARCState*)env)->regwptr[1] = retval2; -+#else -+#warning Arch not supported for returning multiple values from syscall. -+#endif -+} -+ -+/* -+ * do_fock() must return host values and target errnos (unlike most do_*() -+ * functions. -+ */ -+static int -+do_fork(CPUArchState *env, int num, int flags, int *fdp) -+{ -+ int ret, fd; -+ abi_ulong child_flag = 0; -+ -+ fork_start(); -+ switch(num) { -+ case TARGET_FREEBSD_NR_fork: -+ case TARGET_FREEBSD_NR_vfork: -+ ret = fork(); -+ break; -+ -+ case TARGET_FREEBSD_NR_rfork: -+ ret = rfork(flags); -+ break; -+ -+ case TARGET_FREEBSD_NR_pdfork: -+ ret = pdfork(&fd, flags); -+ break; -+ -+ default: -+ ret = -TARGET_ENOSYS; -+ break; -+ } -+ if (0 == ret) { -+ /* Child */ -+ child_flag = 1; -+ cpu_clone_regs(env, 0); -+ } else { -+ /* Parent */ -+ fork_end(0); -+ } -+ if (fdp != NULL) -+ *fdp = fd; -+ -+ /* -+ * The fork() syscall sets a child flag in 2nd return value: -+ * 0 for parent process, 1 for child process -+ */ -+ set_second_rval(env, child_flag); -+ -+ return (ret); -+} -+ -+/* 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_freebsd_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) -+{ -+ abi_long ret; -+ void *p; -+ struct stat st; -+ -+#ifdef DEBUG -+ gemu_log("freebsd syscall %d\n", num); -+#endif -+ if(do_strace) -+ print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); -+ -+ switch(num) { -+ case TARGET_FREEBSD_NR_exit: -+#ifdef TARGET_GPROF -+ _mcleanup(); -+#endif -+ gdb_exit(cpu_env, arg1); -+ /* XXX: should free thread stack and CPU env */ -+ _exit(arg1); -+ ret = 0; /* avoid warning */ -+ break; -+ case TARGET_FREEBSD_NR_read: -+ if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) -+ goto efault; -+ ret = get_errno(read(arg1, p, arg3)); -+ unlock_user(p, arg2, ret); -+ break; -+ -+ case TARGET_FREEBSD_NR_readv: -+ { -+ int count = arg3; -+ struct iovec *vec; -+ -+ vec = alloca(count * sizeof(struct iovec)); -+ if (lock_iovec(VERIFY_WRITE, vec, arg2, count, 0) < 0) -+ goto efault; -+ ret = get_errno(readv(arg1, vec, count)); -+ unlock_iovec(vec, arg2, count, 1); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_pread: -+ if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0))) -+ goto efault; -+ ret = get_errno(pread(arg1, p, arg3, target_offset64(arg4, arg5))); -+ unlock_user(p, arg2, ret); -+ break; -+ -+ case TARGET_FREEBSD_NR_preadv: -+ { -+ int count = arg3; -+ struct iovec *vec; -+ -+ vec = alloca(count * sizeof(struct iovec)); -+ if (lock_iovec(VERIFY_WRITE, vec, arg2, count, 0) < 0) -+ goto efault; -+ ret = get_errno(preadv(arg1, vec, count, -+ target_offset64(arg4, arg5))); -+ unlock_iovec(vec, arg2, count, 1); -+ } -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_writev: -+ { -+ int count = arg3; -+ struct iovec *vec; -+ -+ vec = alloca(count * sizeof(struct iovec)); -+ if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0) -+ goto efault; -+ ret = get_errno(writev(arg1, vec, count)); -+ unlock_iovec(vec, arg2, count, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_pwrite: -+ if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1))) -+ goto efault; -+ ret = get_errno(pwrite(arg1, p, arg3, target_offset64(arg4, arg5))); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_pwritev: -+ { -+ int count = arg3; -+ struct iovec *vec; -+ -+ vec = alloca(count * sizeof(struct iovec)); -+ if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0) -+ goto efault; -+ ret = get_errno(pwritev(arg1, vec, count, -+ target_offset64(arg4, arg5))); -+ unlock_iovec(vec, arg2, count, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_open: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(open(path(p), -+ target_to_host_bitmask(arg2, fcntl_flags_tbl), -+ arg3)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_openat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(openat(arg1, path(p), -+ target_to_host_bitmask(arg3, fcntl_flags_tbl), -+ arg4)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_close: -+ ret = get_errno(close(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_closefrom: -+ ret = 0; -+ closefrom(arg1); -+ break; -+ -+#ifdef TARGET_FREEBSD_NR_creat -+ case TARGET_FREEBSD_NR_creat: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(creat(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+#endif -+ -+ case TARGET_FREEBSD_NR_mmap: -+ ret = get_errno(target_mmap(arg1, arg2, arg3, -+ target_to_host_bitmask(arg4, mmap_flags_tbl), -+ arg5, -+ arg6)); -+ break; -+ -+ case TARGET_FREEBSD_NR_munmap: -+ ret = get_errno(target_munmap(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_mprotect: -+ ret = get_errno(target_mprotect(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_msync: -+ ret = get_errno(msync(g2h(arg1), arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_mlock: -+ ret = get_errno(mlock(g2h(arg1), arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_munlock: -+ ret = get_errno(munlock(g2h(arg1), arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_mlockall: -+ ret = get_errno(mlockall(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_munlockall: -+ ret = get_errno(munlockall()); -+ break; -+ -+ case TARGET_FREEBSD_NR_madvise: -+ /* -+ * A straight passthrough may not be safe because qemu sometimes -+ * turns private file-backed mapping into anonymous mappings. This -+ * will break MADV_DONTNEED. This is a hint, so ignoring and returing -+ * success is ok. -+ */ -+ ret = get_errno(0); -+ break; -+ -+ case TARGET_FREEBSD_NR_break: -+ ret = do_obreak(arg1); -+ break; -+#ifdef __FreeBSD__ -+ case TARGET_FREEBSD_NR___sysctl: -+ ret = do_freebsd_sysctl(arg1, arg2, arg3, arg4, arg5, arg6); -+ break; -+#endif -+ case TARGET_FREEBSD_NR_sysarch: -+ ret = do_freebsd_sysarch(cpu_env, arg1, arg2); -+ break; -+ case TARGET_FREEBSD_NR_syscall: -+ case TARGET_FREEBSD_NR___syscall: -+ ret = do_freebsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,arg7,arg8,0); -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_nstat: -+ case TARGET_FREEBSD_NR_nfstat: -+ case TARGET_FREEBSD_NR_nlstat: -+ ret = unimplemented(num); -+ break; -+ -+ case TARGET_FREEBSD_NR_fstat: -+ { -+ ret = get_errno(fstat(arg1, &st)); -+ -+do_stat: -+ if (!is_error(ret)) { -+ struct target_freebsd_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_nlink, &target_st->st_nlink); -+ __put_user(st.st_uid, &target_st->st_uid); -+ __put_user(st.st_gid, &target_st->st_gid); -+ __put_user(st.st_rdev, &target_st->st_rdev); -+ __put_user(st.st_atim.tv_sec, &target_st->st_atim.tv_sec); -+ __put_user(st.st_atim.tv_nsec, &target_st->st_atim.tv_nsec); -+ __put_user(st.st_mtim.tv_sec, &target_st->st_mtim.tv_sec); -+ __put_user(st.st_mtim.tv_nsec, &target_st->st_mtim.tv_nsec); -+ __put_user(st.st_ctim.tv_sec, &target_st->st_ctim.tv_sec); -+ __put_user(st.st_ctim.tv_nsec, &target_st->st_ctim.tv_nsec); -+ __put_user(st.st_size, &target_st->st_size); -+ __put_user(st.st_blocks, &target_st->st_blocks); -+ __put_user(st.st_blksize, &target_st->st_blksize); -+ __put_user(st.st_flags, &target_st->st_flags); -+ __put_user(st.st_gen, &target_st->st_gen); -+ /* st_lspare not used */ -+ __put_user(st.st_birthtim.tv_sec, -+ &target_st->st_birthtim.tv_sec); -+ __put_user(st.st_birthtim.tv_nsec, -+ &target_st->st_birthtim.tv_nsec); -+ unlock_user_struct(target_st, arg2, 1); -+ } -+ -+ } -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_clock_gettime: -+ { -+ struct timespec ts; -+ -+ ret = get_errno(clock_gettime(arg1, &ts)); -+ if (!is_error(ret)) { -+ if (host_to_target_timespec(arg2, &ts)) -+ goto efault; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_clock_getres: -+ { -+ struct timespec ts; -+ -+ ret = get_errno(clock_getres(arg1, &ts)); -+ if (!is_error(ret)) { -+ if (host_to_target_timespec(arg2, &ts)) -+ goto efault; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_clock_settime: -+ { -+ struct timespec ts; -+ -+ if (target_to_host_timespec(&ts, arg2) != 0) -+ goto efault; -+ ret = get_errno(clock_settime(arg1, &ts)); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_gettimeofday: -+ { -+ struct timeval tv; -+ struct timezone tz, *target_tz; -+ if (arg2 != 0) { -+ if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) -+ goto efault; -+ __get_user(tz.tz_minuteswest, -+ &target_tz->tz_minuteswest); -+ __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); -+ unlock_user_struct(target_tz, arg2, 1); -+ } -+ ret = get_errno(gettimeofday(&tv, arg2 != 0 ? &tz : NULL)); -+ if (!is_error(ret)) { -+ if (fbsd_copy_to_user_timeval(&tv, arg1)) -+ goto efault; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_settimeofday: -+ { -+ struct timeval tv; -+ struct timezone tz, *target_tz; -+ -+ if (arg2 != 0) { -+ if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) -+ goto efault; -+ __get_user(tz.tz_minuteswest, -+ &target_tz->tz_minuteswest); -+ __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); -+ unlock_user_struct(target_tz, arg2, 1); -+ } -+ if (copy_from_user_timeval(&tv, arg1)) -+ goto efault; -+ ret = get_errno(settimeofday(&tv, arg2 != 0 ? & tz : NULL)); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_ktimer_create: -+ case TARGET_FREEBSD_NR_ktimer_delete: -+ case TARGET_FREEBSD_NR_ktimer_settime: -+ case TARGET_FREEBSD_NR_ktimer_gettime: -+ case TARGET_FREEBSD_NR_ktimer_getoverrun: -+ case TARGET_FREEBSD_NR_minherit: -+ ret = unimplemented(num); -+ break; -+ -+ case TARGET_FREEBSD_NR_kqueue: -+ ret = get_errno(kqueue()); -+ break; -+ -+#ifdef __FreeBSD__ -+ case TARGET_FREEBSD_NR_kevent: -+ { -+ struct kevent *changelist = NULL, *eventlist = NULL; -+ struct target_kevent *target_changelist, *target_eventlist; -+ struct timespec ts; -+ int i; -+ -+ if (arg3 != 0) { -+ if (!(target_changelist = lock_user(VERIFY_READ, arg2, -+ sizeof(struct target_kevent) * arg3, 1))) -+ goto efault; -+ changelist = alloca(sizeof(struct kevent) * arg3); -+ -+ for (i = 0; i < arg3; i++) { -+ __get_user(changelist[i].ident, &target_changelist[i].ident); -+ __get_user(changelist[i].filter, &target_changelist[i].filter); -+ __get_user(changelist[i].flags, &target_changelist[i].flags); -+ __get_user(changelist[i].fflags, &target_changelist[i].fflags); -+ __get_user(changelist[i].data, &target_changelist[i].data); -+ /* XXX: This is broken when running a 64bits target on a 32bits host */ -+ /* __get_user(changelist[i].udata, &target_changelist[i].udata); */ -+#if TARGET_ABI_BITS == 32 -+ changelist[i].udata = (void *)(uintptr_t)target_changelist[i].udata; -+ tswap32s((uint32_t *)&changelist[i].udata); -+#else -+ changelist[i].udata = (void *)(uintptr_t)target_changelist[i].udata; -+ tswap64s((uint64_t *)&changelist[i].udata); -+#endif -+ } -+ unlock_user(target_changelist, arg2, 0); -+ } -+ -+ if (arg5 != 0) -+ eventlist = alloca(sizeof(struct kevent) * arg5); -+ if (arg6 != 0) -+ if (target_to_host_timespec(&ts, arg6)) -+ goto efault; -+ ret = get_errno(kevent(arg1, changelist, arg3, eventlist, arg5, -+ arg6 != 0 ? &ts : NULL)); -+ if (!is_error(ret)) { -+ if (!(target_eventlist = lock_user(VERIFY_WRITE, arg4, -+ sizeof(struct target_kevent) * arg5, 0))) -+ goto efault; -+ for (i = 0; i < arg5; i++) { -+ __put_user(eventlist[i].ident, &target_eventlist[i].ident); -+ __put_user(eventlist[i].filter, &target_eventlist[i].filter); -+ __put_user(eventlist[i].flags, &target_eventlist[i].flags); -+ __put_user(eventlist[i].fflags, &target_eventlist[i].fflags); -+ __put_user(eventlist[i].data, &target_eventlist[i].data); -+ /* __put_user(eventlist[i].udata, &target_eventlist[i].udata); */ -+#if TARGET_ABI_BITS == 32 -+ tswap32s((uint32_t *)&eventlist[i].data); -+ target_eventlist[i].data = (uintptr_t)eventlist[i].data; -+#else -+ tswap64s((uint64_t *)&eventlist[i].data); -+ target_eventlist[i].data = (uintptr_t)eventlist[i].data; -+#endif -+ } -+ unlock_user(target_eventlist, arg4, sizeof(struct target_kevent) * arg5); -+ -+ -+ } -+ } -+ break; -+#endif -+ -+ case TARGET_FREEBSD_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; -+ -+ /* This case will not be caught by the host's execve() if its -+ page size is bigger than the target's. */ -+ if (total_size > MAX_ARG_PAGES * TARGET_PAGE_SIZE) { -+ ret = -TARGET_E2BIG; -+ goto execve_end; -+ } -+ 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_FREEBSD_NR_pipe: -+ { -+ int host_pipe[2]; -+ int host_ret = pipe(host_pipe); -+ -+ if (!is_error(host_ret)) { -+ set_second_rval(cpu_env, host_pipe[1]); -+ ret = host_pipe[0]; -+ } else -+ ret = get_errno(host_ret); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_lseek: -+ { -+#if defined(TARGET_MIPS) && TARGET_ABI_BITS == 32 -+ /* 32-bit MIPS uses two 32 registers for 64 bit arguments */ -+ int64_t res = lseek(arg1, target_offset64(arg2, arg3), arg4); -+ -+ if (res == -1) { -+ ret = get_errno(res); -+ } else { -+ ret = res & 0xFFFFFFFF; -+ ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] = -+ (res >> 32) & 0xFFFFFFFF; -+ } -+#else -+ ret = get_errno(lseek(arg1, arg2, arg3)); -+#endif -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_select: -+ ret = do_freebsd_select(arg1, arg2, arg3, arg4, arg5); -+ break; -+ -+ case TARGET_FREEBSD_NR_pselect: -+ ret = do_freebsd_pselect(arg1, arg2, arg3, arg4, arg5, arg6); -+ break; -+ -+ case TARGET_FREEBSD_NR_poll: -+ { -+ nfds_t i, nfds = arg2; -+ int timeout = arg3; -+ struct pollfd *pfd; -+ struct target_pollfd *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); -+ } -+ 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; -+ -+ case TARGET_FREEBSD_NR_openbsd_poll: -+ ret = unimplemented(num); -+ break; -+ -+ case TARGET_FREEBSD_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_FREEBSD_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_FREEBSD_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 (fbsd_copy_to_user_timeval(&ovalue.it_interval, arg3) -+ || fbsd_copy_to_user_timeval(&ovalue.it_value, -+ arg3 + sizeof(struct target_timeval))) -+ goto efault; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_getitimer: -+ { -+ struct itimerval value; -+ -+ ret = get_errno(getitimer(arg1, &value)); -+ if (!is_error(ret) && arg2) { -+ if (fbsd_copy_to_user_timeval(&value.it_interval, arg2) -+ || fbsd_copy_to_user_timeval(&value.it_value, -+ arg2 + sizeof(struct target_timeval))) -+ goto efault; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_lutimes: -+ { -+ 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(lutimes(p, tvp)); -+ unlock_user(p, arg1, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_futimes: -+ { -+ 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; -+ } -+ ret = get_errno(futimes(arg1, tvp)); -+ } -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_access: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(access(path(p), arg2)); -+ unlock_user(p, arg1, 0); -+ -+ case TARGET_FREEBSD_NR_eaccess: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(eaccess(path(p), arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_faccessat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(faccessat(arg1, p, arg3, arg4)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_chdir: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(chdir(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchdir: -+ ret = get_errno(fchdir(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_unlink: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(unlink(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_unlinkat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(unlinkat(arg1, p, arg3)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_mkdir: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(mkdir(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_mkdirat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(mkdirat(arg1, p, arg3)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_rmdir: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(rmdir(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR___getcwd: -+ if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0))) -+ goto efault; -+ ret = get_errno(__getcwd(p, arg2)); -+ unlock_user(p, arg1, ret); -+ break; -+ -+ case TARGET_FREEBSD_NR_dup: -+ ret = get_errno(dup(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_dup2: -+ ret = get_errno(dup2(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_truncate: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ if (regpairs_aligned(cpu_env)) { -+ arg2 = arg3; -+ arg3 = arg4; -+ } -+ ret = get_errno(truncate(p, target_offset64(arg2, arg3))); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_ftruncate: -+ if (regpairs_aligned(cpu_env)) { -+ arg2 = arg3; -+ arg3 = arg4; -+ } -+ ret = get_errno(ftruncate(arg1, target_offset64(arg2, arg3))); -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_sync: -+ sync(); -+ ret = 0; -+ break; -+ -+ case TARGET_FREEBSD_NR_mount: -+ { -+ void *p2; -+ -+ /* We need to look at the data field. */ -+ p = lock_user_string(arg1); /* type */ -+ p2 = lock_user_string(arg2); /* dir */ -+ if (!p || !p2) -+ ret = -TARGET_EFAULT; -+ else { -+ /* -+ * XXX arg5 should be locked, but it isn't clear -+ * how to do that since it's it may be not be a -+ * NULL-terminated string. -+ */ -+ if ( ! arg5 ) -+ ret = get_errno(mount(p, p2, arg3, NULL)); -+ else -+ ret = get_errno(mount(p, p2, arg3, g2h(arg5))); -+ } -+ unlock_user(p, arg1, 0); -+ unlock_user(p2, arg1, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_unmount: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(unmount(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_nmount: -+ { -+ int count = arg2; -+ struct iovec *vec; -+ -+ vec = alloca(count * sizeof(struct iovec)); -+ if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0) -+ goto efault; -+ ret = get_errno(nmount(vec, count, arg3)); -+ unlock_iovec(vec, arg2, count, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_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; -+ -+ case TARGET_FREEBSD_NR_readlink: -+ { -+ void *p2; -+ -+ p = lock_user_string(arg1); -+ p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0); -+ if (!p || !p2) -+ ret = -TARGET_EFAULT; -+ else -+ ret = get_errno(readlink(path(p), p2, arg3)); -+ unlock_user(p2, arg2, ret); -+ unlock_user(p, arg1, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_readlinkat: -+ { -+ void *p2; -+ p = lock_user_string(arg2); -+ p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0); -+ -+ if (!p || !p2) -+ ret = -TARGET_EFAULT; -+ else -+ ret = get_errno(readlinkat(arg1, path(p), p2, arg4)); -+ unlock_user(p2, arg3, ret); -+ unlock_user(p, arg2, 0); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_chmod: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(chmod(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchmod: -+ ret = get_errno(fchmod(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_lchmod: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(lchmod(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchmodat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(fchmodat(arg1, p, arg3, arg4)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_mknod: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(mknod(p, arg2, arg3)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_mknodat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(mknodat(arg1, p, arg3, arg4)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_chown: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(chown(p, arg2, arg3)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchown: -+ ret = get_errno(fchown(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_lchown: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(lchown(p, arg2, arg3)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchownat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(fchownat(arg1, p, arg3, arg4, arg5)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_chflags: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(chflags(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_lchflags: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(lchflags(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fchflags: -+ ret = get_errno(fchflags(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_getgroups: -+ { -+ 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 * 2, 0); -+ if (!target_grouplist) -+ goto efault; -+ for (i = 0;i < ret; i++) -+ target_grouplist[i] = tswap32(grouplist[i]); -+ unlock_user(target_grouplist, arg2, gidsetsize * 2); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_setgroups: -+ { -+ 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 * 2, 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; -+ -+ case TARGET_FREEBSD_NR_umask: -+ ret = get_errno(umask(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_fcntl: -+ { -+ int host_cmd; -+ struct flock fl; -+ struct target_flock *target_fl; -+ -+ host_cmd = target_to_host_fcntl_cmd(arg2); -+ if (-TARGET_EINVAL == host_cmd) { -+ ret = host_cmd; -+ break; -+ } -+ -+ switch(arg2) { -+ case TARGET_F_GETLK: -+ if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) -+ return (-TARGET_EFAULT); -+ fl.l_type = tswap16(target_fl->l_type); -+ 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); -+ fl.l_sysid = tswap32(target_fl->l_sysid); -+ unlock_user_struct(target_fl, arg3, 0); -+ ret = get_errno(fcntl(arg1, host_cmd, &fl)); -+ if (0 == ret) { -+ if (!lock_user_struct(VERIFY_WRITE, target_fl, -+ arg3, 0)) -+ return (-TARGET_EFAULT); -+ target_fl->l_type = tswap16(fl.l_type); -+ 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); -+ target_fl->l_sysid = tswap32(fl.l_sysid); -+ unlock_user_struct(target_fl, arg3, 1); -+ } -+ break; -+ -+ case TARGET_F_SETLK: -+ case TARGET_F_SETLKW: -+ if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1)) -+ return (-TARGET_EFAULT); -+ fl.l_type = tswap16(target_fl->l_type); -+ 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); -+ fl.l_sysid = tswap32(target_fl->l_sysid); -+ unlock_user_struct(target_fl, arg3, 0); -+ ret = get_errno(fcntl(arg1, host_cmd, &fl)); -+ break; -+ -+ case TARGET_F_DUPFD: -+ case TARGET_F_DUP2FD: -+ case TARGET_F_GETOWN: -+ case TARGET_F_SETOWN: -+ case TARGET_F_GETFD: -+ case TARGET_F_SETFD: -+ case TARGET_F_GETFL: -+ case TARGET_F_SETFL: -+ case TARGET_F_READAHEAD: -+ case TARGET_F_RDAHEAD: -+ default: -+ ret = get_errno(fcntl(arg1, host_cmd, arg3)); -+ break; -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_getdents: -+ { -+ struct dirent *dirp; -+ int32_t nbytes = arg3; -+ -+ if (!(dirp = lock_user(VERIFY_WRITE, arg2, nbytes, 0))) -+ goto efault; -+ ret = get_errno(getdents(arg1, (char *)dirp, nbytes)); -+ if (!is_error(ret)) { -+ struct 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); -+ len -= reclen; -+ } -+ } -+ unlock_user(dirp, arg2, ret); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_getdirentries: -+ { -+ struct dirent *dirp; -+ int32_t nbytes = arg3; -+ long basep; -+ -+ if (!(dirp = lock_user(VERIFY_WRITE, arg2, nbytes, 0))) -+ goto efault; -+ ret = get_errno(getdirentries(arg1, (char *)dirp, nbytes, -+ &basep)); -+ if (!is_error(ret)) { -+ struct 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); -+ len -= reclen; -+ } -+ } -+ unlock_user(dirp, arg2, ret); -+ if (arg4) -+ if (put_user(nbytes, arg4, abi_ulong)) -+ ret = -TARGET_EFAULT; -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_chroot: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(chroot(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_flock: -+ ret = get_errno(flock(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_mkfifo: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(mkfifo(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_mkfifoat: -+ if (!(p = lock_user_string(arg2))) -+ goto efault; -+ ret = get_errno(mkfifoat(arg1, p, arg2)); -+ unlock_user(p, arg2, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_pathconf: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(pathconf(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_lpathconf: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(lpathconf(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_fpathconf: -+ ret = get_errno(fpathconf(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_undelete: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(undelete(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ -+ case TARGET_FREEBSD_NR___acl_get_file: -+ case TARGET_FREEBSD_NR___acl_set_file: -+ case TARGET_FREEBSD_NR___acl_get_fd: -+ case TARGET_FREEBSD_NR___acl_set_fd: -+ case TARGET_FREEBSD_NR___acl_delete_file: -+ case TARGET_FREEBSD_NR___acl_delete_fd: -+ case TARGET_FREEBSD_NR___acl_aclcheck_file: -+ case TARGET_FREEBSD_NR___acl_aclcheck_fd: -+ case TARGET_FREEBSD_NR___acl_get_link: -+ case TARGET_FREEBSD_NR___acl_set_link: -+ case TARGET_FREEBSD_NR___acl_delete_link: -+ case TARGET_FREEBSD_NR___acl_aclcheck_link: -+ case TARGET_FREEBSD_NR_extattrctl: -+ case TARGET_FREEBSD_NR_extattr_set_file: -+ case TARGET_FREEBSD_NR_extattr_get_file: -+ case TARGET_FREEBSD_NR_extattr_delete_file: -+ case TARGET_FREEBSD_NR_extattr_set_fd: -+ case TARGET_FREEBSD_NR_extattr_get_fd: -+ case TARGET_FREEBSD_NR_extattr_delete_fd: -+ case TARGET_FREEBSD_NR_extattr_get_link: -+ case TARGET_FREEBSD_NR_extattr_set_link: -+ case TARGET_FREEBSD_NR_extattr_delete_link: -+ case TARGET_FREEBSD_NR_extattr_list_fd: -+ case TARGET_FREEBSD_NR_extattr_list_file: -+ case TARGET_FREEBSD_NR_extattr_list_link: -+ ret = unimplemented(num); -+ break; -+ -+ case TARGET_FREEBSD_NR_setlogin: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(setlogin(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_getlogin: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(_getlogin(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_setloginclass: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(setloginclass(p)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_getloginclass: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(getloginclass(p, arg2)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_getrusage: -+ { -+ struct rusage rusage; -+ ret = get_errno(getrusage(arg1, &rusage)); -+ if (!is_error(ret)) -+ host_to_target_rusage(arg2, &rusage); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_wait4: -+ { -+ int status; -+ abi_long status_ptr = arg2; -+ struct rusage rusage, *rusage_ptr; -+ abi_ulong target_rusage = arg4; -+ -+ if (target_rusage) -+ rusage_ptr = &rusage; -+ else -+ rusage_ptr = NULL; -+ ret = get_errno(wait4(arg1, &status, arg3, rusage_ptr)); -+ if (!is_error(ret)) { -+ status = host_to_target_waitstatus(status); -+ if (put_user_s32(status, status_ptr)) -+ goto efault; -+ if (target_rusage) -+ host_to_target_rusage(target_rusage, &rusage); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_accept: -+ ret = do_accept(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_bind: -+ ret = do_bind(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_connect: -+ ret = do_connect(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_getpeername: -+ ret = do_getpeername(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_getsockname: -+ ret = do_getsockname(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_getsockopt: -+ ret = do_getsockopt(arg1, arg2, arg3, arg4, arg5); -+ break; -+ -+ case TARGET_FREEBSD_NR_setsockopt: -+ ret = do_setsockopt(arg1, arg2, arg3, arg4, arg5); -+ break; -+ -+ case TARGET_FREEBSD_NR_listen: -+ ret = get_errno(listen(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_recvfrom: -+ ret = do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6); -+ break; -+ -+ case TARGET_FREEBSD_NR_recvmsg: -+ ret = do_sendrecvmsg(arg1, arg2, arg3, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_sendmsg: -+ ret = do_sendrecvmsg(arg1, arg2, arg3, 1); -+ break; -+ -+ case TARGET_FREEBSD_NR_sendto: -+ ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6); -+ break; -+ -+ case TARGET_FREEBSD_NR_socket: -+ ret = get_errno(socket(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_socketpair: -+ ret = do_socketpair(arg1, arg2, arg3, arg4); -+ break; -+ -+ case TARGET_FREEBSD_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; -+ } -+ /* Return value is a biased priority to avoid negative numbers. */ -+ ret = 20 - ret; -+ break; -+ -+ case TARGET_FREEBSD_NR_setpriority: -+ ret = get_errno(setpriority(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_semget: -+ ret = get_errno(semget(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_semop: -+ ret = get_errno(do_semop(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR___semctl: -+ ret = do_semctl(arg1, arg2, arg3, (union target_semun)(abi_ulong)arg4); -+ break; -+ -+ case TARGET_FREEBSD_NR_msgctl: -+ ret = do_msgctl(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_msgrcv: -+ ret = do_msgrcv(arg1, arg2, arg3, arg4, arg5); -+ break; -+ -+ case TARGET_FREEBSD_NR_msgsnd: -+ ret = do_msgsnd(arg1, arg2, arg3, arg4); -+ break; -+ -+ case TARGET_FREEBSD_NR_shmget: -+ ret = get_errno(shmget(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_shmctl: -+ ret = do_shmctl(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_shmat: -+ ret = do_shmat(arg1, arg2, arg3); -+ break; -+ -+ case TARGET_FREEBSD_NR_shmdt: -+ ret = do_shmdt(arg1); -+ break; -+ -+ case TARGET_FREEBSD_NR_shm_open: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(shm_open(path(p), -+ target_to_host_bitmask(arg2, fcntl_flags_tbl), -+ arg3)); -+ unlock_user(p, arg1, 0); -+ break; -+ -+ case TARGET_FREEBSD_NR_shm_unlink: -+ if (!(p = lock_user_string(arg1))) -+ goto efault; -+ ret = get_errno(shm_unlink(p)); -+ break; -+ -+ case TARGET_FREEBSD_NR_getpid: -+ ret = get_errno(getpid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_getppid: -+ ret = get_errno(getppid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_getuid: -+ ret = get_errno(getuid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_geteuid: -+ ret = get_errno(geteuid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_getgid: -+ ret = get_errno(getgid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_getegid: -+ ret = get_errno(getegid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_setuid: -+ ret = get_errno(setuid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setgid: -+ ret = get_errno(setgid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setegid: -+ ret = get_errno(setegid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_seteuid: -+ ret = get_errno(setegid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_getpgrp: -+ ret = get_errno(getpgrp()); -+ break; -+ -+#ifdef TARGET_FREEBSD_NR_setpgrp -+ case TARGET_FREEBSD_NR_setpgrp: -+ ret = get_errno(setpgrp(arg1, arg2)); -+ break; -+#endif -+ -+ case TARGET_FREEBSD_NR_setreuid: -+ ret = get_errno(setreuid(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setregid: -+ ret = get_errno(setregid(arg1, arg2)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setresuid: -+ ret = get_errno(setresuid(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setresgid: -+ ret = get_errno(setresgid(arg1, arg2, arg3)); -+ break; -+ -+ case TARGET_FREEBSD_NR_getresuid: -+ case TARGET_FREEBSD_NR_getresgid: -+ ret = unimplemented(num); -+ break; -+ -+ case TARGET_FREEBSD_NR_setsid: -+ ret = get_errno(setsid()); -+ break; -+ -+ case TARGET_FREEBSD_NR_getsid: -+ ret = get_errno(getsid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_setfib: -+ ret = get_errno(setfib(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR___setugid: -+ ret = get_errno(__setugid(arg1)); -+ break; -+ -+ case TARGET_FREEBSD_NR_issetugid: -+ ret = get_errno(issetugid()); -+ break; -+ -+#ifdef TARGET_FREEBSD_NR_wait -+ case TARGET_FREEBSD_NR_wait: -+ ret = get_errno(wait()); -+ break; -+#endif -+ -+ case TARGET_FREEBSD_NR_fork: -+ ret = get_errno(do_fork(cpu_env, num, 0, NULL)); -+ break; -+ -+ case TARGET_FREEBSD_NR_rfork: -+ ret = get_errno(do_fork(cpu_env, num, arg1, NULL)); -+ break; -+ -+ case TARGET_FREEBSD_NR_vfork: -+ ret = get_errno(do_fork(cpu_env, num, 0, NULL)); -+ break; -+ -+ case TARGET_FREEBSD_NR_pdfork: -+ { -+ int pd; -+ -+ ret = get_errno(do_fork(cpu_env, num, arg2, &pd)); -+ if (put_user_s32(pd, arg1)) -+ goto efault; -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_kill: -+ ret = get_errno(kill(arg1, target_to_host_signal(arg2))); -+ break; -+ -+#ifdef TARGET_FREEBSD_NR_killpg -+ case TARGET_FREEBSD_NR_killpg: -+ ret = get_errno(killpg(arg1, target_to_host_signal(arg2))); -+ break; -+#endif -+ -+ case TARGET_FREEBSD_NR_sigaction: -+ { -+ struct target_sigaction *old_act, act, oact, *pact; -+ -+ if (arg2) { -+ if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) -+ goto efault; -+ act._sa_handler = old_act->_sa_handler; -+ act.sa_flags = old_act->sa_flags; -+ memcpy(&act.sa_mask, &old_act->sa_mask, -+ sizeof(target_sigset_t)); -+ 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; -+ memcpy(&old_act->sa_mask, &oact.sa_mask, -+ sizeof(target_sigset_t)); -+ unlock_user_struct(old_act, arg3, 1); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_sigprocmask: -+ { -+ 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_sigset(&set, p); -+ unlock_user(p, arg2, 0); -+ set_ptr = &set; -+ } else { -+ how = 0; -+ set_ptr = NULL; -+ } -+ ret = get_errno(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; -+ -+ case TARGET_FREEBSD_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_sigset(p, &set); -+ unlock_user(p, arg1, sizeof(target_sigset_t)); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_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_FREEBSD_NR_sigreturn: -+ ret = do_sigreturn(cpu_env, arg1); -+ break; -+ -+#ifdef TARGET_FREEBSD_NR_sigvec -+ case TARGET_FREEBSD_NR_sigvec: -+ ret = unimplemented(num); -+ break; -+#endif -+#ifdef TARGET_FREEBSD_NR_sigblock -+ case TARGET_FREEBSD_NR_sigblock: -+ ret = unimplemented(num); -+ break; -+#endif -+#ifdef TARGET_FREEBSD_NR_sigsetmask -+ case TARGET_FREEBSD_NR_sigsetmask: -+ ret = unimplemented(num); -+ break; -+#endif -+#ifdef TARGET_FREEBSD_NR_sigstack -+ case TARGET_FREEBSD_NR_sigstack: -+ ret = unimplemented(num); -+ break; -+#endif -+ -+ case TARGET_FREEBSD_NR_sigwait: -+ { -+ sigset_t set; -+ int sig; -+ -+ 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(sigwait(&set, &sig)); -+ if (!is_error(ret) && arg2) { -+ /* XXX */ -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_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) && arg2) { -+ if (!(p = lock_user(VERIFY_WRITE, arg2, -+ sizeof(target_siginfo_t), 0))) -+ goto efault; -+ host_to_target_siginfo(p, &uinfo); -+ unlock_user(p, arg2, sizeof(target_siginfo_t)); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_sigwaitinfo: -+ { -+ sigset_t set; -+ 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); -+ ret = get_errno(sigwaitinfo(&set, &uinfo)); -+ if (!is_error(ret) && arg2) { -+ if (!(p = lock_user(VERIFY_WRITE, arg2, -+ sizeof(target_siginfo_t), 0))) -+ goto efault; -+ host_to_target_siginfo(p, &uinfo); -+ unlock_user(p, arg2, sizeof(target_siginfo_t)); -+ } -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_sigqueue: -+ { -+ union sigval value; -+ -+ value.sival_ptr = (void *)(uintptr_t)arg3; -+ ret = get_errno(sigqueue(arg1, target_to_host_signal(arg2), -+ value)); -+ } -+ break; -+ -+ case TARGET_FREEBSD_NR_sigaltstack: -+ { -+ -+ ret = do_sigaltstack(arg1, arg2, -+ get_sp_from_cpustate((CPUArchState *)cpu_env)); -+ } -+ -+#ifdef TARGET_FREEBSD_NR_aio_read -+ case TARGET_FREEBSD_NR_aio_read: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_write -+ case TARGET_FREEBSD_NR_aio_write: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_return -+ case TARGET_FREEBSD_NR_aio_return: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_suspend -+ case TARGET_FREEBSD_NR_aio_suspend: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_cancel -+ case TARGET_FREEBSD_NR_aio_cancel: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_error -+ case TARGET_FREEBSD_NR_aio_error: -+#endif -+#ifdef TARGET_FREEBSD_NR_aio_waitcomplete -+ case TARGET_FREEBSD_NR_aio_waitcomplete: -+#endif -+#ifdef TARGET_FREEBSD_NR_lio_listio -+ case TARGET_FREEBSD_NR_lio_listio: -+#endif -+ -+ case TARGET_FREEBSD_NR_yield: -+ case TARGET_FREEBSD_NR_sched_setparam: -+ case TARGET_FREEBSD_NR_sched_getparam: -+ case TARGET_FREEBSD_NR_sched_setscheduler: -+ case TARGET_FREEBSD_NR_sched_getscheduler: -+ case TARGET_FREEBSD_NR_sched_yield: -+ case TARGET_FREEBSD_NR_sched_get_priority_max: -+ case TARGET_FREEBSD_NR_sched_get_priority_min: -+ case TARGET_FREEBSD_NR_sched_rr_get_interval: -+ -+ -+ case TARGET_FREEBSD_NR_reboot: -+ case TARGET_FREEBSD_NR_shutdown: -+ -+ case TARGET_FREEBSD_NR_swapon: -+ case TARGET_FREEBSD_NR_swapoff: -+ -+ case TARGET_FREEBSD_NR_pdkill: -+ case TARGET_FREEBSD_NR_pdgetpid: -+ -+ case TARGET_FREEBSD_NR_thr_create: -+ case TARGET_FREEBSD_NR_thr_exit: -+ case TARGET_FREEBSD_NR_thr_self: -+ case TARGET_FREEBSD_NR_thr_suspend: -+ case TARGET_FREEBSD_NR_thr_wake: -+ case TARGET_FREEBSD_NR_thr_new: -+ case TARGET_FREEBSD_NR_thr_set_name: -+ case TARGET_FREEBSD_NR_thr_kill2: -+ -+ case TARGET_FREEBSD_NR_getcontext: -+ case TARGET_FREEBSD_NR_setcontext: -+ case TARGET_FREEBSD_NR_swapcontext: -+ -+ case TARGET_FREEBSD_NR_rtprio_thread: -+ case TARGET_FREEBSD_NR_cpuset: -+ case TARGET_FREEBSD_NR_cpuset_getid: -+ case TARGET_FREEBSD_NR_cpuset_setid: -+ case TARGET_FREEBSD_NR_cpuset_getaffinity: -+ case TARGET_FREEBSD_NR_cpuset_setaffinity: -+ -+ case TARGET_FREEBSD_NR__umtx_lock: -+ case TARGET_FREEBSD_NR__umtx_unlock: -+ -+ case TARGET_FREEBSD_NR_posix_fadvise: -+ case TARGET_FREEBSD_NR_posix_fallocate: -+ -+ case TARGET_FREEBSD_NR_rctl_get_racct: -+ case TARGET_FREEBSD_NR_rctl_get_rules: -+ case TARGET_FREEBSD_NR_rctl_add_rule: -+ case TARGET_FREEBSD_NR_rctl_remove_rule: -+ case TARGET_FREEBSD_NR_rctl_get_limits: -+ -+ case TARGET_FREEBSD_NR_ntp_adjtime: -+ case TARGET_FREEBSD_NR_ntp_gettime: -+ -+#ifdef TARGET_FREEBSD_NR_getdomainname -+ case TARGET_FREEBSD_NR_getdomainname: -+#endif -+#ifdef TARGET_FREEBSD_NR_setdomainname -+ case TARGET_FREEBSD_NR_setdomainname: -+#endif -+#ifdef TARGET_FREEBSD_NR_uname -+ case TARGET_FREEBSD_NR_uname: -+#endif -+ -+ case TARGET_FREEBSD_NR_sctp_peeloff: -+ case TARGET_FREEBSD_NR_sctp_generic_sendmsg: -+ case TARGET_FREEBSD_NR_sctp_generic_recvmsg: -+ -+ case TARGET_FREEBSD_NR_getfh: -+ case TARGET_FREEBSD_NR_lgetfh: -+ case TARGET_FREEBSD_NR_fhstatfs: -+ case TARGET_FREEBSD_NR_fhopen: -+ case TARGET_FREEBSD_NR_fhstat: -+ -+ case TARGET_FREEBSD_NR_getfsstat: -+ case TARGET_FREEBSD_NR_fstatfs: -+ -+ case TARGET_FREEBSD_NR_modfnext: -+ case TARGET_FREEBSD_NR_modfind: -+ case TARGET_FREEBSD_NR_kldload: -+ case TARGET_FREEBSD_NR_kldunload: -+ case TARGET_FREEBSD_NR_kldunloadf: -+ case TARGET_FREEBSD_NR_kldfind: -+ case TARGET_FREEBSD_NR_kldnext: -+ case TARGET_FREEBSD_NR_kldstat: -+ case TARGET_FREEBSD_NR_kldfirstmod: -+ case TARGET_FREEBSD_NR_kldsym: -+ -+ case TARGET_FREEBSD_NR_quotactl: -+#ifdef TARGET_FREEBSD_NR_quota -+ case TARGET_FREEBSD_NR_quota: -+#endif -+ -+ case TARGET_FREEBSD_NR_adjtime: -+ -+#ifdef TARGET_FREEBSD_NR_gethostid -+ case TARGET_FREEBSD_NR_gethostid: -+#endif -+#ifdef TARGET_FREEBSD_NR_gethostname -+ case TARGET_FREEBSD_NR_gethostname: -+#endif -+#ifdef TARGET_FREEBSD_NR_sethostname -+ case TARGET_FREEBSD_NR_sethostname: -+#endif -+ -+ case TARGET_FREEBSD_NR_mincore: -+ -+ case TARGET_FREEBSD_NR_vadvise: -+ -+ case TARGET_FREEBSD_NR_sbrk: -+ case TARGET_FREEBSD_NR_sstk: -+ -+#ifdef TARGET_FREEBSD_NR_getkerninfo -+ case TARGET_FREEBSD_NR_getkerninfo: -+#endif -+#ifdef TARGET_FREEBSD_NR_getpagesize -+ case TARGET_FREEBSD_NR_getpagesize: -+#endif -+ -+ case TARGET_FREEBSD_NR_revoke: -+ -+ case TARGET_FREEBSD_NR_profil: -+ case TARGET_FREEBSD_NR_ktrace: -+ -+ case TARGET_FREEBSD_NR_jail: -+ case TARGET_FREEBSD_NR_jail_attach: -+ case TARGET_FREEBSD_NR_jail_get: -+ case TARGET_FREEBSD_NR_jail_set: -+ case TARGET_FREEBSD_NR_jail_remove: -+ -+ case TARGET_FREEBSD_NR_cap_enter: -+ case TARGET_FREEBSD_NR_cap_getmode: -+ -+ case TARGET_FREEBSD_NR_kenv: -+ case TARGET_FREEBSD_NR_uuidgen: -+ -+ case TARGET_FREEBSD_NR___mac_get_proc: -+ case TARGET_FREEBSD_NR___mac_set_proc: -+ case TARGET_FREEBSD_NR___mac_get_fd: -+ case TARGET_FREEBSD_NR___mac_set_fd: -+ case TARGET_FREEBSD_NR___mac_get_file: -+ case TARGET_FREEBSD_NR___mac_set_file: -+ case TARGET_FREEBSD_NR___mac_get_link: -+ case TARGET_FREEBSD_NR___mac_set_link: -+ case TARGET_FREEBSD_NR_mac_syscall: -+ -+ case TARGET_FREEBSD_NR_audit: -+ case TARGET_FREEBSD_NR_auditon: -+ case TARGET_FREEBSD_NR_getaudit: -+ case TARGET_FREEBSD_NR_setaudit: -+ case TARGET_FREEBSD_NR_getaudit_addr: -+ case TARGET_FREEBSD_NR_setaudit_addr: -+ case TARGET_FREEBSD_NR_auditctl: -+ -+ -+#ifdef TARGET_FREEBSD_NR_obreak -+ case TARGET_FREEBSD_NR_obreak: -+#endif -+ case TARGET_FREEBSD_NR_freebsd6_pread: -+ case TARGET_FREEBSD_NR_freebsd6_pwrite: -+ case TARGET_FREEBSD_NR_freebsd6_lseek: -+ case TARGET_FREEBSD_NR_freebsd6_truncate: -+ case TARGET_FREEBSD_NR_freebsd6_ftruncate: -+ case TARGET_FREEBSD_NR_sendfile: -+ case TARGET_FREEBSD_NR_ptrace: -+ case TARGET_FREEBSD_NR_utrace: -+ case TARGET_FREEBSD_NR_ioctl: -+ ret = unimplemented(num); -+ break; -+ -+ - default: - ret = get_errno(syscall(num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)); - break; -diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h -index 207ddee..ea1d25d 100644 ---- a/bsd-user/syscall_defs.h -+++ b/bsd-user/syscall_defs.h -@@ -37,8 +37,6 @@ - * @(#)signal.h 8.2 (Berkeley) 1/21/94 - */ - --#define TARGET_NSIG 32 /* counting 0; could be 33 (mask is 1-32) */ -- - #define TARGET_SIGHUP 1 /* hangup */ - #define TARGET_SIGINT 2 /* interrupt */ - #define TARGET_SIGQUIT 3 /* quit */ -@@ -71,14 +69,21 @@ - #define TARGET_SIGINFO 29 /* information request */ - #define TARGET_SIGUSR1 30 /* user defined signal 1 */ - #define TARGET_SIGUSR2 31 /* user defined signal 2 */ -+#define TARGET_SIGTHR 32 /* reserved by thread library */ -+#define TARGET_SIGLWP SIGTHR /* compatibility */ -+#define TARGET_SIGLIBRT 33 /* reserved by the real-time library */ -+#define TARGET_SIGRTMIN 65 -+#define TARGET_SIGRTMAX 126 -+#define TARGET_QEMU_ESIGRETURN 255 /* fake errno value for use by sigreturn */ -+ - - /* - * Language spec says we must list exactly one parameter, even though we - * actually supply three. Ugh! - */ --#define TARGET_SIG_DFL (void (*)(int))0 --#define TARGET_SIG_IGN (void (*)(int))1 --#define TARGET_SIG_ERR (void (*)(int))-1 -+#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 */ - - #define TARGET_SA_ONSTACK 0x0001 /* take signal on signal stack */ - #define TARGET_SA_RESTART 0x0002 /* restart system on signal return */ -@@ -98,17 +103,503 @@ - - #define TARGET_BADSIG SIG_ERR - -+/* -+ * sigaltstack controls -+ */ - #define TARGET_SS_ONSTACK 0x0001 /* take signals on alternate stack */ --#define TARGET_SS_DISABLE 0x0004 /* disable taking signals on alternate stack */ -+#define TARGET_SS_DISABLE 0x0004 /* disable taking signals on alternate -+ stack */ -+ -+#define TARGET_NSIG 128 -+#define TARGET_NSIG_BPW (sizeof(uint32_t) * 8) -+#define TARGET_NSIG_WORDS (TARGET_NSIG / TARGET_NSIG_BPW) -+ -+/* -+ * si_code values -+ * Digital reserves positive values for kernel-generated signals. -+ */ -+ -+/* -+ * SIGSEGV si_codes -+ */ -+#define TARGET_SEGV_MAPERR (1) /* address not mapped to object */ -+#define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped -+ object */ -+/* -+ * SIGTRAP si_codes -+ */ -+#define TARGET_TRAP_BRKPT (1) /* process beakpoint */ -+#define TARGET_TRAP_TRACE (2) /* process trace trap */ - -+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 -+ -+#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 -+#define TARGET_RLIMIT_MEMLOCK 6 -+#define TARGET_RLIMIT_NPROC 7 -+#define TARGET_RLIMIT_NOFILE 8 -+#define TARGET_RLIMIT_SBSIZE 9 -+#define TARGET_RLIMIT_AS 10 -+#define TARGET_RLIMIT_NPTS 11 -+#define TARGET_RLIMIT_SWAP 12 -+ -+struct target_pollfd { -+ int fd; /* file descriptor */ -+ short events; /* requested events */ -+ short revents; /* returned events */ -+}; -+ -+/* -+ * Constants used for fcntl(2). -+ */ -+ -+/* command values */ -+#define TARGET_F_DUPFD 0 -+#define TARGET_F_GETFD 1 -+#define TARGET_F_SETFD 2 -+#define TARGET_F_GETFL 3 -+#define TARGET_F_SETFL 4 -+#define TARGET_F_GETOWN 5 -+#define TARGET_F_SETOWN 6 -+#define TARGET_F_OGETLK 7 -+#define TARGET_F_OSETLK 8 -+#define TARGET_F_OSETLKW 9 -+#define TARGET_F_DUP2FD 10 -+#define TARGET_F_GETLK 11 -+#define TARGET_F_SETLK 12 -+#define TARGET_F_SETLKW 13 -+#define TARGET_F_SETLK_REMOTE 14 -+#define TARGET_F_READAHEAD 15 -+#define TARGET_F_RDAHEAD 16 -+ -+#define TARGET_O_NONBLOCK 0x00000004 -+#define TARGET_O_APPEND 0x00000008 -+#define TARGET_O_ASYNC 0x00000040 -+#define TARGET_O_DIRECT 0x00010000 -+ -+#define TARGET_SPARC_UTRAP_INSTALL 1 -+#define TARGET_SPARC_SIGTRAMP_INSTALL 2 -+ -+#include "socket.h" - #include "errno_defs.h" - - #include "freebsd/syscall_nr.h" - #include "netbsd/syscall_nr.h" - #include "openbsd/syscall_nr.h" - -+struct target_flock { -+ unsigned long long l_start; -+ unsigned long long l_len; -+ int l_pid; -+ int l_sysid; -+ short l_type; -+ short l_whence; -+} QEMU_PACKED; -+ - 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 */ -+ int msg_flags; /* flags on received message */ -+}; -+ -+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) __target_cmsg_nxthdr (mhdr, cmsg) -+#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 *__ptr; -+ -+ __ptr = (struct target_cmsghdr *)((unsigned char *) __cmsg + -+ TARGET_CMSG_ALIGN (tswapal(__cmsg->cmsg_len))); -+ if ((unsigned long)((char *)(__ptr+1) - -+ (char *)(size_t)tswapal(__mhdr->msg_control)) > -+ tswapal(__mhdr->msg_controllen)) -+ /* No more entries. */ -+ return ((struct target_cmsghdr *)0); -+ return (__cmsg); -+} -+ -+struct target_sockaddr { -+ uint16_t sa_family; -+ uint8_t sa_data[14]; -+}; -+ -+struct target_in_addr { -+ uint32_t s_addr; /* big endian */ -+}; -+ -+ -+struct target_timeval { -+ abi_long tv_sec; -+ abi_long tv_usec; -+}; -+ -+typedef abi_long target_clock_t; -+ -+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 context switches */ -+}; -+ -+struct target_kevent { -+ abi_ulong ident; -+ short filter; -+ u_short flags; -+ u_int fflags; -+ abi_long data; -+ abi_ulong udata; -+} __packed; -+ -+/* -+ * FreeBSD/arm uses a 64bits time_t, even in 32bits mode, so we have to -+ * add a special case here. -+ */ -+#if defined(TARGET_ARM) -+typedef uint64_t target_freebsd_time_t; -+#else -+typedef long target_freebsd_time_t; -+#endif -+ -+struct target_freebsd_timespec { -+ target_freebsd_time_t tv_sec; /* seconds */ -+ abi_long tv_nsec; /* and nanoseconds */ -+} __packed; -+ -+struct target_freebsd_timeval { -+ target_freebsd_time_t tv_sec; -+ abi_long tv_usec; -+} __packed; -+ -+struct target_freebsd_stat { -+ uint32_t st_dev; /* inode's device */ -+ uint32_t st_ino; /* inode's number */ -+ int16_t st_mode; /* inode protection mode */ -+ int16_t st_nlink; /* number of hard links */ -+ uint32_t st_uid; /* user ID of the file's owner */ -+ uint32_t st_gid; /* group ID of the file's group */ -+ uint32_t st_rdev; /* device type */ -+ struct target_freebsd_timespec st_atim; /* time of last access */ -+ struct target_freebsd_timespec st_mtim; /* time of last data modification */ -+ struct target_freebsd_timespec st_ctim; /* time of last file status change */ -+ int64_t st_size; /* file size, in bytes */ -+ int64_t st_blocks; /* blocks allocated for file */ -+ uint32_t st_blksize; /* optimal blocksize for I/O */ -+ uint32_t st_flags; /* user defined flags for file */ -+ __uint32_t st_gen; /* file generation number */ -+ __int32_t st_lspare; -+ struct target_freebsd_timespec st_birthtim; /* time of file creation */ -+ /* -+ * Explicitly pad st_birthtim to 16 bytes so that the size of -+ * struct stat is backwards compatible. We use bitfields instead -+ * of an array of chars so that this doesn't require a C99 compiler -+ * to compile if the size of the padding is 0. We use 2 bitfields -+ * to cover up to 64 bits on 32-bit machines. We assume that -+ * CHAR_BIT is 8... -+ */ -+ unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); -+ unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); -+} __packed; -+ -+int __getcwd(char *, size_t); -+ -+struct target_sembuf { -+ unsigned short sem_num; /* semaphore # */ -+ short sem_op; /* semaphore operation */ -+ short sem_flg; /* operation flags */ -+}; -+ -+union target_semun { -+ int val; /* value for SETVAL */ -+ abi_ulong buf; /* buffer for IPC_STAT & IPC_SET */ -+ abi_ulong array; /* array for GETALL & SETALL */ -+}; -+ -+struct target_ipc_perm { -+ uint32_t cuid; /* creator user id */ -+ uint32_t cgid; /* creator group id */ -+ uint32_t uid; /* user id */ -+ uint32_t gid; /* group id */ -+ uint16_t mode; /* r/w permission */ -+ uint16_t seq; /* sequence # */ -+ abi_long key; /* user specified msg/sem/shm key */ -+}; -+ -+struct target_msqid_ds { -+ struct target_ipc_perm msg_perm; /* msg queue permission bits */ -+ abi_ulong msg_first; /* first message in the queue */ -+ abi_ulong msg_last; /* last message in the queue */ -+ abi_ulong msg_cbytes; /* # of bytes in use on the queue */ -+ abi_ulong msg_qnum; /* number of msgs in the queue */ -+ abi_ulong msg_qbytes; /* max # of bytes on the queue */ -+ int32_t msg_lspid; /* pid of last msgsnd() */ -+ int32_t msg_lrpid; /* pid of last msgrcv() */ -+ abi_ulong msg_stime; /* time of last msgsnd() */ -+ abi_ulong msg_rtime; /* time of last msgrcv() */ -+ abi_ulong msg_ctime; /* time of last msgctl() */ -+}; -+ -+struct target_msgbuf { -+ abi_long mtype; /* message type */ -+ char mtext[1]; /* body of message */ -+}; -+ -+struct target_semid_ds { -+ struct target_ipc_perm sem_perm; /* operation permission struct */ -+ abi_ulong sem_base; /* pointer to first semaphore in set */ -+ uint16_t sem_nsems; /* number of sems in set */ -+ abi_ulong sem_otime; /* last operation time */ -+ abi_ulong sem_ctime; /* times measured in secs */ -+}; -+ -+struct target_shmid_ds { -+ struct target_ipc_perm shm_perm; /* peration permission structure */ -+ abi_ulong shm_segsz; /* size of segment in bytes */ -+ int32_t shm_lpid; /* process ID of last shared memory op */ -+ int32_t shm_cpid; /* process ID of creator */ -+ int32_t shm_nattch; /* number of current attaches */ -+ 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() */ -+}; -+ -+/* 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; -+ -+typedef struct { -+ uint32_t __bits[TARGET_NSIG_WORDS]; -+} target_sigset_t; -+ -+struct target_sigaction { -+ abi_ulong _sa_handler; -+ int32_t sa_flags; -+ target_sigset_t sa_mask; -+}; -+ -+union target_sigval { -+ int32_t sival_int; -+ abi_ulong sival_ptr; -+ int32_t sigval_int; -+ abi_ulong sigval_ptr; -+}; -+ -+typedef struct target_siginfo { -+ int32_t si_signo; /* signal number */ -+ int32_t si_errno; /* errno association */ -+ int32_t si_code; /* signal code */ -+ int32_t si_pid; /* sending process */ -+ int32_t si_uid; /* sender's ruid */ -+ abi_ulong si_addr; /* faulting instruction */ -+ -+ union target_sigval si_value; /* signal value */ -+ -+ union { -+ struct { -+ int32_t _trapno; /* machine specific trap code */ -+ } _fault; -+ -+ /* POSIX.1b timers */ -+ struct { -+ int32_t _timerid; -+ int32_t _overrun; -+ } _timer; -+ -+ struct { -+ int32_t _mqd; -+ } _mesgp; -+ -+ /* SIGPOLL */ -+ struct { -+ int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ -+ } _poll; -+ -+ struct { -+ abi_long __spare1__; -+ int32_t __spare2_[7]; -+ } __spare__; -+ } _reason; -+} target_siginfo_t; -+ -+#if defined(TARGET_MIPS) -+ -+struct target_sigcontext { -+ target_sigset_t sc_mask; /* signal mask to retstore */ -+ int32_t sc_onstack; /* sigstack state to restore */ -+ abi_long sc_pc; /* pc at time of signal */ -+ abi_long sc_reg[32]; /* processor regs 0 to 31 */ -+ abi_long mullo, mulhi; /* mullo and mulhi registers */ -+ int32_t sc_fpused; /* fp has been used */ -+ abi_long sc_fpregs[33]; /* fp regs 0 to 31 & csr */ -+ abi_long sc_fpc_eir; /* fp exception instr reg */ -+ /* int32_t reserved[8]; */ -+}; -+ -+typedef struct target_mcontext { -+ int32_t mc_onstack; /* sigstack state to restore */ -+ abi_long mc_pc; /* pc at time of signal */ -+ abi_long mc_regs[32]; /* process regs 0 to 31 */ -+ abi_long sr; /* status register */ -+ abi_long mullo, mulhi; -+ int32_t mc_fpused; /* fp has been used */ -+ abi_long mc_fpregs[33]; /* fp regs 0 to 32 & csr */ -+ abi_long mc_fpc_eir; /* fp exception instr reg */ -+ abi_ulong mc_tls; /* pointer to TLS area */ -+} target_mcontext_t; -+ -+typedef struct target_ucontext { -+ target_sigset_t uc_sigmask; -+ target_mcontext_t uc_mcontext; -+ target_ulong uc_link; -+ target_stack_t uc_stack; -+ int32_t uc_flags; -+ int32_t __space__[8]; -+} target_ucontext_t; -+ -+struct target_sigframe { -+ abi_ulong sf_signum; -+ abi_ulong sf_siginfo; /* code or pointer to sf_si */ -+ abi_ulong sf_ucontext; /* points to sf_uc */ -+ abi_ulong sf_addr; /* undocumented 4th arg */ -+ target_ucontext_t sf_uc; /* = *sf_uncontext */ -+ target_siginfo_t sf_si; /* = *sf_siginfo (SA_SIGINFO case)*/ -+ uint32_t __spare__[2]; -+}; -+ -+#elif defined(TARGET_SPARC64) -+ -+struct target_mcontext { -+ uint64_t mc_global[8]; -+ uint64_t mc_out[8]; -+ uint64_t mc_local[8]; -+ uint64_t mc_in[8]; -+ uint32_t mc_fp[64]; -+} __aligned(64); -+ -+typedef struct target_mcontext target_mcontext_t; -+ -+typedef struct target_ucontext { -+ target_sigset_t uc_sigmask; -+ target_mcontext_t uc_mcontext; -+ target_ulong uc_link; -+ target_stack_t uc_stack; -+ int32_t uc_flags; -+ int32_t __space__[8]; -+} target_ucontext_t; -+ -+struct target_sigframe { -+ target_ucontext_t sf_uc; -+ target_siginfo_t sf_si; -+}; -+ -+#else -+ -+typedef target_ulong target_mcontext_t; /* dummy */ -+ -+#endif -+ -+/* XXX where did this come from? -+typedef struct target_ucontext { -+ target_ulong uc_flags; -+ target_ulong uc_link; -+ target_stack_t uc_stack; -+ target_mcontext_t uc_mcontext; -+ target_ulong uc_filer[80]; -+ target_sigset_t uc_sigmask; -+} target_ucontext_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->__bits[i] = tswapal(s->__bits[i]); -+} -+ -+#else -+static inline void -+tswap_sigset(target_sigset_t *d, const target_sigset_t *s) -+{ -+ -+ *d = *s; -+} -+#endif -+ -+/* XXX -+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); -+int do_sigaction(int sig, const struct target_sigaction *act, -+ struct target_sigaction *oact); -diff --git a/bsd-user/x86_64/target_signal.h b/bsd-user/x86_64/target_signal.h -index 659cd40..ea89f5a 100644 ---- a/bsd-user/x86_64/target_signal.h -+++ b/bsd-user/x86_64/target_signal.h -@@ -3,17 +3,16 @@ - - #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; -- - static inline abi_ulong get_sp_from_cpustate(CPUX86State *state) - { - return state->regs[R_ESP]; - } - -+#define TARGET_SS_ONSTACK 0x0001 /* take signal on alternate stack */ -+#define TARGET_SS_DISABLE 0x0004 /* disable taking signals on -+ alternate stack */ -+ -+#define TARGET_MINSIGSTKSZ (512 * 4) -+#define TARGET_SIGSTKSZ (TARGET_MINSIGSTKSZ + 32768) -+ - #endif /* TARGET_SIGNAL_H */ -diff --git a/bsd-user/x86_64/target_vmparam.h b/bsd-user/x86_64/target_vmparam.h -new file mode 100644 -index 0000000..aa5e0e0 ---- /dev/null -+++ b/bsd-user/x86_64/target_vmparam.h -@@ -0,0 +1,28 @@ -+#ifndef _TARGET_VMPARAM_H_ -+#define _TARGET_VMPARAM_H_ -+ -+#if defined(__FreeBSD__) -+#define TARGET_VM_MAXUSER_ADDRESS (0x0000800000000000UL) -+ -+#define TARGET_USRSTACK (TARGET_VM_MAXUSER_ADDRESS - TARGET_PAGE_SIZE) -+ -+struct target_ps_strings { -+ abi_ulong ps_argvstr; -+ uint32_t ps_nargvstr; -+ abi_ulong ps_envstr; -+ uint32_t ps_nenvstr; -+}; -+ -+#define TARGET_SPACE_USRSPACE 4096 -+#define TARGET_ARG_MAX 262144 -+ -+#define TARGET_PS_STRINGS (TARGET_USRSTACK - sizeof(struct target_ps_strings)) -+ -+#define TARGET_SZSIGCODE 0 -+ -+#else -+ -+#define TARGET_USRSTACK 0 -+#endif -+ -+#endif /* _TARGET_VMPARAM_H_ */ -diff --git a/configure b/configure -index 169b9bd..34eca43 100755 ---- a/configure -+++ b/configure -@@ -1018,6 +1018,10 @@ x86_64-bsd-user \ - sparc-bsd-user \ - sparc64-bsd-user \ - arm-bsd-user \ -+armeb-bsd-user \ -+mips-bsd-user \ -+mipsel-bsd-user \ -+mips64-bsd-user \ - " - fi - -diff --git a/default-configs/armeb-bsd-user.mak b/default-configs/armeb-bsd-user.mak -new file mode 100644 -index 0000000..1b6fe65 ---- /dev/null -+++ b/default-configs/armeb-bsd-user.mak -@@ -0,0 +1,3 @@ -+# Default configuration for armeb-bsd-user -+ -+CONFIG_GDBSTUB_XML=y -diff --git a/default-configs/mips-bsd-user.mak b/default-configs/mips-bsd-user.mak -new file mode 100644 -index 0000000..3fb129a ---- /dev/null -+++ b/default-configs/mips-bsd-user.mak -@@ -0,0 +1 @@ -+# Default configuration for mips-bsd-user -diff --git a/default-configs/mips64-bsd-user.mak b/default-configs/mips64-bsd-user.mak -new file mode 100644 -index 0000000..d4e72a6 ---- /dev/null -+++ b/default-configs/mips64-bsd-user.mak -@@ -0,0 +1 @@ -+# Default configuration for mips64-bsd-user -diff --git a/default-configs/mipsel-bsd-user.mak b/default-configs/mipsel-bsd-user.mak -new file mode 100644 -index 0000000..312b9d5 ---- /dev/null -+++ b/default-configs/mipsel-bsd-user.mak -@@ -0,0 +1 @@ -+# Default configuration for mipsel-bsd-user -diff --git a/target-mips/mips-defs.h b/target-mips/mips-defs.h -index bf094a3..030937c 100644 ---- a/target-mips/mips-defs.h -+++ b/target-mips/mips-defs.h -@@ -10,8 +10,14 @@ - - #if defined(TARGET_MIPS64) - #define TARGET_LONG_BITS 64 --#define TARGET_PHYS_ADDR_SPACE_BITS 36 --#define TARGET_VIRT_ADDR_SPACE_BITS 42 -+//#define TARGET_PHYS_ADDR_SPACE_BITS 36 -+#define TARGET_PHYS_ADDR_SPACE_BITS 59 -+# ifdef TARGET_ABI32 -+# define TARGET_VIRT_ADDR_SPACE_BITS 32 -+# else -+//# define TARGET_VIRT_ADDR_SPACE_BITS 42 -+# define TARGET_VIRT_ADDR_SPACE_BITS 62 -+# endif - #else - #define TARGET_LONG_BITS 32 - #define TARGET_PHYS_ADDR_SPACE_BITS 36 -diff --git a/user-exec.c b/user-exec.c -index b9ea9dd..9ad4858 100644 ---- a/user-exec.c -+++ b/user-exec.c -@@ -34,11 +34,11 @@ - #undef EDI - #undef EIP - #include <signal.h> --#ifdef __linux__ -+#if defined(__linux__) || defined(__FreeBSD__) - #include <sys/ucontext.h> - #endif - --//#define DEBUG_SIGNAL -+#define DEBUG_SIGNAL - - static void exception_action(CPUArchState *env1) - { -@@ -58,6 +58,8 @@ void cpu_resume_from_signal(CPUArchState *env1, void *puc) - struct ucontext *uc = puc; - #elif defined(__OpenBSD__) - struct sigcontext *uc = puc; -+#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) -+ ucontext_t *uc = puc; - #endif - - #ifndef CONFIG_TCG_PASS_AREG0 -@@ -76,6 +78,8 @@ void cpu_resume_from_signal(CPUArchState *env1, void *puc) - #endif - #elif defined(__OpenBSD__) - sigprocmask(SIG_SETMASK, &uc->sc_mask, NULL); -+#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) -+ sigprocmask(SIG_SETMASK, &uc->uc_sigmask, NULL); - #endif - } - env1->exception_index = -1; |