svn commit: r184974 - head/sys/dev/mfi

Chagin Dmitry dchagin at freebsd.org
Mon Nov 17 22:15:11 PST 2008


On Tue, Nov 18, 2008 at 12:40:48AM +0200, Kostik Belousov wrote:
> On Mon, Nov 17, 2008 at 01:21:53PM -0800, Peter Wemm wrote:
> > On Mon, Nov 17, 2008 at 1:13 PM, John Baldwin <jhb at freebsd.org> wrote:
> > >>
> > >> Ok, what about the following. I only compiled it on i386/amd64. And,
> > >> there are more places to convert to such checks, for sure.
> > >>
> > >> [yummy patch]
> > >
> > > Commit!  Note that this is not MFC'able due to ABI breakage for older linux.ko
> > > modules, but this is the proper solution for 8.0+.
> I do not think that sysent KBI shall be preserved on the stable branch,
> it is too core functionality. Our KBI guarantee mostly center around
> drivers and less so for filesystem modules.
> 
> linux or any other ABI emulator probably do not deserve KBI stability
> guarantee, IMHO.
> 
> Anyway, I do not insist.
> 
> > >
> > > --
> > > John Baldwin
> > >
> > 
> > 
> > I was thinking of suggesting a macro to replace the verbose test if
> > curproc->td_proc->p_sysent->sv_flags, but I couldn't think of
> > something off the top of my head.
> > 
> > -                      if (curthread->td_proc->p_sysent ==
> > &ia32_freebsd_sysvec) {
> > +                       if (curthread->td_proc->p_sysent->sv_flags & SV_ILP32) {
> > 
> > if (SV_FLAGS(curthread) & SV_ILP32) ... or the like.  I'm not set on
> > this, it just seemed like it might be worth mentioning.
> > 
> > Also, change curthread->td_proc with curproc, for what its worth.
> Did it.
> 
> I discussed the change with Dmitry Chagin, and he wants explicit mark
> of the image ABI, for linux64/amd64 work.
> 

thnx! tested at
dchagin# uname -a
FreeBSD dchagin.dialup.corbina.ru 8.0-CURRENT FreeBSD 8.0-CURRENT #28 r185047: T
ue Nov 18 08:55:27 MSK 2008     root at dchagin.dialup.corbina.ru:/usr/obj/usr/loca
l/root/pub/head/sys/YOY  amd64

> diff --git a/sys/amd64/amd64/elf_machdep.c b/sys/amd64/amd64/elf_machdep.c
> index ec1afc7..4f6d178 100644
> --- a/sys/amd64/amd64/elf_machdep.c
> +++ b/sys/amd64/amd64/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
> index e233700..3acee30 100644
> --- a/sys/amd64/linux32/linux32_sysvec.c
> +++ b/sys/amd64/linux32/linux32_sysvec.c
> @@ -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 = {
> diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c
> index f44a622..693eab1 100644
> --- a/sys/arm/arm/elf_machdep.c
> +++ b/sys/arm/arm/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/compat/ia32/ia32_sysvec.c b/sys/compat/ia32/ia32_sysvec.c
> index ef74ba0..0b32b9a 100644
> --- a/sys/compat/ia32/ia32_sysvec.c
> +++ b/sys/compat/ia32/ia32_sysvec.c
> @@ -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
>  };
>  
>  
> diff --git a/sys/compat/svr4/svr4_sysvec.c b/sys/compat/svr4/svr4_sysvec.c
> index 60cca7b..63e8e54 100644
> --- a/sys/compat/svr4/svr4_sysvec.c
> +++ b/sys/compat/svr4/svr4_sysvec.c
> @@ -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";
> diff --git a/sys/i386/i386/elf_machdep.c b/sys/i386/i386/elf_machdep.c
> index 93f1d45..19eddd0 100644
> --- a/sys/i386/i386/elf_machdep.c
> +++ b/sys/i386/i386/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/i386/ibcs2/ibcs2_sysvec.c b/sys/i386/ibcs2/ibcs2_sysvec.c
> index 2c834dd..9112ed7 100644
> --- a/sys/i386/ibcs2/ibcs2_sysvec.c
> +++ b/sys/i386/ibcs2/ibcs2_sysvec.c
> @@ -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
> diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
> index a3acfc9..7444901 100644
> --- a/sys/i386/linux/linux_sysvec.c
> +++ b/sys/i386/linux/linux_sysvec.c
> @@ -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 = {
> diff --git a/sys/ia64/ia64/elf_machdep.c b/sys/ia64/ia64/elf_machdep.c
> index 94f4cdc..a3a6e57 100644
> --- a/sys/ia64/ia64/elf_machdep.c
> +++ b/sys/ia64/ia64/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/kern/imgact_aout.c b/sys/kern/imgact_aout.c
> index f4e4614..6c2f627 100644
> --- a/sys/kern/imgact_aout.c
> +++ b/sys/kern/imgact_aout.c
> @@ -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
> diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
> index dade1c2..3802259 100644
> --- a/sys/kern/kern_thr.c
> +++ b/sys/kern/kern_thr.c
> @@ -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);
> diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
> index eb587fb..9a7237d 100644
> --- a/sys/kern/uipc_socket.c
> +++ b/sys/kern/uipc_socket.c
> @@ -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,
> @@ -2277,7 +2276,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,
> @@ -2458,7 +2457,7 @@ integer:
>  			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);
> diff --git a/sys/mips/mips/elf_machdep.c b/sys/mips/mips/elf_machdep.c
> index 0234722..dc08bc2 100644
> --- a/sys/mips/mips/elf_machdep.c
> +++ b/sys/mips/mips/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/powerpc/powerpc/elf_machdep.c b/sys/powerpc/powerpc/elf_machdep.c
> index dadf3ca..69ac55b 100644
> --- a/sys/powerpc/powerpc/elf_machdep.c
> +++ b/sys/powerpc/powerpc/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/sparc64/sparc64/elf_machdep.c b/sys/sparc64/sparc64/elf_machdep.c
> index d1e610a..a956c5c 100644
> --- a/sys/sparc64/sparc64/elf_machdep.c
> +++ b/sys/sparc64/sparc64/elf_machdep.c
> @@ -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 = {
> diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h
> index 0ec07a7..c068946 100644
> --- a/sys/sys/sysent.h
> +++ b/sys/sys/sysent.h
> @@ -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;

and what about target proc macro?

-- 
Have fun!
chd


More information about the svn-src-head mailing list