Add sv_flags field to struct sysentvec with intention to provide description

of the ABI of the currently executing image. Change some places to test
the flags instead of explicit comparing with address of known sysentvec
structures to determine ABI features.

Discussed with:	dchagin, imp, jhb, peter
This commit is contained in:
Konstantin Belousov 2008-11-22 12:36:15 +00:00
parent c85e8dcf18
commit b4cf0e62f4
16 changed files with 50 additions and 20 deletions

View File

@ -72,7 +72,8 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_LP64
};
static Elf64_Brandinfo freebsd_brand_info = {

View File

@ -1026,6 +1026,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = linux32_fixlimit,
.sv_maxssiz = &linux32_maxssiz,
.sv_flags = SV_ABI_LINUX | SV_ILP32 | SV_IA32
};
static Elf32_Brandinfo linux_brand = {

View File

@ -72,7 +72,8 @@ struct sysentvec elf32_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_ILP32
};
static Elf32_Brandinfo freebsd_brand_info = {

View File

@ -135,7 +135,8 @@ struct sysentvec ia32_freebsd_sysvec = {
.sv_copyout_strings = ia32_copyout_strings,
.sv_setregs = ia32_setregs,
.sv_fixlimit = ia32_fixlimit,
.sv_maxssiz = &ia32_maxssiz
.sv_maxssiz = &ia32_maxssiz,
.sv_flags = SV_ABI_FREEBSD | SV_IA32 | SV_ILP32
};

View File

@ -190,7 +190,8 @@ struct sysentvec svr4_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_UNDEF | SV_IA32 | SV_ILP32
};
const char svr4_emul_path[] = "/compat/svr4";

View File

@ -72,7 +72,8 @@ struct sysentvec elf32_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_IA32 | SV_ILP32
};
static Elf32_Brandinfo freebsd_brand_info = {

View File

@ -85,7 +85,8 @@ struct sysentvec ibcs2_svr3_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_UNDEF | SV_IA32 | SV_ILP32
};
static int

View File

@ -837,7 +837,8 @@ struct sysentvec linux_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_LINUX | SV_AOUT | SV_IA32 | SV_ILP32
};
struct sysentvec elf_linux_sysvec = {
@ -867,7 +868,8 @@ struct sysentvec elf_linux_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_LINUX | SV_IA32 | SV_ILP32
};
static Elf32_Brandinfo linux_brand = {

View File

@ -80,7 +80,8 @@ struct sysentvec elf64_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_LP64
};
static Elf64_Brandinfo freebsd_brand_info = {

View File

@ -82,7 +82,13 @@ struct sysentvec aout_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_AOUT |
#if defined(__i386__)
SV_IA32 | SV_ILP32
#else
#error Choose SV_XXX flags for the platform
#endif
};
static int

View File

@ -57,14 +57,12 @@ __FBSDID("$FreeBSD$");
#ifdef COMPAT_IA32
extern struct sysentvec ia32_freebsd_sysvec;
static inline int
suword_lwpid(void *addr, lwpid_t lwpid)
{
int error;
if (curproc->p_sysent != &ia32_freebsd_sysvec)
if (SV_CURPROC_FLAG(SV_LP64))
error = suword(addr, lwpid);
else
error = suword32(addr, lwpid);

View File

@ -136,9 +136,8 @@ __FBSDID("$FreeBSD$");
#ifdef COMPAT_IA32
#include <sys/mount.h>
#include <sys/sysent.h>
#include <compat/freebsd32/freebsd32.h>
extern struct sysentvec ia32_freebsd_sysvec;
#endif
static int soreceive_rcvoob(struct socket *so, struct uio *uio,
@ -2280,7 +2279,7 @@ sosetopt(struct socket *so, struct sockopt *sopt)
case SO_SNDTIMEO:
case SO_RCVTIMEO:
#ifdef COMPAT_IA32
if (curthread->td_proc->p_sysent == &ia32_freebsd_sysvec) {
if (SV_CURPROC_FLAG(SV_ILP32)) {
struct timeval32 tv32;
error = sooptcopyin(sopt, &tv32, sizeof tv32,
@ -2461,7 +2460,7 @@ sogetopt(struct socket *so, struct sockopt *sopt)
tv.tv_sec = optval / hz;
tv.tv_usec = (optval % hz) * tick;
#ifdef COMPAT_IA32
if (curthread->td_proc->p_sysent == &ia32_freebsd_sysvec) {
if (SV_CURPROC_FLAG(SV_ILP32)) {
struct timeval32 tv32;
CP(tv, tv32, tv_sec);

View File

@ -74,7 +74,8 @@ struct sysentvec elf32_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_ILP32
};
static Elf32_Brandinfo freebsd_brand_info = {

View File

@ -75,7 +75,8 @@ struct sysentvec elf32_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_ILP32
};
static Elf32_Brandinfo freebsd_brand_info = {

View File

@ -87,7 +87,8 @@ static struct sysentvec elf64_freebsd_sysvec = {
.sv_copyout_strings = exec_copyout_strings,
.sv_setregs = exec_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_LP64
};
static Elf64_Brandinfo freebsd_brand_info = {

View File

@ -100,8 +100,22 @@ struct sysentvec {
void (*sv_setregs)(struct thread *, u_long, u_long, u_long);
void (*sv_fixlimit)(struct rlimit *, int);
u_long *sv_maxssiz;
u_int sv_flags;
};
#define SV_ILP32 0x000100
#define SV_LP64 0x000200
#define SV_IA32 0x004000
#define SV_AOUT 0x008000
#define SV_ABI_MASK 0xff
#define SV_CURPROC_FLAG(x) (curproc->p_sysent->sv_flags & (x))
#define SV_CURPROC_ABI() (curproc->p_sysent->sv_flags & SV_ABI_MASK)
/* same as ELFOSABI_XXX, to prevent header pollution */
#define SV_ABI_LINUX 3
#define SV_ABI_FREEBSD 9
#define SV_ABI_UNDEF 255
#ifdef _KERNEL
extern struct sysentvec aout_sysvec;
extern struct sysentvec elf_freebsd_sysvec;