Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Jul 2012 16:59:38 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Konstantin Belousov <kostikbel@gmail.com>
Cc:        Mark Linimon <linimon@lonesome.com>, freebsd-amd64@freebsd.org
Subject:   Re: amd64/169927: siginfo, si_code for fpe errors when error occurs using the SSE math processor
Message-ID:  <20120718153554.O2195@besplex.bde.org>
In-Reply-To: <20120718050958.GQ2676@deviant.kiev.zoral.com.ua>
References:  <201207172150.q6HLoFvB096742@freefall.freebsd.org> <20120718103210.E834@besplex.bde.org> <20120718035220.GO2676@deviant.kiev.zoral.com.ua> <20120718140523.X1862@besplex.bde.org> <20120718050958.GQ2676@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 18 Jul 2012, Konstantin Belousov wrote:

> On Wed, Jul 18, 2012 at 02:36:16PM +1000, Bruce Evans wrote:
>> On Wed, 18 Jul 2012, Konstantin Belousov wrote:
> ...
>>> The curpcb access shall be spelled as PCPU_GET(curpcb). Please note that
>>> compiler is not allowed to cache the accesses, since there is __asm
>>> __volatile expression to indirect through %gs-prefixed read.
>>
>> Fix curpcb then.  curthread was de-pessimized to use __pure2 and to not
>> use __volatile.  I could never this to work to cache curthread when I
>> ried it, but it apparently works in -current.
> ..
> curpcb() could be implemented like this for amd64 only:

Similarly for i386?

> diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h
> index 22cbbe2..3417c52 100644
> --- a/sys/amd64/include/pcb.h
> +++ b/sys/amd64/include/pcb.h
> @@ -144,6 +144,17 @@ void	makectx(struct trapframe *, struct pcb *);
> int	savectx(struct pcb *) __returns_twice;
> void	resumectx(struct pcb *);
>
> +static __inline __pure2 struct pcb *
> +__curpcb(void)
> +{
> +	struct pcb *pcb;
> +
> +	__asm("movq %%gs:%1,%0" : "=r" (pcb)
> +	    : "i" (offsetof(struct pcpu, pc_curpcb)));

pc_curpcb is only a pointer, so there is no need for pcb.h to be used
(any more than proc.h is neaded for __curthread()).

I think this can go in machine/pcpu.h next to __curthread().  Or
machine/cpuinfo can provide the an alternative to PCPU_GET() without
__volatile and sys/pcpu.h can do this.

__curthread() avoids a dependency on sys/pcpu.h by hard-coding the
offset of pc_curthread as 0.  This hack seems to be unnecessary,
Including machine/pcpu.h without going through sys/pcpu.h should be an
error.  This error is only in a few low tier files:
- i386/xen/pcpu.h: this bogusly includes machine/pcpu.h after already
   including sys/cpu.h
- mips/cavium/octeon_machdep.c
- mips/cavium/uart_dev_oct16550.c
- powerpc/include/platform.h
- xen/evtchn.h.  xen code is horrible.  In i386/include/xen/xen_os.h,
   as part of this file's namespace pollution, it claims to include
   sys/time.h for pcpu.h.  But actually sys/time.h only provides moderate
   namespace pollution that doesn't include pcpu.h.  It is another style
   bug to include sys/time.h directly.  sys/time.h is standard namespace
   pollution in sys/param.h in the _KERNEL case.

So amd64 can apparently safely put this function in machine/pcpu.h.
i386 might have to untangle the xen pollution.  Other arches aren't
directly affected, since they don't have npx.  I wondered if they
even had curpcb (if not then pc_curpcb should be in the MD fields).
Grep shows that they have considerable variation and messes.  At
lease ia64 doesn't use the "MI" pc_curpcb.  There is similar variation
and messes for pcpup.

> +	return (pcb);
> +}
> +#define	curpcb		(__curpcb())
> +
> #endif
>
> #endif /* _AMD64_PCB_H_ */
> diff --git a/sys/sys/user.h b/sys/sys/user.h
> index accb7c3..ab1c7a7 100644
> --- a/sys/sys/user.h
> +++ b/sys/sys/user.h
> @@ -35,6 +35,7 @@
> #ifndef _SYS_USER_H_
> #define _SYS_USER_H_
>
> +#include <sys/pcpu.h>

Too much namespace pollution for me.

> #include <machine/pcb.h>

Putting the definiton in machine/pcpu.h should avoid changing the
prerequistes for machine/pcb.h.

> #ifndef _KERNEL
> /* stuff that *used* to be included by user.h, or is now needed */
>
> Please note the location in pcb.h an not in machine/pcpu.h, where it
> cannot work for technical reasons (struct pcpu is not defined yet).

Not applicable -- see above.

> This should be committed separetely, together with the pass over amd64/
> to convert PCPU_GET(curpcb) into curpcb().
>
> Do you agree with committing the PR fix as is and adding the curpcb() later ?
> And removing fnclex() later (it seems I convinced enough for its removal).

OK.

Bruce



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