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:
Peter Wemm 2002-07-20 02:56:12 +00:00
parent 382f95d332
commit 3ebc124838
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=100384
50 changed files with 7923 additions and 2741 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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.

View File

@ -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
View 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

File diff suppressed because it is too large Load Diff

View 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;
}

View 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)

View File

@ -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); }

View 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_ */

File diff suppressed because it is too large Load Diff

View 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)

View File

@ -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); }

View 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;
}

View 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)

View File

@ -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? */

View File

@ -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;
/*

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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++) {

View File

@ -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;
/*

View File

@ -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
View 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

File diff suppressed because it is too large Load Diff

365
sys/ia64/ia32/ia32_signal.c Normal file
View 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
View 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
View 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

View File

@ -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_ */

View File

@ -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); }

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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
View 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
View 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
View 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");

View File

@ -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;

View File

@ -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.

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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_ */

View File

@ -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

View File

@ -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 *);

View File

@ -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);
/*