Infrastructure tweaks to allow having both an Elf32 and an Elf64 executable
handler in the kernel at the same time. Also, allow for the exec_new_vmspace() code to build a different sized vmspace depending on the executable environment. This is a big help for execing i386 binaries on ia64. The ELF exec code grows the ability to map partial pages when there is a page size difference, eg: emulating 4K pages on 8K or 16K hardware pages. Flesh out the i386 emulation support for ia64. At this point, the only binary that I know of that fails is cvsup, because the cvsup runtime tries to execute code in pages not marked executable. Obtained from: dfr (mostly, many tweaks from me).
This commit is contained in:
parent
382f95d332
commit
3ebc124838
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=100384
@ -32,9 +32,47 @@
|
||||
#include <sys/proc.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/linker.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
struct sysentvec elf64_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf64_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF64",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf64_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_ALPHA,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf64_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf64_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
/* Process one elf relocation with addend. */
|
||||
int
|
||||
@ -85,7 +123,7 @@ elf_reloc(linker_file_t lf, const void *data, int type)
|
||||
addr = elf_lookup(lf, symidx, 1);
|
||||
if (addr == 0)
|
||||
return -1;
|
||||
addr += addend;
|
||||
addr += addend;
|
||||
if (*where != addr)
|
||||
*where = addr;
|
||||
break;
|
||||
|
@ -189,13 +189,14 @@ struct sysentvec elf_linux_sysvec = {
|
||||
&linux_szsigcode,
|
||||
0,
|
||||
"Linux ELF",
|
||||
elf_coredump,
|
||||
elf64_coredump,
|
||||
exec_linux_imgact_try,
|
||||
LINUX_MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf64_Brandinfo linux_brand = {
|
||||
ELFOSABI_LINUX,
|
||||
EM_ALPHA,
|
||||
"Linux",
|
||||
"/compat/linux",
|
||||
"/lib/ld-linux.so.1",
|
||||
@ -204,6 +205,7 @@ static Elf64_Brandinfo linux_brand = {
|
||||
|
||||
static Elf64_Brandinfo linux_glibc2brand = {
|
||||
ELFOSABI_LINUX,
|
||||
EM_ALPHA,
|
||||
"Linux",
|
||||
"/compat/linux",
|
||||
"/lib/ld-linux.so.2",
|
||||
@ -229,7 +231,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
|
||||
case MOD_LOAD:
|
||||
for (brandinfo = &linux_brandlist[0]; *brandinfo != NULL;
|
||||
++brandinfo)
|
||||
if (elf_insert_brand_entry(*brandinfo) < 0)
|
||||
if (elf64_insert_brand_entry(*brandinfo) < 0)
|
||||
error = EINVAL;
|
||||
if (error == 0) {
|
||||
SET_FOREACH(lihp, linux_ioctl_handler_set)
|
||||
@ -242,12 +244,12 @@ linux_elf_modevent(module_t mod, int type, void *data)
|
||||
case MOD_UNLOAD:
|
||||
for (brandinfo = &linux_brandlist[0]; *brandinfo != NULL;
|
||||
++brandinfo)
|
||||
if (elf_brand_inuse(*brandinfo))
|
||||
if (elf64_brand_inuse(*brandinfo))
|
||||
error = EBUSY;
|
||||
if (error == 0) {
|
||||
for (brandinfo = &linux_brandlist[0];
|
||||
*brandinfo != NULL; ++brandinfo)
|
||||
if (elf_remove_brand_entry(*brandinfo) < 0)
|
||||
if (elf64_remove_brand_entry(*brandinfo) < 0)
|
||||
error = EINVAL;
|
||||
}
|
||||
if (error == 0) {
|
||||
|
@ -178,7 +178,7 @@ exec_osf1_imgact(struct image_params *imgp)
|
||||
/*
|
||||
* Destroy old process VM and create a new one (with a new stack).
|
||||
*/
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
|
||||
/*
|
||||
* The vm space can now be changed.
|
||||
|
@ -26,9 +26,49 @@
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/linker.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
struct sysentvec elf32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF32",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
/* Process one elf relocation with addend. */
|
||||
int
|
||||
|
103
sys/amd64/ia32/ia32.h
Normal file
103
sys/amd64/ia32/ia32.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*-
|
||||
* Copyright (c) 2001 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _IA64_IA32_IA32_H_
|
||||
#define _IA64_IA32_IA32_H_
|
||||
|
||||
#define PTRIN(v) (void *)(uintptr_t) (v)
|
||||
#define PTROUT(v) (u_int32_t)(uintptr_t) (v)
|
||||
|
||||
#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
|
||||
#define PTRIN_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTRIN((src).fld); } while (0)
|
||||
#define PTROUT_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTROUT((src).fld); } while (0)
|
||||
|
||||
struct timeval32 {
|
||||
int32_t tv_sec;
|
||||
int32_t tv_usec;
|
||||
};
|
||||
#define TV_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_usec); \
|
||||
} while (0);
|
||||
|
||||
struct timespec32 {
|
||||
u_int32_t tv_sec;
|
||||
u_int32_t tv_nsec;
|
||||
};
|
||||
#define TS_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_nsec); \
|
||||
} while (0);
|
||||
|
||||
struct rusage32 {
|
||||
struct timeval32 ru_utime;
|
||||
struct timeval32 ru_stime;
|
||||
int32_t ru_maxrss;
|
||||
int32_t ru_ixrss;
|
||||
int32_t ru_idrss;
|
||||
int32_t ru_isrss;
|
||||
int32_t ru_minflt;
|
||||
int32_t ru_majflt;
|
||||
int32_t ru_nswap;
|
||||
int32_t ru_inblock;
|
||||
int32_t ru_oublock;
|
||||
int32_t ru_msgsnd;
|
||||
int32_t ru_msgrcv;
|
||||
int32_t ru_nsignals;
|
||||
int32_t ru_nvcsw;
|
||||
int32_t ru_nivcsw;
|
||||
};
|
||||
|
||||
struct statfs32 {
|
||||
int32_t f_spare2;
|
||||
int32_t f_bsize;
|
||||
int32_t f_iosize;
|
||||
int32_t f_blocks;
|
||||
int32_t f_bfree;
|
||||
int32_t f_bavail;
|
||||
int32_t f_files;
|
||||
int32_t f_ffree;
|
||||
fsid_t f_fsid;
|
||||
uid_t f_owner;
|
||||
int32_t f_type;
|
||||
int32_t f_flags;
|
||||
int32_t f_syncwrites;
|
||||
int32_t f_asyncwrites;
|
||||
char f_fstypename[MFSNAMELEN];
|
||||
char f_mntonname[MNAMELEN];
|
||||
int32_t f_syncreads;
|
||||
int32_t f_asyncreads;
|
||||
int16_t f_spares1;
|
||||
char f_mntfromname[MNAMELEN];
|
||||
int16_t f_spares2;
|
||||
int32_t f_spare[2];
|
||||
};
|
||||
|
||||
#endif /* !_IA64_IA32_IA32_H_ */
|
1339
sys/amd64/ia32/ia32_misc.c
Normal file
1339
sys/amd64/ia32/ia32_misc.c
Normal file
File diff suppressed because it is too large
Load Diff
365
sys/amd64/ia32/ia32_sysvec.c
Normal file
365
sys/amd64/ia32/ia32_sysvec.c
Normal file
@ -0,0 +1,365 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#define __ELF_WORD_SIZE 32
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/exec.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/pioctl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/procfs.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm_map.h>
|
||||
#include <vm/vm_object.h>
|
||||
#include <vm/vm_extern.h>
|
||||
|
||||
#include <ia64/ia32/ia32_util.h>
|
||||
#include <i386/include/psl.h>
|
||||
#include <i386/include/segments.h>
|
||||
#include <i386/include/specialreg.h>
|
||||
#include <machine/frame.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
static register_t *ia32_copyout_strings(struct image_params *imgp);
|
||||
static void ia32_setregs(struct thread *td, u_long entry, u_long stack,
|
||||
u_long ps_strings);
|
||||
|
||||
extern struct sysent ia32_sysent[];
|
||||
|
||||
static char ia32_sigcode[] = {
|
||||
0xff, 0x54, 0x24, 0x10, /* call *SIGF_HANDLER(%esp) */
|
||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_UC(%esp),%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xf7, 0x40, 0x54, 0x00, 0x00, 0x02, 0x02, /* testl $PSL_VM,UC_EFLAGS(%eax) */
|
||||
0x75, 0x03, /* jne 9f */
|
||||
0x8e, 0x68, 0x14, /* movl UC_GS(%eax),%gs */
|
||||
0xb8, 0x57, 0x01, 0x00, 0x00, /* 9: movl $SYS_sigreturn,%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xcd, 0x80, /* int $0x80 */
|
||||
0xeb, 0xfe, /* 0: jmp 0b */
|
||||
0, 0, 0, 0
|
||||
};
|
||||
static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
|
||||
|
||||
struct sysentvec ia32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
ia32_sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
ia32_sigcode,
|
||||
&ia32_szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF",
|
||||
elf32_coredump,
|
||||
NULL,
|
||||
MINSIGSTKSZ,
|
||||
4096,
|
||||
IA32_USRSTACK,
|
||||
IA32_USRSTACK,
|
||||
ia32_copyout_strings,
|
||||
ia32_setregs
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo ia32_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"/compat/ia32",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&ia32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&ia32_brand_info);
|
||||
|
||||
static register_t *
|
||||
ia32_copyout_strings(struct image_params *imgp)
|
||||
{
|
||||
int argc, envc;
|
||||
u_int32_t *vectp;
|
||||
char *stringp, *destp;
|
||||
u_int32_t *stack_base;
|
||||
struct ia32_ps_strings *arginfo;
|
||||
int szsigcode;
|
||||
|
||||
/*
|
||||
* Calculate string base and vector table pointers.
|
||||
* Also deal with signal trampoline code for this exec type.
|
||||
*/
|
||||
arginfo = (struct ia32_ps_strings *)IA32_PS_STRINGS;
|
||||
szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
|
||||
destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
|
||||
roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
|
||||
|
||||
/*
|
||||
* install sigcode
|
||||
*/
|
||||
if (szsigcode)
|
||||
copyout(imgp->proc->p_sysent->sv_sigcode,
|
||||
((caddr_t)arginfo - szsigcode), szsigcode);
|
||||
|
||||
/*
|
||||
* If we have a valid auxargs ptr, prepare some room
|
||||
* on the stack.
|
||||
*/
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
* 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
|
||||
* lower compatibility.
|
||||
*/
|
||||
imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size
|
||||
: (AT_COUNT * 2);
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets,and imgp->auxarg_size is room
|
||||
* for argument of Runtime loader.
|
||||
*/
|
||||
vectp = (u_int32_t *) (destp - (imgp->argc + imgp->envc + 2 +
|
||||
imgp->auxarg_size) * sizeof(u_int32_t));
|
||||
|
||||
} else
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets
|
||||
*/
|
||||
vectp = (u_int32_t *)
|
||||
(destp - (imgp->argc + imgp->envc + 2) * sizeof(u_int32_t));
|
||||
|
||||
/*
|
||||
* vectp also becomes our initial stack base
|
||||
*/
|
||||
stack_base = vectp;
|
||||
|
||||
stringp = imgp->stringbase;
|
||||
argc = imgp->argc;
|
||||
envc = imgp->envc;
|
||||
|
||||
/*
|
||||
* Copy out strings - arguments and environment.
|
||||
*/
|
||||
copyout(stringp, destp, ARG_MAX - imgp->stringspace);
|
||||
|
||||
/*
|
||||
* Fill in "ps_strings" struct for ps, w, etc.
|
||||
*/
|
||||
suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nargvstr, argc);
|
||||
|
||||
/*
|
||||
* Fill in argument portion of vector table.
|
||||
*/
|
||||
for (; argc > 0; --argc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* a null vector table pointer separates the argp's from the envp's */
|
||||
suword32(vectp++, 0);
|
||||
|
||||
suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nenvstr, envc);
|
||||
|
||||
/*
|
||||
* Fill in environment portion of vector table.
|
||||
*/
|
||||
for (; envc > 0; --envc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* end of vector table is a null pointer */
|
||||
suword32(vectp, 0);
|
||||
|
||||
return ((register_t *)stack_base);
|
||||
}
|
||||
|
||||
static void
|
||||
ia32_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
vm_offset_t gdt, ldt;
|
||||
u_int64_t codesel, datasel, ldtsel;
|
||||
u_int64_t codeseg, dataseg, gdtseg, ldtseg;
|
||||
struct segment_descriptor desc;
|
||||
struct vmspace *vmspace = td->td_proc->p_vmspace;
|
||||
|
||||
/*
|
||||
* Make sure that we restore the entire trapframe after an
|
||||
* execve.
|
||||
*/
|
||||
frame->tf_flags &= ~FRAME_SYSCALL;
|
||||
|
||||
bzero(frame->tf_r, sizeof(frame->tf_r));
|
||||
bzero(frame->tf_f, sizeof(frame->tf_f));
|
||||
|
||||
frame->tf_cr_iip = entry;
|
||||
frame->tf_cr_ipsr = (IA64_PSR_IC
|
||||
| IA64_PSR_I
|
||||
| IA64_PSR_IT
|
||||
| IA64_PSR_DT
|
||||
| IA64_PSR_RT
|
||||
| IA64_PSR_DFH
|
||||
| IA64_PSR_IS
|
||||
| IA64_PSR_BN
|
||||
| IA64_PSR_CPL_USER);
|
||||
frame->tf_r[FRAME_R12] = stack;
|
||||
|
||||
codesel = LSEL(LUCODE_SEL, SEL_UPL);
|
||||
datasel = LSEL(LUDATA_SEL, SEL_UPL);
|
||||
ldtsel = GSEL(GLDT_SEL, SEL_UPL);
|
||||
|
||||
#if 1
|
||||
frame->tf_r[FRAME_R16] = (datasel << 48) | (datasel << 32)
|
||||
| (datasel << 16) | datasel;
|
||||
frame->tf_r[FRAME_R17] = (ldtsel << 32) | (datasel << 16) | codesel;
|
||||
#else
|
||||
frame->tf_r[FRAME_R16] = datasel;
|
||||
frame->tf_r[FRAME_R17] = codesel;
|
||||
frame->tf_r[FRAME_R18] = datasel;
|
||||
frame->tf_r[FRAME_R19] = datasel;
|
||||
frame->tf_r[FRAME_R20] = datasel;
|
||||
frame->tf_r[FRAME_R21] = datasel;
|
||||
frame->tf_r[FRAME_R22] = ldtsel;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Build the GDT and LDT.
|
||||
*/
|
||||
gdt = IA32_USRSTACK;
|
||||
vm_map_find(&vmspace->vm_map, 0, 0,
|
||||
&gdt, PAGE_SIZE, 0,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
ldt = gdt + 4096;
|
||||
|
||||
desc.sd_lolimit = 8*NLDT-1;
|
||||
desc.sd_lobase = ldt & 0xffffff;
|
||||
desc.sd_type = SDT_SYSLDT;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = 0;
|
||||
desc.sd_def32 = 0;
|
||||
desc.sd_gran = 0;
|
||||
desc.sd_hibase = ldt >> 24;
|
||||
copyout(&desc, (caddr_t) gdt + 8*GLDT_SEL, sizeof(desc));
|
||||
|
||||
desc.sd_lolimit = ((IA32_USRSTACK >> 12) - 1) & 0xffff;
|
||||
desc.sd_lobase = 0;
|
||||
desc.sd_type = SDT_MEMERA;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = ((IA32_USRSTACK >> 12) - 1) >> 16;
|
||||
desc.sd_def32 = 1;
|
||||
desc.sd_gran = 1;
|
||||
desc.sd_hibase = 0;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUCODE_SEL, sizeof(desc));
|
||||
desc.sd_type = SDT_MEMRWA;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUDATA_SEL, sizeof(desc));
|
||||
|
||||
codeseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMERA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
dataseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMRWA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
ia64_set_csd(codeseg);
|
||||
ia64_set_ssd(dataseg);
|
||||
frame->tf_r[FRAME_R24] = dataseg; /* ESD */
|
||||
frame->tf_r[FRAME_R27] = dataseg; /* DSD */
|
||||
frame->tf_r[FRAME_R28] = dataseg; /* FSD */
|
||||
frame->tf_r[FRAME_R29] = dataseg; /* GSD */
|
||||
|
||||
gdtseg = gdt /* base */
|
||||
+ ((8L*NGDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSNULL << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
ldtseg = ldt /* base */
|
||||
+ ((8L*NLDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSLDT << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
frame->tf_r[FRAME_R30] = ldtseg; /* LDTD */
|
||||
frame->tf_r[FRAME_R31] = gdtseg; /* GDTD */
|
||||
|
||||
ia64_set_eflag(PSL_USER);
|
||||
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
frame->tf_r[FRAME_R11] = IA32_PS_STRINGS;
|
||||
|
||||
/*
|
||||
* XXX - Linux emulator
|
||||
* Make sure sure edx is 0x0 on entry. Linux binaries depend
|
||||
* on it.
|
||||
*/
|
||||
td->td_retval[1] = 0;
|
||||
}
|
94
sys/amd64/ia32/ia32_util.h
Normal file
94
sys/amd64/ia32/ia32_util.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*-
|
||||
* Copyright (c) 1998-1999 Andrew Gallatin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software withough specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
|
||||
#include <sys/exec.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
|
||||
#ifndef SCARG
|
||||
#define SCARG(p, x) (p)->x
|
||||
#endif
|
||||
|
||||
struct ia32_ps_strings {
|
||||
u_int32_t ps_argvstr; /* first of 0 or more argument strings */
|
||||
int ps_nargvstr; /* the number of argument strings */
|
||||
u_int32_t ps_envstr; /* first of 0 or more environment strings */
|
||||
int ps_nenvstr; /* the number of environment strings */
|
||||
};
|
||||
|
||||
#define IA32_USRSTACK (4L*1024*1024*1024 - PAGE_SIZE)
|
||||
#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
|
||||
|
||||
static __inline caddr_t stackgap_init(void);
|
||||
static __inline void *stackgap_alloc(caddr_t *, size_t);
|
||||
|
||||
static __inline caddr_t
|
||||
stackgap_init()
|
||||
{
|
||||
#define szsigcode (*(curproc->p_sysent->sv_szsigcode))
|
||||
return (caddr_t)(((caddr_t)IA32_PS_STRINGS) - szsigcode - SPARE_USRSPACE);
|
||||
#undef szsigcode
|
||||
}
|
||||
|
||||
static __inline void *
|
||||
stackgap_alloc(sgp, sz)
|
||||
caddr_t *sgp;
|
||||
size_t sz;
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = (void *) *sgp;
|
||||
*sgp += ALIGN(sz);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
extern const char ia32_emul_path[];
|
||||
int ia32_emul_find(struct thread *, caddr_t *, const char *, char *,
|
||||
char **, int);
|
||||
|
||||
#define CHECKALT(p, sgp, path, i) \
|
||||
do { \
|
||||
int _error; \
|
||||
\
|
||||
_error = ia32_emul_find(p, sgp, ia32_emul_path, path, \
|
||||
&path, i); \
|
||||
if (_error == EFAULT) \
|
||||
return (_error); \
|
||||
} while (0)
|
||||
|
||||
#define CHECKALTEXIST(p, sgp, path) CHECKALT((p), (sgp), (path), 0)
|
||||
#define CHECKALTCREAT(p, sgp, path) CHECKALT((p), (sgp), (path), 1)
|
@ -36,6 +36,9 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/sysproto.h>
|
||||
#include <sys/mount.h>
|
||||
#include <ia64/ia32/ia32.h>
|
||||
#include <ia64/ia32/ia32_proto.h>
|
||||
|
||||
; Reserved/unimplemented system calls in the range 0-150 inclusive
|
||||
; are reserved for use in future Berkeley releases.
|
||||
@ -43,200 +46,189 @@
|
||||
; redistributions should be placed in the reserved range at the end
|
||||
; of the current calls.
|
||||
|
||||
0 STD NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MSTD NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MSTD POSIX { int fork(void); }
|
||||
3 MSTD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MSTD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int open(char *path, int flags, int mode); }
|
||||
0 MNOPROTO NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MNOPROTO NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MNOPROTO POSIX { int fork(void); }
|
||||
3 MNOPROTO POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MNOPROTO POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int ia32_open(char *path, int flags, int mode); }
|
||||
; XXX should be { int open(const char *path, int flags, ...); }
|
||||
; but we're not ready for `const' or varargs.
|
||||
; XXX man page says `mode_t mode'.
|
||||
6 MSTD POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int wait4(int pid, int *status, int options, \
|
||||
struct rusage *rusage); } wait4 wait_args int
|
||||
8 COMPAT BSD { int creat(char *path, int mode); }
|
||||
9 STD POSIX { int link(char *path, char *link); }
|
||||
10 STD POSIX { int unlink(char *path); }
|
||||
6 MNOPROTO POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int ia32_wait4(int pid, int *status, int options, \
|
||||
struct rusage32 *rusage); }
|
||||
8 OBSOL BSD old creat
|
||||
9 NOPROTO POSIX { int link(char *path, char *link); }
|
||||
10 NOPROTO POSIX { int unlink(char *path); }
|
||||
11 OBSOL NOHIDE execv
|
||||
12 STD POSIX { int chdir(char *path); }
|
||||
13 STD BSD { int fchdir(int fd); }
|
||||
14 STD POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 STD POSIX { int chmod(char *path, int mode); }
|
||||
16 STD POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MSTD BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int getfsstat(struct statfs *buf, long bufsize, \
|
||||
int flags); }
|
||||
19 COMPAT POSIX { long lseek(int fd, long offset, int whence); }
|
||||
20 MSTD POSIX { pid_t getpid(void); }
|
||||
21 STD BSD { int mount(char *type, char *path, int flags, \
|
||||
12 NOPROTO POSIX { int chdir(char *path); }
|
||||
13 NOPROTO BSD { int fchdir(int fd); }
|
||||
14 NOPROTO POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 NOPROTO POSIX { int chmod(char *path, int mode); }
|
||||
16 NOPROTO POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MNOPROTO BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int ia32_getfsstat(struct statfs32 *buf, \
|
||||
long bufsize, int flags); }
|
||||
19 OBSOL POSIX olseek
|
||||
20 MNOPROTO POSIX { pid_t getpid(void); }
|
||||
21 NOPROTO BSD { int mount(char *type, char *path, int flags, \
|
||||
caddr_t data); }
|
||||
; XXX `path' should have type `const char *' but we're not ready for that.
|
||||
22 STD BSD { int unmount(char *path, int flags); }
|
||||
23 MSTD POSIX { int setuid(uid_t uid); }
|
||||
24 MSTD POSIX { uid_t getuid(void); }
|
||||
25 MSTD POSIX { uid_t geteuid(void); }
|
||||
26 STD BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
22 NOPROTO BSD { int unmount(char *path, int flags); }
|
||||
23 MNOPROTO POSIX { int setuid(uid_t uid); }
|
||||
24 MNOPROTO POSIX { uid_t getuid(void); }
|
||||
25 MNOPROTO POSIX { uid_t geteuid(void); }
|
||||
26 NOPROTO BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
int data); }
|
||||
27 MSTD BSD { int recvmsg(int s, struct msghdr *msg, int flags); }
|
||||
28 MSTD BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MSTD BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
27 UNIMPL BSD recvmsg
|
||||
28 MNOPROTO BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); }
|
||||
30 MSTD BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MSTD BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MSTD BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int access(char *path, int flags); }
|
||||
34 STD BSD { int chflags(char *path, int flags); }
|
||||
35 STD BSD { int fchflags(int fd, int flags); }
|
||||
36 STD BSD { int sync(void); }
|
||||
37 MSTD POSIX { int kill(int pid, int signum); }
|
||||
38 COMPAT POSIX { int stat(char *path, struct ostat *ub); }
|
||||
39 MSTD POSIX { pid_t getppid(void); }
|
||||
40 COMPAT POSIX { int lstat(char *path, struct ostat *ub); }
|
||||
41 STD POSIX { int dup(u_int fd); }
|
||||
42 STD POSIX { int pipe(void); }
|
||||
43 MSTD POSIX { gid_t getegid(void); }
|
||||
44 MSTD BSD { int profil(caddr_t samples, size_t size, \
|
||||
30 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MNOPROTO BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MNOPROTO BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int ia32_access(char *path, int flags); }
|
||||
34 STD BSD { int ia32_chflags(char *path, int flags); }
|
||||
35 NOPROTO BSD { int fchflags(int fd, int flags); }
|
||||
36 NOPROTO BSD { int sync(void); }
|
||||
37 MNOPROTO POSIX { int kill(int pid, int signum); }
|
||||
38 UNIMPL POSIX ostat
|
||||
39 MNOPROTO POSIX { pid_t getppid(void); }
|
||||
40 UNIMPL POSIX olstat
|
||||
41 NOPROTO POSIX { int dup(u_int fd); }
|
||||
42 NOPROTO POSIX { int pipe(void); }
|
||||
43 MNOPROTO POSIX { gid_t getegid(void); }
|
||||
44 MNOPROTO BSD { int profil(caddr_t samples, size_t size, \
|
||||
size_t offset, u_int scale); }
|
||||
45 STD BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
45 NOPROTO BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
int pid); }
|
||||
46 MCOMPAT POSIX { int sigaction(int signum, struct osigaction *nsa, \
|
||||
struct osigaction *osa); }
|
||||
47 MSTD POSIX { gid_t getgid(void); }
|
||||
48 MCOMPAT POSIX { int sigprocmask(int how, osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it, and we return the old mask as the
|
||||
; (int) return value.
|
||||
49 MSTD BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MSTD BSD { int setlogin(char *namebuf); }
|
||||
51 MSTD BSD { int acct(char *path); }
|
||||
52 MCOMPAT POSIX { int sigpending(void); }
|
||||
53 MSTD BSD { int sigaltstack(stack_t *ss, stack_t *oss); }
|
||||
54 MSTD POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MSTD BSD { int reboot(int opt); }
|
||||
56 STD POSIX { int revoke(char *path); }
|
||||
57 STD POSIX { int symlink(char *path, char *link); }
|
||||
58 STD POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 MSTD POSIX { int execve(char *fname, char **argv, char **envv); }
|
||||
60 MSTD POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 STD BSD { int chroot(char *path); }
|
||||
62 MCOMPAT POSIX { int fstat(int fd, struct ostat *sb); }
|
||||
63 MCOMPAT BSD { int getkerninfo(int op, char *where, size_t *size, \
|
||||
int arg); } getkerninfo getkerninfo_args int
|
||||
64 MCOMPAT BSD { int getpagesize(void); } \
|
||||
getpagesize getpagesize_args int
|
||||
65 STD BSD { int msync(void *addr, size_t len, int flags); }
|
||||
66 MSTD BSD { int vfork(void); }
|
||||
46 UNIMPL POSIX osigaction
|
||||
47 MNOPROTO POSIX { gid_t getgid(void); }
|
||||
48 UNIMPL POSIX osigprocmask
|
||||
49 MNOPROTO BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MNOPROTO BSD { int setlogin(char *namebuf); }
|
||||
51 MNOPROTO BSD { int acct(char *path); }
|
||||
52 MNOPROTO POSIX { int sigpending(void); }
|
||||
53 STD BSD { int ia32_sigaltstack(struct sigaltstack32 *ss, struct sigaltstack32 *oss); }
|
||||
54 MNOPROTO POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MNOPROTO BSD { int reboot(int opt); }
|
||||
56 NOPROTO POSIX { int revoke(char *path); }
|
||||
57 NOPROTO POSIX { int symlink(char *path, char *link); }
|
||||
58 NOPROTO POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 STD POSIX { int ia32_execve(char *fname, u_int32_t *argv, u_int32_t *envv); }
|
||||
60 MNOPROTO POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 NOPROTO BSD { int chroot(char *path); }
|
||||
62 OBSOL POSIX ofstat
|
||||
63 OBSOL BSD ogetkerninfo
|
||||
64 OBSOL BSD ogetpagesize
|
||||
65 OBSOL BSD omsync
|
||||
66 OBSOL BSD ovfork
|
||||
67 OBSOL NOHIDE vread
|
||||
68 OBSOL NOHIDE vwrite
|
||||
69 MSTD BSD { int sbrk(int incr); }
|
||||
70 MSTD BSD { int sstk(int incr); }
|
||||
71 MCOMPAT BSD { int mmap(void *addr, int len, int prot, \
|
||||
int flags, int fd, long pos); }
|
||||
72 MSTD BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MSTD BSD { int munmap(void *addr, size_t len); }
|
||||
74 MSTD BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MSTD BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
69 MNOPROTO BSD { int sbrk(int incr); }
|
||||
70 MNOPROTO BSD { int sstk(int incr); }
|
||||
71 OBSOL BSD ommap
|
||||
72 MNOPROTO BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MNOPROTO BSD { int munmap(void *addr, size_t len); }
|
||||
74 MNOPROTO BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MNOPROTO BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
76 OBSOL NOHIDE vhangup
|
||||
77 OBSOL NOHIDE vlimit
|
||||
78 MSTD BSD { int mincore(const void *addr, size_t len, \
|
||||
78 MNOPROTO BSD { int mincore(const void *addr, size_t len, \
|
||||
char *vec); }
|
||||
79 MSTD POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MSTD POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MSTD POSIX { int getpgrp(void); }
|
||||
82 MSTD POSIX { int setpgid(int pid, int pgid); }
|
||||
83 MSTD BSD { int setitimer(u_int which, struct itimerval *itv, \
|
||||
struct itimerval *oitv); }
|
||||
84 MCOMPAT BSD { int wait(void); }
|
||||
85 MSTD BSD { int swapon(char *name); }
|
||||
86 MSTD BSD { int getitimer(u_int which, struct itimerval *itv); }
|
||||
87 MCOMPAT BSD { int gethostname(char *hostname, u_int len); } \
|
||||
gethostname gethostname_args int
|
||||
88 MCOMPAT BSD { int sethostname(char *hostname, u_int len); } \
|
||||
sethostname sethostname_args int
|
||||
89 MSTD BSD { int getdtablesize(void); }
|
||||
90 MSTD POSIX { int dup2(u_int from, u_int to); }
|
||||
79 MNOPROTO POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MNOPROTO POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MNOPROTO POSIX { int getpgrp(void); }
|
||||
82 MNOPROTO POSIX { int setpgid(int pid, int pgid); }
|
||||
83 STD BSD { int ia32_setitimer(u_int which, \
|
||||
struct itimerval32 *itv, \
|
||||
struct itimerval32 *oitv); }
|
||||
84 OBSOL BSD owait
|
||||
85 OBSOL BSD oswapon
|
||||
86 OBSOL BSD ogetitimer
|
||||
87 OBSOL BSD ogethostname
|
||||
88 OBSOL BSD osethostname
|
||||
89 MNOPROTO BSD { int getdtablesize(void); }
|
||||
90 MNOPROTO POSIX { int dup2(u_int from, u_int to); }
|
||||
91 UNIMPL BSD getdopt
|
||||
92 MSTD POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
92 MNOPROTO POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
; XXX should be { int fcntl(int fd, int cmd, ...); }
|
||||
; but we're not ready for varargs.
|
||||
; XXX man page says `int arg' too.
|
||||
93 MSTD BSD { int select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval *tv); }
|
||||
93 STD BSD { int ia32_select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval32 *tv); }
|
||||
; XXX need to override for big-endian - little-endian should work fine.
|
||||
94 UNIMPL BSD setdopt
|
||||
95 STD POSIX { int fsync(int fd); }
|
||||
96 MSTD BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MSTD BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MSTD BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MCPT_NOA BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
95 NOPROTO POSIX { int fsync(int fd); }
|
||||
96 MNOPROTO BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MNOPROTO BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MNOPROTO BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
accept accept_args int
|
||||
100 MSTD BSD { int getpriority(int which, int who); }
|
||||
101 MCOMPAT BSD { int send(int s, caddr_t buf, int len, int flags); }
|
||||
102 MCOMPAT BSD { int recv(int s, caddr_t buf, int len, int flags); }
|
||||
103 STD BSD { int osigreturn(struct osigcontext *sigcntxp); }
|
||||
104 MSTD BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MSTD BSD { int setsockopt(int s, int level, int name, \
|
||||
100 MNOPROTO BSD { int getpriority(int which, int who); }
|
||||
101 OBSOL BSD osend
|
||||
102 OBSOL BSD orecv
|
||||
103 OBSOL BSD osigreturn
|
||||
104 MNOPROTO BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MNOPROTO BSD { int setsockopt(int s, int level, int name, \
|
||||
caddr_t val, int valsize); }
|
||||
106 MSTD BSD { int listen(int s, int backlog); }
|
||||
106 MNOPROTO BSD { int listen(int s, int backlog); }
|
||||
107 OBSOL NOHIDE vtimes
|
||||
108 MCOMPAT BSD { int sigvec(int signum, struct sigvec *nsv, \
|
||||
struct sigvec *osv); }
|
||||
109 MCOMPAT BSD { int sigblock(int mask); }
|
||||
110 MCOMPAT BSD { int sigsetmask(int mask); }
|
||||
111 MCOMPAT POSIX { int sigsuspend(osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it.
|
||||
112 MCOMPAT BSD { int sigstack(struct sigstack *nss, \
|
||||
struct sigstack *oss); }
|
||||
113 MCOMPAT BSD { int recvmsg(int s, struct omsghdr *msg, int flags); }
|
||||
114 MCOMPAT BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
108 OBSOL BSD osigvec
|
||||
109 OBSOL BSD osigblock
|
||||
110 OBSOL BSD osigsetmask
|
||||
111 OBSOL POSIX osigsuspend
|
||||
112 OBSOL BSD osigstack
|
||||
113 OBSOL BSD orecvmsg
|
||||
114 OBSOL BSD osendmsg
|
||||
115 OBSOL NOHIDE vtrace
|
||||
116 MSTD BSD { int gettimeofday(struct timeval *tp, \
|
||||
116 STD BSD { int ia32_gettimeofday(struct timeval32 *tp, \
|
||||
struct timezone *tzp); }
|
||||
117 MSTD BSD { int getrusage(int who, struct rusage *rusage); }
|
||||
118 MSTD BSD { int getsockopt(int s, int level, int name, \
|
||||
117 STD BSD { int ia32_getrusage(int who, struct rusage32 *rusage); }
|
||||
118 MNOPROTO BSD { int getsockopt(int s, int level, int name, \
|
||||
caddr_t val, int *avalsize); }
|
||||
119 UNIMPL NOHIDE resuba (BSD/OS 2.x)
|
||||
120 MSTD BSD { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
||||
121 MSTD BSD { int writev(int fd, struct iovec *iovp, \
|
||||
120 STD BSD { int ia32_readv(int fd, struct iovec32 *iovp, u_int iovcnt); }
|
||||
121 STD BSD { int ia32_writev(int fd, struct iovec32 *iovp, \
|
||||
u_int iovcnt); }
|
||||
122 MSTD BSD { int settimeofday(struct timeval *tv, \
|
||||
122 STD BSD { int ia32_settimeofday(struct timeval32 *tv, \
|
||||
struct timezone *tzp); }
|
||||
123 STD BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 STD BSD { int fchmod(int fd, int mode); }
|
||||
125 MCPT_NOA BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
123 NOPROTO BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 NOPROTO BSD { int fchmod(int fd, int mode); }
|
||||
125 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); } \
|
||||
recvfrom recvfrom_args int
|
||||
126 MSTD BSD { int setreuid(int ruid, int euid); }
|
||||
127 MSTD BSD { int setregid(int rgid, int egid); }
|
||||
128 STD POSIX { int rename(char *from, char *to); }
|
||||
129 COMPAT BSD { int truncate(char *path, long length); }
|
||||
130 COMPAT BSD { int ftruncate(int fd, long length); }
|
||||
131 MSTD BSD { int flock(int fd, int how); }
|
||||
132 STD POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MSTD BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
126 MNOPROTO BSD { int setreuid(int ruid, int euid); }
|
||||
127 MNOPROTO BSD { int setregid(int rgid, int egid); }
|
||||
128 NOPROTO POSIX { int rename(char *from, char *to); }
|
||||
129 OBSOL BSD otruncate
|
||||
130 OBSOL BSD ftruncate
|
||||
131 MNOPROTO BSD { int flock(int fd, int how); }
|
||||
132 NOPROTO POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MNOPROTO BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t to, int tolen); }
|
||||
134 MSTD BSD { int shutdown(int s, int how); }
|
||||
135 MSTD BSD { int socketpair(int domain, int type, int protocol, \
|
||||
134 MNOPROTO BSD { int shutdown(int s, int how); }
|
||||
135 MNOPROTO BSD { int socketpair(int domain, int type, int protocol, \
|
||||
int *rsv); }
|
||||
136 STD POSIX { int mkdir(char *path, int mode); }
|
||||
137 STD POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int utimes(char *path, struct timeval *tptr); }
|
||||
136 NOPROTO POSIX { int mkdir(char *path, int mode); }
|
||||
137 NOPROTO POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int ia32_utimes(char *path, \
|
||||
struct timeval32 *tptr); }
|
||||
139 OBSOL NOHIDE 4.2 sigreturn
|
||||
140 MSTD BSD { int adjtime(struct timeval *delta, \
|
||||
struct timeval *olddelta); }
|
||||
141 MCOMPAT BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
142 MCOMPAT BSD { long gethostid(void); }
|
||||
143 MCOMPAT BSD { int sethostid(long hostid); }
|
||||
144 MCOMPAT BSD { int getrlimit(u_int which, struct orlimit *rlp); }
|
||||
145 MCOMPAT BSD { int setrlimit(u_int which, struct orlimit *rlp); }
|
||||
146 MCOMPAT BSD { int killpg(int pgid, int signum); }
|
||||
147 MSTD POSIX { int setsid(void); }
|
||||
148 STD BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
140 STD BSD { int ia32_adjtime(struct timeval32 *delta, \
|
||||
struct timeval32 *olddelta); }
|
||||
141 OBSOL BSD ogetpeername
|
||||
142 OBSOL BSD ogethostid
|
||||
143 OBSOL BSD sethostid
|
||||
144 OBSOL BSD getrlimit
|
||||
145 OBSOL BSD setrlimit
|
||||
146 OBSOL BSD killpg
|
||||
147 MNOPROTO POSIX { int setsid(void); }
|
||||
148 NOPROTO BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
caddr_t arg); }
|
||||
149 MCOMPAT BSD { int quota(void); }
|
||||
150 MCPT_NOA BSD { int getsockname(int fdec, caddr_t asa, int *alen); }\
|
||||
getsockname getsockname_args int
|
||||
149 OBSOL BSD oquota
|
||||
150 OBSOL BSD ogetsockname
|
||||
|
||||
; Syscalls 151-180 inclusive are reserved for vendor-specific
|
||||
; system calls. (This includes various calls added for compatibity
|
||||
@ -247,136 +239,138 @@
|
||||
153 UNIMPL NOHIDE asyncdaemon (BSD/OS 2.x)
|
||||
154 UNIMPL NOHIDE nosys
|
||||
; 155 is initialized by the NFS code, if present.
|
||||
155 MNOIMPL BSD { int nfssvc(int flag, caddr_t argp); }
|
||||
156 COMPAT BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
155 UNIMPL NOHIDE nfssvc
|
||||
156 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
157 STD BSD { int statfs(char *path, struct statfs *buf); }
|
||||
158 STD BSD { int fstatfs(int fd, struct statfs *buf); }
|
||||
157 STD BSD { int ia32_statfs(char *path, struct statfs32 *buf); }
|
||||
158 STD BSD { int ia32_fstatfs(int fd, struct statfs32 *buf); }
|
||||
159 UNIMPL NOHIDE nosys
|
||||
160 UNIMPL NOHIDE nosys
|
||||
161 STD BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MSTD BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MSTD BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MSTD BSD { int uname(struct utsname *name); }
|
||||
165 STD BSD { int sysarch(int op, char *parms); }
|
||||
166 MSTD BSD { int rtprio(int function, pid_t pid, \
|
||||
161 NOPROTO BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MNOPROTO BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MNOPROTO BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MNOPROTO BSD { int uname(struct utsname *name); }
|
||||
165 NOPROTO BSD { int sysarch(int op, char *parms); }
|
||||
166 MNOPROTO BSD { int rtprio(int function, pid_t pid, \
|
||||
struct rtprio *rtp); }
|
||||
167 UNIMPL NOHIDE nosys
|
||||
168 UNIMPL NOHIDE nosys
|
||||
; 169 is initialized by the SYSVSEM code if present or loaded
|
||||
169 MNOSTD BSD { int semsys(int which, int a2, int a3, int a4, \
|
||||
169 STD BSD { int ia32_semsys(int which, int a2, int a3, int a4, \
|
||||
int a5); }
|
||||
; 169 is initialized by the SYSVMSG code if present or loaded
|
||||
; XXX should be { int semsys(int which, ...); }
|
||||
170 MNOSTD BSD { int msgsys(int which, int a2, int a3, int a4, \
|
||||
170 STD BSD { int ia32_msgsys(int which, int a2, int a3, int a4, \
|
||||
int a5, int a6); }
|
||||
; 169 is initialized by the SYSVSHM code if present or loaded
|
||||
; XXX should be { int msgsys(int which, ...); }
|
||||
171 MNOSTD BSD { int shmsys(int which, int a2, int a3, int a4); }
|
||||
; XXX should be { int shmsys(int which, ...); }
|
||||
171 STD BSD { int ia32_shmsys(int which, int a2, int a3, int a4); }
|
||||
172 UNIMPL NOHIDE nosys
|
||||
173 MSTD POSIX { ssize_t pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, off_t offset); }
|
||||
174 MSTD POSIX { ssize_t pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, off_t offset); }
|
||||
173 STD POSIX { ssize_t ia32_pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, u_int32_t offsetlo, u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
174 STD POSIX { ssize_t ia32_pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
175 UNIMPL NOHIDE nosys
|
||||
176 MSTD BSD { int ntp_adjtime(struct timex *tp); }
|
||||
176 MNOPROTO BSD { int ntp_adjtime(struct timex *tp); }
|
||||
177 UNIMPL NOHIDE sfork (BSD/OS 2.x)
|
||||
178 UNIMPL NOHIDE getdescriptor (BSD/OS 2.x)
|
||||
179 UNIMPL NOHIDE setdescriptor (BSD/OS 2.x)
|
||||
180 UNIMPL NOHIDE nosys
|
||||
|
||||
; Syscalls 181-199 are used by/reserved for BSD
|
||||
181 MSTD POSIX { int setgid(gid_t gid); }
|
||||
182 MSTD BSD { int setegid(gid_t egid); }
|
||||
183 MSTD BSD { int seteuid(uid_t euid); }
|
||||
181 MNOPROTO POSIX { int setgid(gid_t gid); }
|
||||
182 MNOPROTO BSD { int setegid(gid_t egid); }
|
||||
183 MNOPROTO BSD { int seteuid(uid_t euid); }
|
||||
184 UNIMPL BSD lfs_bmapv
|
||||
185 UNIMPL BSD lfs_markv
|
||||
186 UNIMPL BSD lfs_segclean
|
||||
187 UNIMPL BSD lfs_segwait
|
||||
188 STD POSIX { int stat(char *path, struct stat *ub); }
|
||||
189 MSTD POSIX { int fstat(int fd, struct stat *sb); }
|
||||
190 STD POSIX { int lstat(char *path, struct stat *ub); }
|
||||
191 STD POSIX { int pathconf(char *path, int name); }
|
||||
192 MSTD POSIX { int fpathconf(int fd, int name); }
|
||||
188 STD POSIX { int ia32_stat(char *path, struct stat32 *ub); }
|
||||
189 STD POSIX { int ia32_fstat(int fd, struct stat32 *ub); }
|
||||
190 STD POSIX { int ia32_lstat(char *path, struct stat32 *ub); }
|
||||
191 NOPROTO POSIX { int pathconf(char *path, int name); }
|
||||
192 MNOPROTO POSIX { int fpathconf(int fd, int name); }
|
||||
193 UNIMPL NOHIDE nosys
|
||||
194 MSTD BSD { int getrlimit(u_int which, \
|
||||
194 MNOPROTO BSD { int getrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
getrlimit __getrlimit_args int
|
||||
195 MSTD BSD { int setrlimit(u_int which, \
|
||||
195 MNOPROTO BSD { int setrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
setrlimit __setrlimit_args int
|
||||
196 STD BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
196 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
197 MSTD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
|
||||
int flags, int fd, int pad, off_t pos); }
|
||||
198 STD NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
199 STD POSIX { off_t lseek(int fd, int pad, off_t offset, \
|
||||
197 STD BSD { caddr_t ia32_mmap(caddr_t addr, size_t len, \
|
||||
int prot, int flags, int fd, int pad, \
|
||||
u_int32_t poslo, u_int32_t poshi); }
|
||||
198 NOPROTO NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
; XXX note - bigendian is different
|
||||
199 STD POSIX { off_t ia32_lseek(int fd, int pad, \
|
||||
u_int32_t offsetlo, u_int32_t offsethi, \
|
||||
int whence); }
|
||||
200 STD BSD { int truncate(char *path, int pad, off_t length); }
|
||||
201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
|
||||
202 MSTD BSD { int __sysctl(int *name, u_int namelen, void *old, \
|
||||
size_t *oldlenp, void *new, size_t newlen); } \
|
||||
__sysctl sysctl_args int
|
||||
; properly, __sysctl should be a NOHIDE, but making an exception
|
||||
; here allows to avoid one in libc/sys/Makefile.inc.
|
||||
203 MSTD BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MSTD BSD { int munlock(const void *addr, size_t len); }
|
||||
205 STD BSD { int undelete(char *path); }
|
||||
206 STD BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MSTD BSD { int getpgid(pid_t pid); }
|
||||
; XXX note - bigendian is different
|
||||
200 STD BSD { int ia32_truncate(char *path, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
; XXX note - bigendian is different
|
||||
201 STD BSD { int ia32_ftruncate(int fd, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
202 MSTD BSD { int ia32_sysctl(int *name, u_int namelen, \
|
||||
void *old, u_int32_t *oldlenp, void *new, \
|
||||
u_int32_t newlen); }
|
||||
203 MNOPROTO BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MNOPROTO BSD { int munlock(const void *addr, size_t len); }
|
||||
205 NOPROTO BSD { int undelete(char *path); }
|
||||
206 NOPROTO BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MNOPROTO BSD { int getpgid(pid_t pid); }
|
||||
208 UNIMPL NOHIDE newreboot (NetBSD)
|
||||
209 MSTD BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
209 MNOPROTO BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
|
||||
;
|
||||
; The following are reserved for loadable syscalls
|
||||
;
|
||||
210 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
211 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
212 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
213 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
214 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
215 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
216 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
217 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
218 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
219 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
210 UNIMPL NOHIDE
|
||||
211 UNIMPL NOHIDE
|
||||
212 UNIMPL NOHIDE
|
||||
213 UNIMPL NOHIDE
|
||||
214 UNIMPL NOHIDE
|
||||
215 UNIMPL NOHIDE
|
||||
216 UNIMPL NOHIDE
|
||||
217 UNIMPL NOHIDE
|
||||
218 UNIMPL NOHIDE
|
||||
219 UNIMPL NOHIDE
|
||||
|
||||
;
|
||||
; The following were introduced with NetBSD/4.4Lite-2
|
||||
; They are initialized by thier respective modules/sysinits
|
||||
220 MNOSTD BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
220 MNOPROTO BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
union semun *arg); }
|
||||
221 MNOSTD BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOSTD BSD { int semop(int semid, struct sembuf *sops, \
|
||||
221 MNOPROTO BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOPROTO BSD { int semop(int semid, struct sembuf *sops, \
|
||||
u_int nsops); }
|
||||
223 UNIMPL NOHIDE semconfig
|
||||
224 MNOSTD BSD { int msgctl(int msqid, int cmd, \
|
||||
224 MNOPROTO BSD { int msgctl(int msqid, int cmd, \
|
||||
struct msqid_ds *buf); }
|
||||
225 MNOSTD BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOSTD BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
225 MNOPROTO BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOPROTO BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
int msgflg); }
|
||||
227 MNOSTD BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
227 MNOPROTO BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
long msgtyp, int msgflg); }
|
||||
228 MNOSTD BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOSTD BSD { int shmctl(int shmid, int cmd, \
|
||||
228 MNOPROTO BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOPROTO BSD { int shmctl(int shmid, int cmd, \
|
||||
struct shmid_ds *buf); }
|
||||
230 MNOSTD BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOSTD BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
230 MNOPROTO BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOPROTO BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
;
|
||||
232 MSTD POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
232 MNOPROTO POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
233 MSTD POSIX { int clock_settime(clockid_t clock_id, \
|
||||
233 MNOPROTO POSIX { int clock_settime(clockid_t clock_id, \
|
||||
const struct timespec *tp); }
|
||||
234 MSTD POSIX { int clock_getres(clockid_t clock_id, \
|
||||
234 MNOPROTO POSIX { int clock_getres(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
235 UNIMPL NOHIDE timer_create
|
||||
236 UNIMPL NOHIDE timer_delete
|
||||
237 UNIMPL NOHIDE timer_settime
|
||||
238 UNIMPL NOHIDE timer_gettime
|
||||
239 UNIMPL NOHIDE timer_getoverrun
|
||||
240 MSTD POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
240 MNOPROTO POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
struct timespec *rmtp); }
|
||||
241 UNIMPL NOHIDE nosys
|
||||
242 UNIMPL NOHIDE nosys
|
||||
@ -388,12 +382,12 @@
|
||||
248 UNIMPL NOHIDE nosys
|
||||
249 UNIMPL NOHIDE nosys
|
||||
; syscall numbers initially used in OpenBSD
|
||||
250 MSTD BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MSTD BSD { int rfork(int flags); }
|
||||
252 MSTD BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
250 MNOPROTO BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MNOPROTO BSD { int rfork(int flags); }
|
||||
252 MNOPROTO BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
253 STD BSD { int issetugid(void); }
|
||||
254 STD BSD { int lchown(char *path, int uid, int gid); }
|
||||
253 NOPROTO BSD { int issetugid(void); }
|
||||
254 NOPROTO BSD { int lchown(char *path, int uid, int gid); }
|
||||
255 UNIMPL NOHIDE nosys
|
||||
256 UNIMPL NOHIDE nosys
|
||||
257 UNIMPL NOHIDE nosys
|
||||
@ -411,15 +405,15 @@
|
||||
269 UNIMPL NOHIDE nosys
|
||||
270 UNIMPL NOHIDE nosys
|
||||
271 UNIMPL NOHIDE nosys
|
||||
272 STD BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
272 NOPROTO BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
273 UNIMPL NOHIDE nosys
|
||||
274 STD BSD { int lchmod(char *path, mode_t mode); }
|
||||
274 NOPROTO BSD { int lchmod(char *path, mode_t mode); }
|
||||
275 NOPROTO BSD { int lchown(char *path, uid_t uid, gid_t gid); } netbsd_lchown lchown_args int
|
||||
276 STD BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
276 NOPROTO BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
277 MNOPROTO BSD { int msync(void *addr, size_t len, int flags); } netbsd_msync msync_args int
|
||||
278 STD BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MSTD BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 STD BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
278 NOPROTO BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MNOPROTO BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 NOPROTO BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
281 UNIMPL NOHIDE nosys
|
||||
282 UNIMPL NOHIDE nosys
|
||||
283 UNIMPL NOHIDE nosys
|
||||
@ -437,126 +431,133 @@
|
||||
295 UNIMPL NOHIDE nosys
|
||||
296 UNIMPL NOHIDE nosys
|
||||
; XXX 297 is 300 in NetBSD
|
||||
297 STD BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 STD BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 STD BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
297 NOPROTO BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 NOPROTO BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 NOPROTO BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
; syscall numbers for FreeBSD
|
||||
300 MSTD BSD { int modnext(int modid); }
|
||||
301 MSTD BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MSTD BSD { int modfnext(int modid); }
|
||||
303 MSTD BSD { int modfind(const char *name); }
|
||||
304 MSTD BSD { int kldload(const char *file); }
|
||||
305 MSTD BSD { int kldunload(int fileid); }
|
||||
306 MSTD BSD { int kldfind(const char *file); }
|
||||
307 MSTD BSD { int kldnext(int fileid); }
|
||||
308 MSTD BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MSTD BSD { int kldfirstmod(int fileid); }
|
||||
310 MSTD BSD { int getsid(pid_t pid); }
|
||||
311 MSTD BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MSTD BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
300 MNOPROTO BSD { int modnext(int modid); }
|
||||
301 MNOPROTO BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MNOPROTO BSD { int modfnext(int modid); }
|
||||
303 MNOPROTO BSD { int modfind(const char *name); }
|
||||
304 MNOPROTO BSD { int kldload(const char *file); }
|
||||
305 MNOPROTO BSD { int kldunload(int fileid); }
|
||||
306 MNOPROTO BSD { int kldfind(const char *file); }
|
||||
307 MNOPROTO BSD { int kldnext(int fileid); }
|
||||
308 MNOPROTO BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MNOPROTO BSD { int kldfirstmod(int fileid); }
|
||||
310 MNOPROTO BSD { int getsid(pid_t pid); }
|
||||
311 MNOPROTO BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MNOPROTO BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
313 OBSOL NOHIDE signanosleep
|
||||
314 NOSTD BSD { int aio_return(struct aiocb *aiocbp); }
|
||||
315 NOSTD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
||||
316 NOSTD BSD { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
||||
317 NOSTD BSD { int aio_error(struct aiocb *aiocbp); }
|
||||
318 NOSTD BSD { int aio_read(struct aiocb *aiocbp); }
|
||||
319 NOSTD BSD { int aio_write(struct aiocb *aiocbp); }
|
||||
320 NOSTD BSD { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
||||
321 MSTD BSD { int yield(void); }
|
||||
314 UNIMPL NOHIDE aio_return
|
||||
315 UNIMPL NOHIDE aio_suspend
|
||||
316 UNIMPL NOHIDE aio_cancel
|
||||
317 UNIMPL NOHIDE aio_error
|
||||
318 UNIMPL NOHIDE aio_read
|
||||
319 UNIMPL NOHIDE aio_write
|
||||
320 UNIMPL NOHIDE lio_listio
|
||||
321 MNOPROTO BSD { int yield(void); }
|
||||
322 OBSOL NOHIDE thr_sleep
|
||||
323 OBSOL NOHIDE thr_wakeup
|
||||
324 MSTD BSD { int mlockall(int how); }
|
||||
325 MSTD BSD { int munlockall(void); }
|
||||
326 STD BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
324 MNOPROTO BSD { int mlockall(int how); }
|
||||
325 MNOPROTO BSD { int munlockall(void); }
|
||||
326 NOPROTO BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
|
||||
327 MSTD POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MSTD POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
327 MNOPROTO POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MNOPROTO POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
|
||||
329 MSTD POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MSTD POSIX { int sched_getscheduler (pid_t pid); }
|
||||
329 MNOPROTO POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MNOPROTO POSIX { int sched_getscheduler (pid_t pid); }
|
||||
|
||||
331 MSTD POSIX { int sched_yield (void); }
|
||||
332 MSTD POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MSTD POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MSTD POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 STD BSD { int utrace(const void *addr, size_t len); }
|
||||
336 MSTD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 STD BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MSTD BSD { int jail(struct jail *jail); }
|
||||
331 MNOPROTO POSIX { int sched_yield (void); }
|
||||
332 MNOPROTO POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MNOPROTO POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MNOPROTO POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 NOPROTO BSD { int utrace(const void *addr, size_t len); }
|
||||
; XXX note - bigendian is different
|
||||
336 MSTD BSD { int ia32_sendfile(int fd, int s, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 NOPROTO BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MNOPROTO BSD { int jail(struct jail *jail); }
|
||||
339 UNIMPL BSD pioctl
|
||||
340 MSTD POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
340 MNOPROTO POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
sigset_t *oset); }
|
||||
341 MSTD POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 MSTD POSIX { int sigaction(int sig, const struct sigaction *act, \
|
||||
struct sigaction *oact); }
|
||||
343 MSTD POSIX { int sigpending(sigset_t *set); }
|
||||
344 STD BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
341 MNOPROTO POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 STD POSIX { int ia32_sigaction(int sig, \
|
||||
struct sigaction32 *act, \
|
||||
struct sigaction32 *oact); }
|
||||
343 MNOPROTO POSIX { int sigpending(sigset_t *set); }
|
||||
344 MNOPROTO BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
345 UNIMPL NOHIDE sigtimedwait
|
||||
346 UNIMPL NOHIDE sigwaitinfo
|
||||
347 MSTD BSD { int __acl_get_file(const char *path, \
|
||||
347 MNOPROTO BSD { int __acl_get_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
348 MSTD BSD { int __acl_set_file(const char *path, \
|
||||
348 MNOPROTO BSD { int __acl_set_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
349 MSTD BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
349 MNOPROTO BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
350 MSTD BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
350 MNOPROTO BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
351 MSTD BSD { int __acl_delete_file(const char *path, \
|
||||
351 MNOPROTO BSD { int __acl_delete_file(const char *path, \
|
||||
acl_type_t type); }
|
||||
352 MSTD BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MSTD BSD { int __acl_aclcheck_file(const char *path, \
|
||||
352 MNOPROTO BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MNOPROTO BSD { int __acl_aclcheck_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
354 MSTD BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
354 MNOPROTO BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
355 STD BSD { int extattrctl(const char *path, int cmd, \
|
||||
355 NOPROTO BSD { int extattrctl(const char *path, int cmd, \
|
||||
const char *filename, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
356 STD BSD { int extattr_set_file(const char *path, \
|
||||
356 NOPROTO BSD { int extattr_set_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
357 STD BSD { ssize_t extattr_get_file(const char *path, \
|
||||
357 NOPROTO BSD { ssize_t extattr_get_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
358 STD BSD { int extattr_delete_file(const char *path, \
|
||||
358 NOPROTO BSD { int extattr_delete_file(const char *path, \
|
||||
int attrnamespace, const char *attrname); }
|
||||
359 NOSTD BSD { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }
|
||||
360 MSTD BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MSTD BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MSTD BSD { int kqueue(void); }
|
||||
363 MSTD BSD { int kevent(int fd, \
|
||||
359 UNIMPL NOHIDE aio_waitcomplete
|
||||
360 MNOPROTO BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MNOPROTO BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MNOPROTO BSD { int kqueue(void); }
|
||||
363 MNOPROTO BSD { int kevent(int fd, \
|
||||
const struct kevent *changelist, int nchanges, \
|
||||
struct kevent *eventlist, int nevents, \
|
||||
const struct timespec *timeout); }
|
||||
364 STD BSD { int __cap_get_proc(struct cap *cap_p); }
|
||||
365 STD BSD { int __cap_set_proc(struct cap *cap_p); }
|
||||
366 STD BSD { int __cap_get_fd(int fd, struct cap *cap_p); }
|
||||
367 STD BSD { int __cap_get_file(const char *path_p, struct cap *cap_p); }
|
||||
368 STD BSD { int __cap_set_fd(int fd, struct cap *cap_p); }
|
||||
369 STD BSD { int __cap_set_file(const char *path_p, struct cap *cap_p); }
|
||||
370 NODEF NOHIDE lkmressys lkmressys nosys_args int
|
||||
371 STD BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
364 UNIMPL NOHIDE __cap_get_proc
|
||||
365 UNIMPL NOHIDE __cap_set_proc
|
||||
366 UNIMPL NOHIDE __cap_get_fd
|
||||
367 UNIMPL NOHIDE __cap_get_file
|
||||
368 UNIMPL NOHIDE __cap_set_fd
|
||||
369 UNIMPL NOHIDE __cap_set_file
|
||||
370 UNIMPL NOHIDE lkmressys
|
||||
371 NOPROTO BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, \
|
||||
size_t nbytes); }
|
||||
372 STD BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
372 NOPROTO BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, size_t nbytes); }
|
||||
373 STD BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
373 NOPROTO BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
374 MSTD BSD { int __setugid(int flag); }
|
||||
375 NOIMPL BSD { int nfsclnt(int flag, caddr_t argp); }
|
||||
376 STD BSD { int eaccess(char *path, int flags); }
|
||||
374 MNOPROTO BSD { int __setugid(int flag); }
|
||||
375 UNIMPL BSD nfsclnt
|
||||
376 NOPROTO BSD { int eaccess(char *path, int flags); }
|
||||
377 UNIMPL BSD afs_syscall
|
||||
378 STD BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
378 NOPROTO BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
int flags); }
|
||||
379 STD BSD { int kse_exit(void); }
|
||||
380 STD BSD { int kse_wakeup(void); }
|
||||
381 STD BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
379 NOPROTO BSD { int kse_exit(void); }
|
||||
380 NOPROTO BSD { int kse_wakeup(void); }
|
||||
381 NOPROTO BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
int new_grp_flag); }
|
||||
382 STD BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 STD BSD { int kse_yield(void); }
|
||||
382 NOPROTO BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 NOPROTO BSD { int kse_yield(void); }
|
||||
384 UNIMPL BSD __mac_get_proc
|
||||
385 UNIMPL BSD __mac_set_proc
|
||||
386 UNIMPL BSD __mac_get_fd
|
||||
387 UNIMPL BSD __mac_get_file
|
||||
388 UNIMPL BSD __mac_set_fd
|
||||
389 UNIMPL BSD __mac_set_file
|
||||
390 NOPROTO BSD { int kenv(int what, const char *name, char *value, \
|
||||
int len); }
|
||||
391 NOPROTO BSD { int lchflags(const char *path, int flags); }
|
||||
392 NOPROTO BSD { int uuidgen(struct uuid *store, int count); }
|
||||
|
103
sys/compat/freebsd32/freebsd32.h
Normal file
103
sys/compat/freebsd32/freebsd32.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*-
|
||||
* Copyright (c) 2001 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _IA64_IA32_IA32_H_
|
||||
#define _IA64_IA32_IA32_H_
|
||||
|
||||
#define PTRIN(v) (void *)(uintptr_t) (v)
|
||||
#define PTROUT(v) (u_int32_t)(uintptr_t) (v)
|
||||
|
||||
#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
|
||||
#define PTRIN_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTRIN((src).fld); } while (0)
|
||||
#define PTROUT_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTROUT((src).fld); } while (0)
|
||||
|
||||
struct timeval32 {
|
||||
int32_t tv_sec;
|
||||
int32_t tv_usec;
|
||||
};
|
||||
#define TV_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_usec); \
|
||||
} while (0);
|
||||
|
||||
struct timespec32 {
|
||||
u_int32_t tv_sec;
|
||||
u_int32_t tv_nsec;
|
||||
};
|
||||
#define TS_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_nsec); \
|
||||
} while (0);
|
||||
|
||||
struct rusage32 {
|
||||
struct timeval32 ru_utime;
|
||||
struct timeval32 ru_stime;
|
||||
int32_t ru_maxrss;
|
||||
int32_t ru_ixrss;
|
||||
int32_t ru_idrss;
|
||||
int32_t ru_isrss;
|
||||
int32_t ru_minflt;
|
||||
int32_t ru_majflt;
|
||||
int32_t ru_nswap;
|
||||
int32_t ru_inblock;
|
||||
int32_t ru_oublock;
|
||||
int32_t ru_msgsnd;
|
||||
int32_t ru_msgrcv;
|
||||
int32_t ru_nsignals;
|
||||
int32_t ru_nvcsw;
|
||||
int32_t ru_nivcsw;
|
||||
};
|
||||
|
||||
struct statfs32 {
|
||||
int32_t f_spare2;
|
||||
int32_t f_bsize;
|
||||
int32_t f_iosize;
|
||||
int32_t f_blocks;
|
||||
int32_t f_bfree;
|
||||
int32_t f_bavail;
|
||||
int32_t f_files;
|
||||
int32_t f_ffree;
|
||||
fsid_t f_fsid;
|
||||
uid_t f_owner;
|
||||
int32_t f_type;
|
||||
int32_t f_flags;
|
||||
int32_t f_syncwrites;
|
||||
int32_t f_asyncwrites;
|
||||
char f_fstypename[MFSNAMELEN];
|
||||
char f_mntonname[MNAMELEN];
|
||||
int32_t f_syncreads;
|
||||
int32_t f_asyncreads;
|
||||
int16_t f_spares1;
|
||||
char f_mntfromname[MNAMELEN];
|
||||
int16_t f_spares2;
|
||||
int32_t f_spare[2];
|
||||
};
|
||||
|
||||
#endif /* !_IA64_IA32_IA32_H_ */
|
1339
sys/compat/freebsd32/freebsd32_misc.c
Normal file
1339
sys/compat/freebsd32/freebsd32_misc.c
Normal file
File diff suppressed because it is too large
Load Diff
94
sys/compat/freebsd32/freebsd32_util.h
Normal file
94
sys/compat/freebsd32/freebsd32_util.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*-
|
||||
* Copyright (c) 1998-1999 Andrew Gallatin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software withough specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
|
||||
#include <sys/exec.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
|
||||
#ifndef SCARG
|
||||
#define SCARG(p, x) (p)->x
|
||||
#endif
|
||||
|
||||
struct ia32_ps_strings {
|
||||
u_int32_t ps_argvstr; /* first of 0 or more argument strings */
|
||||
int ps_nargvstr; /* the number of argument strings */
|
||||
u_int32_t ps_envstr; /* first of 0 or more environment strings */
|
||||
int ps_nenvstr; /* the number of environment strings */
|
||||
};
|
||||
|
||||
#define IA32_USRSTACK (4L*1024*1024*1024 - PAGE_SIZE)
|
||||
#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
|
||||
|
||||
static __inline caddr_t stackgap_init(void);
|
||||
static __inline void *stackgap_alloc(caddr_t *, size_t);
|
||||
|
||||
static __inline caddr_t
|
||||
stackgap_init()
|
||||
{
|
||||
#define szsigcode (*(curproc->p_sysent->sv_szsigcode))
|
||||
return (caddr_t)(((caddr_t)IA32_PS_STRINGS) - szsigcode - SPARE_USRSPACE);
|
||||
#undef szsigcode
|
||||
}
|
||||
|
||||
static __inline void *
|
||||
stackgap_alloc(sgp, sz)
|
||||
caddr_t *sgp;
|
||||
size_t sz;
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = (void *) *sgp;
|
||||
*sgp += ALIGN(sz);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
extern const char ia32_emul_path[];
|
||||
int ia32_emul_find(struct thread *, caddr_t *, const char *, char *,
|
||||
char **, int);
|
||||
|
||||
#define CHECKALT(p, sgp, path, i) \
|
||||
do { \
|
||||
int _error; \
|
||||
\
|
||||
_error = ia32_emul_find(p, sgp, ia32_emul_path, path, \
|
||||
&path, i); \
|
||||
if (_error == EFAULT) \
|
||||
return (_error); \
|
||||
} while (0)
|
||||
|
||||
#define CHECKALTEXIST(p, sgp, path) CHECKALT((p), (sgp), (path), 0)
|
||||
#define CHECKALTCREAT(p, sgp, path) CHECKALT((p), (sgp), (path), 1)
|
@ -36,6 +36,9 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/sysproto.h>
|
||||
#include <sys/mount.h>
|
||||
#include <ia64/ia32/ia32.h>
|
||||
#include <ia64/ia32/ia32_proto.h>
|
||||
|
||||
; Reserved/unimplemented system calls in the range 0-150 inclusive
|
||||
; are reserved for use in future Berkeley releases.
|
||||
@ -43,200 +46,189 @@
|
||||
; redistributions should be placed in the reserved range at the end
|
||||
; of the current calls.
|
||||
|
||||
0 STD NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MSTD NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MSTD POSIX { int fork(void); }
|
||||
3 MSTD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MSTD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int open(char *path, int flags, int mode); }
|
||||
0 MNOPROTO NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MNOPROTO NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MNOPROTO POSIX { int fork(void); }
|
||||
3 MNOPROTO POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MNOPROTO POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int ia32_open(char *path, int flags, int mode); }
|
||||
; XXX should be { int open(const char *path, int flags, ...); }
|
||||
; but we're not ready for `const' or varargs.
|
||||
; XXX man page says `mode_t mode'.
|
||||
6 MSTD POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int wait4(int pid, int *status, int options, \
|
||||
struct rusage *rusage); } wait4 wait_args int
|
||||
8 COMPAT BSD { int creat(char *path, int mode); }
|
||||
9 STD POSIX { int link(char *path, char *link); }
|
||||
10 STD POSIX { int unlink(char *path); }
|
||||
6 MNOPROTO POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int ia32_wait4(int pid, int *status, int options, \
|
||||
struct rusage32 *rusage); }
|
||||
8 OBSOL BSD old creat
|
||||
9 NOPROTO POSIX { int link(char *path, char *link); }
|
||||
10 NOPROTO POSIX { int unlink(char *path); }
|
||||
11 OBSOL NOHIDE execv
|
||||
12 STD POSIX { int chdir(char *path); }
|
||||
13 STD BSD { int fchdir(int fd); }
|
||||
14 STD POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 STD POSIX { int chmod(char *path, int mode); }
|
||||
16 STD POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MSTD BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int getfsstat(struct statfs *buf, long bufsize, \
|
||||
int flags); }
|
||||
19 COMPAT POSIX { long lseek(int fd, long offset, int whence); }
|
||||
20 MSTD POSIX { pid_t getpid(void); }
|
||||
21 STD BSD { int mount(char *type, char *path, int flags, \
|
||||
12 NOPROTO POSIX { int chdir(char *path); }
|
||||
13 NOPROTO BSD { int fchdir(int fd); }
|
||||
14 NOPROTO POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 NOPROTO POSIX { int chmod(char *path, int mode); }
|
||||
16 NOPROTO POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MNOPROTO BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int ia32_getfsstat(struct statfs32 *buf, \
|
||||
long bufsize, int flags); }
|
||||
19 OBSOL POSIX olseek
|
||||
20 MNOPROTO POSIX { pid_t getpid(void); }
|
||||
21 NOPROTO BSD { int mount(char *type, char *path, int flags, \
|
||||
caddr_t data); }
|
||||
; XXX `path' should have type `const char *' but we're not ready for that.
|
||||
22 STD BSD { int unmount(char *path, int flags); }
|
||||
23 MSTD POSIX { int setuid(uid_t uid); }
|
||||
24 MSTD POSIX { uid_t getuid(void); }
|
||||
25 MSTD POSIX { uid_t geteuid(void); }
|
||||
26 STD BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
22 NOPROTO BSD { int unmount(char *path, int flags); }
|
||||
23 MNOPROTO POSIX { int setuid(uid_t uid); }
|
||||
24 MNOPROTO POSIX { uid_t getuid(void); }
|
||||
25 MNOPROTO POSIX { uid_t geteuid(void); }
|
||||
26 NOPROTO BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
int data); }
|
||||
27 MSTD BSD { int recvmsg(int s, struct msghdr *msg, int flags); }
|
||||
28 MSTD BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MSTD BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
27 UNIMPL BSD recvmsg
|
||||
28 MNOPROTO BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); }
|
||||
30 MSTD BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MSTD BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MSTD BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int access(char *path, int flags); }
|
||||
34 STD BSD { int chflags(char *path, int flags); }
|
||||
35 STD BSD { int fchflags(int fd, int flags); }
|
||||
36 STD BSD { int sync(void); }
|
||||
37 MSTD POSIX { int kill(int pid, int signum); }
|
||||
38 COMPAT POSIX { int stat(char *path, struct ostat *ub); }
|
||||
39 MSTD POSIX { pid_t getppid(void); }
|
||||
40 COMPAT POSIX { int lstat(char *path, struct ostat *ub); }
|
||||
41 STD POSIX { int dup(u_int fd); }
|
||||
42 STD POSIX { int pipe(void); }
|
||||
43 MSTD POSIX { gid_t getegid(void); }
|
||||
44 MSTD BSD { int profil(caddr_t samples, size_t size, \
|
||||
30 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MNOPROTO BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MNOPROTO BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int ia32_access(char *path, int flags); }
|
||||
34 STD BSD { int ia32_chflags(char *path, int flags); }
|
||||
35 NOPROTO BSD { int fchflags(int fd, int flags); }
|
||||
36 NOPROTO BSD { int sync(void); }
|
||||
37 MNOPROTO POSIX { int kill(int pid, int signum); }
|
||||
38 UNIMPL POSIX ostat
|
||||
39 MNOPROTO POSIX { pid_t getppid(void); }
|
||||
40 UNIMPL POSIX olstat
|
||||
41 NOPROTO POSIX { int dup(u_int fd); }
|
||||
42 NOPROTO POSIX { int pipe(void); }
|
||||
43 MNOPROTO POSIX { gid_t getegid(void); }
|
||||
44 MNOPROTO BSD { int profil(caddr_t samples, size_t size, \
|
||||
size_t offset, u_int scale); }
|
||||
45 STD BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
45 NOPROTO BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
int pid); }
|
||||
46 MCOMPAT POSIX { int sigaction(int signum, struct osigaction *nsa, \
|
||||
struct osigaction *osa); }
|
||||
47 MSTD POSIX { gid_t getgid(void); }
|
||||
48 MCOMPAT POSIX { int sigprocmask(int how, osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it, and we return the old mask as the
|
||||
; (int) return value.
|
||||
49 MSTD BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MSTD BSD { int setlogin(char *namebuf); }
|
||||
51 MSTD BSD { int acct(char *path); }
|
||||
52 MCOMPAT POSIX { int sigpending(void); }
|
||||
53 MSTD BSD { int sigaltstack(stack_t *ss, stack_t *oss); }
|
||||
54 MSTD POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MSTD BSD { int reboot(int opt); }
|
||||
56 STD POSIX { int revoke(char *path); }
|
||||
57 STD POSIX { int symlink(char *path, char *link); }
|
||||
58 STD POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 MSTD POSIX { int execve(char *fname, char **argv, char **envv); }
|
||||
60 MSTD POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 STD BSD { int chroot(char *path); }
|
||||
62 MCOMPAT POSIX { int fstat(int fd, struct ostat *sb); }
|
||||
63 MCOMPAT BSD { int getkerninfo(int op, char *where, size_t *size, \
|
||||
int arg); } getkerninfo getkerninfo_args int
|
||||
64 MCOMPAT BSD { int getpagesize(void); } \
|
||||
getpagesize getpagesize_args int
|
||||
65 STD BSD { int msync(void *addr, size_t len, int flags); }
|
||||
66 MSTD BSD { int vfork(void); }
|
||||
46 UNIMPL POSIX osigaction
|
||||
47 MNOPROTO POSIX { gid_t getgid(void); }
|
||||
48 UNIMPL POSIX osigprocmask
|
||||
49 MNOPROTO BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MNOPROTO BSD { int setlogin(char *namebuf); }
|
||||
51 MNOPROTO BSD { int acct(char *path); }
|
||||
52 MNOPROTO POSIX { int sigpending(void); }
|
||||
53 STD BSD { int ia32_sigaltstack(struct sigaltstack32 *ss, struct sigaltstack32 *oss); }
|
||||
54 MNOPROTO POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MNOPROTO BSD { int reboot(int opt); }
|
||||
56 NOPROTO POSIX { int revoke(char *path); }
|
||||
57 NOPROTO POSIX { int symlink(char *path, char *link); }
|
||||
58 NOPROTO POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 STD POSIX { int ia32_execve(char *fname, u_int32_t *argv, u_int32_t *envv); }
|
||||
60 MNOPROTO POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 NOPROTO BSD { int chroot(char *path); }
|
||||
62 OBSOL POSIX ofstat
|
||||
63 OBSOL BSD ogetkerninfo
|
||||
64 OBSOL BSD ogetpagesize
|
||||
65 OBSOL BSD omsync
|
||||
66 OBSOL BSD ovfork
|
||||
67 OBSOL NOHIDE vread
|
||||
68 OBSOL NOHIDE vwrite
|
||||
69 MSTD BSD { int sbrk(int incr); }
|
||||
70 MSTD BSD { int sstk(int incr); }
|
||||
71 MCOMPAT BSD { int mmap(void *addr, int len, int prot, \
|
||||
int flags, int fd, long pos); }
|
||||
72 MSTD BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MSTD BSD { int munmap(void *addr, size_t len); }
|
||||
74 MSTD BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MSTD BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
69 MNOPROTO BSD { int sbrk(int incr); }
|
||||
70 MNOPROTO BSD { int sstk(int incr); }
|
||||
71 OBSOL BSD ommap
|
||||
72 MNOPROTO BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MNOPROTO BSD { int munmap(void *addr, size_t len); }
|
||||
74 MNOPROTO BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MNOPROTO BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
76 OBSOL NOHIDE vhangup
|
||||
77 OBSOL NOHIDE vlimit
|
||||
78 MSTD BSD { int mincore(const void *addr, size_t len, \
|
||||
78 MNOPROTO BSD { int mincore(const void *addr, size_t len, \
|
||||
char *vec); }
|
||||
79 MSTD POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MSTD POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MSTD POSIX { int getpgrp(void); }
|
||||
82 MSTD POSIX { int setpgid(int pid, int pgid); }
|
||||
83 MSTD BSD { int setitimer(u_int which, struct itimerval *itv, \
|
||||
struct itimerval *oitv); }
|
||||
84 MCOMPAT BSD { int wait(void); }
|
||||
85 MSTD BSD { int swapon(char *name); }
|
||||
86 MSTD BSD { int getitimer(u_int which, struct itimerval *itv); }
|
||||
87 MCOMPAT BSD { int gethostname(char *hostname, u_int len); } \
|
||||
gethostname gethostname_args int
|
||||
88 MCOMPAT BSD { int sethostname(char *hostname, u_int len); } \
|
||||
sethostname sethostname_args int
|
||||
89 MSTD BSD { int getdtablesize(void); }
|
||||
90 MSTD POSIX { int dup2(u_int from, u_int to); }
|
||||
79 MNOPROTO POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MNOPROTO POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MNOPROTO POSIX { int getpgrp(void); }
|
||||
82 MNOPROTO POSIX { int setpgid(int pid, int pgid); }
|
||||
83 STD BSD { int ia32_setitimer(u_int which, \
|
||||
struct itimerval32 *itv, \
|
||||
struct itimerval32 *oitv); }
|
||||
84 OBSOL BSD owait
|
||||
85 OBSOL BSD oswapon
|
||||
86 OBSOL BSD ogetitimer
|
||||
87 OBSOL BSD ogethostname
|
||||
88 OBSOL BSD osethostname
|
||||
89 MNOPROTO BSD { int getdtablesize(void); }
|
||||
90 MNOPROTO POSIX { int dup2(u_int from, u_int to); }
|
||||
91 UNIMPL BSD getdopt
|
||||
92 MSTD POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
92 MNOPROTO POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
; XXX should be { int fcntl(int fd, int cmd, ...); }
|
||||
; but we're not ready for varargs.
|
||||
; XXX man page says `int arg' too.
|
||||
93 MSTD BSD { int select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval *tv); }
|
||||
93 STD BSD { int ia32_select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval32 *tv); }
|
||||
; XXX need to override for big-endian - little-endian should work fine.
|
||||
94 UNIMPL BSD setdopt
|
||||
95 STD POSIX { int fsync(int fd); }
|
||||
96 MSTD BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MSTD BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MSTD BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MCPT_NOA BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
95 NOPROTO POSIX { int fsync(int fd); }
|
||||
96 MNOPROTO BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MNOPROTO BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MNOPROTO BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
accept accept_args int
|
||||
100 MSTD BSD { int getpriority(int which, int who); }
|
||||
101 MCOMPAT BSD { int send(int s, caddr_t buf, int len, int flags); }
|
||||
102 MCOMPAT BSD { int recv(int s, caddr_t buf, int len, int flags); }
|
||||
103 STD BSD { int osigreturn(struct osigcontext *sigcntxp); }
|
||||
104 MSTD BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MSTD BSD { int setsockopt(int s, int level, int name, \
|
||||
100 MNOPROTO BSD { int getpriority(int which, int who); }
|
||||
101 OBSOL BSD osend
|
||||
102 OBSOL BSD orecv
|
||||
103 OBSOL BSD osigreturn
|
||||
104 MNOPROTO BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MNOPROTO BSD { int setsockopt(int s, int level, int name, \
|
||||
caddr_t val, int valsize); }
|
||||
106 MSTD BSD { int listen(int s, int backlog); }
|
||||
106 MNOPROTO BSD { int listen(int s, int backlog); }
|
||||
107 OBSOL NOHIDE vtimes
|
||||
108 MCOMPAT BSD { int sigvec(int signum, struct sigvec *nsv, \
|
||||
struct sigvec *osv); }
|
||||
109 MCOMPAT BSD { int sigblock(int mask); }
|
||||
110 MCOMPAT BSD { int sigsetmask(int mask); }
|
||||
111 MCOMPAT POSIX { int sigsuspend(osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it.
|
||||
112 MCOMPAT BSD { int sigstack(struct sigstack *nss, \
|
||||
struct sigstack *oss); }
|
||||
113 MCOMPAT BSD { int recvmsg(int s, struct omsghdr *msg, int flags); }
|
||||
114 MCOMPAT BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
108 OBSOL BSD osigvec
|
||||
109 OBSOL BSD osigblock
|
||||
110 OBSOL BSD osigsetmask
|
||||
111 OBSOL POSIX osigsuspend
|
||||
112 OBSOL BSD osigstack
|
||||
113 OBSOL BSD orecvmsg
|
||||
114 OBSOL BSD osendmsg
|
||||
115 OBSOL NOHIDE vtrace
|
||||
116 MSTD BSD { int gettimeofday(struct timeval *tp, \
|
||||
116 STD BSD { int ia32_gettimeofday(struct timeval32 *tp, \
|
||||
struct timezone *tzp); }
|
||||
117 MSTD BSD { int getrusage(int who, struct rusage *rusage); }
|
||||
118 MSTD BSD { int getsockopt(int s, int level, int name, \
|
||||
117 STD BSD { int ia32_getrusage(int who, struct rusage32 *rusage); }
|
||||
118 MNOPROTO BSD { int getsockopt(int s, int level, int name, \
|
||||
caddr_t val, int *avalsize); }
|
||||
119 UNIMPL NOHIDE resuba (BSD/OS 2.x)
|
||||
120 MSTD BSD { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
||||
121 MSTD BSD { int writev(int fd, struct iovec *iovp, \
|
||||
120 STD BSD { int ia32_readv(int fd, struct iovec32 *iovp, u_int iovcnt); }
|
||||
121 STD BSD { int ia32_writev(int fd, struct iovec32 *iovp, \
|
||||
u_int iovcnt); }
|
||||
122 MSTD BSD { int settimeofday(struct timeval *tv, \
|
||||
122 STD BSD { int ia32_settimeofday(struct timeval32 *tv, \
|
||||
struct timezone *tzp); }
|
||||
123 STD BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 STD BSD { int fchmod(int fd, int mode); }
|
||||
125 MCPT_NOA BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
123 NOPROTO BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 NOPROTO BSD { int fchmod(int fd, int mode); }
|
||||
125 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); } \
|
||||
recvfrom recvfrom_args int
|
||||
126 MSTD BSD { int setreuid(int ruid, int euid); }
|
||||
127 MSTD BSD { int setregid(int rgid, int egid); }
|
||||
128 STD POSIX { int rename(char *from, char *to); }
|
||||
129 COMPAT BSD { int truncate(char *path, long length); }
|
||||
130 COMPAT BSD { int ftruncate(int fd, long length); }
|
||||
131 MSTD BSD { int flock(int fd, int how); }
|
||||
132 STD POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MSTD BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
126 MNOPROTO BSD { int setreuid(int ruid, int euid); }
|
||||
127 MNOPROTO BSD { int setregid(int rgid, int egid); }
|
||||
128 NOPROTO POSIX { int rename(char *from, char *to); }
|
||||
129 OBSOL BSD otruncate
|
||||
130 OBSOL BSD ftruncate
|
||||
131 MNOPROTO BSD { int flock(int fd, int how); }
|
||||
132 NOPROTO POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MNOPROTO BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t to, int tolen); }
|
||||
134 MSTD BSD { int shutdown(int s, int how); }
|
||||
135 MSTD BSD { int socketpair(int domain, int type, int protocol, \
|
||||
134 MNOPROTO BSD { int shutdown(int s, int how); }
|
||||
135 MNOPROTO BSD { int socketpair(int domain, int type, int protocol, \
|
||||
int *rsv); }
|
||||
136 STD POSIX { int mkdir(char *path, int mode); }
|
||||
137 STD POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int utimes(char *path, struct timeval *tptr); }
|
||||
136 NOPROTO POSIX { int mkdir(char *path, int mode); }
|
||||
137 NOPROTO POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int ia32_utimes(char *path, \
|
||||
struct timeval32 *tptr); }
|
||||
139 OBSOL NOHIDE 4.2 sigreturn
|
||||
140 MSTD BSD { int adjtime(struct timeval *delta, \
|
||||
struct timeval *olddelta); }
|
||||
141 MCOMPAT BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
142 MCOMPAT BSD { long gethostid(void); }
|
||||
143 MCOMPAT BSD { int sethostid(long hostid); }
|
||||
144 MCOMPAT BSD { int getrlimit(u_int which, struct orlimit *rlp); }
|
||||
145 MCOMPAT BSD { int setrlimit(u_int which, struct orlimit *rlp); }
|
||||
146 MCOMPAT BSD { int killpg(int pgid, int signum); }
|
||||
147 MSTD POSIX { int setsid(void); }
|
||||
148 STD BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
140 STD BSD { int ia32_adjtime(struct timeval32 *delta, \
|
||||
struct timeval32 *olddelta); }
|
||||
141 OBSOL BSD ogetpeername
|
||||
142 OBSOL BSD ogethostid
|
||||
143 OBSOL BSD sethostid
|
||||
144 OBSOL BSD getrlimit
|
||||
145 OBSOL BSD setrlimit
|
||||
146 OBSOL BSD killpg
|
||||
147 MNOPROTO POSIX { int setsid(void); }
|
||||
148 NOPROTO BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
caddr_t arg); }
|
||||
149 MCOMPAT BSD { int quota(void); }
|
||||
150 MCPT_NOA BSD { int getsockname(int fdec, caddr_t asa, int *alen); }\
|
||||
getsockname getsockname_args int
|
||||
149 OBSOL BSD oquota
|
||||
150 OBSOL BSD ogetsockname
|
||||
|
||||
; Syscalls 151-180 inclusive are reserved for vendor-specific
|
||||
; system calls. (This includes various calls added for compatibity
|
||||
@ -247,136 +239,138 @@
|
||||
153 UNIMPL NOHIDE asyncdaemon (BSD/OS 2.x)
|
||||
154 UNIMPL NOHIDE nosys
|
||||
; 155 is initialized by the NFS code, if present.
|
||||
155 MNOIMPL BSD { int nfssvc(int flag, caddr_t argp); }
|
||||
156 COMPAT BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
155 UNIMPL NOHIDE nfssvc
|
||||
156 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
157 STD BSD { int statfs(char *path, struct statfs *buf); }
|
||||
158 STD BSD { int fstatfs(int fd, struct statfs *buf); }
|
||||
157 STD BSD { int ia32_statfs(char *path, struct statfs32 *buf); }
|
||||
158 STD BSD { int ia32_fstatfs(int fd, struct statfs32 *buf); }
|
||||
159 UNIMPL NOHIDE nosys
|
||||
160 UNIMPL NOHIDE nosys
|
||||
161 STD BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MSTD BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MSTD BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MSTD BSD { int uname(struct utsname *name); }
|
||||
165 STD BSD { int sysarch(int op, char *parms); }
|
||||
166 MSTD BSD { int rtprio(int function, pid_t pid, \
|
||||
161 NOPROTO BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MNOPROTO BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MNOPROTO BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MNOPROTO BSD { int uname(struct utsname *name); }
|
||||
165 NOPROTO BSD { int sysarch(int op, char *parms); }
|
||||
166 MNOPROTO BSD { int rtprio(int function, pid_t pid, \
|
||||
struct rtprio *rtp); }
|
||||
167 UNIMPL NOHIDE nosys
|
||||
168 UNIMPL NOHIDE nosys
|
||||
; 169 is initialized by the SYSVSEM code if present or loaded
|
||||
169 MNOSTD BSD { int semsys(int which, int a2, int a3, int a4, \
|
||||
169 STD BSD { int ia32_semsys(int which, int a2, int a3, int a4, \
|
||||
int a5); }
|
||||
; 169 is initialized by the SYSVMSG code if present or loaded
|
||||
; XXX should be { int semsys(int which, ...); }
|
||||
170 MNOSTD BSD { int msgsys(int which, int a2, int a3, int a4, \
|
||||
170 STD BSD { int ia32_msgsys(int which, int a2, int a3, int a4, \
|
||||
int a5, int a6); }
|
||||
; 169 is initialized by the SYSVSHM code if present or loaded
|
||||
; XXX should be { int msgsys(int which, ...); }
|
||||
171 MNOSTD BSD { int shmsys(int which, int a2, int a3, int a4); }
|
||||
; XXX should be { int shmsys(int which, ...); }
|
||||
171 STD BSD { int ia32_shmsys(int which, int a2, int a3, int a4); }
|
||||
172 UNIMPL NOHIDE nosys
|
||||
173 MSTD POSIX { ssize_t pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, off_t offset); }
|
||||
174 MSTD POSIX { ssize_t pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, off_t offset); }
|
||||
173 STD POSIX { ssize_t ia32_pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, u_int32_t offsetlo, u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
174 STD POSIX { ssize_t ia32_pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
175 UNIMPL NOHIDE nosys
|
||||
176 MSTD BSD { int ntp_adjtime(struct timex *tp); }
|
||||
176 MNOPROTO BSD { int ntp_adjtime(struct timex *tp); }
|
||||
177 UNIMPL NOHIDE sfork (BSD/OS 2.x)
|
||||
178 UNIMPL NOHIDE getdescriptor (BSD/OS 2.x)
|
||||
179 UNIMPL NOHIDE setdescriptor (BSD/OS 2.x)
|
||||
180 UNIMPL NOHIDE nosys
|
||||
|
||||
; Syscalls 181-199 are used by/reserved for BSD
|
||||
181 MSTD POSIX { int setgid(gid_t gid); }
|
||||
182 MSTD BSD { int setegid(gid_t egid); }
|
||||
183 MSTD BSD { int seteuid(uid_t euid); }
|
||||
181 MNOPROTO POSIX { int setgid(gid_t gid); }
|
||||
182 MNOPROTO BSD { int setegid(gid_t egid); }
|
||||
183 MNOPROTO BSD { int seteuid(uid_t euid); }
|
||||
184 UNIMPL BSD lfs_bmapv
|
||||
185 UNIMPL BSD lfs_markv
|
||||
186 UNIMPL BSD lfs_segclean
|
||||
187 UNIMPL BSD lfs_segwait
|
||||
188 STD POSIX { int stat(char *path, struct stat *ub); }
|
||||
189 MSTD POSIX { int fstat(int fd, struct stat *sb); }
|
||||
190 STD POSIX { int lstat(char *path, struct stat *ub); }
|
||||
191 STD POSIX { int pathconf(char *path, int name); }
|
||||
192 MSTD POSIX { int fpathconf(int fd, int name); }
|
||||
188 STD POSIX { int ia32_stat(char *path, struct stat32 *ub); }
|
||||
189 STD POSIX { int ia32_fstat(int fd, struct stat32 *ub); }
|
||||
190 STD POSIX { int ia32_lstat(char *path, struct stat32 *ub); }
|
||||
191 NOPROTO POSIX { int pathconf(char *path, int name); }
|
||||
192 MNOPROTO POSIX { int fpathconf(int fd, int name); }
|
||||
193 UNIMPL NOHIDE nosys
|
||||
194 MSTD BSD { int getrlimit(u_int which, \
|
||||
194 MNOPROTO BSD { int getrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
getrlimit __getrlimit_args int
|
||||
195 MSTD BSD { int setrlimit(u_int which, \
|
||||
195 MNOPROTO BSD { int setrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
setrlimit __setrlimit_args int
|
||||
196 STD BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
196 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
197 MSTD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
|
||||
int flags, int fd, int pad, off_t pos); }
|
||||
198 STD NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
199 STD POSIX { off_t lseek(int fd, int pad, off_t offset, \
|
||||
197 STD BSD { caddr_t ia32_mmap(caddr_t addr, size_t len, \
|
||||
int prot, int flags, int fd, int pad, \
|
||||
u_int32_t poslo, u_int32_t poshi); }
|
||||
198 NOPROTO NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
; XXX note - bigendian is different
|
||||
199 STD POSIX { off_t ia32_lseek(int fd, int pad, \
|
||||
u_int32_t offsetlo, u_int32_t offsethi, \
|
||||
int whence); }
|
||||
200 STD BSD { int truncate(char *path, int pad, off_t length); }
|
||||
201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
|
||||
202 MSTD BSD { int __sysctl(int *name, u_int namelen, void *old, \
|
||||
size_t *oldlenp, void *new, size_t newlen); } \
|
||||
__sysctl sysctl_args int
|
||||
; properly, __sysctl should be a NOHIDE, but making an exception
|
||||
; here allows to avoid one in libc/sys/Makefile.inc.
|
||||
203 MSTD BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MSTD BSD { int munlock(const void *addr, size_t len); }
|
||||
205 STD BSD { int undelete(char *path); }
|
||||
206 STD BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MSTD BSD { int getpgid(pid_t pid); }
|
||||
; XXX note - bigendian is different
|
||||
200 STD BSD { int ia32_truncate(char *path, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
; XXX note - bigendian is different
|
||||
201 STD BSD { int ia32_ftruncate(int fd, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
202 MSTD BSD { int ia32_sysctl(int *name, u_int namelen, \
|
||||
void *old, u_int32_t *oldlenp, void *new, \
|
||||
u_int32_t newlen); }
|
||||
203 MNOPROTO BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MNOPROTO BSD { int munlock(const void *addr, size_t len); }
|
||||
205 NOPROTO BSD { int undelete(char *path); }
|
||||
206 NOPROTO BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MNOPROTO BSD { int getpgid(pid_t pid); }
|
||||
208 UNIMPL NOHIDE newreboot (NetBSD)
|
||||
209 MSTD BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
209 MNOPROTO BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
|
||||
;
|
||||
; The following are reserved for loadable syscalls
|
||||
;
|
||||
210 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
211 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
212 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
213 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
214 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
215 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
216 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
217 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
218 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
219 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
210 UNIMPL NOHIDE
|
||||
211 UNIMPL NOHIDE
|
||||
212 UNIMPL NOHIDE
|
||||
213 UNIMPL NOHIDE
|
||||
214 UNIMPL NOHIDE
|
||||
215 UNIMPL NOHIDE
|
||||
216 UNIMPL NOHIDE
|
||||
217 UNIMPL NOHIDE
|
||||
218 UNIMPL NOHIDE
|
||||
219 UNIMPL NOHIDE
|
||||
|
||||
;
|
||||
; The following were introduced with NetBSD/4.4Lite-2
|
||||
; They are initialized by thier respective modules/sysinits
|
||||
220 MNOSTD BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
220 MNOPROTO BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
union semun *arg); }
|
||||
221 MNOSTD BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOSTD BSD { int semop(int semid, struct sembuf *sops, \
|
||||
221 MNOPROTO BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOPROTO BSD { int semop(int semid, struct sembuf *sops, \
|
||||
u_int nsops); }
|
||||
223 UNIMPL NOHIDE semconfig
|
||||
224 MNOSTD BSD { int msgctl(int msqid, int cmd, \
|
||||
224 MNOPROTO BSD { int msgctl(int msqid, int cmd, \
|
||||
struct msqid_ds *buf); }
|
||||
225 MNOSTD BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOSTD BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
225 MNOPROTO BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOPROTO BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
int msgflg); }
|
||||
227 MNOSTD BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
227 MNOPROTO BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
long msgtyp, int msgflg); }
|
||||
228 MNOSTD BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOSTD BSD { int shmctl(int shmid, int cmd, \
|
||||
228 MNOPROTO BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOPROTO BSD { int shmctl(int shmid, int cmd, \
|
||||
struct shmid_ds *buf); }
|
||||
230 MNOSTD BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOSTD BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
230 MNOPROTO BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOPROTO BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
;
|
||||
232 MSTD POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
232 MNOPROTO POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
233 MSTD POSIX { int clock_settime(clockid_t clock_id, \
|
||||
233 MNOPROTO POSIX { int clock_settime(clockid_t clock_id, \
|
||||
const struct timespec *tp); }
|
||||
234 MSTD POSIX { int clock_getres(clockid_t clock_id, \
|
||||
234 MNOPROTO POSIX { int clock_getres(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
235 UNIMPL NOHIDE timer_create
|
||||
236 UNIMPL NOHIDE timer_delete
|
||||
237 UNIMPL NOHIDE timer_settime
|
||||
238 UNIMPL NOHIDE timer_gettime
|
||||
239 UNIMPL NOHIDE timer_getoverrun
|
||||
240 MSTD POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
240 MNOPROTO POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
struct timespec *rmtp); }
|
||||
241 UNIMPL NOHIDE nosys
|
||||
242 UNIMPL NOHIDE nosys
|
||||
@ -388,12 +382,12 @@
|
||||
248 UNIMPL NOHIDE nosys
|
||||
249 UNIMPL NOHIDE nosys
|
||||
; syscall numbers initially used in OpenBSD
|
||||
250 MSTD BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MSTD BSD { int rfork(int flags); }
|
||||
252 MSTD BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
250 MNOPROTO BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MNOPROTO BSD { int rfork(int flags); }
|
||||
252 MNOPROTO BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
253 STD BSD { int issetugid(void); }
|
||||
254 STD BSD { int lchown(char *path, int uid, int gid); }
|
||||
253 NOPROTO BSD { int issetugid(void); }
|
||||
254 NOPROTO BSD { int lchown(char *path, int uid, int gid); }
|
||||
255 UNIMPL NOHIDE nosys
|
||||
256 UNIMPL NOHIDE nosys
|
||||
257 UNIMPL NOHIDE nosys
|
||||
@ -411,15 +405,15 @@
|
||||
269 UNIMPL NOHIDE nosys
|
||||
270 UNIMPL NOHIDE nosys
|
||||
271 UNIMPL NOHIDE nosys
|
||||
272 STD BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
272 NOPROTO BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
273 UNIMPL NOHIDE nosys
|
||||
274 STD BSD { int lchmod(char *path, mode_t mode); }
|
||||
274 NOPROTO BSD { int lchmod(char *path, mode_t mode); }
|
||||
275 NOPROTO BSD { int lchown(char *path, uid_t uid, gid_t gid); } netbsd_lchown lchown_args int
|
||||
276 STD BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
276 NOPROTO BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
277 MNOPROTO BSD { int msync(void *addr, size_t len, int flags); } netbsd_msync msync_args int
|
||||
278 STD BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MSTD BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 STD BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
278 NOPROTO BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MNOPROTO BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 NOPROTO BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
281 UNIMPL NOHIDE nosys
|
||||
282 UNIMPL NOHIDE nosys
|
||||
283 UNIMPL NOHIDE nosys
|
||||
@ -437,126 +431,133 @@
|
||||
295 UNIMPL NOHIDE nosys
|
||||
296 UNIMPL NOHIDE nosys
|
||||
; XXX 297 is 300 in NetBSD
|
||||
297 STD BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 STD BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 STD BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
297 NOPROTO BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 NOPROTO BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 NOPROTO BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
; syscall numbers for FreeBSD
|
||||
300 MSTD BSD { int modnext(int modid); }
|
||||
301 MSTD BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MSTD BSD { int modfnext(int modid); }
|
||||
303 MSTD BSD { int modfind(const char *name); }
|
||||
304 MSTD BSD { int kldload(const char *file); }
|
||||
305 MSTD BSD { int kldunload(int fileid); }
|
||||
306 MSTD BSD { int kldfind(const char *file); }
|
||||
307 MSTD BSD { int kldnext(int fileid); }
|
||||
308 MSTD BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MSTD BSD { int kldfirstmod(int fileid); }
|
||||
310 MSTD BSD { int getsid(pid_t pid); }
|
||||
311 MSTD BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MSTD BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
300 MNOPROTO BSD { int modnext(int modid); }
|
||||
301 MNOPROTO BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MNOPROTO BSD { int modfnext(int modid); }
|
||||
303 MNOPROTO BSD { int modfind(const char *name); }
|
||||
304 MNOPROTO BSD { int kldload(const char *file); }
|
||||
305 MNOPROTO BSD { int kldunload(int fileid); }
|
||||
306 MNOPROTO BSD { int kldfind(const char *file); }
|
||||
307 MNOPROTO BSD { int kldnext(int fileid); }
|
||||
308 MNOPROTO BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MNOPROTO BSD { int kldfirstmod(int fileid); }
|
||||
310 MNOPROTO BSD { int getsid(pid_t pid); }
|
||||
311 MNOPROTO BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MNOPROTO BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
313 OBSOL NOHIDE signanosleep
|
||||
314 NOSTD BSD { int aio_return(struct aiocb *aiocbp); }
|
||||
315 NOSTD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
||||
316 NOSTD BSD { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
||||
317 NOSTD BSD { int aio_error(struct aiocb *aiocbp); }
|
||||
318 NOSTD BSD { int aio_read(struct aiocb *aiocbp); }
|
||||
319 NOSTD BSD { int aio_write(struct aiocb *aiocbp); }
|
||||
320 NOSTD BSD { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
||||
321 MSTD BSD { int yield(void); }
|
||||
314 UNIMPL NOHIDE aio_return
|
||||
315 UNIMPL NOHIDE aio_suspend
|
||||
316 UNIMPL NOHIDE aio_cancel
|
||||
317 UNIMPL NOHIDE aio_error
|
||||
318 UNIMPL NOHIDE aio_read
|
||||
319 UNIMPL NOHIDE aio_write
|
||||
320 UNIMPL NOHIDE lio_listio
|
||||
321 MNOPROTO BSD { int yield(void); }
|
||||
322 OBSOL NOHIDE thr_sleep
|
||||
323 OBSOL NOHIDE thr_wakeup
|
||||
324 MSTD BSD { int mlockall(int how); }
|
||||
325 MSTD BSD { int munlockall(void); }
|
||||
326 STD BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
324 MNOPROTO BSD { int mlockall(int how); }
|
||||
325 MNOPROTO BSD { int munlockall(void); }
|
||||
326 NOPROTO BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
|
||||
327 MSTD POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MSTD POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
327 MNOPROTO POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MNOPROTO POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
|
||||
329 MSTD POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MSTD POSIX { int sched_getscheduler (pid_t pid); }
|
||||
329 MNOPROTO POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MNOPROTO POSIX { int sched_getscheduler (pid_t pid); }
|
||||
|
||||
331 MSTD POSIX { int sched_yield (void); }
|
||||
332 MSTD POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MSTD POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MSTD POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 STD BSD { int utrace(const void *addr, size_t len); }
|
||||
336 MSTD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 STD BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MSTD BSD { int jail(struct jail *jail); }
|
||||
331 MNOPROTO POSIX { int sched_yield (void); }
|
||||
332 MNOPROTO POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MNOPROTO POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MNOPROTO POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 NOPROTO BSD { int utrace(const void *addr, size_t len); }
|
||||
; XXX note - bigendian is different
|
||||
336 MSTD BSD { int ia32_sendfile(int fd, int s, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 NOPROTO BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MNOPROTO BSD { int jail(struct jail *jail); }
|
||||
339 UNIMPL BSD pioctl
|
||||
340 MSTD POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
340 MNOPROTO POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
sigset_t *oset); }
|
||||
341 MSTD POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 MSTD POSIX { int sigaction(int sig, const struct sigaction *act, \
|
||||
struct sigaction *oact); }
|
||||
343 MSTD POSIX { int sigpending(sigset_t *set); }
|
||||
344 STD BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
341 MNOPROTO POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 STD POSIX { int ia32_sigaction(int sig, \
|
||||
struct sigaction32 *act, \
|
||||
struct sigaction32 *oact); }
|
||||
343 MNOPROTO POSIX { int sigpending(sigset_t *set); }
|
||||
344 MNOPROTO BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
345 UNIMPL NOHIDE sigtimedwait
|
||||
346 UNIMPL NOHIDE sigwaitinfo
|
||||
347 MSTD BSD { int __acl_get_file(const char *path, \
|
||||
347 MNOPROTO BSD { int __acl_get_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
348 MSTD BSD { int __acl_set_file(const char *path, \
|
||||
348 MNOPROTO BSD { int __acl_set_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
349 MSTD BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
349 MNOPROTO BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
350 MSTD BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
350 MNOPROTO BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
351 MSTD BSD { int __acl_delete_file(const char *path, \
|
||||
351 MNOPROTO BSD { int __acl_delete_file(const char *path, \
|
||||
acl_type_t type); }
|
||||
352 MSTD BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MSTD BSD { int __acl_aclcheck_file(const char *path, \
|
||||
352 MNOPROTO BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MNOPROTO BSD { int __acl_aclcheck_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
354 MSTD BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
354 MNOPROTO BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
355 STD BSD { int extattrctl(const char *path, int cmd, \
|
||||
355 NOPROTO BSD { int extattrctl(const char *path, int cmd, \
|
||||
const char *filename, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
356 STD BSD { int extattr_set_file(const char *path, \
|
||||
356 NOPROTO BSD { int extattr_set_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
357 STD BSD { ssize_t extattr_get_file(const char *path, \
|
||||
357 NOPROTO BSD { ssize_t extattr_get_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
358 STD BSD { int extattr_delete_file(const char *path, \
|
||||
358 NOPROTO BSD { int extattr_delete_file(const char *path, \
|
||||
int attrnamespace, const char *attrname); }
|
||||
359 NOSTD BSD { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }
|
||||
360 MSTD BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MSTD BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MSTD BSD { int kqueue(void); }
|
||||
363 MSTD BSD { int kevent(int fd, \
|
||||
359 UNIMPL NOHIDE aio_waitcomplete
|
||||
360 MNOPROTO BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MNOPROTO BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MNOPROTO BSD { int kqueue(void); }
|
||||
363 MNOPROTO BSD { int kevent(int fd, \
|
||||
const struct kevent *changelist, int nchanges, \
|
||||
struct kevent *eventlist, int nevents, \
|
||||
const struct timespec *timeout); }
|
||||
364 STD BSD { int __cap_get_proc(struct cap *cap_p); }
|
||||
365 STD BSD { int __cap_set_proc(struct cap *cap_p); }
|
||||
366 STD BSD { int __cap_get_fd(int fd, struct cap *cap_p); }
|
||||
367 STD BSD { int __cap_get_file(const char *path_p, struct cap *cap_p); }
|
||||
368 STD BSD { int __cap_set_fd(int fd, struct cap *cap_p); }
|
||||
369 STD BSD { int __cap_set_file(const char *path_p, struct cap *cap_p); }
|
||||
370 NODEF NOHIDE lkmressys lkmressys nosys_args int
|
||||
371 STD BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
364 UNIMPL NOHIDE __cap_get_proc
|
||||
365 UNIMPL NOHIDE __cap_set_proc
|
||||
366 UNIMPL NOHIDE __cap_get_fd
|
||||
367 UNIMPL NOHIDE __cap_get_file
|
||||
368 UNIMPL NOHIDE __cap_set_fd
|
||||
369 UNIMPL NOHIDE __cap_set_file
|
||||
370 UNIMPL NOHIDE lkmressys
|
||||
371 NOPROTO BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, \
|
||||
size_t nbytes); }
|
||||
372 STD BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
372 NOPROTO BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, size_t nbytes); }
|
||||
373 STD BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
373 NOPROTO BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
374 MSTD BSD { int __setugid(int flag); }
|
||||
375 NOIMPL BSD { int nfsclnt(int flag, caddr_t argp); }
|
||||
376 STD BSD { int eaccess(char *path, int flags); }
|
||||
374 MNOPROTO BSD { int __setugid(int flag); }
|
||||
375 UNIMPL BSD nfsclnt
|
||||
376 NOPROTO BSD { int eaccess(char *path, int flags); }
|
||||
377 UNIMPL BSD afs_syscall
|
||||
378 STD BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
378 NOPROTO BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
int flags); }
|
||||
379 STD BSD { int kse_exit(void); }
|
||||
380 STD BSD { int kse_wakeup(void); }
|
||||
381 STD BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
379 NOPROTO BSD { int kse_exit(void); }
|
||||
380 NOPROTO BSD { int kse_wakeup(void); }
|
||||
381 NOPROTO BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
int new_grp_flag); }
|
||||
382 STD BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 STD BSD { int kse_yield(void); }
|
||||
382 NOPROTO BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 NOPROTO BSD { int kse_yield(void); }
|
||||
384 UNIMPL BSD __mac_get_proc
|
||||
385 UNIMPL BSD __mac_set_proc
|
||||
386 UNIMPL BSD __mac_get_fd
|
||||
387 UNIMPL BSD __mac_get_file
|
||||
388 UNIMPL BSD __mac_set_fd
|
||||
389 UNIMPL BSD __mac_set_file
|
||||
390 NOPROTO BSD { int kenv(int what, const char *name, char *value, \
|
||||
int len); }
|
||||
391 NOPROTO BSD { int lchflags(const char *path, int flags); }
|
||||
392 NOPROTO BSD { int uuidgen(struct uuid *store, int count); }
|
||||
|
365
sys/compat/ia32/ia32_sysvec.c
Normal file
365
sys/compat/ia32/ia32_sysvec.c
Normal file
@ -0,0 +1,365 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#define __ELF_WORD_SIZE 32
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/exec.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/pioctl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/procfs.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm_map.h>
|
||||
#include <vm/vm_object.h>
|
||||
#include <vm/vm_extern.h>
|
||||
|
||||
#include <ia64/ia32/ia32_util.h>
|
||||
#include <i386/include/psl.h>
|
||||
#include <i386/include/segments.h>
|
||||
#include <i386/include/specialreg.h>
|
||||
#include <machine/frame.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
static register_t *ia32_copyout_strings(struct image_params *imgp);
|
||||
static void ia32_setregs(struct thread *td, u_long entry, u_long stack,
|
||||
u_long ps_strings);
|
||||
|
||||
extern struct sysent ia32_sysent[];
|
||||
|
||||
static char ia32_sigcode[] = {
|
||||
0xff, 0x54, 0x24, 0x10, /* call *SIGF_HANDLER(%esp) */
|
||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_UC(%esp),%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xf7, 0x40, 0x54, 0x00, 0x00, 0x02, 0x02, /* testl $PSL_VM,UC_EFLAGS(%eax) */
|
||||
0x75, 0x03, /* jne 9f */
|
||||
0x8e, 0x68, 0x14, /* movl UC_GS(%eax),%gs */
|
||||
0xb8, 0x57, 0x01, 0x00, 0x00, /* 9: movl $SYS_sigreturn,%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xcd, 0x80, /* int $0x80 */
|
||||
0xeb, 0xfe, /* 0: jmp 0b */
|
||||
0, 0, 0, 0
|
||||
};
|
||||
static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
|
||||
|
||||
struct sysentvec ia32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
ia32_sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
ia32_sigcode,
|
||||
&ia32_szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF",
|
||||
elf32_coredump,
|
||||
NULL,
|
||||
MINSIGSTKSZ,
|
||||
4096,
|
||||
IA32_USRSTACK,
|
||||
IA32_USRSTACK,
|
||||
ia32_copyout_strings,
|
||||
ia32_setregs
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo ia32_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"/compat/ia32",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&ia32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&ia32_brand_info);
|
||||
|
||||
static register_t *
|
||||
ia32_copyout_strings(struct image_params *imgp)
|
||||
{
|
||||
int argc, envc;
|
||||
u_int32_t *vectp;
|
||||
char *stringp, *destp;
|
||||
u_int32_t *stack_base;
|
||||
struct ia32_ps_strings *arginfo;
|
||||
int szsigcode;
|
||||
|
||||
/*
|
||||
* Calculate string base and vector table pointers.
|
||||
* Also deal with signal trampoline code for this exec type.
|
||||
*/
|
||||
arginfo = (struct ia32_ps_strings *)IA32_PS_STRINGS;
|
||||
szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
|
||||
destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
|
||||
roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
|
||||
|
||||
/*
|
||||
* install sigcode
|
||||
*/
|
||||
if (szsigcode)
|
||||
copyout(imgp->proc->p_sysent->sv_sigcode,
|
||||
((caddr_t)arginfo - szsigcode), szsigcode);
|
||||
|
||||
/*
|
||||
* If we have a valid auxargs ptr, prepare some room
|
||||
* on the stack.
|
||||
*/
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
* 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
|
||||
* lower compatibility.
|
||||
*/
|
||||
imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size
|
||||
: (AT_COUNT * 2);
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets,and imgp->auxarg_size is room
|
||||
* for argument of Runtime loader.
|
||||
*/
|
||||
vectp = (u_int32_t *) (destp - (imgp->argc + imgp->envc + 2 +
|
||||
imgp->auxarg_size) * sizeof(u_int32_t));
|
||||
|
||||
} else
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets
|
||||
*/
|
||||
vectp = (u_int32_t *)
|
||||
(destp - (imgp->argc + imgp->envc + 2) * sizeof(u_int32_t));
|
||||
|
||||
/*
|
||||
* vectp also becomes our initial stack base
|
||||
*/
|
||||
stack_base = vectp;
|
||||
|
||||
stringp = imgp->stringbase;
|
||||
argc = imgp->argc;
|
||||
envc = imgp->envc;
|
||||
|
||||
/*
|
||||
* Copy out strings - arguments and environment.
|
||||
*/
|
||||
copyout(stringp, destp, ARG_MAX - imgp->stringspace);
|
||||
|
||||
/*
|
||||
* Fill in "ps_strings" struct for ps, w, etc.
|
||||
*/
|
||||
suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nargvstr, argc);
|
||||
|
||||
/*
|
||||
* Fill in argument portion of vector table.
|
||||
*/
|
||||
for (; argc > 0; --argc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* a null vector table pointer separates the argp's from the envp's */
|
||||
suword32(vectp++, 0);
|
||||
|
||||
suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nenvstr, envc);
|
||||
|
||||
/*
|
||||
* Fill in environment portion of vector table.
|
||||
*/
|
||||
for (; envc > 0; --envc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* end of vector table is a null pointer */
|
||||
suword32(vectp, 0);
|
||||
|
||||
return ((register_t *)stack_base);
|
||||
}
|
||||
|
||||
static void
|
||||
ia32_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
vm_offset_t gdt, ldt;
|
||||
u_int64_t codesel, datasel, ldtsel;
|
||||
u_int64_t codeseg, dataseg, gdtseg, ldtseg;
|
||||
struct segment_descriptor desc;
|
||||
struct vmspace *vmspace = td->td_proc->p_vmspace;
|
||||
|
||||
/*
|
||||
* Make sure that we restore the entire trapframe after an
|
||||
* execve.
|
||||
*/
|
||||
frame->tf_flags &= ~FRAME_SYSCALL;
|
||||
|
||||
bzero(frame->tf_r, sizeof(frame->tf_r));
|
||||
bzero(frame->tf_f, sizeof(frame->tf_f));
|
||||
|
||||
frame->tf_cr_iip = entry;
|
||||
frame->tf_cr_ipsr = (IA64_PSR_IC
|
||||
| IA64_PSR_I
|
||||
| IA64_PSR_IT
|
||||
| IA64_PSR_DT
|
||||
| IA64_PSR_RT
|
||||
| IA64_PSR_DFH
|
||||
| IA64_PSR_IS
|
||||
| IA64_PSR_BN
|
||||
| IA64_PSR_CPL_USER);
|
||||
frame->tf_r[FRAME_R12] = stack;
|
||||
|
||||
codesel = LSEL(LUCODE_SEL, SEL_UPL);
|
||||
datasel = LSEL(LUDATA_SEL, SEL_UPL);
|
||||
ldtsel = GSEL(GLDT_SEL, SEL_UPL);
|
||||
|
||||
#if 1
|
||||
frame->tf_r[FRAME_R16] = (datasel << 48) | (datasel << 32)
|
||||
| (datasel << 16) | datasel;
|
||||
frame->tf_r[FRAME_R17] = (ldtsel << 32) | (datasel << 16) | codesel;
|
||||
#else
|
||||
frame->tf_r[FRAME_R16] = datasel;
|
||||
frame->tf_r[FRAME_R17] = codesel;
|
||||
frame->tf_r[FRAME_R18] = datasel;
|
||||
frame->tf_r[FRAME_R19] = datasel;
|
||||
frame->tf_r[FRAME_R20] = datasel;
|
||||
frame->tf_r[FRAME_R21] = datasel;
|
||||
frame->tf_r[FRAME_R22] = ldtsel;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Build the GDT and LDT.
|
||||
*/
|
||||
gdt = IA32_USRSTACK;
|
||||
vm_map_find(&vmspace->vm_map, 0, 0,
|
||||
&gdt, PAGE_SIZE, 0,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
ldt = gdt + 4096;
|
||||
|
||||
desc.sd_lolimit = 8*NLDT-1;
|
||||
desc.sd_lobase = ldt & 0xffffff;
|
||||
desc.sd_type = SDT_SYSLDT;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = 0;
|
||||
desc.sd_def32 = 0;
|
||||
desc.sd_gran = 0;
|
||||
desc.sd_hibase = ldt >> 24;
|
||||
copyout(&desc, (caddr_t) gdt + 8*GLDT_SEL, sizeof(desc));
|
||||
|
||||
desc.sd_lolimit = ((IA32_USRSTACK >> 12) - 1) & 0xffff;
|
||||
desc.sd_lobase = 0;
|
||||
desc.sd_type = SDT_MEMERA;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = ((IA32_USRSTACK >> 12) - 1) >> 16;
|
||||
desc.sd_def32 = 1;
|
||||
desc.sd_gran = 1;
|
||||
desc.sd_hibase = 0;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUCODE_SEL, sizeof(desc));
|
||||
desc.sd_type = SDT_MEMRWA;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUDATA_SEL, sizeof(desc));
|
||||
|
||||
codeseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMERA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
dataseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMRWA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
ia64_set_csd(codeseg);
|
||||
ia64_set_ssd(dataseg);
|
||||
frame->tf_r[FRAME_R24] = dataseg; /* ESD */
|
||||
frame->tf_r[FRAME_R27] = dataseg; /* DSD */
|
||||
frame->tf_r[FRAME_R28] = dataseg; /* FSD */
|
||||
frame->tf_r[FRAME_R29] = dataseg; /* GSD */
|
||||
|
||||
gdtseg = gdt /* base */
|
||||
+ ((8L*NGDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSNULL << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
ldtseg = ldt /* base */
|
||||
+ ((8L*NLDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSLDT << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
frame->tf_r[FRAME_R30] = ldtseg; /* LDTD */
|
||||
frame->tf_r[FRAME_R31] = gdtseg; /* GDTD */
|
||||
|
||||
ia64_set_eflag(PSL_USER);
|
||||
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
frame->tf_r[FRAME_R11] = IA32_PS_STRINGS;
|
||||
|
||||
/*
|
||||
* XXX - Linux emulator
|
||||
* Make sure sure edx is 0x0 on entry. Linux binaries depend
|
||||
* on it.
|
||||
*/
|
||||
td->td_retval[1] = 0;
|
||||
}
|
94
sys/compat/ia32/ia32_util.h
Normal file
94
sys/compat/ia32/ia32_util.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*-
|
||||
* Copyright (c) 1998-1999 Andrew Gallatin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software withough specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
|
||||
#include <sys/exec.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
|
||||
#ifndef SCARG
|
||||
#define SCARG(p, x) (p)->x
|
||||
#endif
|
||||
|
||||
struct ia32_ps_strings {
|
||||
u_int32_t ps_argvstr; /* first of 0 or more argument strings */
|
||||
int ps_nargvstr; /* the number of argument strings */
|
||||
u_int32_t ps_envstr; /* first of 0 or more environment strings */
|
||||
int ps_nenvstr; /* the number of environment strings */
|
||||
};
|
||||
|
||||
#define IA32_USRSTACK (4L*1024*1024*1024 - PAGE_SIZE)
|
||||
#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
|
||||
|
||||
static __inline caddr_t stackgap_init(void);
|
||||
static __inline void *stackgap_alloc(caddr_t *, size_t);
|
||||
|
||||
static __inline caddr_t
|
||||
stackgap_init()
|
||||
{
|
||||
#define szsigcode (*(curproc->p_sysent->sv_szsigcode))
|
||||
return (caddr_t)(((caddr_t)IA32_PS_STRINGS) - szsigcode - SPARE_USRSPACE);
|
||||
#undef szsigcode
|
||||
}
|
||||
|
||||
static __inline void *
|
||||
stackgap_alloc(sgp, sz)
|
||||
caddr_t *sgp;
|
||||
size_t sz;
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = (void *) *sgp;
|
||||
*sgp += ALIGN(sz);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
extern const char ia32_emul_path[];
|
||||
int ia32_emul_find(struct thread *, caddr_t *, const char *, char *,
|
||||
char **, int);
|
||||
|
||||
#define CHECKALT(p, sgp, path, i) \
|
||||
do { \
|
||||
int _error; \
|
||||
\
|
||||
_error = ia32_emul_find(p, sgp, ia32_emul_path, path, \
|
||||
&path, i); \
|
||||
if (_error == EFAULT) \
|
||||
return (_error); \
|
||||
} while (0)
|
||||
|
||||
#define CHECKALTEXIST(p, sgp, path) CHECKALT((p), (sgp), (path), 0)
|
||||
#define CHECKALTCREAT(p, sgp, path) CHECKALT((p), (sgp), (path), 1)
|
@ -465,7 +465,7 @@ exec_pecoff_coff_prep_zmagic(struct image_params * imgp,
|
||||
peofs + PECOFF_HDR_SIZE, (caddr_t) sh, scnsiz);
|
||||
if ((error = exec_extract_strings(imgp)) != 0)
|
||||
goto fail;
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
vmspace = imgp->proc->p_vmspace;
|
||||
for (i = 0; i < fp->f_nscns; i++) {
|
||||
prot = VM_PROT_WRITE; /* XXX for relocation? */
|
||||
|
@ -119,7 +119,7 @@ exec_svr4_imgact(imgp)
|
||||
/*
|
||||
* Destroy old process VM and create a new one (with a new stack)
|
||||
*/
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
vmspace = imgp->proc->p_vmspace;
|
||||
|
||||
/*
|
||||
|
@ -179,13 +179,14 @@ struct sysentvec svr4_sysvec = {
|
||||
&svr4_szsigcode,
|
||||
NULL,
|
||||
"SVR4",
|
||||
elf_coredump,
|
||||
elf32_coredump,
|
||||
NULL,
|
||||
SVR4_MINSIGSTKSZ
|
||||
};
|
||||
|
||||
Elf32_Brandinfo svr4_brand = {
|
||||
ELFOSABI_SYSV,
|
||||
EM_386, /* XXX only implemented for x86 so far. */
|
||||
"SVR4",
|
||||
svr4_emul_path,
|
||||
"/lib/libc.so.1",
|
||||
@ -376,7 +377,7 @@ svr4_elf_modevent(module_t mod, int type, void *data)
|
||||
|
||||
switch(type) {
|
||||
case MOD_LOAD:
|
||||
if (elf_insert_brand_entry(&svr4_brand) < 0)
|
||||
if (elf32_insert_brand_entry(&svr4_brand) < 0)
|
||||
error = EINVAL;
|
||||
if (error)
|
||||
printf("cannot insert svr4 elf brand handler\n");
|
||||
@ -385,9 +386,9 @@ svr4_elf_modevent(module_t mod, int type, void *data)
|
||||
break;
|
||||
case MOD_UNLOAD:
|
||||
/* Only allow the emulator to be removed if it isn't in use. */
|
||||
if (elf_brand_inuse(&svr4_brand) != 0) {
|
||||
if (elf32_brand_inuse(&svr4_brand) != 0) {
|
||||
error = EBUSY;
|
||||
} else if (elf_remove_brand_entry(&svr4_brand) < 0) {
|
||||
} else if (elf32_remove_brand_entry(&svr4_brand) < 0) {
|
||||
error = EINVAL;
|
||||
}
|
||||
|
||||
|
@ -841,7 +841,9 @@ isofs/cd9660/cd9660_rrip.c optional cd9660
|
||||
isofs/cd9660/cd9660_util.c optional cd9660
|
||||
isofs/cd9660/cd9660_vfsops.c optional cd9660
|
||||
isofs/cd9660/cd9660_vnops.c optional cd9660
|
||||
kern/imgact_elf.c standard
|
||||
kern/imgact_elf32.c standard
|
||||
kern/imgact_elf64.c standard
|
||||
kern/imgact_elfN.c standard
|
||||
kern/imgact_shell.c standard
|
||||
kern/inflate.c optional gzip
|
||||
kern/init_main.c standard
|
||||
|
@ -22,8 +22,9 @@ ia64/acpica/acpi_machdep.c optional acpica
|
||||
ia64/acpica/acpi_wakeup.c optional acpica
|
||||
ia64/acpica/OsdEnvironment.c optional acpica
|
||||
ia64/acpica/madt.c optional acpica
|
||||
ia64/ia32/ia32_misc.c optional ia32
|
||||
ia64/ia32/ia32_sysent.c optional ia32
|
||||
ia64/ia32/imgact_ia32.c optional ia32
|
||||
ia64/ia32/ia32_sysvec.c optional ia32
|
||||
ia64/ia64/ia64-gdbstub.c optional ddb
|
||||
ia64/ia64/autoconf.c standard
|
||||
ia64/ia64/busdma_machdep.c standard
|
||||
|
@ -26,9 +26,49 @@
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/linker.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
struct sysentvec elf32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF32",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
/* Process one elf relocation with addend. */
|
||||
int
|
||||
|
@ -333,7 +333,7 @@ exec_coff_imgact(imgp)
|
||||
return error;
|
||||
}
|
||||
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
vmspace = imgp->proc->p_vmspace;
|
||||
|
||||
for (i = 0; i < nscns; i++) {
|
||||
|
@ -118,7 +118,7 @@ exec_linux_imgact(imgp)
|
||||
/*
|
||||
* Destroy old process VM and create a new one (with a new stack)
|
||||
*/
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
vmspace = imgp->proc->p_vmspace;
|
||||
|
||||
/*
|
||||
|
@ -792,13 +792,14 @@ struct sysentvec elf_linux_sysvec = {
|
||||
&linux_szsigcode,
|
||||
linux_prepsyscall,
|
||||
"Linux ELF",
|
||||
elf_coredump,
|
||||
elf32_coredump,
|
||||
exec_linux_imgact_try,
|
||||
LINUX_MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo linux_brand = {
|
||||
ELFOSABI_LINUX,
|
||||
EM_386,
|
||||
"Linux",
|
||||
"/compat/linux",
|
||||
"/lib/ld-linux.so.1",
|
||||
@ -807,6 +808,7 @@ static Elf32_Brandinfo linux_brand = {
|
||||
|
||||
static Elf32_Brandinfo linux_glibc2brand = {
|
||||
ELFOSABI_LINUX,
|
||||
EM_386,
|
||||
"Linux",
|
||||
"/compat/linux",
|
||||
"/lib/ld-linux.so.2",
|
||||
@ -832,7 +834,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
|
||||
case MOD_LOAD:
|
||||
for (brandinfo = &linux_brandlist[0]; *brandinfo != NULL;
|
||||
++brandinfo)
|
||||
if (elf_insert_brand_entry(*brandinfo) < 0)
|
||||
if (elf32_insert_brand_entry(*brandinfo) < 0)
|
||||
error = EINVAL;
|
||||
if (error == 0) {
|
||||
SET_FOREACH(lihp, linux_ioctl_handler_set)
|
||||
@ -845,12 +847,12 @@ linux_elf_modevent(module_t mod, int type, void *data)
|
||||
case MOD_UNLOAD:
|
||||
for (brandinfo = &linux_brandlist[0]; *brandinfo != NULL;
|
||||
++brandinfo)
|
||||
if (elf_brand_inuse(*brandinfo))
|
||||
if (elf32_brand_inuse(*brandinfo))
|
||||
error = EBUSY;
|
||||
if (error == 0) {
|
||||
for (brandinfo = &linux_brandlist[0];
|
||||
*brandinfo != NULL; ++brandinfo)
|
||||
if (elf_remove_brand_entry(*brandinfo) < 0)
|
||||
if (elf32_remove_brand_entry(*brandinfo) < 0)
|
||||
error = EINVAL;
|
||||
}
|
||||
if (error == 0) {
|
||||
|
103
sys/ia64/ia32/ia32.h
Normal file
103
sys/ia64/ia32/ia32.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*-
|
||||
* Copyright (c) 2001 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _IA64_IA32_IA32_H_
|
||||
#define _IA64_IA32_IA32_H_
|
||||
|
||||
#define PTRIN(v) (void *)(uintptr_t) (v)
|
||||
#define PTROUT(v) (u_int32_t)(uintptr_t) (v)
|
||||
|
||||
#define CP(src,dst,fld) do { (dst).fld = (src).fld; } while (0)
|
||||
#define PTRIN_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTRIN((src).fld); } while (0)
|
||||
#define PTROUT_CP(src,dst,fld) \
|
||||
do { (dst).fld = PTROUT((src).fld); } while (0)
|
||||
|
||||
struct timeval32 {
|
||||
int32_t tv_sec;
|
||||
int32_t tv_usec;
|
||||
};
|
||||
#define TV_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_usec); \
|
||||
} while (0);
|
||||
|
||||
struct timespec32 {
|
||||
u_int32_t tv_sec;
|
||||
u_int32_t tv_nsec;
|
||||
};
|
||||
#define TS_CP(src,dst,fld) do { \
|
||||
CP((src).fld,(dst).fld,tv_sec); \
|
||||
CP((src).fld,(dst).fld,tv_nsec); \
|
||||
} while (0);
|
||||
|
||||
struct rusage32 {
|
||||
struct timeval32 ru_utime;
|
||||
struct timeval32 ru_stime;
|
||||
int32_t ru_maxrss;
|
||||
int32_t ru_ixrss;
|
||||
int32_t ru_idrss;
|
||||
int32_t ru_isrss;
|
||||
int32_t ru_minflt;
|
||||
int32_t ru_majflt;
|
||||
int32_t ru_nswap;
|
||||
int32_t ru_inblock;
|
||||
int32_t ru_oublock;
|
||||
int32_t ru_msgsnd;
|
||||
int32_t ru_msgrcv;
|
||||
int32_t ru_nsignals;
|
||||
int32_t ru_nvcsw;
|
||||
int32_t ru_nivcsw;
|
||||
};
|
||||
|
||||
struct statfs32 {
|
||||
int32_t f_spare2;
|
||||
int32_t f_bsize;
|
||||
int32_t f_iosize;
|
||||
int32_t f_blocks;
|
||||
int32_t f_bfree;
|
||||
int32_t f_bavail;
|
||||
int32_t f_files;
|
||||
int32_t f_ffree;
|
||||
fsid_t f_fsid;
|
||||
uid_t f_owner;
|
||||
int32_t f_type;
|
||||
int32_t f_flags;
|
||||
int32_t f_syncwrites;
|
||||
int32_t f_asyncwrites;
|
||||
char f_fstypename[MFSNAMELEN];
|
||||
char f_mntonname[MNAMELEN];
|
||||
int32_t f_syncreads;
|
||||
int32_t f_asyncreads;
|
||||
int16_t f_spares1;
|
||||
char f_mntfromname[MNAMELEN];
|
||||
int16_t f_spares2;
|
||||
int32_t f_spare[2];
|
||||
};
|
||||
|
||||
#endif /* !_IA64_IA32_IA32_H_ */
|
1339
sys/ia64/ia32/ia32_misc.c
Normal file
1339
sys/ia64/ia32/ia32_misc.c
Normal file
File diff suppressed because it is too large
Load Diff
365
sys/ia64/ia32/ia32_signal.c
Normal file
365
sys/ia64/ia32/ia32_signal.c
Normal file
@ -0,0 +1,365 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#define __ELF_WORD_SIZE 32
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/exec.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/pioctl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/procfs.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm_map.h>
|
||||
#include <vm/vm_object.h>
|
||||
#include <vm/vm_extern.h>
|
||||
|
||||
#include <ia64/ia32/ia32_util.h>
|
||||
#include <i386/include/psl.h>
|
||||
#include <i386/include/segments.h>
|
||||
#include <i386/include/specialreg.h>
|
||||
#include <machine/frame.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
static register_t *ia32_copyout_strings(struct image_params *imgp);
|
||||
static void ia32_setregs(struct thread *td, u_long entry, u_long stack,
|
||||
u_long ps_strings);
|
||||
|
||||
extern struct sysent ia32_sysent[];
|
||||
|
||||
static char ia32_sigcode[] = {
|
||||
0xff, 0x54, 0x24, 0x10, /* call *SIGF_HANDLER(%esp) */
|
||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_UC(%esp),%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xf7, 0x40, 0x54, 0x00, 0x00, 0x02, 0x02, /* testl $PSL_VM,UC_EFLAGS(%eax) */
|
||||
0x75, 0x03, /* jne 9f */
|
||||
0x8e, 0x68, 0x14, /* movl UC_GS(%eax),%gs */
|
||||
0xb8, 0x57, 0x01, 0x00, 0x00, /* 9: movl $SYS_sigreturn,%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xcd, 0x80, /* int $0x80 */
|
||||
0xeb, 0xfe, /* 0: jmp 0b */
|
||||
0, 0, 0, 0
|
||||
};
|
||||
static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
|
||||
|
||||
struct sysentvec ia32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
ia32_sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
ia32_sigcode,
|
||||
&ia32_szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF",
|
||||
elf32_coredump,
|
||||
NULL,
|
||||
MINSIGSTKSZ,
|
||||
4096,
|
||||
IA32_USRSTACK,
|
||||
IA32_USRSTACK,
|
||||
ia32_copyout_strings,
|
||||
ia32_setregs
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo ia32_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"/compat/ia32",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&ia32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&ia32_brand_info);
|
||||
|
||||
static register_t *
|
||||
ia32_copyout_strings(struct image_params *imgp)
|
||||
{
|
||||
int argc, envc;
|
||||
u_int32_t *vectp;
|
||||
char *stringp, *destp;
|
||||
u_int32_t *stack_base;
|
||||
struct ia32_ps_strings *arginfo;
|
||||
int szsigcode;
|
||||
|
||||
/*
|
||||
* Calculate string base and vector table pointers.
|
||||
* Also deal with signal trampoline code for this exec type.
|
||||
*/
|
||||
arginfo = (struct ia32_ps_strings *)IA32_PS_STRINGS;
|
||||
szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
|
||||
destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
|
||||
roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
|
||||
|
||||
/*
|
||||
* install sigcode
|
||||
*/
|
||||
if (szsigcode)
|
||||
copyout(imgp->proc->p_sysent->sv_sigcode,
|
||||
((caddr_t)arginfo - szsigcode), szsigcode);
|
||||
|
||||
/*
|
||||
* If we have a valid auxargs ptr, prepare some room
|
||||
* on the stack.
|
||||
*/
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
* 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
|
||||
* lower compatibility.
|
||||
*/
|
||||
imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size
|
||||
: (AT_COUNT * 2);
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets,and imgp->auxarg_size is room
|
||||
* for argument of Runtime loader.
|
||||
*/
|
||||
vectp = (u_int32_t *) (destp - (imgp->argc + imgp->envc + 2 +
|
||||
imgp->auxarg_size) * sizeof(u_int32_t));
|
||||
|
||||
} else
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets
|
||||
*/
|
||||
vectp = (u_int32_t *)
|
||||
(destp - (imgp->argc + imgp->envc + 2) * sizeof(u_int32_t));
|
||||
|
||||
/*
|
||||
* vectp also becomes our initial stack base
|
||||
*/
|
||||
stack_base = vectp;
|
||||
|
||||
stringp = imgp->stringbase;
|
||||
argc = imgp->argc;
|
||||
envc = imgp->envc;
|
||||
|
||||
/*
|
||||
* Copy out strings - arguments and environment.
|
||||
*/
|
||||
copyout(stringp, destp, ARG_MAX - imgp->stringspace);
|
||||
|
||||
/*
|
||||
* Fill in "ps_strings" struct for ps, w, etc.
|
||||
*/
|
||||
suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nargvstr, argc);
|
||||
|
||||
/*
|
||||
* Fill in argument portion of vector table.
|
||||
*/
|
||||
for (; argc > 0; --argc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* a null vector table pointer separates the argp's from the envp's */
|
||||
suword32(vectp++, 0);
|
||||
|
||||
suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nenvstr, envc);
|
||||
|
||||
/*
|
||||
* Fill in environment portion of vector table.
|
||||
*/
|
||||
for (; envc > 0; --envc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* end of vector table is a null pointer */
|
||||
suword32(vectp, 0);
|
||||
|
||||
return ((register_t *)stack_base);
|
||||
}
|
||||
|
||||
static void
|
||||
ia32_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
vm_offset_t gdt, ldt;
|
||||
u_int64_t codesel, datasel, ldtsel;
|
||||
u_int64_t codeseg, dataseg, gdtseg, ldtseg;
|
||||
struct segment_descriptor desc;
|
||||
struct vmspace *vmspace = td->td_proc->p_vmspace;
|
||||
|
||||
/*
|
||||
* Make sure that we restore the entire trapframe after an
|
||||
* execve.
|
||||
*/
|
||||
frame->tf_flags &= ~FRAME_SYSCALL;
|
||||
|
||||
bzero(frame->tf_r, sizeof(frame->tf_r));
|
||||
bzero(frame->tf_f, sizeof(frame->tf_f));
|
||||
|
||||
frame->tf_cr_iip = entry;
|
||||
frame->tf_cr_ipsr = (IA64_PSR_IC
|
||||
| IA64_PSR_I
|
||||
| IA64_PSR_IT
|
||||
| IA64_PSR_DT
|
||||
| IA64_PSR_RT
|
||||
| IA64_PSR_DFH
|
||||
| IA64_PSR_IS
|
||||
| IA64_PSR_BN
|
||||
| IA64_PSR_CPL_USER);
|
||||
frame->tf_r[FRAME_R12] = stack;
|
||||
|
||||
codesel = LSEL(LUCODE_SEL, SEL_UPL);
|
||||
datasel = LSEL(LUDATA_SEL, SEL_UPL);
|
||||
ldtsel = GSEL(GLDT_SEL, SEL_UPL);
|
||||
|
||||
#if 1
|
||||
frame->tf_r[FRAME_R16] = (datasel << 48) | (datasel << 32)
|
||||
| (datasel << 16) | datasel;
|
||||
frame->tf_r[FRAME_R17] = (ldtsel << 32) | (datasel << 16) | codesel;
|
||||
#else
|
||||
frame->tf_r[FRAME_R16] = datasel;
|
||||
frame->tf_r[FRAME_R17] = codesel;
|
||||
frame->tf_r[FRAME_R18] = datasel;
|
||||
frame->tf_r[FRAME_R19] = datasel;
|
||||
frame->tf_r[FRAME_R20] = datasel;
|
||||
frame->tf_r[FRAME_R21] = datasel;
|
||||
frame->tf_r[FRAME_R22] = ldtsel;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Build the GDT and LDT.
|
||||
*/
|
||||
gdt = IA32_USRSTACK;
|
||||
vm_map_find(&vmspace->vm_map, 0, 0,
|
||||
&gdt, PAGE_SIZE, 0,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
ldt = gdt + 4096;
|
||||
|
||||
desc.sd_lolimit = 8*NLDT-1;
|
||||
desc.sd_lobase = ldt & 0xffffff;
|
||||
desc.sd_type = SDT_SYSLDT;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = 0;
|
||||
desc.sd_def32 = 0;
|
||||
desc.sd_gran = 0;
|
||||
desc.sd_hibase = ldt >> 24;
|
||||
copyout(&desc, (caddr_t) gdt + 8*GLDT_SEL, sizeof(desc));
|
||||
|
||||
desc.sd_lolimit = ((IA32_USRSTACK >> 12) - 1) & 0xffff;
|
||||
desc.sd_lobase = 0;
|
||||
desc.sd_type = SDT_MEMERA;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = ((IA32_USRSTACK >> 12) - 1) >> 16;
|
||||
desc.sd_def32 = 1;
|
||||
desc.sd_gran = 1;
|
||||
desc.sd_hibase = 0;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUCODE_SEL, sizeof(desc));
|
||||
desc.sd_type = SDT_MEMRWA;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUDATA_SEL, sizeof(desc));
|
||||
|
||||
codeseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMERA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
dataseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMRWA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
ia64_set_csd(codeseg);
|
||||
ia64_set_ssd(dataseg);
|
||||
frame->tf_r[FRAME_R24] = dataseg; /* ESD */
|
||||
frame->tf_r[FRAME_R27] = dataseg; /* DSD */
|
||||
frame->tf_r[FRAME_R28] = dataseg; /* FSD */
|
||||
frame->tf_r[FRAME_R29] = dataseg; /* GSD */
|
||||
|
||||
gdtseg = gdt /* base */
|
||||
+ ((8L*NGDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSNULL << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
ldtseg = ldt /* base */
|
||||
+ ((8L*NLDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSLDT << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
frame->tf_r[FRAME_R30] = ldtseg; /* LDTD */
|
||||
frame->tf_r[FRAME_R31] = gdtseg; /* GDTD */
|
||||
|
||||
ia64_set_eflag(PSL_USER);
|
||||
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
frame->tf_r[FRAME_R11] = IA32_PS_STRINGS;
|
||||
|
||||
/*
|
||||
* XXX - Linux emulator
|
||||
* Make sure sure edx is 0x0 on entry. Linux binaries depend
|
||||
* on it.
|
||||
*/
|
||||
td->td_retval[1] = 0;
|
||||
}
|
365
sys/ia64/ia32/ia32_sysvec.c
Normal file
365
sys/ia64/ia32/ia32_sysvec.c
Normal file
@ -0,0 +1,365 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#define __ELF_WORD_SIZE 32
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/exec.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/pioctl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/procfs.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_kern.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm_map.h>
|
||||
#include <vm/vm_object.h>
|
||||
#include <vm/vm_extern.h>
|
||||
|
||||
#include <ia64/ia32/ia32_util.h>
|
||||
#include <i386/include/psl.h>
|
||||
#include <i386/include/segments.h>
|
||||
#include <i386/include/specialreg.h>
|
||||
#include <machine/frame.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
static register_t *ia32_copyout_strings(struct image_params *imgp);
|
||||
static void ia32_setregs(struct thread *td, u_long entry, u_long stack,
|
||||
u_long ps_strings);
|
||||
|
||||
extern struct sysent ia32_sysent[];
|
||||
|
||||
static char ia32_sigcode[] = {
|
||||
0xff, 0x54, 0x24, 0x10, /* call *SIGF_HANDLER(%esp) */
|
||||
0x8d, 0x44, 0x24, 0x14, /* lea SIGF_UC(%esp),%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xf7, 0x40, 0x54, 0x00, 0x00, 0x02, 0x02, /* testl $PSL_VM,UC_EFLAGS(%eax) */
|
||||
0x75, 0x03, /* jne 9f */
|
||||
0x8e, 0x68, 0x14, /* movl UC_GS(%eax),%gs */
|
||||
0xb8, 0x57, 0x01, 0x00, 0x00, /* 9: movl $SYS_sigreturn,%eax */
|
||||
0x50, /* pushl %eax */
|
||||
0xcd, 0x80, /* int $0x80 */
|
||||
0xeb, 0xfe, /* 0: jmp 0b */
|
||||
0, 0, 0, 0
|
||||
};
|
||||
static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
|
||||
|
||||
struct sysentvec ia32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
ia32_sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
ia32_sigcode,
|
||||
&ia32_szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF",
|
||||
elf32_coredump,
|
||||
NULL,
|
||||
MINSIGSTKSZ,
|
||||
4096,
|
||||
IA32_USRSTACK,
|
||||
IA32_USRSTACK,
|
||||
ia32_copyout_strings,
|
||||
ia32_setregs
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo ia32_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_386,
|
||||
"FreeBSD",
|
||||
"/compat/ia32",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&ia32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&ia32_brand_info);
|
||||
|
||||
static register_t *
|
||||
ia32_copyout_strings(struct image_params *imgp)
|
||||
{
|
||||
int argc, envc;
|
||||
u_int32_t *vectp;
|
||||
char *stringp, *destp;
|
||||
u_int32_t *stack_base;
|
||||
struct ia32_ps_strings *arginfo;
|
||||
int szsigcode;
|
||||
|
||||
/*
|
||||
* Calculate string base and vector table pointers.
|
||||
* Also deal with signal trampoline code for this exec type.
|
||||
*/
|
||||
arginfo = (struct ia32_ps_strings *)IA32_PS_STRINGS;
|
||||
szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
|
||||
destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
|
||||
roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
|
||||
|
||||
/*
|
||||
* install sigcode
|
||||
*/
|
||||
if (szsigcode)
|
||||
copyout(imgp->proc->p_sysent->sv_sigcode,
|
||||
((caddr_t)arginfo - szsigcode), szsigcode);
|
||||
|
||||
/*
|
||||
* If we have a valid auxargs ptr, prepare some room
|
||||
* on the stack.
|
||||
*/
|
||||
if (imgp->auxargs) {
|
||||
/*
|
||||
* 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
|
||||
* lower compatibility.
|
||||
*/
|
||||
imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size
|
||||
: (AT_COUNT * 2);
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets,and imgp->auxarg_size is room
|
||||
* for argument of Runtime loader.
|
||||
*/
|
||||
vectp = (u_int32_t *) (destp - (imgp->argc + imgp->envc + 2 +
|
||||
imgp->auxarg_size) * sizeof(u_int32_t));
|
||||
|
||||
} else
|
||||
/*
|
||||
* The '+ 2' is for the null pointers at the end of each of
|
||||
* the arg and env vector sets
|
||||
*/
|
||||
vectp = (u_int32_t *)
|
||||
(destp - (imgp->argc + imgp->envc + 2) * sizeof(u_int32_t));
|
||||
|
||||
/*
|
||||
* vectp also becomes our initial stack base
|
||||
*/
|
||||
stack_base = vectp;
|
||||
|
||||
stringp = imgp->stringbase;
|
||||
argc = imgp->argc;
|
||||
envc = imgp->envc;
|
||||
|
||||
/*
|
||||
* Copy out strings - arguments and environment.
|
||||
*/
|
||||
copyout(stringp, destp, ARG_MAX - imgp->stringspace);
|
||||
|
||||
/*
|
||||
* Fill in "ps_strings" struct for ps, w, etc.
|
||||
*/
|
||||
suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nargvstr, argc);
|
||||
|
||||
/*
|
||||
* Fill in argument portion of vector table.
|
||||
*/
|
||||
for (; argc > 0; --argc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* a null vector table pointer separates the argp's from the envp's */
|
||||
suword32(vectp++, 0);
|
||||
|
||||
suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
|
||||
suword32(&arginfo->ps_nenvstr, envc);
|
||||
|
||||
/*
|
||||
* Fill in environment portion of vector table.
|
||||
*/
|
||||
for (; envc > 0; --envc) {
|
||||
suword32(vectp++, (u_int32_t)(intptr_t)destp);
|
||||
while (*stringp++ != 0)
|
||||
destp++;
|
||||
destp++;
|
||||
}
|
||||
|
||||
/* end of vector table is a null pointer */
|
||||
suword32(vectp, 0);
|
||||
|
||||
return ((register_t *)stack_base);
|
||||
}
|
||||
|
||||
static void
|
||||
ia32_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
vm_offset_t gdt, ldt;
|
||||
u_int64_t codesel, datasel, ldtsel;
|
||||
u_int64_t codeseg, dataseg, gdtseg, ldtseg;
|
||||
struct segment_descriptor desc;
|
||||
struct vmspace *vmspace = td->td_proc->p_vmspace;
|
||||
|
||||
/*
|
||||
* Make sure that we restore the entire trapframe after an
|
||||
* execve.
|
||||
*/
|
||||
frame->tf_flags &= ~FRAME_SYSCALL;
|
||||
|
||||
bzero(frame->tf_r, sizeof(frame->tf_r));
|
||||
bzero(frame->tf_f, sizeof(frame->tf_f));
|
||||
|
||||
frame->tf_cr_iip = entry;
|
||||
frame->tf_cr_ipsr = (IA64_PSR_IC
|
||||
| IA64_PSR_I
|
||||
| IA64_PSR_IT
|
||||
| IA64_PSR_DT
|
||||
| IA64_PSR_RT
|
||||
| IA64_PSR_DFH
|
||||
| IA64_PSR_IS
|
||||
| IA64_PSR_BN
|
||||
| IA64_PSR_CPL_USER);
|
||||
frame->tf_r[FRAME_R12] = stack;
|
||||
|
||||
codesel = LSEL(LUCODE_SEL, SEL_UPL);
|
||||
datasel = LSEL(LUDATA_SEL, SEL_UPL);
|
||||
ldtsel = GSEL(GLDT_SEL, SEL_UPL);
|
||||
|
||||
#if 1
|
||||
frame->tf_r[FRAME_R16] = (datasel << 48) | (datasel << 32)
|
||||
| (datasel << 16) | datasel;
|
||||
frame->tf_r[FRAME_R17] = (ldtsel << 32) | (datasel << 16) | codesel;
|
||||
#else
|
||||
frame->tf_r[FRAME_R16] = datasel;
|
||||
frame->tf_r[FRAME_R17] = codesel;
|
||||
frame->tf_r[FRAME_R18] = datasel;
|
||||
frame->tf_r[FRAME_R19] = datasel;
|
||||
frame->tf_r[FRAME_R20] = datasel;
|
||||
frame->tf_r[FRAME_R21] = datasel;
|
||||
frame->tf_r[FRAME_R22] = ldtsel;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Build the GDT and LDT.
|
||||
*/
|
||||
gdt = IA32_USRSTACK;
|
||||
vm_map_find(&vmspace->vm_map, 0, 0,
|
||||
&gdt, PAGE_SIZE, 0,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
ldt = gdt + 4096;
|
||||
|
||||
desc.sd_lolimit = 8*NLDT-1;
|
||||
desc.sd_lobase = ldt & 0xffffff;
|
||||
desc.sd_type = SDT_SYSLDT;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = 0;
|
||||
desc.sd_def32 = 0;
|
||||
desc.sd_gran = 0;
|
||||
desc.sd_hibase = ldt >> 24;
|
||||
copyout(&desc, (caddr_t) gdt + 8*GLDT_SEL, sizeof(desc));
|
||||
|
||||
desc.sd_lolimit = ((IA32_USRSTACK >> 12) - 1) & 0xffff;
|
||||
desc.sd_lobase = 0;
|
||||
desc.sd_type = SDT_MEMERA;
|
||||
desc.sd_dpl = SEL_UPL;
|
||||
desc.sd_p = 1;
|
||||
desc.sd_hilimit = ((IA32_USRSTACK >> 12) - 1) >> 16;
|
||||
desc.sd_def32 = 1;
|
||||
desc.sd_gran = 1;
|
||||
desc.sd_hibase = 0;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUCODE_SEL, sizeof(desc));
|
||||
desc.sd_type = SDT_MEMRWA;
|
||||
copyout(&desc, (caddr_t) ldt + 8*LUDATA_SEL, sizeof(desc));
|
||||
|
||||
codeseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMERA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
dataseg = 0 /* base */
|
||||
+ (((IA32_USRSTACK >> 12) - 1) << 32) /* limit */
|
||||
+ ((long)SDT_MEMRWA << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (1L << 62) /* 32 bits */
|
||||
+ (1L << 63); /* page granularity */
|
||||
ia64_set_csd(codeseg);
|
||||
ia64_set_ssd(dataseg);
|
||||
frame->tf_r[FRAME_R24] = dataseg; /* ESD */
|
||||
frame->tf_r[FRAME_R27] = dataseg; /* DSD */
|
||||
frame->tf_r[FRAME_R28] = dataseg; /* FSD */
|
||||
frame->tf_r[FRAME_R29] = dataseg; /* GSD */
|
||||
|
||||
gdtseg = gdt /* base */
|
||||
+ ((8L*NGDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSNULL << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
ldtseg = ldt /* base */
|
||||
+ ((8L*NLDT - 1) << 32) /* limit */
|
||||
+ ((long)SDT_SYSLDT << 52)
|
||||
+ ((long)SEL_UPL << 57)
|
||||
+ (1L << 59) /* present */
|
||||
+ (0L << 62) /* 16 bits */
|
||||
+ (0L << 63); /* byte granularity */
|
||||
frame->tf_r[FRAME_R30] = ldtseg; /* LDTD */
|
||||
frame->tf_r[FRAME_R31] = gdtseg; /* GDTD */
|
||||
|
||||
ia64_set_eflag(PSL_USER);
|
||||
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
frame->tf_r[FRAME_R11] = IA32_PS_STRINGS;
|
||||
|
||||
/*
|
||||
* XXX - Linux emulator
|
||||
* Make sure sure edx is 0x0 on entry. Linux binaries depend
|
||||
* on it.
|
||||
*/
|
||||
td->td_retval[1] = 0;
|
||||
}
|
94
sys/ia64/ia32/ia32_util.h
Normal file
94
sys/ia64/ia32/ia32_util.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*-
|
||||
* Copyright (c) 1998-1999 Andrew Gallatin
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software withough specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
|
||||
#include <sys/exec.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
|
||||
#ifndef SCARG
|
||||
#define SCARG(p, x) (p)->x
|
||||
#endif
|
||||
|
||||
struct ia32_ps_strings {
|
||||
u_int32_t ps_argvstr; /* first of 0 or more argument strings */
|
||||
int ps_nargvstr; /* the number of argument strings */
|
||||
u_int32_t ps_envstr; /* first of 0 or more environment strings */
|
||||
int ps_nenvstr; /* the number of environment strings */
|
||||
};
|
||||
|
||||
#define IA32_USRSTACK (4L*1024*1024*1024 - PAGE_SIZE)
|
||||
#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
|
||||
|
||||
static __inline caddr_t stackgap_init(void);
|
||||
static __inline void *stackgap_alloc(caddr_t *, size_t);
|
||||
|
||||
static __inline caddr_t
|
||||
stackgap_init()
|
||||
{
|
||||
#define szsigcode (*(curproc->p_sysent->sv_szsigcode))
|
||||
return (caddr_t)(((caddr_t)IA32_PS_STRINGS) - szsigcode - SPARE_USRSPACE);
|
||||
#undef szsigcode
|
||||
}
|
||||
|
||||
static __inline void *
|
||||
stackgap_alloc(sgp, sz)
|
||||
caddr_t *sgp;
|
||||
size_t sz;
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = (void *) *sgp;
|
||||
*sgp += ALIGN(sz);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
extern const char ia32_emul_path[];
|
||||
int ia32_emul_find(struct thread *, caddr_t *, const char *, char *,
|
||||
char **, int);
|
||||
|
||||
#define CHECKALT(p, sgp, path, i) \
|
||||
do { \
|
||||
int _error; \
|
||||
\
|
||||
_error = ia32_emul_find(p, sgp, ia32_emul_path, path, \
|
||||
&path, i); \
|
||||
if (_error == EFAULT) \
|
||||
return (_error); \
|
||||
} while (0)
|
||||
|
||||
#define CHECKALTEXIST(p, sgp, path) CHECKALT((p), (sgp), (path), 0)
|
||||
#define CHECKALTCREAT(p, sgp, path) CHECKALT((p), (sgp), (path), 1)
|
File diff suppressed because it is too large
Load Diff
@ -1,112 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1995-1996 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _IA64_IA32_IMGACT_ELF_H_
|
||||
#define _IA64_IA32_IMGACT_ELF_H_
|
||||
|
||||
#include <i386/include/elf.h>
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
#define AUXARGS_ENTRY(pos, id, val) {suword(pos++, id); suword(pos++, val);}
|
||||
|
||||
#if ELF_TARG_CLASS == ELFCLASS32
|
||||
|
||||
/*
|
||||
* Structure used to pass infomation from the loader to the
|
||||
* stack fixup routine.
|
||||
*/
|
||||
typedef struct {
|
||||
Elf32_Sword execfd;
|
||||
Elf32_Word phdr;
|
||||
Elf32_Word phent;
|
||||
Elf32_Word phnum;
|
||||
Elf32_Word pagesz;
|
||||
Elf32_Word base;
|
||||
Elf32_Word flags;
|
||||
Elf32_Word entry;
|
||||
Elf32_Word trace;
|
||||
} Elf32_Auxargs;
|
||||
|
||||
typedef struct {
|
||||
int brand;
|
||||
const char *compat_3_brand; /* pre Binutils 2.10 method (FBSD 3) */
|
||||
const char *emul_path;
|
||||
const char *interp_path;
|
||||
struct sysentvec *sysvec;
|
||||
} Elf32_Brandinfo;
|
||||
|
||||
#define MAX_BRANDS 8
|
||||
|
||||
int elf_brand_inuse(Elf32_Brandinfo *entry);
|
||||
int elf_insert_brand_entry(Elf32_Brandinfo *entry);
|
||||
int elf_remove_brand_entry(Elf32_Brandinfo *entry);
|
||||
|
||||
#else /* !(ELF_TARG_CLASS == ELFCLASS32) */
|
||||
|
||||
/*
|
||||
* Structure used to pass infomation from the loader to the
|
||||
* stack fixup routine.
|
||||
*/
|
||||
typedef struct {
|
||||
Elf64_Sword execfd;
|
||||
Elf64_Addr phdr;
|
||||
Elf64_Word phent;
|
||||
Elf64_Word phnum;
|
||||
Elf64_Word pagesz;
|
||||
Elf64_Addr base;
|
||||
Elf64_Word flags;
|
||||
Elf64_Addr entry;
|
||||
Elf64_Word trace;
|
||||
} Elf64_Auxargs;
|
||||
|
||||
typedef struct {
|
||||
int brand;
|
||||
const char *compat_3_brand; /* pre Binutils 2.10 method (FBSD 3) */
|
||||
const char *emul_path;
|
||||
const char *interp_path;
|
||||
struct sysentvec *sysvec;
|
||||
} Elf64_Brandinfo;
|
||||
|
||||
#define MAX_BRANDS 8
|
||||
|
||||
int elf_brand_inuse(Elf64_Brandinfo *entry);
|
||||
int elf_insert_brand_entry(Elf64_Brandinfo *entry);
|
||||
int elf_remove_brand_entry(Elf64_Brandinfo *entry);
|
||||
|
||||
#endif /* ELF_TARG_CLASS == ELFCLASS32 */
|
||||
|
||||
struct thread;
|
||||
|
||||
int elf_coredump(struct thread *, struct vnode *, off_t);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_IA64_IA32_IMGACT_ELF_H_ */
|
@ -36,6 +36,9 @@
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/sysproto.h>
|
||||
#include <sys/mount.h>
|
||||
#include <ia64/ia32/ia32.h>
|
||||
#include <ia64/ia32/ia32_proto.h>
|
||||
|
||||
; Reserved/unimplemented system calls in the range 0-150 inclusive
|
||||
; are reserved for use in future Berkeley releases.
|
||||
@ -43,200 +46,189 @@
|
||||
; redistributions should be placed in the reserved range at the end
|
||||
; of the current calls.
|
||||
|
||||
0 STD NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MSTD NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MSTD POSIX { int fork(void); }
|
||||
3 MSTD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MSTD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int open(char *path, int flags, int mode); }
|
||||
0 MNOPROTO NOHIDE { int nosys(void); } syscall nosys_args int
|
||||
1 MNOPROTO NOHIDE { void sys_exit(int rval); } exit sys_exit_args void
|
||||
2 MNOPROTO POSIX { int fork(void); }
|
||||
3 MNOPROTO POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
|
||||
4 MNOPROTO POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
|
||||
5 STD POSIX { int ia32_open(char *path, int flags, int mode); }
|
||||
; XXX should be { int open(const char *path, int flags, ...); }
|
||||
; but we're not ready for `const' or varargs.
|
||||
; XXX man page says `mode_t mode'.
|
||||
6 MSTD POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int wait4(int pid, int *status, int options, \
|
||||
struct rusage *rusage); } wait4 wait_args int
|
||||
8 COMPAT BSD { int creat(char *path, int mode); }
|
||||
9 STD POSIX { int link(char *path, char *link); }
|
||||
10 STD POSIX { int unlink(char *path); }
|
||||
6 MNOPROTO POSIX { int close(int fd); }
|
||||
7 MSTD BSD { int ia32_wait4(int pid, int *status, int options, \
|
||||
struct rusage32 *rusage); }
|
||||
8 OBSOL BSD old creat
|
||||
9 NOPROTO POSIX { int link(char *path, char *link); }
|
||||
10 NOPROTO POSIX { int unlink(char *path); }
|
||||
11 OBSOL NOHIDE execv
|
||||
12 STD POSIX { int chdir(char *path); }
|
||||
13 STD BSD { int fchdir(int fd); }
|
||||
14 STD POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 STD POSIX { int chmod(char *path, int mode); }
|
||||
16 STD POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MSTD BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int getfsstat(struct statfs *buf, long bufsize, \
|
||||
int flags); }
|
||||
19 COMPAT POSIX { long lseek(int fd, long offset, int whence); }
|
||||
20 MSTD POSIX { pid_t getpid(void); }
|
||||
21 STD BSD { int mount(char *type, char *path, int flags, \
|
||||
12 NOPROTO POSIX { int chdir(char *path); }
|
||||
13 NOPROTO BSD { int fchdir(int fd); }
|
||||
14 NOPROTO POSIX { int mknod(char *path, int mode, int dev); }
|
||||
15 NOPROTO POSIX { int chmod(char *path, int mode); }
|
||||
16 NOPROTO POSIX { int chown(char *path, int uid, int gid); }
|
||||
17 MNOPROTO BSD { int obreak(char *nsize); } break obreak_args int
|
||||
18 STD BSD { int ia32_getfsstat(struct statfs32 *buf, \
|
||||
long bufsize, int flags); }
|
||||
19 OBSOL POSIX olseek
|
||||
20 MNOPROTO POSIX { pid_t getpid(void); }
|
||||
21 NOPROTO BSD { int mount(char *type, char *path, int flags, \
|
||||
caddr_t data); }
|
||||
; XXX `path' should have type `const char *' but we're not ready for that.
|
||||
22 STD BSD { int unmount(char *path, int flags); }
|
||||
23 MSTD POSIX { int setuid(uid_t uid); }
|
||||
24 MSTD POSIX { uid_t getuid(void); }
|
||||
25 MSTD POSIX { uid_t geteuid(void); }
|
||||
26 STD BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
22 NOPROTO BSD { int unmount(char *path, int flags); }
|
||||
23 MNOPROTO POSIX { int setuid(uid_t uid); }
|
||||
24 MNOPROTO POSIX { uid_t getuid(void); }
|
||||
25 MNOPROTO POSIX { uid_t geteuid(void); }
|
||||
26 NOPROTO BSD { int ptrace(int req, pid_t pid, caddr_t addr, \
|
||||
int data); }
|
||||
27 MSTD BSD { int recvmsg(int s, struct msghdr *msg, int flags); }
|
||||
28 MSTD BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MSTD BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
27 UNIMPL BSD recvmsg
|
||||
28 MNOPROTO BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
29 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); }
|
||||
30 MSTD BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MSTD BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MSTD BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int access(char *path, int flags); }
|
||||
34 STD BSD { int chflags(char *path, int flags); }
|
||||
35 STD BSD { int fchflags(int fd, int flags); }
|
||||
36 STD BSD { int sync(void); }
|
||||
37 MSTD POSIX { int kill(int pid, int signum); }
|
||||
38 COMPAT POSIX { int stat(char *path, struct ostat *ub); }
|
||||
39 MSTD POSIX { pid_t getppid(void); }
|
||||
40 COMPAT POSIX { int lstat(char *path, struct ostat *ub); }
|
||||
41 STD POSIX { int dup(u_int fd); }
|
||||
42 STD POSIX { int pipe(void); }
|
||||
43 MSTD POSIX { gid_t getegid(void); }
|
||||
44 MSTD BSD { int profil(caddr_t samples, size_t size, \
|
||||
30 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); }
|
||||
31 MNOPROTO BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
32 MNOPROTO BSD { int getsockname(int fdes, caddr_t asa, int *alen); }
|
||||
33 STD POSIX { int ia32_access(char *path, int flags); }
|
||||
34 STD BSD { int ia32_chflags(char *path, int flags); }
|
||||
35 NOPROTO BSD { int fchflags(int fd, int flags); }
|
||||
36 NOPROTO BSD { int sync(void); }
|
||||
37 MNOPROTO POSIX { int kill(int pid, int signum); }
|
||||
38 UNIMPL POSIX ostat
|
||||
39 MNOPROTO POSIX { pid_t getppid(void); }
|
||||
40 UNIMPL POSIX olstat
|
||||
41 NOPROTO POSIX { int dup(u_int fd); }
|
||||
42 NOPROTO POSIX { int pipe(void); }
|
||||
43 MNOPROTO POSIX { gid_t getegid(void); }
|
||||
44 MNOPROTO BSD { int profil(caddr_t samples, size_t size, \
|
||||
size_t offset, u_int scale); }
|
||||
45 STD BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
45 NOPROTO BSD { int ktrace(const char *fname, int ops, int facs, \
|
||||
int pid); }
|
||||
46 MCOMPAT POSIX { int sigaction(int signum, struct osigaction *nsa, \
|
||||
struct osigaction *osa); }
|
||||
47 MSTD POSIX { gid_t getgid(void); }
|
||||
48 MCOMPAT POSIX { int sigprocmask(int how, osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it, and we return the old mask as the
|
||||
; (int) return value.
|
||||
49 MSTD BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MSTD BSD { int setlogin(char *namebuf); }
|
||||
51 MSTD BSD { int acct(char *path); }
|
||||
52 MCOMPAT POSIX { int sigpending(void); }
|
||||
53 MSTD BSD { int sigaltstack(stack_t *ss, stack_t *oss); }
|
||||
54 MSTD POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MSTD BSD { int reboot(int opt); }
|
||||
56 STD POSIX { int revoke(char *path); }
|
||||
57 STD POSIX { int symlink(char *path, char *link); }
|
||||
58 STD POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 MSTD POSIX { int execve(char *fname, char **argv, char **envv); }
|
||||
60 MSTD POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 STD BSD { int chroot(char *path); }
|
||||
62 MCOMPAT POSIX { int fstat(int fd, struct ostat *sb); }
|
||||
63 MCOMPAT BSD { int getkerninfo(int op, char *where, size_t *size, \
|
||||
int arg); } getkerninfo getkerninfo_args int
|
||||
64 MCOMPAT BSD { int getpagesize(void); } \
|
||||
getpagesize getpagesize_args int
|
||||
65 STD BSD { int msync(void *addr, size_t len, int flags); }
|
||||
66 MSTD BSD { int vfork(void); }
|
||||
46 UNIMPL POSIX osigaction
|
||||
47 MNOPROTO POSIX { gid_t getgid(void); }
|
||||
48 UNIMPL POSIX osigprocmask
|
||||
49 MNOPROTO BSD { int getlogin(char *namebuf, u_int namelen); }
|
||||
50 MNOPROTO BSD { int setlogin(char *namebuf); }
|
||||
51 MNOPROTO BSD { int acct(char *path); }
|
||||
52 MNOPROTO POSIX { int sigpending(void); }
|
||||
53 STD BSD { int ia32_sigaltstack(struct sigaltstack32 *ss, struct sigaltstack32 *oss); }
|
||||
54 MNOPROTO POSIX { int ioctl(int fd, u_long com, caddr_t data); }
|
||||
55 MNOPROTO BSD { int reboot(int opt); }
|
||||
56 NOPROTO POSIX { int revoke(char *path); }
|
||||
57 NOPROTO POSIX { int symlink(char *path, char *link); }
|
||||
58 NOPROTO POSIX { int readlink(char *path, char *buf, int count); }
|
||||
59 STD POSIX { int ia32_execve(char *fname, u_int32_t *argv, u_int32_t *envv); }
|
||||
60 MNOPROTO POSIX { int umask(int newmask); } umask umask_args int
|
||||
61 NOPROTO BSD { int chroot(char *path); }
|
||||
62 OBSOL POSIX ofstat
|
||||
63 OBSOL BSD ogetkerninfo
|
||||
64 OBSOL BSD ogetpagesize
|
||||
65 OBSOL BSD omsync
|
||||
66 OBSOL BSD ovfork
|
||||
67 OBSOL NOHIDE vread
|
||||
68 OBSOL NOHIDE vwrite
|
||||
69 MSTD BSD { int sbrk(int incr); }
|
||||
70 MSTD BSD { int sstk(int incr); }
|
||||
71 MCOMPAT BSD { int mmap(void *addr, int len, int prot, \
|
||||
int flags, int fd, long pos); }
|
||||
72 MSTD BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MSTD BSD { int munmap(void *addr, size_t len); }
|
||||
74 MSTD BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MSTD BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
69 MNOPROTO BSD { int sbrk(int incr); }
|
||||
70 MNOPROTO BSD { int sstk(int incr); }
|
||||
71 OBSOL BSD ommap
|
||||
72 MNOPROTO BSD { int ovadvise(int anom); } vadvise ovadvise_args int
|
||||
73 MNOPROTO BSD { int munmap(void *addr, size_t len); }
|
||||
74 MNOPROTO BSD { int mprotect(const void *addr, size_t len, int prot); }
|
||||
75 MNOPROTO BSD { int madvise(void *addr, size_t len, int behav); }
|
||||
76 OBSOL NOHIDE vhangup
|
||||
77 OBSOL NOHIDE vlimit
|
||||
78 MSTD BSD { int mincore(const void *addr, size_t len, \
|
||||
78 MNOPROTO BSD { int mincore(const void *addr, size_t len, \
|
||||
char *vec); }
|
||||
79 MSTD POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MSTD POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MSTD POSIX { int getpgrp(void); }
|
||||
82 MSTD POSIX { int setpgid(int pid, int pgid); }
|
||||
83 MSTD BSD { int setitimer(u_int which, struct itimerval *itv, \
|
||||
struct itimerval *oitv); }
|
||||
84 MCOMPAT BSD { int wait(void); }
|
||||
85 MSTD BSD { int swapon(char *name); }
|
||||
86 MSTD BSD { int getitimer(u_int which, struct itimerval *itv); }
|
||||
87 MCOMPAT BSD { int gethostname(char *hostname, u_int len); } \
|
||||
gethostname gethostname_args int
|
||||
88 MCOMPAT BSD { int sethostname(char *hostname, u_int len); } \
|
||||
sethostname sethostname_args int
|
||||
89 MSTD BSD { int getdtablesize(void); }
|
||||
90 MSTD POSIX { int dup2(u_int from, u_int to); }
|
||||
79 MNOPROTO POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
80 MNOPROTO POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); }
|
||||
81 MNOPROTO POSIX { int getpgrp(void); }
|
||||
82 MNOPROTO POSIX { int setpgid(int pid, int pgid); }
|
||||
83 STD BSD { int ia32_setitimer(u_int which, \
|
||||
struct itimerval32 *itv, \
|
||||
struct itimerval32 *oitv); }
|
||||
84 OBSOL BSD owait
|
||||
85 OBSOL BSD oswapon
|
||||
86 OBSOL BSD ogetitimer
|
||||
87 OBSOL BSD ogethostname
|
||||
88 OBSOL BSD osethostname
|
||||
89 MNOPROTO BSD { int getdtablesize(void); }
|
||||
90 MNOPROTO POSIX { int dup2(u_int from, u_int to); }
|
||||
91 UNIMPL BSD getdopt
|
||||
92 MSTD POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
92 MNOPROTO POSIX { int fcntl(int fd, int cmd, long arg); }
|
||||
; XXX should be { int fcntl(int fd, int cmd, ...); }
|
||||
; but we're not ready for varargs.
|
||||
; XXX man page says `int arg' too.
|
||||
93 MSTD BSD { int select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval *tv); }
|
||||
93 STD BSD { int ia32_select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval32 *tv); }
|
||||
; XXX need to override for big-endian - little-endian should work fine.
|
||||
94 UNIMPL BSD setdopt
|
||||
95 STD POSIX { int fsync(int fd); }
|
||||
96 MSTD BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MSTD BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MSTD BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MCPT_NOA BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
95 NOPROTO POSIX { int fsync(int fd); }
|
||||
96 MNOPROTO BSD { int setpriority(int which, int who, int prio); }
|
||||
97 MNOPROTO BSD { int socket(int domain, int type, int protocol); }
|
||||
98 MNOPROTO BSD { int connect(int s, caddr_t name, int namelen); }
|
||||
99 MNOPROTO BSD { int accept(int s, caddr_t name, int *anamelen); } \
|
||||
accept accept_args int
|
||||
100 MSTD BSD { int getpriority(int which, int who); }
|
||||
101 MCOMPAT BSD { int send(int s, caddr_t buf, int len, int flags); }
|
||||
102 MCOMPAT BSD { int recv(int s, caddr_t buf, int len, int flags); }
|
||||
103 STD BSD { int osigreturn(struct osigcontext *sigcntxp); }
|
||||
104 MSTD BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MSTD BSD { int setsockopt(int s, int level, int name, \
|
||||
100 MNOPROTO BSD { int getpriority(int which, int who); }
|
||||
101 OBSOL BSD osend
|
||||
102 OBSOL BSD orecv
|
||||
103 OBSOL BSD osigreturn
|
||||
104 MNOPROTO BSD { int bind(int s, caddr_t name, int namelen); }
|
||||
105 MNOPROTO BSD { int setsockopt(int s, int level, int name, \
|
||||
caddr_t val, int valsize); }
|
||||
106 MSTD BSD { int listen(int s, int backlog); }
|
||||
106 MNOPROTO BSD { int listen(int s, int backlog); }
|
||||
107 OBSOL NOHIDE vtimes
|
||||
108 MCOMPAT BSD { int sigvec(int signum, struct sigvec *nsv, \
|
||||
struct sigvec *osv); }
|
||||
109 MCOMPAT BSD { int sigblock(int mask); }
|
||||
110 MCOMPAT BSD { int sigsetmask(int mask); }
|
||||
111 MCOMPAT POSIX { int sigsuspend(osigset_t mask); }
|
||||
; XXX note nonstandard (bogus) calling convention - the libc stub passes
|
||||
; us the mask, not a pointer to it.
|
||||
112 MCOMPAT BSD { int sigstack(struct sigstack *nss, \
|
||||
struct sigstack *oss); }
|
||||
113 MCOMPAT BSD { int recvmsg(int s, struct omsghdr *msg, int flags); }
|
||||
114 MCOMPAT BSD { int sendmsg(int s, caddr_t msg, int flags); }
|
||||
108 OBSOL BSD osigvec
|
||||
109 OBSOL BSD osigblock
|
||||
110 OBSOL BSD osigsetmask
|
||||
111 OBSOL POSIX osigsuspend
|
||||
112 OBSOL BSD osigstack
|
||||
113 OBSOL BSD orecvmsg
|
||||
114 OBSOL BSD osendmsg
|
||||
115 OBSOL NOHIDE vtrace
|
||||
116 MSTD BSD { int gettimeofday(struct timeval *tp, \
|
||||
116 STD BSD { int ia32_gettimeofday(struct timeval32 *tp, \
|
||||
struct timezone *tzp); }
|
||||
117 MSTD BSD { int getrusage(int who, struct rusage *rusage); }
|
||||
118 MSTD BSD { int getsockopt(int s, int level, int name, \
|
||||
117 STD BSD { int ia32_getrusage(int who, struct rusage32 *rusage); }
|
||||
118 MNOPROTO BSD { int getsockopt(int s, int level, int name, \
|
||||
caddr_t val, int *avalsize); }
|
||||
119 UNIMPL NOHIDE resuba (BSD/OS 2.x)
|
||||
120 MSTD BSD { int readv(int fd, struct iovec *iovp, u_int iovcnt); }
|
||||
121 MSTD BSD { int writev(int fd, struct iovec *iovp, \
|
||||
120 STD BSD { int ia32_readv(int fd, struct iovec32 *iovp, u_int iovcnt); }
|
||||
121 STD BSD { int ia32_writev(int fd, struct iovec32 *iovp, \
|
||||
u_int iovcnt); }
|
||||
122 MSTD BSD { int settimeofday(struct timeval *tv, \
|
||||
122 STD BSD { int ia32_settimeofday(struct timeval32 *tv, \
|
||||
struct timezone *tzp); }
|
||||
123 STD BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 STD BSD { int fchmod(int fd, int mode); }
|
||||
125 MCPT_NOA BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
123 NOPROTO BSD { int fchown(int fd, int uid, int gid); }
|
||||
124 NOPROTO BSD { int fchmod(int fd, int mode); }
|
||||
125 MNOPROTO BSD { int recvfrom(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t from, int *fromlenaddr); } \
|
||||
recvfrom recvfrom_args int
|
||||
126 MSTD BSD { int setreuid(int ruid, int euid); }
|
||||
127 MSTD BSD { int setregid(int rgid, int egid); }
|
||||
128 STD POSIX { int rename(char *from, char *to); }
|
||||
129 COMPAT BSD { int truncate(char *path, long length); }
|
||||
130 COMPAT BSD { int ftruncate(int fd, long length); }
|
||||
131 MSTD BSD { int flock(int fd, int how); }
|
||||
132 STD POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MSTD BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
126 MNOPROTO BSD { int setreuid(int ruid, int euid); }
|
||||
127 MNOPROTO BSD { int setregid(int rgid, int egid); }
|
||||
128 NOPROTO POSIX { int rename(char *from, char *to); }
|
||||
129 OBSOL BSD otruncate
|
||||
130 OBSOL BSD ftruncate
|
||||
131 MNOPROTO BSD { int flock(int fd, int how); }
|
||||
132 NOPROTO POSIX { int mkfifo(char *path, int mode); }
|
||||
133 MNOPROTO BSD { int sendto(int s, caddr_t buf, size_t len, \
|
||||
int flags, caddr_t to, int tolen); }
|
||||
134 MSTD BSD { int shutdown(int s, int how); }
|
||||
135 MSTD BSD { int socketpair(int domain, int type, int protocol, \
|
||||
134 MNOPROTO BSD { int shutdown(int s, int how); }
|
||||
135 MNOPROTO BSD { int socketpair(int domain, int type, int protocol, \
|
||||
int *rsv); }
|
||||
136 STD POSIX { int mkdir(char *path, int mode); }
|
||||
137 STD POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int utimes(char *path, struct timeval *tptr); }
|
||||
136 NOPROTO POSIX { int mkdir(char *path, int mode); }
|
||||
137 NOPROTO POSIX { int rmdir(char *path); }
|
||||
138 STD BSD { int ia32_utimes(char *path, \
|
||||
struct timeval32 *tptr); }
|
||||
139 OBSOL NOHIDE 4.2 sigreturn
|
||||
140 MSTD BSD { int adjtime(struct timeval *delta, \
|
||||
struct timeval *olddelta); }
|
||||
141 MCOMPAT BSD { int getpeername(int fdes, caddr_t asa, int *alen); }
|
||||
142 MCOMPAT BSD { long gethostid(void); }
|
||||
143 MCOMPAT BSD { int sethostid(long hostid); }
|
||||
144 MCOMPAT BSD { int getrlimit(u_int which, struct orlimit *rlp); }
|
||||
145 MCOMPAT BSD { int setrlimit(u_int which, struct orlimit *rlp); }
|
||||
146 MCOMPAT BSD { int killpg(int pgid, int signum); }
|
||||
147 MSTD POSIX { int setsid(void); }
|
||||
148 STD BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
140 STD BSD { int ia32_adjtime(struct timeval32 *delta, \
|
||||
struct timeval32 *olddelta); }
|
||||
141 OBSOL BSD ogetpeername
|
||||
142 OBSOL BSD ogethostid
|
||||
143 OBSOL BSD sethostid
|
||||
144 OBSOL BSD getrlimit
|
||||
145 OBSOL BSD setrlimit
|
||||
146 OBSOL BSD killpg
|
||||
147 MNOPROTO POSIX { int setsid(void); }
|
||||
148 NOPROTO BSD { int quotactl(char *path, int cmd, int uid, \
|
||||
caddr_t arg); }
|
||||
149 MCOMPAT BSD { int quota(void); }
|
||||
150 MCPT_NOA BSD { int getsockname(int fdec, caddr_t asa, int *alen); }\
|
||||
getsockname getsockname_args int
|
||||
149 OBSOL BSD oquota
|
||||
150 OBSOL BSD ogetsockname
|
||||
|
||||
; Syscalls 151-180 inclusive are reserved for vendor-specific
|
||||
; system calls. (This includes various calls added for compatibity
|
||||
@ -247,136 +239,138 @@
|
||||
153 UNIMPL NOHIDE asyncdaemon (BSD/OS 2.x)
|
||||
154 UNIMPL NOHIDE nosys
|
||||
; 155 is initialized by the NFS code, if present.
|
||||
155 MNOIMPL BSD { int nfssvc(int flag, caddr_t argp); }
|
||||
156 COMPAT BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
155 UNIMPL NOHIDE nfssvc
|
||||
156 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
157 STD BSD { int statfs(char *path, struct statfs *buf); }
|
||||
158 STD BSD { int fstatfs(int fd, struct statfs *buf); }
|
||||
157 STD BSD { int ia32_statfs(char *path, struct statfs32 *buf); }
|
||||
158 STD BSD { int ia32_fstatfs(int fd, struct statfs32 *buf); }
|
||||
159 UNIMPL NOHIDE nosys
|
||||
160 UNIMPL NOHIDE nosys
|
||||
161 STD BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MSTD BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MSTD BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MSTD BSD { int uname(struct utsname *name); }
|
||||
165 STD BSD { int sysarch(int op, char *parms); }
|
||||
166 MSTD BSD { int rtprio(int function, pid_t pid, \
|
||||
161 NOPROTO BSD { int getfh(char *fname, struct fhandle *fhp); }
|
||||
162 MNOPROTO BSD { int getdomainname(char *domainname, int len); }
|
||||
163 MNOPROTO BSD { int setdomainname(char *domainname, int len); }
|
||||
164 MNOPROTO BSD { int uname(struct utsname *name); }
|
||||
165 NOPROTO BSD { int sysarch(int op, char *parms); }
|
||||
166 MNOPROTO BSD { int rtprio(int function, pid_t pid, \
|
||||
struct rtprio *rtp); }
|
||||
167 UNIMPL NOHIDE nosys
|
||||
168 UNIMPL NOHIDE nosys
|
||||
; 169 is initialized by the SYSVSEM code if present or loaded
|
||||
169 MNOSTD BSD { int semsys(int which, int a2, int a3, int a4, \
|
||||
169 STD BSD { int ia32_semsys(int which, int a2, int a3, int a4, \
|
||||
int a5); }
|
||||
; 169 is initialized by the SYSVMSG code if present or loaded
|
||||
; XXX should be { int semsys(int which, ...); }
|
||||
170 MNOSTD BSD { int msgsys(int which, int a2, int a3, int a4, \
|
||||
170 STD BSD { int ia32_msgsys(int which, int a2, int a3, int a4, \
|
||||
int a5, int a6); }
|
||||
; 169 is initialized by the SYSVSHM code if present or loaded
|
||||
; XXX should be { int msgsys(int which, ...); }
|
||||
171 MNOSTD BSD { int shmsys(int which, int a2, int a3, int a4); }
|
||||
; XXX should be { int shmsys(int which, ...); }
|
||||
171 STD BSD { int ia32_shmsys(int which, int a2, int a3, int a4); }
|
||||
172 UNIMPL NOHIDE nosys
|
||||
173 MSTD POSIX { ssize_t pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, off_t offset); }
|
||||
174 MSTD POSIX { ssize_t pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, off_t offset); }
|
||||
173 STD POSIX { ssize_t ia32_pread(int fd, void *buf, size_t nbyte, \
|
||||
int pad, u_int32_t offsetlo, u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
174 STD POSIX { ssize_t ia32_pwrite(int fd, const void *buf, \
|
||||
size_t nbyte, int pad, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi); }
|
||||
; XXX note - bigendian is different
|
||||
175 UNIMPL NOHIDE nosys
|
||||
176 MSTD BSD { int ntp_adjtime(struct timex *tp); }
|
||||
176 MNOPROTO BSD { int ntp_adjtime(struct timex *tp); }
|
||||
177 UNIMPL NOHIDE sfork (BSD/OS 2.x)
|
||||
178 UNIMPL NOHIDE getdescriptor (BSD/OS 2.x)
|
||||
179 UNIMPL NOHIDE setdescriptor (BSD/OS 2.x)
|
||||
180 UNIMPL NOHIDE nosys
|
||||
|
||||
; Syscalls 181-199 are used by/reserved for BSD
|
||||
181 MSTD POSIX { int setgid(gid_t gid); }
|
||||
182 MSTD BSD { int setegid(gid_t egid); }
|
||||
183 MSTD BSD { int seteuid(uid_t euid); }
|
||||
181 MNOPROTO POSIX { int setgid(gid_t gid); }
|
||||
182 MNOPROTO BSD { int setegid(gid_t egid); }
|
||||
183 MNOPROTO BSD { int seteuid(uid_t euid); }
|
||||
184 UNIMPL BSD lfs_bmapv
|
||||
185 UNIMPL BSD lfs_markv
|
||||
186 UNIMPL BSD lfs_segclean
|
||||
187 UNIMPL BSD lfs_segwait
|
||||
188 STD POSIX { int stat(char *path, struct stat *ub); }
|
||||
189 MSTD POSIX { int fstat(int fd, struct stat *sb); }
|
||||
190 STD POSIX { int lstat(char *path, struct stat *ub); }
|
||||
191 STD POSIX { int pathconf(char *path, int name); }
|
||||
192 MSTD POSIX { int fpathconf(int fd, int name); }
|
||||
188 STD POSIX { int ia32_stat(char *path, struct stat32 *ub); }
|
||||
189 STD POSIX { int ia32_fstat(int fd, struct stat32 *ub); }
|
||||
190 STD POSIX { int ia32_lstat(char *path, struct stat32 *ub); }
|
||||
191 NOPROTO POSIX { int pathconf(char *path, int name); }
|
||||
192 MNOPROTO POSIX { int fpathconf(int fd, int name); }
|
||||
193 UNIMPL NOHIDE nosys
|
||||
194 MSTD BSD { int getrlimit(u_int which, \
|
||||
194 MNOPROTO BSD { int getrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
getrlimit __getrlimit_args int
|
||||
195 MSTD BSD { int setrlimit(u_int which, \
|
||||
195 MNOPROTO BSD { int setrlimit(u_int which, \
|
||||
struct rlimit *rlp); } \
|
||||
setrlimit __setrlimit_args int
|
||||
196 STD BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
196 NOPROTO BSD { int getdirentries(int fd, char *buf, u_int count, \
|
||||
long *basep); }
|
||||
197 MSTD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
|
||||
int flags, int fd, int pad, off_t pos); }
|
||||
198 STD NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
199 STD POSIX { off_t lseek(int fd, int pad, off_t offset, \
|
||||
197 STD BSD { caddr_t ia32_mmap(caddr_t addr, size_t len, \
|
||||
int prot, int flags, int fd, int pad, \
|
||||
u_int32_t poslo, u_int32_t poshi); }
|
||||
198 NOPROTO NOHIDE { int nosys(void); } __syscall __syscall_args int
|
||||
; XXX note - bigendian is different
|
||||
199 STD POSIX { off_t ia32_lseek(int fd, int pad, \
|
||||
u_int32_t offsetlo, u_int32_t offsethi, \
|
||||
int whence); }
|
||||
200 STD BSD { int truncate(char *path, int pad, off_t length); }
|
||||
201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
|
||||
202 MSTD BSD { int __sysctl(int *name, u_int namelen, void *old, \
|
||||
size_t *oldlenp, void *new, size_t newlen); } \
|
||||
__sysctl sysctl_args int
|
||||
; properly, __sysctl should be a NOHIDE, but making an exception
|
||||
; here allows to avoid one in libc/sys/Makefile.inc.
|
||||
203 MSTD BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MSTD BSD { int munlock(const void *addr, size_t len); }
|
||||
205 STD BSD { int undelete(char *path); }
|
||||
206 STD BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MSTD BSD { int getpgid(pid_t pid); }
|
||||
; XXX note - bigendian is different
|
||||
200 STD BSD { int ia32_truncate(char *path, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
; XXX note - bigendian is different
|
||||
201 STD BSD { int ia32_ftruncate(int fd, int pad, \
|
||||
u_int32_t lengthlo, u_int32_t lengthhi); }
|
||||
202 MSTD BSD { int ia32_sysctl(int *name, u_int namelen, \
|
||||
void *old, u_int32_t *oldlenp, void *new, \
|
||||
u_int32_t newlen); }
|
||||
203 MNOPROTO BSD { int mlock(const void *addr, size_t len); }
|
||||
204 MNOPROTO BSD { int munlock(const void *addr, size_t len); }
|
||||
205 NOPROTO BSD { int undelete(char *path); }
|
||||
206 NOPROTO BSD { int futimes(int fd, struct timeval *tptr); }
|
||||
207 MNOPROTO BSD { int getpgid(pid_t pid); }
|
||||
208 UNIMPL NOHIDE newreboot (NetBSD)
|
||||
209 MSTD BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
209 MNOPROTO BSD { int poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
|
||||
;
|
||||
; The following are reserved for loadable syscalls
|
||||
;
|
||||
210 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
211 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
212 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
213 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
214 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
215 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
216 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
217 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
218 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
219 NODEF NOHIDE lkmnosys lkmnosys nosys_args int
|
||||
210 UNIMPL NOHIDE
|
||||
211 UNIMPL NOHIDE
|
||||
212 UNIMPL NOHIDE
|
||||
213 UNIMPL NOHIDE
|
||||
214 UNIMPL NOHIDE
|
||||
215 UNIMPL NOHIDE
|
||||
216 UNIMPL NOHIDE
|
||||
217 UNIMPL NOHIDE
|
||||
218 UNIMPL NOHIDE
|
||||
219 UNIMPL NOHIDE
|
||||
|
||||
;
|
||||
; The following were introduced with NetBSD/4.4Lite-2
|
||||
; They are initialized by thier respective modules/sysinits
|
||||
220 MNOSTD BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
220 MNOPROTO BSD { int __semctl(int semid, int semnum, int cmd, \
|
||||
union semun *arg); }
|
||||
221 MNOSTD BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOSTD BSD { int semop(int semid, struct sembuf *sops, \
|
||||
221 MNOPROTO BSD { int semget(key_t key, int nsems, int semflg); }
|
||||
222 MNOPROTO BSD { int semop(int semid, struct sembuf *sops, \
|
||||
u_int nsops); }
|
||||
223 UNIMPL NOHIDE semconfig
|
||||
224 MNOSTD BSD { int msgctl(int msqid, int cmd, \
|
||||
224 MNOPROTO BSD { int msgctl(int msqid, int cmd, \
|
||||
struct msqid_ds *buf); }
|
||||
225 MNOSTD BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOSTD BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
225 MNOPROTO BSD { int msgget(key_t key, int msgflg); }
|
||||
226 MNOPROTO BSD { int msgsnd(int msqid, void *msgp, size_t msgsz, \
|
||||
int msgflg); }
|
||||
227 MNOSTD BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
227 MNOPROTO BSD { int msgrcv(int msqid, void *msgp, size_t msgsz, \
|
||||
long msgtyp, int msgflg); }
|
||||
228 MNOSTD BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOSTD BSD { int shmctl(int shmid, int cmd, \
|
||||
228 MNOPROTO BSD { int shmat(int shmid, void *shmaddr, int shmflg); }
|
||||
229 MNOPROTO BSD { int shmctl(int shmid, int cmd, \
|
||||
struct shmid_ds *buf); }
|
||||
230 MNOSTD BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOSTD BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
230 MNOPROTO BSD { int shmdt(void *shmaddr); }
|
||||
231 MNOPROTO BSD { int shmget(key_t key, int size, int shmflg); }
|
||||
;
|
||||
232 MSTD POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
232 MNOPROTO POSIX { int clock_gettime(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
233 MSTD POSIX { int clock_settime(clockid_t clock_id, \
|
||||
233 MNOPROTO POSIX { int clock_settime(clockid_t clock_id, \
|
||||
const struct timespec *tp); }
|
||||
234 MSTD POSIX { int clock_getres(clockid_t clock_id, \
|
||||
234 MNOPROTO POSIX { int clock_getres(clockid_t clock_id, \
|
||||
struct timespec *tp); }
|
||||
235 UNIMPL NOHIDE timer_create
|
||||
236 UNIMPL NOHIDE timer_delete
|
||||
237 UNIMPL NOHIDE timer_settime
|
||||
238 UNIMPL NOHIDE timer_gettime
|
||||
239 UNIMPL NOHIDE timer_getoverrun
|
||||
240 MSTD POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
240 MNOPROTO POSIX { int nanosleep(const struct timespec *rqtp, \
|
||||
struct timespec *rmtp); }
|
||||
241 UNIMPL NOHIDE nosys
|
||||
242 UNIMPL NOHIDE nosys
|
||||
@ -388,12 +382,12 @@
|
||||
248 UNIMPL NOHIDE nosys
|
||||
249 UNIMPL NOHIDE nosys
|
||||
; syscall numbers initially used in OpenBSD
|
||||
250 MSTD BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MSTD BSD { int rfork(int flags); }
|
||||
252 MSTD BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
250 MNOPROTO BSD { int minherit(void *addr, size_t len, int inherit); }
|
||||
251 MNOPROTO BSD { int rfork(int flags); }
|
||||
252 MNOPROTO BSD { int openbsd_poll(struct pollfd *fds, u_int nfds, \
|
||||
int timeout); }
|
||||
253 STD BSD { int issetugid(void); }
|
||||
254 STD BSD { int lchown(char *path, int uid, int gid); }
|
||||
253 NOPROTO BSD { int issetugid(void); }
|
||||
254 NOPROTO BSD { int lchown(char *path, int uid, int gid); }
|
||||
255 UNIMPL NOHIDE nosys
|
||||
256 UNIMPL NOHIDE nosys
|
||||
257 UNIMPL NOHIDE nosys
|
||||
@ -411,15 +405,15 @@
|
||||
269 UNIMPL NOHIDE nosys
|
||||
270 UNIMPL NOHIDE nosys
|
||||
271 UNIMPL NOHIDE nosys
|
||||
272 STD BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
272 NOPROTO BSD { int getdents(int fd, char *buf, size_t count); }
|
||||
273 UNIMPL NOHIDE nosys
|
||||
274 STD BSD { int lchmod(char *path, mode_t mode); }
|
||||
274 NOPROTO BSD { int lchmod(char *path, mode_t mode); }
|
||||
275 NOPROTO BSD { int lchown(char *path, uid_t uid, gid_t gid); } netbsd_lchown lchown_args int
|
||||
276 STD BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
276 NOPROTO BSD { int lutimes(char *path, struct timeval *tptr); }
|
||||
277 MNOPROTO BSD { int msync(void *addr, size_t len, int flags); } netbsd_msync msync_args int
|
||||
278 STD BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MSTD BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 STD BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
278 NOPROTO BSD { int nstat(char *path, struct nstat *ub); }
|
||||
279 MNOPROTO BSD { int nfstat(int fd, struct nstat *sb); }
|
||||
280 NOPROTO BSD { int nlstat(char *path, struct nstat *ub); }
|
||||
281 UNIMPL NOHIDE nosys
|
||||
282 UNIMPL NOHIDE nosys
|
||||
283 UNIMPL NOHIDE nosys
|
||||
@ -437,126 +431,133 @@
|
||||
295 UNIMPL NOHIDE nosys
|
||||
296 UNIMPL NOHIDE nosys
|
||||
; XXX 297 is 300 in NetBSD
|
||||
297 STD BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 STD BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 STD BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
297 NOPROTO BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
|
||||
298 NOPROTO BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
|
||||
299 NOPROTO BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
|
||||
; syscall numbers for FreeBSD
|
||||
300 MSTD BSD { int modnext(int modid); }
|
||||
301 MSTD BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MSTD BSD { int modfnext(int modid); }
|
||||
303 MSTD BSD { int modfind(const char *name); }
|
||||
304 MSTD BSD { int kldload(const char *file); }
|
||||
305 MSTD BSD { int kldunload(int fileid); }
|
||||
306 MSTD BSD { int kldfind(const char *file); }
|
||||
307 MSTD BSD { int kldnext(int fileid); }
|
||||
308 MSTD BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MSTD BSD { int kldfirstmod(int fileid); }
|
||||
310 MSTD BSD { int getsid(pid_t pid); }
|
||||
311 MSTD BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MSTD BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
300 MNOPROTO BSD { int modnext(int modid); }
|
||||
301 MNOPROTO BSD { int modstat(int modid, struct module_stat* stat); }
|
||||
302 MNOPROTO BSD { int modfnext(int modid); }
|
||||
303 MNOPROTO BSD { int modfind(const char *name); }
|
||||
304 MNOPROTO BSD { int kldload(const char *file); }
|
||||
305 MNOPROTO BSD { int kldunload(int fileid); }
|
||||
306 MNOPROTO BSD { int kldfind(const char *file); }
|
||||
307 MNOPROTO BSD { int kldnext(int fileid); }
|
||||
308 MNOPROTO BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 MNOPROTO BSD { int kldfirstmod(int fileid); }
|
||||
310 MNOPROTO BSD { int getsid(pid_t pid); }
|
||||
311 MNOPROTO BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 MNOPROTO BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
313 OBSOL NOHIDE signanosleep
|
||||
314 NOSTD BSD { int aio_return(struct aiocb *aiocbp); }
|
||||
315 NOSTD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
||||
316 NOSTD BSD { int aio_cancel(int fd, struct aiocb *aiocbp); }
|
||||
317 NOSTD BSD { int aio_error(struct aiocb *aiocbp); }
|
||||
318 NOSTD BSD { int aio_read(struct aiocb *aiocbp); }
|
||||
319 NOSTD BSD { int aio_write(struct aiocb *aiocbp); }
|
||||
320 NOSTD BSD { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }
|
||||
321 MSTD BSD { int yield(void); }
|
||||
314 UNIMPL NOHIDE aio_return
|
||||
315 UNIMPL NOHIDE aio_suspend
|
||||
316 UNIMPL NOHIDE aio_cancel
|
||||
317 UNIMPL NOHIDE aio_error
|
||||
318 UNIMPL NOHIDE aio_read
|
||||
319 UNIMPL NOHIDE aio_write
|
||||
320 UNIMPL NOHIDE lio_listio
|
||||
321 MNOPROTO BSD { int yield(void); }
|
||||
322 OBSOL NOHIDE thr_sleep
|
||||
323 OBSOL NOHIDE thr_wakeup
|
||||
324 MSTD BSD { int mlockall(int how); }
|
||||
325 MSTD BSD { int munlockall(void); }
|
||||
326 STD BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
324 MNOPROTO BSD { int mlockall(int how); }
|
||||
325 MNOPROTO BSD { int munlockall(void); }
|
||||
326 NOPROTO BSD { int __getcwd(u_char *buf, u_int buflen); }
|
||||
|
||||
327 MSTD POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MSTD POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
327 MNOPROTO POSIX { int sched_setparam (pid_t pid, const struct sched_param *param); }
|
||||
328 MNOPROTO POSIX { int sched_getparam (pid_t pid, struct sched_param *param); }
|
||||
|
||||
329 MSTD POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MSTD POSIX { int sched_getscheduler (pid_t pid); }
|
||||
329 MNOPROTO POSIX { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }
|
||||
330 MNOPROTO POSIX { int sched_getscheduler (pid_t pid); }
|
||||
|
||||
331 MSTD POSIX { int sched_yield (void); }
|
||||
332 MSTD POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MSTD POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MSTD POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 STD BSD { int utrace(const void *addr, size_t len); }
|
||||
336 MSTD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 STD BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MSTD BSD { int jail(struct jail *jail); }
|
||||
331 MNOPROTO POSIX { int sched_yield (void); }
|
||||
332 MNOPROTO POSIX { int sched_get_priority_max (int policy); }
|
||||
333 MNOPROTO POSIX { int sched_get_priority_min (int policy); }
|
||||
334 MNOPROTO POSIX { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }
|
||||
335 NOPROTO BSD { int utrace(const void *addr, size_t len); }
|
||||
; XXX note - bigendian is different
|
||||
336 MSTD BSD { int ia32_sendfile(int fd, int s, u_int32_t offsetlo, \
|
||||
u_int32_t offsethi, size_t nbytes, \
|
||||
struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
|
||||
337 NOPROTO BSD { int kldsym(int fileid, int cmd, void *data); }
|
||||
338 MNOPROTO BSD { int jail(struct jail *jail); }
|
||||
339 UNIMPL BSD pioctl
|
||||
340 MSTD POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
340 MNOPROTO POSIX { int sigprocmask(int how, const sigset_t *set, \
|
||||
sigset_t *oset); }
|
||||
341 MSTD POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 MSTD POSIX { int sigaction(int sig, const struct sigaction *act, \
|
||||
struct sigaction *oact); }
|
||||
343 MSTD POSIX { int sigpending(sigset_t *set); }
|
||||
344 STD BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
341 MNOPROTO POSIX { int sigsuspend(const sigset_t *sigmask); }
|
||||
342 STD POSIX { int ia32_sigaction(int sig, \
|
||||
struct sigaction32 *act, \
|
||||
struct sigaction32 *oact); }
|
||||
343 MNOPROTO POSIX { int sigpending(sigset_t *set); }
|
||||
344 MNOPROTO BSD { int sigreturn(const struct __ucontext *sigcntxp); }
|
||||
345 UNIMPL NOHIDE sigtimedwait
|
||||
346 UNIMPL NOHIDE sigwaitinfo
|
||||
347 MSTD BSD { int __acl_get_file(const char *path, \
|
||||
347 MNOPROTO BSD { int __acl_get_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
348 MSTD BSD { int __acl_set_file(const char *path, \
|
||||
348 MNOPROTO BSD { int __acl_set_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
349 MSTD BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
349 MNOPROTO BSD { int __acl_get_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
350 MSTD BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
350 MNOPROTO BSD { int __acl_set_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
351 MSTD BSD { int __acl_delete_file(const char *path, \
|
||||
351 MNOPROTO BSD { int __acl_delete_file(const char *path, \
|
||||
acl_type_t type); }
|
||||
352 MSTD BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MSTD BSD { int __acl_aclcheck_file(const char *path, \
|
||||
352 MNOPROTO BSD { int __acl_delete_fd(int filedes, acl_type_t type); }
|
||||
353 MNOPROTO BSD { int __acl_aclcheck_file(const char *path, \
|
||||
acl_type_t type, struct acl *aclp); }
|
||||
354 MSTD BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
354 MNOPROTO BSD { int __acl_aclcheck_fd(int filedes, acl_type_t type, \
|
||||
struct acl *aclp); }
|
||||
355 STD BSD { int extattrctl(const char *path, int cmd, \
|
||||
355 NOPROTO BSD { int extattrctl(const char *path, int cmd, \
|
||||
const char *filename, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
356 STD BSD { int extattr_set_file(const char *path, \
|
||||
356 NOPROTO BSD { int extattr_set_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
357 STD BSD { ssize_t extattr_get_file(const char *path, \
|
||||
357 NOPROTO BSD { ssize_t extattr_get_file(const char *path, \
|
||||
int attrnamespace, const char *attrname, \
|
||||
void *data, size_t nbytes); }
|
||||
358 STD BSD { int extattr_delete_file(const char *path, \
|
||||
358 NOPROTO BSD { int extattr_delete_file(const char *path, \
|
||||
int attrnamespace, const char *attrname); }
|
||||
359 NOSTD BSD { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }
|
||||
360 MSTD BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MSTD BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MSTD BSD { int kqueue(void); }
|
||||
363 MSTD BSD { int kevent(int fd, \
|
||||
359 UNIMPL NOHIDE aio_waitcomplete
|
||||
360 MNOPROTO BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 MNOPROTO BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
362 MNOPROTO BSD { int kqueue(void); }
|
||||
363 MNOPROTO BSD { int kevent(int fd, \
|
||||
const struct kevent *changelist, int nchanges, \
|
||||
struct kevent *eventlist, int nevents, \
|
||||
const struct timespec *timeout); }
|
||||
364 STD BSD { int __cap_get_proc(struct cap *cap_p); }
|
||||
365 STD BSD { int __cap_set_proc(struct cap *cap_p); }
|
||||
366 STD BSD { int __cap_get_fd(int fd, struct cap *cap_p); }
|
||||
367 STD BSD { int __cap_get_file(const char *path_p, struct cap *cap_p); }
|
||||
368 STD BSD { int __cap_set_fd(int fd, struct cap *cap_p); }
|
||||
369 STD BSD { int __cap_set_file(const char *path_p, struct cap *cap_p); }
|
||||
370 NODEF NOHIDE lkmressys lkmressys nosys_args int
|
||||
371 STD BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
364 UNIMPL NOHIDE __cap_get_proc
|
||||
365 UNIMPL NOHIDE __cap_set_proc
|
||||
366 UNIMPL NOHIDE __cap_get_fd
|
||||
367 UNIMPL NOHIDE __cap_get_file
|
||||
368 UNIMPL NOHIDE __cap_set_fd
|
||||
369 UNIMPL NOHIDE __cap_set_file
|
||||
370 UNIMPL NOHIDE lkmressys
|
||||
371 NOPROTO BSD { int extattr_set_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, \
|
||||
size_t nbytes); }
|
||||
372 STD BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
372 NOPROTO BSD { ssize_t extattr_get_fd(int fd, int attrnamespace, \
|
||||
const char *attrname, void *data, size_t nbytes); }
|
||||
373 STD BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
373 NOPROTO BSD { int extattr_delete_fd(int fd, int attrnamespace, \
|
||||
const char *attrname); }
|
||||
374 MSTD BSD { int __setugid(int flag); }
|
||||
375 NOIMPL BSD { int nfsclnt(int flag, caddr_t argp); }
|
||||
376 STD BSD { int eaccess(char *path, int flags); }
|
||||
374 MNOPROTO BSD { int __setugid(int flag); }
|
||||
375 UNIMPL BSD nfsclnt
|
||||
376 NOPROTO BSD { int eaccess(char *path, int flags); }
|
||||
377 UNIMPL BSD afs_syscall
|
||||
378 STD BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
378 NOPROTO BSD { int nmount(struct iovec *iovp, unsigned int iovcnt, \
|
||||
int flags); }
|
||||
379 STD BSD { int kse_exit(void); }
|
||||
380 STD BSD { int kse_wakeup(void); }
|
||||
381 STD BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
379 NOPROTO BSD { int kse_exit(void); }
|
||||
380 NOPROTO BSD { int kse_wakeup(void); }
|
||||
381 NOPROTO BSD { int kse_new(struct kse_mailbox * mbx, \
|
||||
int new_grp_flag); }
|
||||
382 STD BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 STD BSD { int kse_yield(void); }
|
||||
382 NOPROTO BSD { int thread_wakeup(struct thread_mailbox *tmbx); }
|
||||
383 NOPROTO BSD { int kse_yield(void); }
|
||||
384 UNIMPL BSD __mac_get_proc
|
||||
385 UNIMPL BSD __mac_set_proc
|
||||
386 UNIMPL BSD __mac_get_fd
|
||||
387 UNIMPL BSD __mac_get_file
|
||||
388 UNIMPL BSD __mac_set_fd
|
||||
389 UNIMPL BSD __mac_set_file
|
||||
390 NOPROTO BSD { int kenv(int what, const char *name, char *value, \
|
||||
int len); }
|
||||
391 NOPROTO BSD { int lchflags(const char *path, int flags); }
|
||||
392 NOPROTO BSD { int uuidgen(struct uuid *store, int count); }
|
||||
|
@ -34,7 +34,45 @@
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/linker.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
struct sysentvec elf64_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf64_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF64",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf64_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_IA_64,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf64_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf64_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
Elf_Addr link_elf_get_gp(linker_file_t);
|
||||
|
||||
|
@ -33,9 +33,13 @@
|
||||
* ELF definitions for the IA-64 architecture.
|
||||
*/
|
||||
|
||||
#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
|
||||
#ifndef __ELF_WORD_SIZE
|
||||
#define __ELF_WORD_SIZE 64
|
||||
#endif
|
||||
|
||||
#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */
|
||||
#include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */
|
||||
|
||||
#define __ELF_WORD_SIZE 64 /* Used by <sys/elf_generic.h> */
|
||||
#include <sys/elf_generic.h>
|
||||
|
||||
#define ELF_ARCH EM_IA_64
|
||||
@ -49,6 +53,13 @@
|
||||
* but POSIX lays claim to all symbols ending with "_t".
|
||||
*/
|
||||
|
||||
typedef struct { /* Auxiliary vector entry on initial stack */
|
||||
int a_type; /* Entry type. */
|
||||
union {
|
||||
int a_val; /* Integer value. */
|
||||
} a_un;
|
||||
} Elf32_Auxinfo;
|
||||
|
||||
typedef struct { /* Auxiliary vector entry on initial stack */
|
||||
int a_type; /* Entry type. */
|
||||
union {
|
||||
@ -194,7 +205,11 @@ __ElfType(Auxinfo);
|
||||
#define R_IA64_LDXMOV 0x87 /* immediate22 special */
|
||||
|
||||
/* Define "machine" characteristics */
|
||||
#if __ELF_WORD_SIZE == 32
|
||||
#define ELF_TARG_CLASS ELFCLASS32
|
||||
#else
|
||||
#define ELF_TARG_CLASS ELFCLASS64
|
||||
#endif
|
||||
#define ELF_TARG_DATA ELFDATA2LSB
|
||||
#define ELF_TARG_MACH EM_IA_64
|
||||
#define ELF_TARG_VER 1
|
||||
|
@ -178,7 +178,7 @@ exec_aout_imgact(imgp)
|
||||
/*
|
||||
* Destroy old process VM and create a new one (with a new stack)
|
||||
*/
|
||||
exec_new_vmspace(imgp);
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
|
||||
/*
|
||||
* The vm space can be changed by exec_new_vmspace
|
||||
|
@ -70,59 +70,30 @@
|
||||
__ElfType(Brandinfo);
|
||||
__ElfType(Auxargs);
|
||||
|
||||
static int elf_check_header(const Elf_Ehdr *hdr);
|
||||
static int elf_freebsd_fixup(register_t **stack_base,
|
||||
struct image_params *imgp);
|
||||
static int elf_load_file(struct proc *p, const char *file, u_long *addr,
|
||||
u_long *entry);
|
||||
static int elf_load_section(struct proc *p,
|
||||
static int __elfN(check_header)(const Elf_Ehdr *hdr);
|
||||
static int __elfN(load_file)(struct proc *p, const char *file, u_long *addr,
|
||||
u_long *entry, size_t pagesize);
|
||||
static int __elfN(load_section)(struct proc *p,
|
||||
struct vmspace *vmspace, struct vnode *vp, vm_object_t object,
|
||||
vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz,
|
||||
vm_prot_t prot);
|
||||
static int exec_elf_imgact(struct image_params *imgp);
|
||||
vm_prot_t prot, size_t pagesize);
|
||||
static int __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp);
|
||||
|
||||
static int elf_trace = 0;
|
||||
SYSCTL_INT(_debug, OID_AUTO, elf_trace, CTLFLAG_RW, &elf_trace, 0, "");
|
||||
#if __ELF_WORD_SIZE == 32
|
||||
SYSCTL_INT(_debug, OID_AUTO, elf32_trace, CTLFLAG_RW, &elf_trace, 0, "");
|
||||
#else
|
||||
SYSCTL_INT(_debug, OID_AUTO, elf64_trace, CTLFLAG_RW, &elf_trace, 0, "");
|
||||
#endif
|
||||
|
||||
struct sysentvec elf_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF",
|
||||
elf_coredump,
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf_freebsd_sysvec
|
||||
};
|
||||
static Elf_Brandinfo *elf_brand_list[MAX_BRANDS] = {
|
||||
&freebsd_brand_info,
|
||||
NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL
|
||||
};
|
||||
static Elf_Brandinfo *elf_brand_list[MAX_BRANDS];
|
||||
|
||||
int
|
||||
elf_insert_brand_entry(Elf_Brandinfo *entry)
|
||||
__elfN(insert_brand_entry)(Elf_Brandinfo *entry)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=1; i<MAX_BRANDS; i++) {
|
||||
for (i=0; i<MAX_BRANDS; i++) {
|
||||
if (elf_brand_list[i] == NULL) {
|
||||
elf_brand_list[i] = entry;
|
||||
break;
|
||||
@ -134,11 +105,11 @@ elf_insert_brand_entry(Elf_Brandinfo *entry)
|
||||
}
|
||||
|
||||
int
|
||||
elf_remove_brand_entry(Elf_Brandinfo *entry)
|
||||
__elfN(remove_brand_entry)(Elf_Brandinfo *entry)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=1; i<MAX_BRANDS; i++) {
|
||||
for (i=0; i<MAX_BRANDS; i++) {
|
||||
if (elf_brand_list[i] == entry) {
|
||||
elf_brand_list[i] = NULL;
|
||||
break;
|
||||
@ -150,7 +121,7 @@ elf_remove_brand_entry(Elf_Brandinfo *entry)
|
||||
}
|
||||
|
||||
int
|
||||
elf_brand_inuse(Elf_Brandinfo *entry)
|
||||
__elfN(brand_inuse)(Elf_Brandinfo *entry)
|
||||
{
|
||||
struct proc *p;
|
||||
int rval = FALSE;
|
||||
@ -168,25 +139,165 @@ elf_brand_inuse(Elf_Brandinfo *entry)
|
||||
}
|
||||
|
||||
static int
|
||||
elf_check_header(const Elf_Ehdr *hdr)
|
||||
__elfN(check_header)(const Elf_Ehdr *hdr)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!IS_ELF(*hdr) ||
|
||||
hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS ||
|
||||
hdr->e_ident[EI_DATA] != ELF_TARG_DATA ||
|
||||
hdr->e_ident[EI_VERSION] != EV_CURRENT)
|
||||
return ENOEXEC;
|
||||
|
||||
if (!ELF_MACHINE_OK(hdr->e_machine))
|
||||
/*
|
||||
* Make sure we have at least one brand for this machine.
|
||||
*/
|
||||
|
||||
for (i=0; i<MAX_BRANDS; i++) {
|
||||
if (elf_brand_list[i]->machine == hdr->e_machine)
|
||||
break;
|
||||
}
|
||||
if (i == MAX_BRANDS)
|
||||
return ENOEXEC;
|
||||
|
||||
if (hdr->e_version != ELF_TARG_VER)
|
||||
return ENOEXEC;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_object_t object, vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot)
|
||||
__elfN(map_partial)(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
|
||||
vm_offset_t start, vm_offset_t end, vm_prot_t prot,
|
||||
vm_prot_t max)
|
||||
{
|
||||
int error, rv;
|
||||
vm_offset_t off;
|
||||
vm_offset_t data_buf = 0;
|
||||
|
||||
/*
|
||||
* Create the page if it doesn't exist yet. Ignore errors.
|
||||
*/
|
||||
vm_map_lock(map);
|
||||
vm_map_insert(map, NULL, 0, trunc_page(start), round_page(end),
|
||||
max, max, 0);
|
||||
vm_map_unlock(map);
|
||||
|
||||
/*
|
||||
* Find the page from the underlying object.
|
||||
*/
|
||||
if (object) {
|
||||
vm_object_reference(object);
|
||||
rv = vm_map_find(exec_map,
|
||||
object,
|
||||
trunc_page(offset),
|
||||
&data_buf,
|
||||
PAGE_SIZE,
|
||||
TRUE,
|
||||
VM_PROT_READ,
|
||||
VM_PROT_ALL,
|
||||
MAP_COPY_ON_WRITE | MAP_PREFAULT_PARTIAL);
|
||||
if (rv != KERN_SUCCESS) {
|
||||
vm_object_deallocate(object);
|
||||
return rv;
|
||||
}
|
||||
|
||||
off = offset - trunc_page(offset);
|
||||
error = copyout((caddr_t)data_buf+off, (caddr_t)start, end - start);
|
||||
vm_map_remove(exec_map, data_buf, data_buf + PAGE_SIZE);
|
||||
if (error) {
|
||||
return KERN_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
return KERN_SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
__elfN(map_insert)(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
|
||||
vm_offset_t start, vm_offset_t end, vm_prot_t prot,
|
||||
vm_prot_t max, int cow)
|
||||
{
|
||||
int rv;
|
||||
|
||||
if (start != trunc_page(start)) {
|
||||
rv = __elfN(map_partial)(map, object, offset,
|
||||
start, round_page(start), prot, max);
|
||||
if (rv)
|
||||
return rv;
|
||||
offset += round_page(start) - start;
|
||||
start = round_page(start);
|
||||
}
|
||||
if (end != round_page(end)) {
|
||||
rv = __elfN(map_partial)(map, object,
|
||||
offset + trunc_page(end) - start,
|
||||
trunc_page(end), end, prot, max);
|
||||
if (rv)
|
||||
return rv;
|
||||
end = trunc_page(end);
|
||||
}
|
||||
if (end > start) {
|
||||
if (offset & PAGE_MASK) {
|
||||
vm_offset_t data_buf, off;
|
||||
vm_size_t sz;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* The mapping is not page aligned. This means we have
|
||||
* to copy the data. Sigh.
|
||||
*/
|
||||
rv = vm_map_find(map, 0, 0,
|
||||
&start, end - start,
|
||||
FALSE, prot, max, 0);
|
||||
if (rv)
|
||||
return rv;
|
||||
while (start < end) {
|
||||
vm_object_reference(object);
|
||||
rv = vm_map_find(exec_map,
|
||||
object,
|
||||
trunc_page(offset),
|
||||
&data_buf,
|
||||
2*PAGE_SIZE,
|
||||
TRUE,
|
||||
VM_PROT_READ,
|
||||
VM_PROT_ALL,
|
||||
(MAP_COPY_ON_WRITE
|
||||
| MAP_PREFAULT_PARTIAL));
|
||||
if (rv != KERN_SUCCESS) {
|
||||
vm_object_deallocate(object);
|
||||
return rv;
|
||||
}
|
||||
off = offset - trunc_page(offset);
|
||||
sz = end - start;
|
||||
if (sz > PAGE_SIZE)
|
||||
sz = PAGE_SIZE;
|
||||
error = copyout((caddr_t)data_buf+off,
|
||||
(caddr_t)start, sz);
|
||||
vm_map_remove(exec_map, data_buf,
|
||||
data_buf + 2*PAGE_SIZE);
|
||||
if (error) {
|
||||
return KERN_FAILURE;
|
||||
}
|
||||
start += sz;
|
||||
}
|
||||
rv = KERN_SUCCESS;
|
||||
} else {
|
||||
vm_map_lock(map);
|
||||
rv = vm_map_insert(map, object, offset, start, end,
|
||||
prot, max, cow);
|
||||
vm_map_unlock(map);
|
||||
}
|
||||
return rv;
|
||||
} else {
|
||||
return KERN_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
__elfN(load_section)(struct proc *p, struct vmspace *vmspace,
|
||||
struct vnode *vp, vm_object_t object, vm_offset_t offset,
|
||||
caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot,
|
||||
size_t pagesize)
|
||||
{
|
||||
size_t map_len;
|
||||
vm_offset_t map_addr;
|
||||
@ -214,8 +325,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
return (ENOEXEC);
|
||||
}
|
||||
|
||||
map_addr = trunc_page((vm_offset_t)vmaddr);
|
||||
file_addr = trunc_page(offset);
|
||||
#define trunc_page_ps(va, ps) ((va) & ~(ps - 1))
|
||||
#define round_page_ps(va, ps) (((va) + (ps - 1)) & ~(ps - 1))
|
||||
|
||||
map_addr = trunc_page_ps((vm_offset_t)vmaddr, pagesize);
|
||||
file_addr = trunc_page_ps(offset, pagesize);
|
||||
|
||||
/*
|
||||
* We have two choices. We can either clear the data in the last page
|
||||
@ -224,14 +338,13 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
* choose the second..
|
||||
*/
|
||||
if (memsz > filsz)
|
||||
map_len = trunc_page(offset+filsz) - file_addr;
|
||||
map_len = trunc_page_ps(offset+filsz, pagesize) - file_addr;
|
||||
else
|
||||
map_len = round_page(offset+filsz) - file_addr;
|
||||
map_len = round_page_ps(offset+filsz, pagesize) - file_addr;
|
||||
|
||||
if (map_len != 0) {
|
||||
vm_object_reference(object);
|
||||
vm_map_lock(&vmspace->vm_map);
|
||||
rv = vm_map_insert(&vmspace->vm_map,
|
||||
rv = __elfN(map_insert)(&vmspace->vm_map,
|
||||
object,
|
||||
file_addr, /* file offset */
|
||||
map_addr, /* virtual start */
|
||||
@ -239,7 +352,6 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
prot,
|
||||
VM_PROT_ALL,
|
||||
MAP_COPY_ON_WRITE | MAP_PREFAULT);
|
||||
vm_map_unlock(&vmspace->vm_map);
|
||||
if (rv != KERN_SUCCESS) {
|
||||
vm_object_deallocate(object);
|
||||
return EINVAL;
|
||||
@ -258,26 +370,25 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
* segment in the file is extended to provide bss. It's a neat idea
|
||||
* to try and save a page, but it's a pain in the behind to implement.
|
||||
*/
|
||||
copy_len = (offset + filsz) - trunc_page(offset + filsz);
|
||||
map_addr = trunc_page((vm_offset_t)vmaddr + filsz);
|
||||
map_len = round_page((vm_offset_t)vmaddr + memsz) - map_addr;
|
||||
copy_len = (offset + filsz) - trunc_page_ps(offset + filsz, pagesize);
|
||||
map_addr = trunc_page_ps((vm_offset_t)vmaddr + filsz, pagesize);
|
||||
map_len = round_page_ps((vm_offset_t)vmaddr + memsz, pagesize) - map_addr;
|
||||
|
||||
/* This had damn well better be true! */
|
||||
if (map_len != 0) {
|
||||
vm_map_lock(&vmspace->vm_map);
|
||||
rv = vm_map_insert(&vmspace->vm_map, NULL, 0,
|
||||
map_addr, map_addr + map_len,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
vm_map_unlock(&vmspace->vm_map);
|
||||
if (map_len != 0) {
|
||||
rv = __elfN(map_insert)(&vmspace->vm_map, NULL, 0,
|
||||
map_addr, map_addr + map_len,
|
||||
VM_PROT_ALL, VM_PROT_ALL, 0);
|
||||
if (rv != KERN_SUCCESS) {
|
||||
return EINVAL;
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (copy_len != 0) {
|
||||
vm_offset_t off;
|
||||
vm_object_reference(object);
|
||||
rv = vm_map_find(exec_map,
|
||||
object,
|
||||
object,
|
||||
trunc_page(offset + filsz),
|
||||
&data_buf,
|
||||
PAGE_SIZE,
|
||||
@ -291,7 +402,10 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
}
|
||||
|
||||
/* send the page fragment to user space */
|
||||
error = copyout((caddr_t)data_buf, (caddr_t)map_addr, copy_len);
|
||||
off = trunc_page_ps(offset + filsz, pagesize)
|
||||
- trunc_page(offset + filsz);
|
||||
error = copyout((caddr_t)data_buf+off, (caddr_t)map_addr,
|
||||
copy_len);
|
||||
vm_map_remove(exec_map, data_buf, data_buf + PAGE_SIZE);
|
||||
if (error) {
|
||||
return (error);
|
||||
@ -299,10 +413,11 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
}
|
||||
|
||||
/*
|
||||
* set it to the specified protection
|
||||
* set it to the specified protection.
|
||||
* XXX had better undo the damage from pasting over the cracks here!
|
||||
*/
|
||||
vm_map_protect(&vmspace->vm_map, map_addr, map_addr + map_len, prot,
|
||||
FALSE);
|
||||
vm_map_protect(&vmspace->vm_map, trunc_page(map_addr),
|
||||
round_page(map_addr + map_len), prot, FALSE);
|
||||
|
||||
return error;
|
||||
}
|
||||
@ -320,7 +435,8 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_o
|
||||
* the entry point for the loaded file.
|
||||
*/
|
||||
static int
|
||||
elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
|
||||
__elfN(load_file)(struct proc *p, const char *file, u_long *addr,
|
||||
u_long *entry, size_t pagesize)
|
||||
{
|
||||
struct {
|
||||
struct nameidata nd;
|
||||
@ -363,8 +479,8 @@ elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
|
||||
}
|
||||
|
||||
/* XXXKSE */
|
||||
NDINIT(nd, LOOKUP, LOCKLEAF|FOLLOW, UIO_SYSSPACE, file, curthread);
|
||||
|
||||
NDINIT(nd, LOOKUP, LOCKLEAF|FOLLOW, UIO_SYSSPACE, file, curthread);
|
||||
|
||||
if ((error = namei(nd)) != 0) {
|
||||
nd->ni_vp = NULL;
|
||||
goto fail;
|
||||
@ -393,10 +509,10 @@ elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
|
||||
|
||||
VOP_UNLOCK(nd->ni_vp, 0, curthread); /* XXXKSE */
|
||||
if (error)
|
||||
goto fail;
|
||||
goto fail;
|
||||
|
||||
hdr = (const Elf_Ehdr *)imgp->image_header;
|
||||
if ((error = elf_check_header(hdr)) != 0)
|
||||
if ((error = __elfN(check_header)(hdr)) != 0)
|
||||
goto fail;
|
||||
if (hdr->e_type == ET_DYN)
|
||||
rbase = *addr;
|
||||
@ -426,13 +542,14 @@ elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
|
||||
if (phdr[i].p_flags & PF_R)
|
||||
prot |= VM_PROT_READ;
|
||||
|
||||
if ((error = elf_load_section(p, vmspace, nd->ni_vp,
|
||||
imgp->object,
|
||||
phdr[i].p_offset,
|
||||
(caddr_t)phdr[i].p_vaddr +
|
||||
rbase,
|
||||
phdr[i].p_memsz,
|
||||
phdr[i].p_filesz, prot)) != 0)
|
||||
if ((error = __elfN(load_section)
|
||||
(p, vmspace, nd->ni_vp,
|
||||
imgp->object,
|
||||
phdr[i].p_offset,
|
||||
(caddr_t)(uintptr_t)phdr[i].p_vaddr +
|
||||
rbase,
|
||||
phdr[i].p_memsz,
|
||||
phdr[i].p_filesz, prot, pagesize)) != 0)
|
||||
goto fail;
|
||||
/*
|
||||
* Establish the base address if this is the
|
||||
@ -463,20 +580,10 @@ elf_load_file(struct proc *p, const char *file, u_long *addr, u_long *entry)
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* non static, as it can be overridden by start_init()
|
||||
*/
|
||||
#ifdef __ia64__
|
||||
int fallback_elf_brand = ELFOSABI_FREEBSD;
|
||||
#else
|
||||
int fallback_elf_brand = -1;
|
||||
#endif
|
||||
SYSCTL_INT(_kern, OID_AUTO, fallback_elf_brand, CTLFLAG_RW,
|
||||
&fallback_elf_brand, -1,
|
||||
"ELF brand of last resort");
|
||||
extern int fallback_elf_brand;
|
||||
|
||||
static int
|
||||
exec_elf_imgact(struct image_params *imgp)
|
||||
__CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
|
||||
{
|
||||
const Elf_Ehdr *hdr = (const Elf_Ehdr *) imgp->image_header;
|
||||
const Elf_Phdr *phdr;
|
||||
@ -486,6 +593,7 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
u_long text_size = 0, data_size = 0;
|
||||
u_long text_addr = 0, data_addr = 0;
|
||||
u_long addr, entry = 0, proghdr = 0;
|
||||
vm_offset_t maxuser, usrstack, pagesize;
|
||||
int error, i;
|
||||
const char *interp = NULL;
|
||||
Elf_Brandinfo *brand_info;
|
||||
@ -496,7 +604,7 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
/*
|
||||
* Do we have a valid ELF header ?
|
||||
*/
|
||||
if (elf_check_header(hdr) != 0 || hdr->e_type != ET_EXEC)
|
||||
if (__elfN(check_header)(hdr) != 0 || hdr->e_type != ET_EXEC)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
@ -510,7 +618,7 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
return ENOEXEC;
|
||||
}
|
||||
phdr = (const Elf_Phdr*)(imgp->image_header + hdr->e_phoff);
|
||||
|
||||
|
||||
/*
|
||||
* From this point on, we may have resources that need to be freed.
|
||||
*/
|
||||
@ -528,7 +636,38 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
if ((error = exec_extract_strings(imgp)) != 0)
|
||||
goto fail;
|
||||
|
||||
exec_new_vmspace(imgp);
|
||||
/*
|
||||
* Tentatively identify the brand based on the machine so that
|
||||
* we can figure out VM ranges and page sizes.
|
||||
*/
|
||||
brand_info = NULL;
|
||||
for (i = 0; i < MAX_BRANDS; i++) {
|
||||
Elf_Brandinfo *bi = elf_brand_list[i];
|
||||
|
||||
if (bi != NULL &&
|
||||
hdr->e_machine == bi->machine &&
|
||||
(hdr->e_ident[EI_OSABI] == bi->brand
|
||||
|| 0 ==
|
||||
strncmp((const char *)&hdr->e_ident[OLD_EI_BRAND],
|
||||
bi->compat_3_brand, strlen(bi->compat_3_brand)))) {
|
||||
brand_info = bi;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pagesize = PAGE_SIZE;
|
||||
maxuser = VM_MAXUSER_ADDRESS;
|
||||
usrstack = USRSTACK;
|
||||
if (brand_info) {
|
||||
if (brand_info->sysvec->sv_pagesize)
|
||||
pagesize = brand_info->sysvec->sv_pagesize;
|
||||
if (brand_info->sysvec->sv_maxuser)
|
||||
maxuser = brand_info->sysvec->sv_maxuser;
|
||||
if (brand_info->sysvec->sv_usrstack)
|
||||
usrstack = brand_info->sysvec->sv_usrstack;
|
||||
}
|
||||
|
||||
exec_new_vmspace(imgp, VM_MIN_ADDRESS, maxuser, usrstack);
|
||||
|
||||
vmspace = imgp->proc->p_vmspace;
|
||||
|
||||
@ -544,13 +683,23 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
if (phdr[i].p_flags & PF_R)
|
||||
prot |= VM_PROT_READ;
|
||||
|
||||
if ((error = elf_load_section(imgp->proc,
|
||||
vmspace, imgp->vp,
|
||||
imgp->object,
|
||||
phdr[i].p_offset,
|
||||
(caddr_t)phdr[i].p_vaddr,
|
||||
phdr[i].p_memsz,
|
||||
phdr[i].p_filesz, prot)) != 0)
|
||||
#if defined(__ia64__) && __ELF_WORD_SIZE == 32 && defined(IA32_ME_HARDER)
|
||||
/*
|
||||
* Some x86 binaries assume read == executable,
|
||||
* notably the M3 runtime and therefore cvsup
|
||||
*/
|
||||
if (prot & VM_PROT_READ)
|
||||
prot |= VM_PROT_EXECUTE;
|
||||
#endif
|
||||
|
||||
if ((error = __elfN(load_section)
|
||||
(imgp->proc,
|
||||
vmspace, imgp->vp,
|
||||
imgp->object,
|
||||
phdr[i].p_offset,
|
||||
(caddr_t)(uintptr_t)phdr[i].p_vaddr,
|
||||
phdr[i].p_memsz,
|
||||
phdr[i].p_filesz, prot, pagesize)) != 0)
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
@ -611,10 +760,11 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
for (i = 0; i < MAX_BRANDS; i++) {
|
||||
Elf_Brandinfo *bi = elf_brand_list[i];
|
||||
|
||||
if (bi != NULL &&
|
||||
if (bi != NULL &&
|
||||
hdr->e_machine == bi->machine &&
|
||||
(hdr->e_ident[EI_OSABI] == bi->brand
|
||||
|| 0 ==
|
||||
strncmp((const char *)&hdr->e_ident[OLD_EI_BRAND],
|
||||
|| 0 ==
|
||||
strncmp((const char *)&hdr->e_ident[OLD_EI_BRAND],
|
||||
bi->compat_3_brand, strlen(bi->compat_3_brand)))) {
|
||||
brand_info = bi;
|
||||
break;
|
||||
@ -628,6 +778,7 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
Elf_Brandinfo *bi = elf_brand_list[i];
|
||||
|
||||
if (bi != NULL &&
|
||||
hdr->e_machine == bi->machine &&
|
||||
strcmp(interp, bi->interp_path) == 0) {
|
||||
brand_info = bi;
|
||||
break;
|
||||
@ -640,7 +791,9 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
for (i = 0; i < MAX_BRANDS; i++) {
|
||||
Elf_Brandinfo *bi = elf_brand_list[i];
|
||||
|
||||
if (bi != NULL && fallback_elf_brand == bi->brand) {
|
||||
if (bi != NULL &&
|
||||
hdr->e_machine == bi->machine &&
|
||||
fallback_elf_brand == bi->brand) {
|
||||
brand_info = bi;
|
||||
break;
|
||||
}
|
||||
@ -657,17 +810,19 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
imgp->proc->p_sysent = brand_info->sysvec;
|
||||
if (interp != NULL) {
|
||||
path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
|
||||
snprintf(path, MAXPATHLEN, "%s%s",
|
||||
snprintf(path, MAXPATHLEN, "%s%s",
|
||||
brand_info->emul_path, interp);
|
||||
if ((error = elf_load_file(imgp->proc, path, &addr,
|
||||
&imgp->entry_addr)) != 0) {
|
||||
if ((error = elf_load_file(imgp->proc, interp, &addr,
|
||||
&imgp->entry_addr)) != 0) {
|
||||
uprintf("ELF interpreter %s not found\n", path);
|
||||
if ((error = __elfN(load_file)(imgp->proc, path, &addr,
|
||||
&imgp->entry_addr,
|
||||
pagesize)) != 0) {
|
||||
if ((error = __elfN(load_file)
|
||||
(imgp->proc, interp, &addr,
|
||||
&imgp->entry_addr, pagesize)) != 0) {
|
||||
uprintf("ELF interpreter %s not found\n", path);
|
||||
free(path, M_TEMP);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(path, M_TEMP);
|
||||
}
|
||||
|
||||
@ -692,13 +847,23 @@ exec_elf_imgact(struct image_params *imgp)
|
||||
return error;
|
||||
}
|
||||
|
||||
static int
|
||||
elf_freebsd_fixup(register_t **stack_base, struct image_params *imgp)
|
||||
#if __ELF_WORD_SIZE == 32
|
||||
#define suword suword32
|
||||
#define stacktype u_int32_t
|
||||
#else
|
||||
#define suword suword64
|
||||
#define stacktype u_int64_t
|
||||
#endif
|
||||
|
||||
int
|
||||
__elfN(freebsd_fixup)(register_t **stack_base, struct image_params *imgp)
|
||||
{
|
||||
Elf_Auxargs *args = (Elf_Auxargs *)imgp->auxargs;
|
||||
register_t *pos;
|
||||
stacktype *base;
|
||||
stacktype *pos;
|
||||
|
||||
pos = *stack_base + (imgp->argc + imgp->envc + 2);
|
||||
base = (stacktype *)*stack_base;
|
||||
pos = base + (imgp->argc + imgp->envc + 2);
|
||||
|
||||
if (args->trace) {
|
||||
AUXARGS_ENTRY(pos, AT_DEBUG, 1);
|
||||
@ -718,10 +883,11 @@ elf_freebsd_fixup(register_t **stack_base, struct image_params *imgp)
|
||||
free(imgp->auxargs, M_TEMP);
|
||||
imgp->auxargs = NULL;
|
||||
|
||||
(*stack_base)--;
|
||||
suword(*stack_base, (long) imgp->argc);
|
||||
base--;
|
||||
suword(base, (long) imgp->argc);
|
||||
*stack_base = (register_t *)base;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Code for generating ELF core dumps.
|
||||
@ -744,17 +910,17 @@ struct sseg_closure {
|
||||
static void cb_put_phdr(vm_map_entry_t, void *);
|
||||
static void cb_size_segment(vm_map_entry_t, void *);
|
||||
static void each_writable_segment(struct proc *, segment_callback, void *);
|
||||
static int elf_corehdr(struct thread *, struct vnode *, struct ucred *,
|
||||
static int __elfN(corehdr)(struct thread *, struct vnode *, struct ucred *,
|
||||
int, void *, size_t);
|
||||
static void elf_puthdr(struct proc *, void *, size_t *,
|
||||
static void __elfN(puthdr)(struct proc *, void *, size_t *,
|
||||
const prstatus_t *, const prfpregset_t *, const prpsinfo_t *, int);
|
||||
static void elf_putnote(void *, size_t *, const char *, int,
|
||||
static void __elfN(putnote)(void *, size_t *, const char *, int,
|
||||
const void *, size_t);
|
||||
|
||||
extern int osreldate;
|
||||
|
||||
int
|
||||
elf_coredump(td, vp, limit)
|
||||
__elfN(coredump)(td, vp, limit)
|
||||
struct thread *td;
|
||||
register struct vnode *vp;
|
||||
off_t limit;
|
||||
@ -777,7 +943,7 @@ elf_coredump(td, vp, limit)
|
||||
* size is calculated.
|
||||
*/
|
||||
hdrsize = 0;
|
||||
elf_puthdr((struct proc *)NULL, (void *)NULL, &hdrsize,
|
||||
__elfN(puthdr)((struct proc *)NULL, (void *)NULL, &hdrsize,
|
||||
(const prstatus_t *)NULL, (const prfpregset_t *)NULL,
|
||||
(const prpsinfo_t *)NULL, seginfo.count);
|
||||
|
||||
@ -792,7 +958,7 @@ elf_coredump(td, vp, limit)
|
||||
if (hdr == NULL) {
|
||||
return EINVAL;
|
||||
}
|
||||
error = elf_corehdr(td, vp, cred, seginfo.count, hdr, hdrsize);
|
||||
error = __elfN(corehdr)(td, vp, cred, seginfo.count, hdr, hdrsize);
|
||||
|
||||
/* Write the contents of all of the writable segments. */
|
||||
if (error == 0) {
|
||||
@ -803,8 +969,8 @@ elf_coredump(td, vp, limit)
|
||||
php = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr)) + 1;
|
||||
offset = hdrsize;
|
||||
for (i = 0; i < seginfo.count; i++) {
|
||||
error = vn_rdwr_inchunks(UIO_WRITE, vp,
|
||||
(caddr_t)php->p_vaddr,
|
||||
error = vn_rdwr_inchunks(UIO_WRITE, vp,
|
||||
(caddr_t)(uintptr_t)php->p_vaddr,
|
||||
php->p_filesz, offset, UIO_USERSPACE,
|
||||
IO_UNIT | IO_DIRECT, cred, (int *)NULL, curthread); /* XXXKSE */
|
||||
if (error != 0)
|
||||
@ -814,7 +980,7 @@ elf_coredump(td, vp, limit)
|
||||
}
|
||||
}
|
||||
free(hdr, M_TEMP);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -918,7 +1084,7 @@ each_writable_segment(p, func, closure)
|
||||
* the page boundary.
|
||||
*/
|
||||
static int
|
||||
elf_corehdr(td, vp, cred, numsegs, hdr, hdrsize)
|
||||
__elfN(corehdr)(td, vp, cred, numsegs, hdr, hdrsize)
|
||||
struct thread *td;
|
||||
struct vnode *vp;
|
||||
struct ucred *cred;
|
||||
@ -964,7 +1130,7 @@ elf_corehdr(td, vp, cred, numsegs, hdr, hdrsize)
|
||||
/* Fill in the header. */
|
||||
bzero(hdr, hdrsize);
|
||||
off = 0;
|
||||
elf_puthdr(p, hdr, &off, status, fpregset, psinfo, numsegs);
|
||||
__elfN(puthdr)(p, hdr, &off, status, fpregset, psinfo, numsegs);
|
||||
|
||||
free(tempdata, M_TEMP);
|
||||
|
||||
@ -974,7 +1140,7 @@ elf_corehdr(td, vp, cred, numsegs, hdr, hdrsize)
|
||||
}
|
||||
|
||||
static void
|
||||
elf_puthdr(struct proc *p, void *dst, size_t *off, const prstatus_t *status,
|
||||
__elfN(puthdr)(struct proc *p, void *dst, size_t *off, const prstatus_t *status,
|
||||
const prfpregset_t *fpregset, const prpsinfo_t *psinfo, int numsegs)
|
||||
{
|
||||
size_t ehoff;
|
||||
@ -989,11 +1155,11 @@ elf_puthdr(struct proc *p, void *dst, size_t *off, const prstatus_t *status,
|
||||
*off += (numsegs + 1) * sizeof(Elf_Phdr);
|
||||
|
||||
noteoff = *off;
|
||||
elf_putnote(dst, off, "FreeBSD", NT_PRSTATUS, status,
|
||||
__elfN(putnote)(dst, off, "FreeBSD", NT_PRSTATUS, status,
|
||||
sizeof *status);
|
||||
elf_putnote(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
|
||||
__elfN(putnote)(dst, off, "FreeBSD", NT_FPREGSET, fpregset,
|
||||
sizeof *fpregset);
|
||||
elf_putnote(dst, off, "FreeBSD", NT_PRPSINFO, psinfo,
|
||||
__elfN(putnote)(dst, off, "FreeBSD", NT_PRPSINFO, psinfo,
|
||||
sizeof *psinfo);
|
||||
notesz = *off - noteoff;
|
||||
|
||||
@ -1056,7 +1222,7 @@ elf_puthdr(struct proc *p, void *dst, size_t *off, const prstatus_t *status,
|
||||
}
|
||||
|
||||
static void
|
||||
elf_putnote(void *dst, size_t *off, const char *name, int type,
|
||||
__elfN(putnote)(void *dst, size_t *off, const char *name, int type,
|
||||
const void *desc, size_t descsz)
|
||||
{
|
||||
Elf_Note note;
|
||||
@ -1078,5 +1244,10 @@ elf_putnote(void *dst, size_t *off, const char *name, int type,
|
||||
/*
|
||||
* Tell kern_execve.c about it, with a little help from the linker.
|
||||
*/
|
||||
static struct execsw elf_execsw = {exec_elf_imgact, "ELF"};
|
||||
EXEC_SET(elf, elf_execsw);
|
||||
#if __ELF_WORD_SIZE == 32
|
||||
static struct execsw elf_execsw = {exec_elf32_imgact, "ELF32"};
|
||||
EXEC_SET(elf32, elf_execsw);
|
||||
#else
|
||||
static struct execsw elf_execsw = {exec_elf64_imgact, "ELF64"};
|
||||
EXEC_SET(elf64, elf_execsw);
|
||||
#endif
|
||||
|
38
sys/kern/imgact_elf32.c
Normal file
38
sys/kern/imgact_elf32.c
Normal file
@ -0,0 +1,38 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* There ought to be a better way of deciding this.
|
||||
*/
|
||||
#if defined(__i386__) || defined(__ia64__) || defined(__powerpc__)
|
||||
|
||||
#define __ELF_WORD_SIZE 32
|
||||
|
||||
#include <kern/imgact_elf.c>
|
||||
|
||||
#endif
|
38
sys/kern/imgact_elf64.c
Normal file
38
sys/kern/imgact_elf64.c
Normal file
@ -0,0 +1,38 @@
|
||||
/*-
|
||||
* Copyright (c) 2002 Doug Rabson
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
/*
|
||||
* There ought to be a better way of deciding this.
|
||||
*/
|
||||
#if defined(__alpha__) || defined(__ia64__) || defined(__sparc64__)
|
||||
|
||||
#define __ELF_WORD_SIZE 64
|
||||
|
||||
#include <kern/imgact_elf.c>
|
||||
|
||||
#endif
|
51
sys/kern/imgact_elfN.c
Normal file
51
sys/kern/imgact_elfN.c
Normal file
@ -0,0 +1,51 @@
|
||||
/*-
|
||||
* Copyright (c) 2000 David O'Brien
|
||||
* Copyright (c) 1995-1996 Søren Schmidt
|
||||
* Copyright (c) 1996 Peter Wemm
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software withough specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <machine/elf.h>
|
||||
#include <sys/elf_generic.h>
|
||||
|
||||
/*
|
||||
* non static, as it can be overridden by start_init()
|
||||
*/
|
||||
#ifdef __ia64__
|
||||
int fallback_elf_brand = ELFOSABI_FREEBSD;
|
||||
#else
|
||||
int fallback_elf_brand = -1;
|
||||
#endif
|
||||
SYSCTL_INT(_kern, OID_AUTO, fallback_elf_brand, CTLFLAG_RW,
|
||||
&fallback_elf_brand, -1,
|
||||
"ELF brand of last resort");
|
||||
|
@ -229,7 +229,7 @@ do_aout_hdr(struct imgact_gzip * gz)
|
||||
/*
|
||||
* Destroy old process VM and create a new one (with a new stack)
|
||||
*/
|
||||
exec_new_vmspace(gz->ip);
|
||||
exec_new_vmspace(gz->ip, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, USRSTACK);
|
||||
|
||||
vmspace = gz->ip->proc->p_vmspace;
|
||||
|
||||
|
@ -252,6 +252,9 @@ set_boot_verbose(void *data __unused)
|
||||
}
|
||||
SYSINIT(boot_verbose, SI_SUB_TUNABLES, SI_ORDER_ANY, set_boot_verbose, NULL)
|
||||
|
||||
static struct sysentvec null_sysvec;
|
||||
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
****
|
||||
@ -317,11 +320,7 @@ proc0_init(void *dummy __unused)
|
||||
session0.s_count = 1;
|
||||
session0.s_leader = p;
|
||||
|
||||
#ifdef __ELF__
|
||||
p->p_sysent = &elf_freebsd_sysvec;
|
||||
#else
|
||||
p->p_sysent = &aout_sysvec;
|
||||
#endif
|
||||
p->p_sysent = &null_sysvec;
|
||||
|
||||
/*
|
||||
* proc_linkup was already done in init_i386() or alphainit() etc.
|
||||
|
@ -284,7 +284,10 @@ execve(td, uap)
|
||||
/*
|
||||
* Copy out strings (args and env) and initialize stack base
|
||||
*/
|
||||
stack_base = exec_copyout_strings(imgp);
|
||||
if (p->p_sysent->sv_copyout_strings)
|
||||
stack_base = (*p->p_sysent->sv_copyout_strings)(imgp);
|
||||
else
|
||||
stack_base = exec_copyout_strings(imgp);
|
||||
|
||||
/*
|
||||
* If custom stack fixup routine present for this process
|
||||
@ -471,8 +474,12 @@ execve(td, uap)
|
||||
p->p_args = NULL;
|
||||
|
||||
/* Set values passed into the program in registers. */
|
||||
setregs(td, imgp->entry_addr, (u_long)(uintptr_t)stack_base,
|
||||
imgp->ps_strings);
|
||||
if (p->p_sysent->sv_setregs)
|
||||
(*p->p_sysent->sv_setregs)(td, imgp->entry_addr,
|
||||
(u_long)(uintptr_t)stack_base, imgp->ps_strings);
|
||||
else
|
||||
setregs(td, imgp->entry_addr, (u_long)(uintptr_t)stack_base,
|
||||
imgp->ps_strings);
|
||||
|
||||
/* Cache arguments if they fit inside our allowance */
|
||||
if (ps_arg_cache_limit >= i + sizeof(struct pargs)) {
|
||||
@ -628,17 +635,19 @@ exec_unmap_first_page(imgp)
|
||||
* automatically in trap.c.
|
||||
*/
|
||||
int
|
||||
exec_new_vmspace(imgp)
|
||||
exec_new_vmspace(imgp, minuser, maxuser, stack_addr)
|
||||
struct image_params *imgp;
|
||||
vm_offset_t minuser, maxuser, stack_addr;
|
||||
{
|
||||
int error;
|
||||
struct execlist *ep;
|
||||
struct proc *p = imgp->proc;
|
||||
struct vmspace *vmspace = p->p_vmspace;
|
||||
vm_offset_t stack_addr = USRSTACK - maxssiz;
|
||||
|
||||
GIANT_REQUIRED;
|
||||
|
||||
stack_addr = stack_addr - maxssiz;
|
||||
|
||||
imgp->vmspace_destroyed = 1;
|
||||
|
||||
/*
|
||||
@ -652,13 +661,15 @@ exec_new_vmspace(imgp)
|
||||
* otherwise, create a new VM space so that other threads are
|
||||
* not disrupted
|
||||
*/
|
||||
if (vmspace->vm_refcnt == 1) {
|
||||
if (vmspace->vm_refcnt == 1
|
||||
&& vm_map_min(&vmspace->vm_map) == minuser
|
||||
&& vm_map_max(&vmspace->vm_map) == maxuser) {
|
||||
if (vmspace->vm_shm)
|
||||
shmexit(p);
|
||||
pmap_remove_pages(vmspace_pmap(vmspace), 0, VM_MAXUSER_ADDRESS);
|
||||
vm_map_remove(&vmspace->vm_map, 0, VM_MAXUSER_ADDRESS);
|
||||
pmap_remove_pages(vmspace_pmap(vmspace), minuser, maxuser);
|
||||
vm_map_remove(&vmspace->vm_map, minuser, maxuser);
|
||||
} else {
|
||||
vmspace_exec(p);
|
||||
vmspace_exec(p, minuser, maxuser);
|
||||
vmspace = p->p_vmspace;
|
||||
}
|
||||
|
||||
|
@ -32,9 +32,47 @@
|
||||
#include <sys/proc.h>
|
||||
#include <sys/namei.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/linker.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
struct sysentvec elf32_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf32_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF32",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf32_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_PPC,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf32_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf32_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
/* Process one elf relocation with addend. */
|
||||
int
|
||||
@ -76,7 +114,7 @@ elf_reloc(linker_file_t lf, const void *data, int type)
|
||||
addr = elf_lookup(lf, symidx, 1);
|
||||
if (addr == 0)
|
||||
return -1;
|
||||
addr += addend;
|
||||
addr += addend;
|
||||
if (*where != addr)
|
||||
*where = addr;
|
||||
break;
|
||||
|
@ -40,12 +40,52 @@
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/linker.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <machine/elf.h>
|
||||
#include <machine/md_var.h>
|
||||
|
||||
#include "linker_if.h"
|
||||
|
||||
struct sysentvec elf64_freebsd_sysvec = {
|
||||
SYS_MAXSYSCALL,
|
||||
sysent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
elf64_freebsd_fixup,
|
||||
sendsig,
|
||||
sigcode,
|
||||
&szsigcode,
|
||||
0,
|
||||
"FreeBSD ELF64",
|
||||
__elfN(coredump),
|
||||
NULL,
|
||||
MINSIGSTKSZ
|
||||
};
|
||||
|
||||
static Elf64_Brandinfo freebsd_brand_info = {
|
||||
ELFOSABI_FREEBSD,
|
||||
EM_SPARCV9,
|
||||
"FreeBSD",
|
||||
"",
|
||||
"/usr/libexec/ld-elf.so.1",
|
||||
&elf64_freebsd_sysvec
|
||||
};
|
||||
|
||||
SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY,
|
||||
(sysinit_cfunc_t) elf64_insert_brand_entry,
|
||||
&freebsd_brand_info);
|
||||
|
||||
/*
|
||||
* The following table holds for each relocation type:
|
||||
* - the width in bits of the memory location the relocation
|
||||
|
@ -50,6 +50,7 @@
|
||||
#error "Unknown byte order"
|
||||
#endif
|
||||
|
||||
#define __elfN(x) __CONCAT(__CONCAT(__CONCAT(elf,__ELF_WORD_SIZE),_),x)
|
||||
#define __ElfN(x) __CONCAT(__CONCAT(__CONCAT(Elf,__ELF_WORD_SIZE),_),x)
|
||||
#define __ELFN(x) __CONCAT(__CONCAT(__CONCAT(ELF,__ELF_WORD_SIZE),_),x)
|
||||
#define __ElfType(x) typedef __ElfN(x) __CONCAT(Elf_,x)
|
||||
|
@ -67,7 +67,8 @@ struct image_params {
|
||||
#ifdef _KERNEL
|
||||
int exec_check_permissions(struct image_params *);
|
||||
int exec_extract_strings(struct image_params *);
|
||||
int exec_new_vmspace(struct image_params *);
|
||||
int exec_new_vmspace(struct image_params *, vm_offset_t, vm_offset_t,
|
||||
vm_offset_t);
|
||||
int exec_shell_imgact(struct image_params *);
|
||||
#endif
|
||||
|
||||
|
@ -37,6 +37,8 @@
|
||||
|
||||
#define AUXARGS_ENTRY(pos, id, val) {suword(pos++, id); suword(pos++, val);}
|
||||
|
||||
struct thread;
|
||||
|
||||
#if ELF_TARG_CLASS == ELFCLASS32
|
||||
|
||||
/*
|
||||
@ -57,6 +59,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
int brand;
|
||||
int machine;
|
||||
const char *compat_3_brand; /* pre Binutils 2.10 method (FBSD 3) */
|
||||
const char *emul_path;
|
||||
const char *interp_path;
|
||||
@ -65,9 +68,11 @@ typedef struct {
|
||||
|
||||
#define MAX_BRANDS 8
|
||||
|
||||
int elf_brand_inuse(Elf32_Brandinfo *entry);
|
||||
int elf_insert_brand_entry(Elf32_Brandinfo *entry);
|
||||
int elf_remove_brand_entry(Elf32_Brandinfo *entry);
|
||||
int elf32_brand_inuse(Elf32_Brandinfo *entry);
|
||||
int elf32_insert_brand_entry(Elf32_Brandinfo *entry);
|
||||
int elf32_remove_brand_entry(Elf32_Brandinfo *entry);
|
||||
int elf32_freebsd_fixup(register_t **, struct image_params *);
|
||||
int elf32_coredump(struct thread *, struct vnode *, off_t);
|
||||
|
||||
#else /* !(ELF_TARG_CLASS == ELFCLASS32) */
|
||||
|
||||
@ -89,6 +94,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
int brand;
|
||||
int machine;
|
||||
const char *compat_3_brand; /* pre Binutils 2.10 method (FBSD 3) */
|
||||
const char *emul_path;
|
||||
const char *interp_path;
|
||||
@ -97,16 +103,14 @@ typedef struct {
|
||||
|
||||
#define MAX_BRANDS 8
|
||||
|
||||
int elf_brand_inuse(Elf64_Brandinfo *entry);
|
||||
int elf_insert_brand_entry(Elf64_Brandinfo *entry);
|
||||
int elf_remove_brand_entry(Elf64_Brandinfo *entry);
|
||||
int elf64_brand_inuse(Elf64_Brandinfo *entry);
|
||||
int elf64_insert_brand_entry(Elf64_Brandinfo *entry);
|
||||
int elf64_remove_brand_entry(Elf64_Brandinfo *entry);
|
||||
int elf64_freebsd_fixup(register_t **, struct image_params *);
|
||||
int elf64_coredump(struct thread *, struct vnode *, off_t);
|
||||
|
||||
#endif /* ELF_TARG_CLASS == ELFCLASS32 */
|
||||
|
||||
struct thread;
|
||||
|
||||
int elf_coredump(struct thread *, struct vnode *, off_t);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* !_SYS_IMGACT_ELF_H_ */
|
||||
|
@ -79,6 +79,11 @@ struct sysentvec {
|
||||
/* function to dump core, or NULL */
|
||||
int (*sv_imgact_try)(struct image_params *);
|
||||
int sv_minsigstksz; /* minimum signal stack size */
|
||||
int sv_pagesize; /* pagesize override */
|
||||
vm_offset_t sv_maxuser; /* VM_MAXUSER_ADDRESS override */
|
||||
vm_offset_t sv_usrstack; /* USRSTACK override */
|
||||
register_t *(*sv_copyout_strings)(struct image_params *);
|
||||
void (*sv_setregs)(struct thread *, u_long, u_long, u_long);
|
||||
};
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
@ -85,7 +85,7 @@ vm_offset_t vm_page_alloc_contig(vm_offset_t, vm_offset_t, vm_offset_t, vm_offse
|
||||
void vm_set_page_size(void);
|
||||
struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t);
|
||||
struct vmspace *vmspace_fork(struct vmspace *);
|
||||
void vmspace_exec(struct proc *);
|
||||
void vmspace_exec(struct proc *, vm_offset_t, vm_offset_t);
|
||||
void vmspace_unshare(struct proc *);
|
||||
void vmspace_free(struct vmspace *);
|
||||
void vmspace_exitfree(struct proc *);
|
||||
|
@ -2586,14 +2586,13 @@ vm_map_growstack (struct proc *p, vm_offset_t addr)
|
||||
* mapped to it, then create a new one. The new vmspace is null.
|
||||
*/
|
||||
void
|
||||
vmspace_exec(struct proc *p)
|
||||
vmspace_exec(struct proc *p, vm_offset_t minuser, vm_offset_t maxuser)
|
||||
{
|
||||
struct vmspace *oldvmspace = p->p_vmspace;
|
||||
struct vmspace *newvmspace;
|
||||
vm_map_t map = &p->p_vmspace->vm_map;
|
||||
|
||||
GIANT_REQUIRED;
|
||||
newvmspace = vmspace_alloc(map->min_offset, map->max_offset);
|
||||
newvmspace = vmspace_alloc(minuser, maxuser);
|
||||
bcopy(&oldvmspace->vm_startcopy, &newvmspace->vm_startcopy,
|
||||
(caddr_t) (newvmspace + 1) - (caddr_t) &newvmspace->vm_startcopy);
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user