From 2acd24a8cc53060164937ce69fdbf1e6e6ffc625 Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Wed, 7 Apr 2010 02:24:41 +0000 Subject: [PATCH] MFC r205014,205015: Provide groundwork for 32-bit binary compatibility on non-x86 platforms, for upcoming 64-bit PowerPC and MIPS support. This renames the COMPAT_IA32 option to COMPAT_FREEBSD32, removes some IA32-specific code from MI parts of the kernel and enhances the freebsd32 compatibility code to support big-endian platforms. This MFC is required for MFCs of later changes to the freebsd32 compatibility from HEAD. Requested by: kib git-svn-id: svn://svn.freebsd.org/base/stable/8@206336 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- UPDATING | 6 + sys/amd64/amd64/db_trace.c | 2 +- sys/amd64/amd64/exception.S | 2 +- sys/amd64/amd64/vm_machdep.c | 4 +- sys/amd64/conf/GENERIC | 2 +- sys/amd64/conf/NOTES | 4 +- sys/amd64/conf/XENHVM | 2 +- sys/amd64/include/elf.h | 1 + sys/amd64/include/reg.h | 9 ++ sys/amd64/linux32/linux32_sysvec.c | 4 +- sys/compat/freebsd32/freebsd32.h | 24 ++++ sys/compat/freebsd32/freebsd32_misc.c | 185 ++++++++++++++++++++++---- sys/compat/freebsd32/freebsd32_util.h | 2 + sys/compat/freebsd32/syscalls.master | 92 ++++++++----- sys/compat/ia32/ia32_reg.h | 23 ---- sys/compat/ia32/ia32_sysvec.c | 124 +---------------- sys/conf/files.amd64 | 24 ++-- sys/conf/files.ia64 | 20 +-- sys/conf/options.amd64 | 2 +- sys/conf/options.ia64 | 2 +- sys/fs/procfs/procfs_dbregs.c | 7 +- sys/fs/procfs/procfs_fpregs.c | 7 +- sys/fs/procfs/procfs_ioctl.c | 6 +- sys/fs/procfs/procfs_map.c | 8 +- sys/fs/procfs/procfs_regs.c | 7 +- sys/ia64/conf/GENERIC | 1 + sys/ia64/conf/NOTES | 4 +- sys/ia64/ia64/exception.S | 2 +- sys/ia64/ia64/genassym.c | 4 +- sys/ia64/ia64/machdep.c | 6 +- sys/ia64/include/elf.h | 1 + sys/ia64/include/reg.h | 9 ++ sys/kern/imgact_elf.c | 15 +-- sys/kern/kern_jail.c | 8 +- sys/kern/kern_module.c | 2 +- sys/kern/kern_thr.c | 2 +- sys/kern/kern_umtx.c | 6 +- sys/kern/sys_generic.c | 34 ++++- sys/kern/sys_process.c | 30 ++--- sys/kern/uipc_socket.c | 6 +- sys/kern/vfs_aio.c | 2 +- sys/modules/linux/Makefile | 2 +- sys/modules/procfs/Makefile | 2 +- sys/sys/ptrace.h | 3 +- 44 files changed, 399 insertions(+), 309 deletions(-) diff --git a/UPDATING b/UPDATING index 288925611..9ba6b287c 100644 --- a/UPDATING +++ b/UPDATING @@ -15,6 +15,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 8.x IS SLOW ON IA64 OR SUN4V: debugging tools present in HEAD were left in place because sun4v support still needs work to become production ready. +20100406: + The kernel option COMPAT_IA32 has been replaced with COMPAT_FREEBSD32 + to allow 32-bit compatibility on non-x86 platforms. All kernel + configurations on amd64 and ia64 platforms using these options must + be modified accordingly. + 20100125: Introduce the kernel thread "deadlock resolver" (which can be enabled via the DEADLKRES option, see NOTES for more details) and the diff --git a/sys/amd64/amd64/db_trace.c b/sys/amd64/amd64/db_trace.c index 73ffac53d..cba90f2f5 100644 --- a/sys/amd64/amd64/db_trace.c +++ b/sys/amd64/amd64/db_trace.c @@ -319,7 +319,7 @@ db_nextframe(struct amd64_frame **fp, db_addr_t *ip, struct thread *td) frame_type = INTERRUPT; else if (strcmp(name, "Xfast_syscall") == 0) frame_type = SYSCALL; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 else if (strcmp(name, "Xint0x80_syscall") == 0) frame_type = SYSCALL; #endif diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 3d1a20ee2..1799b7466 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -572,7 +572,7 @@ ENTRY(fork_trampoline) * included. */ -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 .data .p2align 4 .text diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index a99fdaaf6..d6906ac69 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -439,7 +439,7 @@ cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg, */ cpu_thread_clean(td); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (td->td_proc->p_sysent->sv_flags & SV_ILP32) { /* * Set the trap frame to point at the beginning of the uts @@ -490,7 +490,7 @@ cpu_set_user_tls(struct thread *td, void *tls_base) if ((u_int64_t)tls_base >= VM_MAXUSER_ADDRESS) return (EINVAL); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (td->td_proc->p_sysent->sv_flags & SV_ILP32) { td->td_pcb->pcb_gsbase = (register_t)tls_base; return (0); diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index e5a6955f1..e9f3c1707 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -54,7 +54,7 @@ options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) -options COMPAT_IA32 # Compatible with i386 binaries +options COMPAT_FREEBSD32 # Compatible with i386 binaries options COMPAT_FREEBSD4 # Compatible with FreeBSD4 options COMPAT_FREEBSD5 # Compatible with FreeBSD5 options COMPAT_FREEBSD6 # Compatible with FreeBSD6 diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES index 159f12e80..4b6debb34 100644 --- a/sys/amd64/conf/NOTES +++ b/sys/amd64/conf/NOTES @@ -445,7 +445,7 @@ options PMAP_SHPGPERPROC=201 #XXX these 32 bit binaries is added. # Enable 32-bit runtime support for FreeBSD/i386 binaries. -options COMPAT_IA32 +options COMPAT_FREEBSD32 # Enable iBCS2 runtime support for SCO and ISC binaries #XXX#options IBCS2 @@ -456,7 +456,7 @@ options COMPAT_IA32 # Enable Linux ABI emulation #XXX#options COMPAT_LINUX -# Enable 32-bit Linux ABI emulation (requires COMPAT_43 and COMPAT_IA32) +# Enable 32-bit Linux ABI emulation (requires COMPAT_43 and COMPAT_FREEBSD32) options COMPAT_LINUX32 # Enable the linux-like proc filesystem support (requires COMPAT_LINUX32 diff --git a/sys/amd64/conf/XENHVM b/sys/amd64/conf/XENHVM index f875f5af7..377276e39 100644 --- a/sys/amd64/conf/XENHVM +++ b/sys/amd64/conf/XENHVM @@ -55,7 +55,7 @@ options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) -options COMPAT_IA32 # Compatible with i386 binaries +options COMPAT_FREEBSD32 # Compatible with i386 binaries options COMPAT_FREEBSD4 # Compatible with FreeBSD4 options COMPAT_FREEBSD5 # Compatible with FreeBSD5 options COMPAT_FREEBSD6 # Compatible with FreeBSD6 diff --git a/sys/amd64/include/elf.h b/sys/amd64/include/elf.h index 88f439805..678f5d3ba 100644 --- a/sys/amd64/include/elf.h +++ b/sys/amd64/include/elf.h @@ -42,6 +42,7 @@ #include #define ELF_ARCH EM_X86_64 +#define ELF_ARCH32 EM_386 #define ELF_MACHINE_OK(x) ((x) == EM_X86_64) diff --git a/sys/amd64/include/reg.h b/sys/amd64/include/reg.h index 89211a326..4a8391818 100644 --- a/sys/amd64/include/reg.h +++ b/sys/amd64/include/reg.h @@ -37,6 +37,10 @@ #ifndef _MACHINE_REG_H_ #define _MACHINE_REG_H_ +#if defined(_KERNEL) && !defined(_STANDALONE) +#include "opt_compat.h" +#endif + /* * Register set accessible via /proc/$pid/regs and PT_{SET,GET}REGS. */ @@ -116,6 +120,11 @@ struct dbreg { #define DBREG_DRX(d,x) ((d)->dr[(x)]) /* reference dr0 - dr15 by register number */ +#ifdef COMPAT_FREEBSD32 +#include +#include +#endif + #ifdef _KERNEL /* * XXX these interfaces are MI, so they should be declared in a MI place. diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c index 6e3e32622..d967ad701 100644 --- a/sys/amd64/linux32/linux32_sysvec.c +++ b/sys/amd64/linux32/linux32_sysvec.c @@ -34,8 +34,8 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" -#ifndef COMPAT_IA32 -#error "Unable to compile Linux-emulator due to missing COMPAT_IA32 option!" +#ifndef COMPAT_FREEBSD32 +#error "Unable to compile Linux-emulator due to missing COMPAT_FREEBSD32 option!" #endif #define __ELF_WORD_SIZE 32 diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 84e832c4e..058ac72fe 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -29,6 +29,9 @@ #ifndef _COMPAT_FREEBSD32_FREEBSD32_H_ #define _COMPAT_FREEBSD32_FREEBSD32_H_ +#include +#include + #define PTRIN(v) (void *)(uintptr_t) (v) #define PTROUT(v) (u_int32_t)(uintptr_t) (v) @@ -197,4 +200,25 @@ struct i386_ldt_args32 { uint32_t num; }; +/* + * Alternative layouts for + */ +struct prstatus32 { + int pr_version; + u_int pr_statussz; + u_int pr_gregsetsz; + u_int pr_fpregsetsz; + int pr_osreldate; + int pr_cursig; + pid_t pr_pid; + struct reg32 pr_reg; +}; + +struct prpsinfo32 { + int pr_version; + u_int pr_psinfosz; + char pr_fname[PRFNAMESZ+1]; + char pr_psargs[PRARGSZ+1]; +}; + #endif /* !_COMPAT_FREEBSD32_FREEBSD32_H_ */ diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 75b290b36..c20e5fbd2 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#define __ELF_WORD_SIZE 32 + #include #include #include @@ -44,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include /* Must come after sys/malloc.h */ +#include #include #include #include @@ -91,6 +94,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include @@ -115,6 +119,16 @@ CTASSERT(sizeof(struct sigaction32) == 24); static int freebsd32_kevent_copyout(void *arg, struct kevent *kevp, int count); static int freebsd32_kevent_copyin(void *arg, struct kevent *kevp, int count); +#if BYTE_ORDER == BIG_ENDIAN +#define PAIR32TO64(type, name) ((name ## 2) | ((type)(name ## 1) << 32)) +#define RETVAL_HI 0 +#define RETVAL_LO 1 +#else +#define PAIR32TO64(type, name) ((name ## 1) | ((type)(name ## 2) << 32)) +#define RETVAL_HI 1 +#define RETVAL_LO 0 +#endif + int freebsd32_wait4(struct thread *td, struct freebsd32_wait4_args *uap) { @@ -426,8 +440,7 @@ freebsd32_mmap(struct thread *td, struct freebsd32_mmap_args *uap) int prot = uap->prot; int flags = uap->flags; int fd = uap->fd; - off_t pos = (uap->poslo - | ((off_t)uap->poshi << 32)); + off_t pos = PAIR32TO64(off_t,uap->pos); #ifdef __ia64__ vm_size_t pageoff; int error; @@ -523,8 +536,8 @@ freebsd6_freebsd32_mmap(struct thread *td, struct freebsd6_freebsd32_mmap_args * ap.prot = uap->prot; ap.flags = uap->flags; ap.fd = uap->fd; - ap.poslo = uap->poslo; - ap.poshi = uap->poshi; + ap.pos1 = uap->pos1; + ap.pos2 = uap->pos2; return (freebsd32_mmap(td, &ap)); } @@ -586,7 +599,6 @@ freebsd32_select(struct thread *td, struct freebsd32_select_args *uap) } else tvp = NULL; /* - * XXX big-endian needs to convert the fd_sets too. * XXX Do pointers need PTRIN()? */ return (kern_select(td, uap->nd, uap->in, uap->ou, uap->ex, tvp, @@ -620,7 +632,6 @@ freebsd32_pselect(struct thread *td, struct freebsd32_pselect_args *uap) } else uset = NULL; /* - * XXX big-endian needs to convert the fd_sets too. * XXX Do pointers need PTRIN()? */ error = kern_pselect(td, uap->nd, uap->in, uap->ou, uap->ex, tvp, @@ -843,7 +854,7 @@ freebsd32_preadv(struct thread *td, struct freebsd32_preadv_args *uap) error = freebsd32_copyinuio(uap->iovp, uap->iovcnt, &auio); if (error) return (error); - error = kern_preadv(td, uap->fd, auio, uap->offset); + error = kern_preadv(td, uap->fd, auio, PAIR32TO64(off_t,uap->offset)); free(auio, M_IOV); return (error); } @@ -857,7 +868,7 @@ freebsd32_pwritev(struct thread *td, struct freebsd32_pwritev_args *uap) error = freebsd32_copyinuio(uap->iovp, uap->iovcnt, &auio); if (error) return (error); - error = kern_pwritev(td, uap->fd, auio, uap->offset); + error = kern_pwritev(td, uap->fd, auio, PAIR32TO64(off_t,uap->offset)); free(auio, M_IOV); return (error); } @@ -1982,7 +1993,7 @@ freebsd32_pread(struct thread *td, struct freebsd32_pread_args *uap) ap.fd = uap->fd; ap.buf = uap->buf; ap.nbyte = uap->nbyte; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); return (pread(td, &ap)); } @@ -1994,7 +2005,7 @@ freebsd32_pwrite(struct thread *td, struct freebsd32_pwrite_args *uap) ap.fd = uap->fd; ap.buf = uap->buf; ap.nbyte = uap->nbyte; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); return (pwrite(td, &ap)); } @@ -2006,13 +2017,13 @@ freebsd32_lseek(struct thread *td, struct freebsd32_lseek_args *uap) off_t pos; ap.fd = uap->fd; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); ap.whence = uap->whence; error = lseek(td, &ap); /* Expand the quad return into two parts for eax and edx */ pos = *(off_t *)(td->td_retval); - td->td_retval[0] = pos & 0xffffffff; /* %eax */ - td->td_retval[1] = pos >> 32; /* %edx */ + td->td_retval[RETVAL_LO] = pos & 0xffffffff; /* %eax */ + td->td_retval[RETVAL_HI] = pos >> 32; /* %edx */ return error; } @@ -2022,7 +2033,7 @@ freebsd32_truncate(struct thread *td, struct freebsd32_truncate_args *uap) struct truncate_args ap; ap.path = uap->path; - ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + ap.length = PAIR32TO64(off_t,uap->length); return (truncate(td, &ap)); } @@ -2032,7 +2043,7 @@ freebsd32_ftruncate(struct thread *td, struct freebsd32_ftruncate_args *uap) struct ftruncate_args ap; ap.fd = uap->fd; - ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + ap.length = PAIR32TO64(off_t,uap->length); return (ftruncate(td, &ap)); } @@ -2064,7 +2075,7 @@ freebsd6_freebsd32_pread(struct thread *td, struct freebsd6_freebsd32_pread_args ap.fd = uap->fd; ap.buf = uap->buf; ap.nbyte = uap->nbyte; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); return (pread(td, &ap)); } @@ -2076,7 +2087,7 @@ freebsd6_freebsd32_pwrite(struct thread *td, struct freebsd6_freebsd32_pwrite_ar ap.fd = uap->fd; ap.buf = uap->buf; ap.nbyte = uap->nbyte; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); return (pwrite(td, &ap)); } @@ -2088,13 +2099,13 @@ freebsd6_freebsd32_lseek(struct thread *td, struct freebsd6_freebsd32_lseek_args off_t pos; ap.fd = uap->fd; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); ap.whence = uap->whence; error = lseek(td, &ap); /* Expand the quad return into two parts for eax and edx */ pos = *(off_t *)(td->td_retval); - td->td_retval[0] = pos & 0xffffffff; /* %eax */ - td->td_retval[1] = pos >> 32; /* %edx */ + td->td_retval[RETVAL_LO] = pos & 0xffffffff; /* %eax */ + td->td_retval[RETVAL_HI] = pos >> 32; /* %edx */ return error; } @@ -2104,7 +2115,7 @@ freebsd6_freebsd32_truncate(struct thread *td, struct freebsd6_freebsd32_truncat struct truncate_args ap; ap.path = uap->path; - ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + ap.length = PAIR32TO64(off_t,uap->length); return (truncate(td, &ap)); } @@ -2114,7 +2125,7 @@ freebsd6_freebsd32_ftruncate(struct thread *td, struct freebsd6_freebsd32_ftrunc struct ftruncate_args ap; ap.fd = uap->fd; - ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + ap.length = PAIR32TO64(off_t,uap->length); return (ftruncate(td, &ap)); } #endif /* COMPAT_FREEBSD6 */ @@ -2141,7 +2152,7 @@ freebsd32_do_sendfile(struct thread *td, ap.fd = uap->fd; ap.s = uap->s; - ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.offset = PAIR32TO64(off_t,uap->offset); ap.nbytes = uap->nbytes; ap.hdtr = (struct sf_hdtr *)uap->hdtr; /* XXX not used */ ap.sbytes = uap->sbytes; @@ -2879,7 +2890,7 @@ freebsd32_cpuset_setid(struct thread *td, struct cpuset_setid_args ap; ap.which = uap->which; - ap.id = (uap->idlo | ((id_t)uap->idhi << 32)); + ap.id = PAIR32TO64(id_t,uap->id); ap.setid = uap->setid; return (cpuset_setid(td, &ap)); @@ -2893,7 +2904,7 @@ freebsd32_cpuset_getid(struct thread *td, ap.level = uap->level; ap.which = uap->which; - ap.id = (uap->idlo | ((id_t)uap->idhi << 32)); + ap.id = PAIR32TO64(id_t,uap->id); ap.setid = uap->setid; return (cpuset_getid(td, &ap)); @@ -2907,7 +2918,7 @@ freebsd32_cpuset_getaffinity(struct thread *td, ap.level = uap->level; ap.which = uap->which; - ap.id = (uap->idlo | ((id_t)uap->idhi << 32)); + ap.id = PAIR32TO64(id_t,uap->id); ap.cpusetsize = uap->cpusetsize; ap.mask = uap->mask; @@ -2922,7 +2933,7 @@ freebsd32_cpuset_setaffinity(struct thread *td, ap.level = uap->level; ap.which = uap->which; - ap.id = (uap->idlo | ((id_t)uap->idhi << 32)); + ap.id = PAIR32TO64(id_t,uap->id); ap.cpusetsize = uap->cpusetsize; ap.mask = uap->mask; @@ -3072,3 +3083,123 @@ syscall32_module_handler(struct module *mod, int what, void *arg) return (error); } } + +register_t * +freebsd32_copyout_strings(struct image_params *imgp) +{ + int argc, envc; + u_int32_t *vectp; + char *stringp, *destp; + u_int32_t *stack_base; + struct freebsd32_ps_strings *arginfo; + size_t execpath_len; + int szsigcode; + + /* + * Calculate string base and vector table pointers. + * Also deal with signal trampoline code for this exec type. + */ + if (imgp->execpath != NULL && imgp->auxargs != NULL) + execpath_len = strlen(imgp->execpath) + 1; + else + execpath_len = 0; + arginfo = (struct freebsd32_ps_strings *)FREEBSD32_PS_STRINGS; + szsigcode = *(imgp->proc->p_sysent->sv_szsigcode); + destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE - + roundup(execpath_len, sizeof(char *)) - + roundup((ARG_MAX - imgp->args->stringspace), sizeof(char *)); + + /* + * install sigcode + */ + if (szsigcode) + copyout(imgp->proc->p_sysent->sv_sigcode, + ((caddr_t)arginfo - szsigcode), szsigcode); + + /* + * Copy the image path for the rtld. + */ + if (execpath_len != 0) { + imgp->execpathp = (uintptr_t)arginfo - szsigcode - execpath_len; + copyout(imgp->execpath, (void *)imgp->execpathp, + execpath_len); + } + + /* + * 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->args->argc + + imgp->args->envc + 2 + imgp->auxarg_size + execpath_len) * + 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->args->argc + imgp->args->envc + 2) * sizeof(u_int32_t)); + + /* + * vectp also becomes our initial stack base + */ + stack_base = vectp; + + stringp = imgp->args->begin_argv; + argc = imgp->args->argc; + envc = imgp->args->envc; + /* + * Copy out strings - arguments and environment. + */ + copyout(stringp, destp, ARG_MAX - imgp->args->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); +} + diff --git a/sys/compat/freebsd32/freebsd32_util.h b/sys/compat/freebsd32/freebsd32_util.h index 6536b2ca1..5e5942b09 100644 --- a/sys/compat/freebsd32/freebsd32_util.h +++ b/sys/compat/freebsd32/freebsd32_util.h @@ -83,4 +83,6 @@ int syscall32_register(int *offset, struct sysent *new_sysent, int syscall32_deregister(int *offset, struct sysent *old_sysent); int syscall32_module_handler(struct module *mod, int what, void *arg); +register_t *freebsd32_copyout_strings(struct image_params *imgp); + #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */ diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master index 485f7a6d8..f6d9a6b6f 100644 --- a/sys/compat/freebsd32/syscalls.master +++ b/sys/compat/freebsd32/syscalls.master @@ -53,6 +53,10 @@ #include #include +#if !defined(PAD64_REQUIRED) && defined(__powerpc__) +#define PAD64_REQUIRED +#endif + ; Reserved/unimplemented system calls in the range 0-150 inclusive ; are reserved for use in future Berkeley releases. ; Additional system calls implemented in vendor and other @@ -195,7 +199,6 @@ 93 AUE_SELECT STD { int freebsd32_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 AUE_NULL UNIMPL setdopt 95 AUE_FSYNC NOPROTO { int fsync(int fd); } 96 AUE_SETPRIORITY NOPROTO { int setpriority(int which, int who, \ @@ -316,12 +319,10 @@ 172 AUE_NULL UNIMPL nosys 173 AUE_PREAD COMPAT6 { ssize_t freebsd32_pread(int fd, void *buf, \ size_t nbyte, int pad, \ - u_int32_t offsetlo, u_int32_t offsethi); } -; XXX note - bigendian is different + u_int32_t offset1, u_int32_t offset2); } 174 AUE_PWRITE COMPAT6 { ssize_t freebsd32_pwrite(int fd, \ const void *buf, size_t nbyte, int pad, \ - u_int32_t offsetlo, u_int32_t offsethi); } -; XXX note - bigendian is different + u_int32_t offset1, u_int32_t offset2); } 175 AUE_NULL UNIMPL nosys 176 AUE_NTP_ADJTIME NOPROTO { int ntp_adjtime(struct timex *tp); } 177 AUE_NULL UNIMPL sfork (BSD/OS 2.x) @@ -356,21 +357,17 @@ char *buf, u_int count, int32_t *basep); } 197 AUE_MMAP COMPAT6 { caddr_t freebsd32_mmap(caddr_t addr, \ size_t len, int prot, int flags, int fd, \ - int pad, u_int32_t poslo, \ - u_int32_t poshi); } + int pad, u_int32_t pos1, u_int32_t pos2); } 198 AUE_NULL NOPROTO { int nosys(void); } __syscall \ __syscall_args int -; XXX note - bigendian is different 199 AUE_LSEEK COMPAT6 { off_t freebsd32_lseek(int fd, int pad, \ - u_int32_t offsetlo, u_int32_t offsethi, \ + u_int32_t offset1, u_int32_t offset2, \ int whence); } -; XXX note - bigendian is different 200 AUE_TRUNCATE COMPAT6 { int freebsd32_truncate(char *path, \ - int pad, u_int32_t lengthlo, \ - u_int32_t lengthhi); } -; XXX note - bigendian is different + int pad, u_int32_t length1, \ + u_int32_t length2); } 201 AUE_FTRUNCATE COMPAT6 { int freebsd32_ftruncate(int fd, int pad, \ - u_int32_t lengthlo, u_int32_t lengthhi); } + u_int32_t length1, u_int32_t length2); } 202 AUE_SYSCTL STD { int freebsd32_sysctl(int *name, \ u_int namelen, void *old, \ u_int32_t *oldlenp, void *new, \ @@ -403,7 +400,7 @@ ; ; The following were introduced with NetBSD/4.4Lite-2 -; They are initialized by thier respective modules/sysinits +; They are initialized by their respective modules/sysinits ; XXX PROBLEM!! 220 AUE_SEMCTL COMPAT7 { int freebsd32_semctl(int semid, int semnum, \ int cmd, union semun32 *arg); } @@ -504,12 +501,12 @@ ; 289 and 290 from NetBSD (OpenBSD: 267 and 268) 289 AUE_PREADV STD { ssize_t freebsd32_preadv(int fd, \ struct iovec32 *iovp, \ - u_int iovcnt, off_t offset); } -; XXX note - bigendian is different + u_int iovcnt, \ + u_int32_t offset1, u_int32_t offset2); } 290 AUE_PWRITEV STD { ssize_t freebsd32_pwritev(int fd, \ struct iovec32 *iovp, \ - u_int iovcnt, off_t offset); } -; XXX note - bigendian is different + u_int iovcnt, \ + u_int32_t offset1, u_int32_t offset2); } 291 AUE_NULL UNIMPL nosys 292 AUE_NULL UNIMPL nosys 293 AUE_NULL UNIMPL nosys @@ -582,9 +579,8 @@ 334 AUE_NULL NOPROTO { int sched_rr_get_interval (pid_t pid, \ struct timespec *interval); } 335 AUE_NULL NOPROTO { int utrace(const void *addr, size_t len); } -; XXX note - bigendian is different 336 AUE_SENDFILE COMPAT4 { int freebsd32_sendfile(int fd, int s, \ - u_int32_t offsetlo, u_int32_t offsethi, \ + u_int32_t offset1, u_int32_t offset2, \ size_t nbytes, struct sf_hdtr32 *hdtr, \ off_t *sbytes, int flags); } 337 AUE_NULL NOPROTO { int kldsym(int fileid, int cmd, \ @@ -687,7 +683,7 @@ 392 AUE_NULL NOPROTO { int uuidgen(struct uuid *store, \ int count); } 393 AUE_SENDFILE STD { int freebsd32_sendfile(int fd, int s, \ - u_int32_t offsetlo, u_int32_t offsethi, \ + u_int32_t offset1, u_int32_t offset2, \ size_t nbytes, struct sf_hdtr32 *hdtr, \ off_t *sbytes, int flags); } 394 AUE_NULL UNIMPL mac_syscall @@ -821,42 +817,74 @@ 474 AUE_NULL NOPROTO { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ struct sockaddr * from, __socklen_t *fromlenaddr, \ struct sctp_sndrcvinfo *sinfo, int *msg_flags); } +#ifdef PAD64_REQUIRED 475 AUE_PREAD STD { ssize_t freebsd32_pread(int fd, \ void *buf,size_t nbyte, \ - u_int32_t offsetlo, u_int32_t offsethi); } + int pad, \ + u_int32_t offset1, u_int32_t offset2); } 476 AUE_PWRITE STD { ssize_t freebsd32_pwrite(int fd, \ const void *buf, size_t nbyte, \ - u_int32_t offsetlo, u_int32_t offsethi); } + int pad, \ + u_int32_t offset1, u_int32_t offset2); } 477 AUE_MMAP STD { caddr_t freebsd32_mmap(caddr_t addr, \ size_t len, int prot, int flags, int fd, \ - u_int32_t poslo, u_int32_t poshi); } + int pad, \ + u_int32_t pos1, u_int32_t pos2); } 478 AUE_LSEEK STD { off_t freebsd32_lseek(int fd, \ - u_int32_t offsetlo, u_int32_t offsethi, \ + int pad, \ + u_int32_t offset1, u_int32_t offset2, \ int whence); } 479 AUE_TRUNCATE STD { int freebsd32_truncate(char *path, \ - u_int32_t lengthlo, u_int32_t lengthhi); } + int pad, \ + u_int32_t length1, u_int32_t length2); } 480 AUE_FTRUNCATE STD { int freebsd32_ftruncate(int fd, \ - u_int32_t lengthlo, u_int32_t lengthhi); } + int pad, \ + u_int32_t length1, u_int32_t length2); } +#else +475 AUE_PREAD STD { ssize_t freebsd32_pread(int fd, \ + void *buf,size_t nbyte, \ + u_int32_t offset1, u_int32_t offset2); } +476 AUE_PWRITE STD { ssize_t freebsd32_pwrite(int fd, \ + const void *buf, size_t nbyte, \ + u_int32_t offset1, u_int32_t offset2); } +477 AUE_MMAP STD { caddr_t freebsd32_mmap(caddr_t addr, \ + size_t len, int prot, int flags, int fd, \ + u_int32_t pos1, u_int32_t pos2); } +478 AUE_LSEEK STD { off_t freebsd32_lseek(int fd, \ + u_int32_t offset1, u_int32_t offset2, \ + int whence); } +479 AUE_TRUNCATE STD { int freebsd32_truncate(char *path, \ + u_int32_t length1, u_int32_t length2); } +480 AUE_FTRUNCATE STD { int freebsd32_ftruncate(int fd, \ + u_int32_t length1, u_int32_t length2); } +#endif 481 AUE_KILL NOPROTO { int thr_kill2(pid_t pid, long id, int sig); } 482 AUE_SHMOPEN NOPROTO { int shm_open(const char *path, int flags, \ mode_t mode); } 483 AUE_SHMUNLINK NOPROTO { int shm_unlink(const char *path); } 484 AUE_NULL NOPROTO { int cpuset(cpusetid_t *setid); } +#ifdef PAD64_REQUIRED +485 AUE_NULL STD { int freebsd32_cpuset_setid(cpuwhich_t which, \ + int pad, \ + u_int32_t id1, u_int32_t id2, \ + cpusetid_t setid); } +#else 485 AUE_NULL STD { int freebsd32_cpuset_setid(cpuwhich_t which, \ - uint32_t idlo, uint32_t idhi, \ + u_int32_t id1, u_int32_t id2, \ cpusetid_t setid); } +#endif 486 AUE_NULL STD { int freebsd32_cpuset_getid(cpulevel_t level, \ cpuwhich_t which, \ - uint32_t idlo, uint32_t idhi, \ + u_int32_t id1, u_int32_t id2, \ cpusetid_t *setid); } 487 AUE_NULL STD { int freebsd32_cpuset_getaffinity( \ cpulevel_t level, cpuwhich_t which, \ - uint32_t idlo, uint32_t idhi, \ + u_int32_t id1, u_int32_t id2, \ size_t cpusetsize, \ cpuset_t *mask); } 488 AUE_NULL STD { int freebsd32_cpuset_setaffinity( \ cpulevel_t level, cpuwhich_t which, \ - uint32_t idlo, uint32_t idhi, \ + u_int32_t id1, u_int32_t id2, \ size_t cpusetsize, \ const cpuset_t *mask); } 489 AUE_FACCESSAT NOPROTO { int faccessat(int fd, char *path, int mode, \ diff --git a/sys/compat/ia32/ia32_reg.h b/sys/compat/ia32/ia32_reg.h index 5a9cdf2ee..b93019746 100644 --- a/sys/compat/ia32/ia32_reg.h +++ b/sys/compat/ia32/ia32_reg.h @@ -105,29 +105,6 @@ struct save87 { u_char sv_pad[64]; /* padding; used by emulators */ }; - -/* - * Alternative layouts for - * Used in core dumps, the reason for this file existing. - */ -struct prstatus32 { - int pr_version; - u_int pr_statussz; - u_int pr_gregsetsz; - u_int pr_fpregsetsz; - int pr_osreldate; - int pr_cursig; - pid_t pr_pid; - struct reg32 pr_reg; -}; - -struct prpsinfo32 { - int pr_version; - u_int pr_psinfosz; - char pr_fname[PRFNAMESZ+1]; - char pr_psargs[PRARGSZ+1]; -}; - /* * Wrappers and converters. */ diff --git a/sys/compat/ia32/ia32_sysvec.c b/sys/compat/ia32/ia32_sysvec.c index cb8d33df4..79448a525 100644 --- a/sys/compat/ia32/ia32_sysvec.c +++ b/sys/compat/ia32/ia32_sysvec.c @@ -93,7 +93,6 @@ CTASSERT(sizeof(struct ia32_ucontext4) == 324); CTASSERT(sizeof(struct ia32_sigframe4) == 408); #endif -static register_t *ia32_copyout_strings(struct image_params *imgp); static void ia32_fixlimit(struct rlimit *rl, int which); SYSCTL_NODE(_compat, OID_AUTO, ia32, CTLFLAG_RW, 0, "ia32 mode"); @@ -132,7 +131,7 @@ struct sysentvec ia32_freebsd_sysvec = { .sv_usrstack = FREEBSD32_USRSTACK, .sv_psstrings = FREEBSD32_PS_STRINGS, .sv_stackprot = VM_PROT_ALL, - .sv_copyout_strings = ia32_copyout_strings, + .sv_copyout_strings = freebsd32_copyout_strings, .sv_setregs = ia32_setregs, .sv_fixlimit = ia32_fixlimit, .sv_maxssiz = &ia32_maxssiz, @@ -194,127 +193,6 @@ elf32_dump_thread(struct thread *td __unused, void *dst __unused, { } - -/* XXX may be freebsd32 MI */ -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 freebsd32_ps_strings *arginfo; - size_t execpath_len; - int szsigcode; - - /* - * Calculate string base and vector table pointers. - * Also deal with signal trampoline code for this exec type. - */ - if (imgp->execpath != NULL && imgp->auxargs != NULL) - execpath_len = strlen(imgp->execpath) + 1; - else - execpath_len = 0; - arginfo = (struct freebsd32_ps_strings *)FREEBSD32_PS_STRINGS; - szsigcode = *(imgp->proc->p_sysent->sv_szsigcode); - destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE - - roundup(execpath_len, sizeof(char *)) - - roundup((ARG_MAX - imgp->args->stringspace), sizeof(char *)); - - /* - * install sigcode - */ - if (szsigcode) - copyout(imgp->proc->p_sysent->sv_sigcode, - ((caddr_t)arginfo - szsigcode), szsigcode); - - /* - * Copy the image path for the rtld. - */ - if (execpath_len != 0) { - imgp->execpathp = (uintptr_t)arginfo - szsigcode - execpath_len; - copyout(imgp->execpath, (void *)imgp->execpathp, - execpath_len); - } - - /* - * 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->args->argc + - imgp->args->envc + 2 + imgp->auxarg_size + execpath_len) * - 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->args->argc + imgp->args->envc + 2) * sizeof(u_int32_t)); - - /* - * vectp also becomes our initial stack base - */ - stack_base = vectp; - - stringp = imgp->args->begin_argv; - argc = imgp->args->argc; - envc = imgp->args->envc; - /* - * Copy out strings - arguments and environment. - */ - copyout(stringp, destp, ARG_MAX - imgp->args->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_fixlimit(struct rlimit *rl, int which) { diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 2b33ea60b..2457abba0 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -236,20 +236,20 @@ kern/link_elf_obj.c standard # # IA32 binary support # -#amd64/ia32/ia32_exception.S optional compat_ia32 -amd64/ia32/ia32_reg.c optional compat_ia32 -amd64/ia32/ia32_signal.c optional compat_ia32 -amd64/ia32/ia32_sigtramp.S optional compat_ia32 -amd64/ia32/ia32_syscall.c optional compat_ia32 -amd64/ia32/ia32_misc.c optional compat_ia32 -compat/freebsd32/freebsd32_ioctl.c optional compat_ia32 -compat/freebsd32/freebsd32_misc.c optional compat_ia32 -compat/freebsd32/freebsd32_syscalls.c optional compat_ia32 -compat/freebsd32/freebsd32_sysent.c optional compat_ia32 -compat/ia32/ia32_sysvec.c optional compat_ia32 +#amd64/ia32/ia32_exception.S optional compat_freebsd32 +amd64/ia32/ia32_reg.c optional compat_freebsd32 +amd64/ia32/ia32_signal.c optional compat_freebsd32 +amd64/ia32/ia32_sigtramp.S optional compat_freebsd32 +amd64/ia32/ia32_syscall.c optional compat_freebsd32 +amd64/ia32/ia32_misc.c optional compat_freebsd32 +compat/freebsd32/freebsd32_ioctl.c optional compat_freebsd32 +compat/freebsd32/freebsd32_misc.c optional compat_freebsd32 +compat/freebsd32/freebsd32_syscalls.c optional compat_freebsd32 +compat/freebsd32/freebsd32_sysent.c optional compat_freebsd32 +compat/ia32/ia32_sysvec.c optional compat_freebsd32 compat/linprocfs/linprocfs.c optional linprocfs compat/linsysfs/linsysfs.c optional linsysfs -kern/imgact_elf32.c optional compat_ia32 +kern/imgact_elf32.c optional compat_freebsd32 # # Linux/i386 binary support # diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64 index 176733179..253c55ed0 100644 --- a/sys/conf/files.ia64 +++ b/sys/conf/files.ia64 @@ -28,11 +28,11 @@ ukbdmap.h optional ukbd_dflt_keymap \ no-obj no-implicit-rule before-depend \ clean "ukbdmap.h" # -compat/freebsd32/freebsd32_ioctl.c optional compat_ia32 -compat/freebsd32/freebsd32_misc.c optional compat_ia32 -compat/freebsd32/freebsd32_syscalls.c optional compat_ia32 -compat/freebsd32/freebsd32_sysent.c optional compat_ia32 -compat/ia32/ia32_sysvec.c optional compat_ia32 +compat/freebsd32/freebsd32_ioctl.c optional compat_freebsd32 +compat/freebsd32/freebsd32_misc.c optional compat_freebsd32 +compat/freebsd32/freebsd32_syscalls.c optional compat_freebsd32 +compat/freebsd32/freebsd32_sysent.c optional compat_freebsd32 +compat/ia32/ia32_sysvec.c optional compat_freebsd32 contrib/ia64/libuwx/src/uwx_bstream.c standard contrib/ia64/libuwx/src/uwx_context.c standard contrib/ia64/libuwx/src/uwx_env.c standard @@ -69,10 +69,10 @@ ia64/acpica/madt.c optional acpi ia64/disasm/disasm_decode.c standard ia64/disasm/disasm_extract.c standard ia64/disasm/disasm_format.c standard -ia64/ia32/ia32_misc.c optional compat_ia32 -ia64/ia32/ia32_reg.c optional compat_ia32 -ia64/ia32/ia32_signal.c optional compat_ia32 -ia64/ia32/ia32_trap.c optional compat_ia32 +ia64/ia32/ia32_misc.c optional compat_freebsd32 +ia64/ia32/ia32_reg.c optional compat_freebsd32 +ia64/ia32/ia32_signal.c optional compat_freebsd32 +ia64/ia32/ia32_trap.c optional compat_freebsd32 ia64/ia64/autoconf.c standard ia64/ia64/bus_machdep.c standard ia64/ia64/busdma_machdep.c standard @@ -118,7 +118,7 @@ ia64/isa/isa_dma.c optional isa ia64/pci/pci_cfgreg.c optional pci isa/syscons_isa.c optional sc isa/vga_isa.c optional vga -kern/imgact_elf32.c optional compat_ia32 +kern/imgact_elf32.c optional compat_freebsd32 libkern/bcmp.c standard libkern/ffsl.c standard libkern/fls.c standard diff --git a/sys/conf/options.amd64 b/sys/conf/options.amd64 index 5617da4e1..20a49a188 100644 --- a/sys/conf/options.amd64 +++ b/sys/conf/options.amd64 @@ -11,7 +11,7 @@ MP_WATCHDOG # Options for emulators. These should only be used at config time, so # they are handled like options for static filesystems # (see src/sys/conf/options), except for broken debugging options. -COMPAT_IA32 opt_compat.h +COMPAT_FREEBSD32 opt_compat.h #IBCS2 opt_dontuse.h #COMPAT_LINUX opt_dontuse.h COMPAT_LINUX32 opt_compat.h diff --git a/sys/conf/options.ia64 b/sys/conf/options.ia64 index 7a292ed71..603c5ed01 100644 --- a/sys/conf/options.ia64 +++ b/sys/conf/options.ia64 @@ -9,7 +9,7 @@ LOG2_PAGE_SIZE opt_global.h UWX_TRACE_ENABLE opt_global.h -COMPAT_IA32 opt_compat.h +COMPAT_FREEBSD32 opt_compat.h EXCEPTION_TRACING opt_xtrace.h diff --git a/sys/fs/procfs/procfs_dbregs.c b/sys/fs/procfs/procfs_dbregs.c index efa4e14d6..68945ef95 100644 --- a/sys/fs/procfs/procfs_dbregs.c +++ b/sys/fs/procfs/procfs_dbregs.c @@ -59,10 +59,9 @@ #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include -#include /* * PROC(write, dbregs, td2, &r) becomes @@ -90,7 +89,7 @@ procfs_doprocdbregs(PFS_FILL_ARGS) int error; struct dbreg r; struct thread *td2; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct dbreg32 r32; int wrap32 = 0; #endif @@ -106,7 +105,7 @@ procfs_doprocdbregs(PFS_FILL_ARGS) } td2 = FIRST_THREAD_IN_PROC(p); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { if ((td2->td_proc->p_sysent->sv_flags & SV_ILP32) == 0) { PROC_UNLOCK(p); diff --git a/sys/fs/procfs/procfs_fpregs.c b/sys/fs/procfs/procfs_fpregs.c index 43af53e3c..c35b0660f 100644 --- a/sys/fs/procfs/procfs_fpregs.c +++ b/sys/fs/procfs/procfs_fpregs.c @@ -53,10 +53,9 @@ #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include -#include /* * PROC(write, fpregs, td2, &r) becomes @@ -84,7 +83,7 @@ procfs_doprocfpregs(PFS_FILL_ARGS) int error; struct fpreg r; struct thread *td2; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct fpreg32 r32; int wrap32 = 0; #endif @@ -101,7 +100,7 @@ procfs_doprocfpregs(PFS_FILL_ARGS) /* XXXKSE: */ td2 = FIRST_THREAD_IN_PROC(p); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { if ((td2->td_proc->p_sysent->sv_flags & SV_ILP32) == 0) { PROC_UNLOCK(p); diff --git a/sys/fs/procfs/procfs_ioctl.c b/sys/fs/procfs/procfs_ioctl.c index ccff55528..4b45af670 100644 --- a/sys/fs/procfs/procfs_ioctl.c +++ b/sys/fs/procfs/procfs_ioctl.c @@ -42,7 +42,7 @@ #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct procfs_status32 { int state; /* Running, stopped, something else? */ int flags; /* Any flags */ @@ -62,7 +62,7 @@ int procfs_ioctl(PFS_IOCTL_ARGS) { struct procfs_status *ps; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct procfs_status32 *ps32; #endif int error, flags, sig; @@ -142,7 +142,7 @@ procfs_ioctl(PFS_IOCTL_ARGS) ps->why = p->p_step ? p->p_stype : 0; ps->val = p->p_step ? p->p_xstat : 0; break; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 case PIOCWAIT32: while (p->p_step == 0 && (p->p_flag & P_WEXIT) == 0) { /* sleep until p stops */ diff --git a/sys/fs/procfs/procfs_map.c b/sys/fs/procfs/procfs_map.c index 878e2d5a6..2622d1e33 100644 --- a/sys/fs/procfs/procfs_map.c +++ b/sys/fs/procfs/procfs_map.c @@ -47,7 +47,7 @@ #include #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #endif #include @@ -86,7 +86,7 @@ procfs_doprocmap(PFS_FILL_ARGS) struct uidinfo *uip; int error, vfslocked; unsigned int last_timestamp; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 int wrap32 = 0; #endif @@ -99,7 +99,7 @@ procfs_doprocmap(PFS_FILL_ARGS) if (uio->uio_rw != UIO_READ) return (EOPNOTSUPP); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (curproc->p_sysent->sv_flags & SV_ILP32) { if (!(p->p_sysent->sv_flags & SV_ILP32)) return (EOPNOTSUPP); @@ -209,7 +209,7 @@ procfs_doprocmap(PFS_FILL_ARGS) "0x%lx 0x%lx %d %d %p %s%s%s %d %d 0x%x %s %s %s %s %s %d\n", (u_long)e_start, (u_long)e_end, resident, privateresident, -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 wrap32 ? NULL : obj, /* Hide 64 bit value */ #else obj, diff --git a/sys/fs/procfs/procfs_regs.c b/sys/fs/procfs/procfs_regs.c index 82922fbe8..5bf1c0ac7 100644 --- a/sys/fs/procfs/procfs_regs.c +++ b/sys/fs/procfs/procfs_regs.c @@ -53,10 +53,9 @@ #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include -#include /* * PROC(write, regs, td2, &r) becomes @@ -84,7 +83,7 @@ procfs_doprocregs(PFS_FILL_ARGS) int error; struct reg r; struct thread *td2; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct reg32 r32; int wrap32 = 0; #endif @@ -101,7 +100,7 @@ procfs_doprocregs(PFS_FILL_ARGS) /* XXXKSE: */ td2 = FIRST_THREAD_IN_PROC(p); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { if ((td2->td_proc->p_sysent->sv_flags & SV_ILP32) == 0) { PROC_UNLOCK(p); diff --git a/sys/ia64/conf/GENERIC b/sys/ia64/conf/GENERIC index e0e739da2..a536ced00 100644 --- a/sys/ia64/conf/GENERIC +++ b/sys/ia64/conf/GENERIC @@ -28,6 +28,7 @@ makeoptions DEBUG=-g # Build kernel with debug information. options AUDIT # Security event auditing options CD9660 # ISO 9660 Filesystem options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) +options COMPAT_FREEBSD6 # Compatible with FreeBSD6 options COMPAT_FREEBSD7 # Compatible with FreeBSD7 options FFS # Berkeley Fast Filesystem options FLOWTABLE # per-cpu routing cache diff --git a/sys/ia64/conf/NOTES b/sys/ia64/conf/NOTES index 873199a61..3f3821856 100644 --- a/sys/ia64/conf/NOTES +++ b/sys/ia64/conf/NOTES @@ -12,10 +12,10 @@ cpu ITANIUM cpu ITANIUM2 -# option: COMPAT_IA32 +# option: COMPAT_FREEBSD32 # This option enables the support for execution of i386 (32-bit) programs on # ia64. It is based on the ia32 emulation in the processor. -options COMPAT_IA32 +options COMPAT_FREEBSD32 # option: LOG2_ID_PAGE_SIZE # Specify the log2 size of the identity (direct) mappings in regions 6 and 7 diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S index 755a467d7..4464a880b 100644 --- a/sys/ia64/ia64/exception.S +++ b/sys/ia64/ia64/exception.S @@ -676,7 +676,7 @@ ivt_##name: \ #define IVT_END(name) \ .endp ivt_##name -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #define IA32_TRAP ia32_trap #else #define IA32_TRAP trap diff --git a/sys/ia64/ia64/genassym.c b/sys/ia64/ia64/genassym.c index 9f7625279..d81054b9c 100644 --- a/sys/ia64/ia64/genassym.c +++ b/sys/ia64/ia64/genassym.c @@ -61,8 +61,8 @@ #include #include -#ifdef COMPAT_IA32 -ASSYM(COMPAT_IA32, COMPAT_IA32); +#ifdef COMPAT_FREEBSD32 +ASSYM(COMPAT_FREEBSD32, COMPAT_FREEBSD32); #endif ASSYM(DT_NULL, DT_NULL); diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index e2e9f9141..ec3d612eb 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -440,7 +440,7 @@ cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx) struct pcb *oldpcb, *newpcb; oldpcb = old->td_pcb; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 ia32_savectx(oldpcb); #endif if (PCPU_GET(fpcurthread) == old) @@ -459,7 +459,7 @@ cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx) PCPU_SET(curthread, new); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 ia32_restorectx(newpcb); #endif @@ -487,7 +487,7 @@ cpu_throw(struct thread *old __unused, struct thread *new) PCPU_SET(curthread, new); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 ia32_restorectx(newpcb); #endif diff --git a/sys/ia64/include/elf.h b/sys/ia64/include/elf.h index c6a43fcdc..27182dbca 100644 --- a/sys/ia64/include/elf.h +++ b/sys/ia64/include/elf.h @@ -43,6 +43,7 @@ #include #define ELF_ARCH EM_IA_64 +#define ELF_ARCH32 EM_386 #define ELF_MACHINE_OK(x) ((x) == EM_IA_64) diff --git a/sys/ia64/include/reg.h b/sys/ia64/include/reg.h index 453c9b831..e95db312d 100644 --- a/sys/ia64/include/reg.h +++ b/sys/ia64/include/reg.h @@ -31,6 +31,10 @@ #include +#if defined(_KERNEL) && !defined(_STANDALONE) +#include "opt_compat.h" +#endif + struct reg { struct _special r_special; struct _callee_saved r_preserved; @@ -48,6 +52,11 @@ struct dbreg { unsigned long dbr_inst[8]; }; +#ifdef COMPAT_FREEBSD32 +#include +#include +#endif + #ifdef _KERNEL struct thread; diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 56cd66f25..0ece02041 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -70,11 +70,6 @@ __FBSDID("$FreeBSD$"); #include #include -#if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32 -#include -#include -#endif - #define OLD_EI_BRAND 8 static int __elfN(check_header)(const Elf_Ehdr *hdr); @@ -1210,7 +1205,9 @@ __elfN(corehdr)(td, vp, cred, numsegs, hdr, hdrsize) td)); } -#if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32 +#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 +#include + typedef struct prstatus32 elf_prstatus_t; typedef struct prpsinfo32 elf_prpsinfo_t; typedef struct fpreg32 elf_prfpregset_t; @@ -1294,7 +1291,7 @@ __elfN(puthdr)(struct thread *td, void *dst, size_t *off, int numsegs) status->pr_osreldate = osreldate; status->pr_cursig = p->p_sig; status->pr_pid = thr->td_tid; -#if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32 +#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 fill_regs32(thr, &status->pr_reg); fill_fpregs32(thr, fpregset); #else @@ -1346,8 +1343,8 @@ __elfN(puthdr)(struct thread *td, void *dst, size_t *off, int numsegs) ehdr->e_ident[EI_ABIVERSION] = 0; ehdr->e_ident[EI_PAD] = 0; ehdr->e_type = ET_CORE; -#if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32 - ehdr->e_machine = EM_386; +#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 + ehdr->e_machine = ELF_ARCH32; #else ehdr->e_machine = ELF_ARCH; #endif diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 93fdfa930..d419833da 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -734,8 +734,8 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) } } -#ifdef COMPAT_IA32 - if (td->td_proc->p_sysent->sv_flags & SV_IA32) { +#ifdef COMPAT_FREEBSD32 + if (td->td_proc->p_sysent->sv_flags & SV_ILP32) { uint32_t hid32; error = vfs_copyopt(opts, "host.hostid", &hid32, sizeof(hid32)); @@ -1961,8 +1961,8 @@ kern_jail_get(struct thread *td, struct uio *optuio, int flags) error = vfs_setopts(opts, "host.hostuuid", pr->pr_hostuuid); if (error != 0 && error != ENOENT) goto done_deref; -#ifdef COMPAT_IA32 - if (td->td_proc->p_sysent->sv_flags & SV_IA32) { +#ifdef COMPAT_FREEBSD32 + if (td->td_proc->p_sysent->sv_flags & SV_ILP32) { uint32_t hid32 = pr->pr_hostid; error = vfs_setopt(opts, "host.hostid", &hid32, sizeof(hid32)); diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c index 9c53bf6f4..0409344b9 100644 --- a/sys/kern/kern_module.c +++ b/sys/kern/kern_module.c @@ -446,7 +446,7 @@ modfind(struct thread *td, struct modfind_args *uap) MODULE_VERSION(kernel, __FreeBSD_version); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include #include diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index 116e79bae..0b90dfc34 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$"); #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 static inline int suword_lwpid(void *addr, lwpid_t lwpid) diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index a57dc3d90..dac168c4b 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$"); #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #endif @@ -751,7 +751,7 @@ do_unlock_umtx(struct thread *td, struct umtx *umtx, u_long id) return (0); } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 /* * Lock a umtx object. @@ -3075,7 +3075,7 @@ _umtx_op(struct thread *td, struct _umtx_op_args *uap) return (EINVAL); } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 int freebsd32_umtx_lock(struct thread *td, struct freebsd32_umtx_lock_args *uap) /* struct umtx *umtx */ diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index b34af6132..eaefd9c69 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -878,9 +878,10 @@ kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, sbp = selbits; #define getbits(name, x) \ do { \ - if (name == NULL) \ + if (name == NULL) { \ ibits[x] = NULL; \ - else { \ + obits[x] = NULL; \ + } else { \ ibits[x] = sbp + nbufbytes / 2 / sizeof *sbp; \ obits[x] = sbp; \ sbp += ncpbytes / sizeof *sbp; \ @@ -895,6 +896,28 @@ kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, getbits(fd_ou, 1); getbits(fd_ex, 2); #undef getbits + +#if BYTE_ORDER == BIG_ENDIAN && defined(__LP64__) + /* + * XXX: swizzle_fdset assumes that if abi_nfdbits != NFDBITS, + * we are running under 32-bit emulation. This should be more + * generic. + */ +#define swizzle_fdset(bits) \ + if (abi_nfdbits != NFDBITS && bits != NULL) { \ + int i; \ + for (i = 0; i < ncpbytes / sizeof *sbp; i++) \ + bits[i] = (bits[i] >> 32) | (bits[i] << 32); \ + } +#else +#define swizzle_fdset(bits) +#endif + + /* Make sure the bit order makes it through an ABI transition */ + swizzle_fdset(ibits[0]); + swizzle_fdset(ibits[1]); + swizzle_fdset(ibits[2]); + if (nbufbytes != 0) bzero(selbits, nbufbytes / 2); @@ -941,6 +964,13 @@ done: error = EINTR; if (error == EWOULDBLOCK) error = 0; + + /* swizzle bit order back, if necessary */ + swizzle_fdset(obits[0]); + swizzle_fdset(obits[1]); + swizzle_fdset(obits[2]); +#undef swizzle_fdset + #define putbits(name, x) \ if (name && (error2 = copyout(obits[x], name, ncpubytes))) \ error = error2; diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 4f2569d18..88f4f6011 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -61,10 +61,8 @@ __FBSDID("$FreeBSD$"); #include #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include -#include -#include struct ptrace_io_desc32 { int piod_op; @@ -171,7 +169,7 @@ proc_write_fpregs(struct thread *td, struct fpreg *fpregs) PROC_ACTION(set_fpregs(td, fpregs)); } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 /* For 32 bit binaries, we need to expose the 32 bit regs layouts. */ int proc_read_regs32(struct thread *td, struct reg32 *regs32) @@ -470,7 +468,7 @@ ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve) return (error); } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 static int ptrace_vm_entry32(struct thread *td, struct proc *p, struct ptrace_vm_entry32 *pve32) @@ -497,7 +495,7 @@ ptrace_vm_entry32(struct thread *td, struct proc *p, pve32->pve_pathlen = pve.pve_pathlen; return (error); } -#endif /* COMPAT_IA32 */ +#endif /* COMPAT_FREEBSD32 */ /* * Process debugging system call. @@ -511,7 +509,7 @@ struct ptrace_args { }; #endif -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 /* * This CPP subterfuge is to try and reduce the number of ifdefs in * the body of the code. @@ -546,7 +544,7 @@ ptrace(struct thread *td, struct ptrace_args *uap) struct dbreg dbreg; struct fpreg fpreg; struct reg reg; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct dbreg32 dbreg32; struct fpreg32 fpreg32; struct reg32 reg32; @@ -556,7 +554,7 @@ ptrace(struct thread *td, struct ptrace_args *uap) } r; void *addr; int error = 0; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 int wrap32 = 0; if (SV_CURPROC_FLAG(SV_ILP32)) @@ -624,7 +622,7 @@ ptrace(struct thread *td, struct ptrace_args *uap) #undef COPYIN #undef COPYOUT -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 /* * PROC_READ(regs, td2, addr); * becomes either: @@ -658,7 +656,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) int error, write, tmp, num; int proctree_locked = 0; lwpid_t tid = 0, *buf; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 int wrap32 = 0, safe = 0; struct ptrace_io_desc32 *piod32 = NULL; #endif @@ -746,7 +744,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) tid = td2->td_tid; } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 /* * Test if we're a 32 bit client and what the target is. * Set the wrap controls accordingly. @@ -1014,7 +1012,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) break; case PT_IO: -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (wrap32) { piod32 = addr; iov.iov_base = (void *)(uintptr_t)piod32->piod_addr; @@ -1034,7 +1032,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) uio.uio_iovcnt = 1; uio.uio_segflg = UIO_USERSPACE; uio.uio_td = td; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 tmp = wrap32 ? piod32->piod_op : piod->piod_op; #else tmp = piod->piod_op; @@ -1055,7 +1053,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) } PROC_UNLOCK(p); error = proc_rwmem(p, &uio); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (wrap32) piod32->piod_len -= uio.uio_resid; else @@ -1144,7 +1142,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) case PT_VM_ENTRY: PROC_UNLOCK(p); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (wrap32) error = ptrace_vm_entry32(td, p, addr); else diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index afa3d7188..07f0e1ba8 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -136,7 +136,7 @@ __FBSDID("$FreeBSD$"); #include -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include #include @@ -2496,7 +2496,7 @@ sosetopt(struct socket *so, struct sockopt *sopt) case SO_SNDTIMEO: case SO_RCVTIMEO: -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { struct timeval32 tv32; @@ -2677,7 +2677,7 @@ integer: tv.tv_sec = optval / hz; tv.tv_usec = (optval % hz) * tick; -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 if (SV_CURPROC_FLAG(SV_ILP32)) { struct timeval32 tv32; diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 3f7596b79..841d39a15 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -2524,7 +2524,7 @@ filt_lio(struct knote *kn, long hint) return (lj->lioj_flags & LIOJ_KEVENT_POSTED); } -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 #include #include #include diff --git a/sys/modules/linux/Makefile b/sys/modules/linux/Makefile index a24b6b27b..a67fcc702 100644 --- a/sys/modules/linux/Makefile +++ b/sys/modules/linux/Makefile @@ -2,7 +2,7 @@ .if ${MACHINE_ARCH} == "amd64" SFX= 32 -CFLAGS+=-DCOMPAT_IA32 -DCOMPAT_LINUX32 +CFLAGS+=-DCOMPAT_FREEBSD32 -DCOMPAT_LINUX32 .endif .PATH: ${.CURDIR}/../../compat/linux ${.CURDIR}/../../${MACHINE_ARCH}/linux${SFX} diff --git a/sys/modules/procfs/Makefile b/sys/modules/procfs/Makefile index c3b36337f..9a94838c7 100644 --- a/sys/modules/procfs/Makefile +++ b/sys/modules/procfs/Makefile @@ -35,7 +35,7 @@ opt_compat.h: echo "#define COMPAT_FREEBSD5 1" >> ${.TARGET} echo "#define COMPAT_FREEBSD6 1" >> ${.TARGET} .if ${MACHINE_ARCH} == "amd64" - echo "#define COMPAT_IA32 1" >> ${.TARGET} + echo "#define COMPAT_FREEBSD32 1" >> ${.TARGET} echo "#define COMPAT_LINUX32 1" >> ${.TARGET} .endif .endif diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h index e3653b657..b30447cfb 100644 --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -34,6 +34,7 @@ #define _SYS_PTRACE_H_ #include +#include #define PT_TRACE_ME 0 /* child declares it's being traced */ #define PT_READ_I 1 /* read word in child's I space */ @@ -157,7 +158,7 @@ int proc_read_dbregs(struct thread *_td, struct dbreg *_dbreg); int proc_write_dbregs(struct thread *_td, struct dbreg *_dbreg); int proc_sstep(struct thread *_td); int proc_rwmem(struct proc *_p, struct uio *_uio); -#ifdef COMPAT_IA32 +#ifdef COMPAT_FREEBSD32 struct reg32; struct fpreg32; struct dbreg32; -- 2.45.0