Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Nov 2008 20:51:18 -0700
From:      Scott Long <scottl@samsco.org>
To:        Doug Ambrisko <ambrisko@ambrisko.com>
Cc:        Kostik Belousov <kostikbel@gmail.com>, Doug Ambrisko <ambrisko@FreeBSD.org>, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, svn-src-head@FreeBSD.org
Subject:   Re: svn commit: r184974 - head/sys/dev/mfi
Message-ID:  <4920EA36.5020909@samsco.org>
In-Reply-To: <200811170237.mAH2bjY5088186@ambrisko.com>
References:  <200811170237.mAH2bjY5088186@ambrisko.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Doug Ambrisko wrote:
> Kostik Belousov writes:
> | On Fri, Nov 14, 2008 at 09:05:45PM +0000, Doug Ambrisko wrote:
> | > Author: ambrisko
> | > Date: Fri Nov 14 21:05:45 2008
> | > New Revision: 184974
> | > URL: http://svn.freebsd.org/changeset/base/184974
> | > 
> | > Log:
> | >   When running a 32bit app. on amd64, ensure the bits above 32bit
> | >   are zero for the copyout.  Confirmed by LSI.
> | > 
> | > Modified:
> | >   head/sys/dev/mfi/mfi.c
> | > 
> | > Modified: head/sys/dev/mfi/mfi.c
> | > ==============================================================================
> | > --- head/sys/dev/mfi/mfi.c	Fri Nov 14 18:09:19 2008	(r184973)
> | > +++ head/sys/dev/mfi/mfi.c	Fri Nov 14 21:05:45 2008	(r184974)
> | > @@ -2130,6 +2130,14 @@ mfi_ioctl(struct cdev *dev, u_long cmd, 
> | >  			    ->mfi_frame.raw[ioc->mfi_sense_off],
> | >  			    &sense_ptr.sense_ptr_data[0],
> | >  			    sizeof(sense_ptr.sense_ptr_data));
> | > +#ifdef __amd64__
> | > +			if (cmd != MFI_CMD) {
> | > +				/*
> | > +				 * not 64bit native so zero out any address
> | > +				 * over 32bit */
> | > +				sense_ptr.high = 0;
> | > +			}
> | > +#endif
> | >  			error = copyout(cm->cm_sense, sense_ptr.user_space,
> | >  			    ioc->mfi_sense_len);
> | >  			if (error != 0) {
> | > @@ -2353,6 +2361,13 @@ mfi_linux_ioctl_int(struct cdev *dev, u_
> | >                              ->lioc_frame.raw[l_ioc.lioc_sense_off],
> | >  			    &sense_ptr.sense_ptr_data[0],
> | >  			    sizeof(sense_ptr.sense_ptr_data));
> | > +#ifdef __amd64__
> | > +			/*
> | > +			 * only 32bit Linux support so zero out any
> | > +			 * address over 32bit
> | > +			 */
> | > +			sense_ptr.high = 0;
> | > +#endif
> | >  			error = copyout(cm->cm_sense, sense_ptr.user_space,
> | >  			    l_ioc.lioc_sense_len);
> | >  			if (error != 0) {
> | 
> | Would it make sense to perform this cut slightly more generically, by
> | checking whether the current process is 32bit ?
> | 
> | We still have not grew the easy to check flag or attribute of the image,
> | but usual practice is to compare p_sysent with corresponding sysvec,
> | like
> | 	if (td->td_proc->p_sysent == &ia32_freebsd_sysvec)
> | or
> | 	if (td->td_proc->p_sysent == &elf_linux_sysvec)
> 
> So far we do it based on the ioctl since the 32bit or 64bit ioctl
> value is different.  I put in that comment for Linux since there
> is talk/work for Linux amd64 emulation.  For 64bit Linux ioctl 
> support we need a 64bit structure defined.  When the ioctl can't
> be figured out then I've used the p_sysent.  Eventually, something
> that is more generic then the #ifdef __amd64__ should be done
> in all the drivers that do this emulation.
> 
> Doug A.

Something that identifies the ABI needs to be put into the proc
structure.  This isn't the only place where such information is needed.
Comparing against the sysent table symbol doesn't work very well because
it requires all sysent tables be loaded, which isn't always true for the
linux ABI.

Scott




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4920EA36.5020909>