Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Sep 2013 03:44:30 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r255192 - in head: contrib/binutils/gas/config contrib/binutils/opcodes sys/amd64/amd64
Message-ID:  <20130905004430.GM41229@kib.kiev.ua>
In-Reply-To: <201309040756.45464.jhb@freebsd.org>
References:  <201309032121.r83LLlI5026519@svn.freebsd.org> <20130904042535.GX41229@kib.kiev.ua> <201309040756.45464.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--KQVDJCmBkPV8WfA9
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Wed, Sep 04, 2013 at 07:56:45AM -0400, John Baldwin wrote:
> On Wednesday, September 04, 2013 12:25:35 am Konstantin Belousov wrote:
> > On Tue, Sep 03, 2013 at 09:21:47PM +0000, John Baldwin wrote:
> > > Author: jhb
> > > Date: Tue Sep  3 21:21:47 2013
> > > New Revision: 255192
> > > URL: http://svnweb.freebsd.org/changeset/base/255192
> > >=20
> > > Log:
> > >   Add support for the 'invpcid' instruction to binutils and DDB's
> > >   disassembler on amd64.
> > >  =20
> > >   MFC after:	1 month
> >=20
> > Nice, thank you.
> >=20
> > Do you agree with me that it is premature to start using the mnemonics
> > in the kernel source until the changes are merged into stable/9 at leas=
t ?
>=20
> That is fine.  Can you test that using them directly works fine with GCC?
> I know clang already supported this instruction.

Hmm, tried make buildkernel CC=3Dgcc for the world (and builworld area)
built after your commit.  I get

gcc -c -x assembler-with-cpp -DLOCORE -O2 -frename-registers -pipe -fno-str=
ict-a
liasing  -std=3Dc99 -g -Wall -Wredundant-decls -Wnested-externs -Wstrict-pr=
ototype
s  -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual  -Wundef -Wno-=
point
er-sign -fformat-extensions  -Wmissing-include-dirs -fdiagnostics-show-opti=
on  =20
-nostdinc  -I. -I/usr/home/kostik/work/build/bsd/DEV/src/sys -I/usr/home/ko=
stik/
work/build/bsd/DEV/src/sys/contrib/altq -I/usr/home/kostik/work/build/bsd/D=
EV/sr
c/sys/contrib/libfdt -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_gl=
obal.
h -fno-common -finline-limit=3D8000 --param inline-unit-growth=3D100 --para=
m large-f
unction-growth=3D1000  -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer=
 -mcmod
el=3Dkernel -mno-red-zone -mno-mmx -mno-sse -msoft-float  -fno-asynchronous=
-unwind
-tables -ffreestanding -fstack-protector  -Werror /usr/home/kostik/work/bui=
ld/bsd/DEV/src/sys/amd64/amd64/exception.S
/usr/home/kostik/work/build/bsd/DEV/src/sys/amd64/amd64/apic_vector.S: Asse=
mbler messages:
/usr/home/kostik/work/build/bsd/DEV/src/sys/amd64/amd64/apic_vector.S:224: =
Error: no such instruction: `invpcid (%rdx),%rax'
/usr/home/kostik/work/build/bsd/DEV/src/sys/amd64/amd64/apic_vector.S:312: =
Error: no such instruction: `invpcid (%rdx),%rax'
/usr/home/kostik/work/build/bsd/DEV/src/sys/amd64/amd64/apic_vector.S:409: =
Error: no such instruction: `invpcid (%rdx),%rax'
*** Error code 1

On the other hand, with the target machine, I successfully did the
config/make style of the kernel build and verified that the assembled
byte sequences for the invpcid are the same as manually assembled. I have
no haswell machine to test this at runtime, but I believe that what was
done is enough.

diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S
index d002b4d..0e00549 100644
--- a/sys/amd64/amd64/apic_vector.S
+++ b/sys/amd64/amd64/apic_vector.S
@@ -221,8 +221,7 @@ IDTVEC(invltlb_pcid)
 	je	1f
 	/* Use invpcid if available. */
 	movl	$1,%eax /* INVPCID_CTX */
-	/* invpcid (%rdx),%rax */
-	.byte 0x66,0x0f,0x38,0x82,0x02
+	invpcid (%rdx),%rax
 	jmp	invltlb_ret_clear_pm_save
 1:
 	/* Otherwise reload %cr3 twice. */
@@ -309,8 +308,7 @@ IDTVEC(invlpg_pcid)
 	 */
 2:
 	xorl	%eax,%eax
-/*	invpcid	(%rdx),%rax */
-	.byte	0x66,0x0f,0x38,0x82,0x02
+	invpcid	(%rdx),%rax
 	jmp	invltlb_ret_rdx
=20
 	/*
@@ -406,8 +404,7 @@ invlrng_invpcid:
 	subq	%rax,%rcx
 	shrq	$PAGE_SHIFT,%rcx
 1:
-//	invpcid	(%rdx),%rax
-	.byte	0x66,0x0f,0x38,0x82,0x02
+	invpcid	(%rdx),%rax
 	addq	$PAGE_SIZE,8(%rsp)
 	dec	%rcx
 	jne	1b
diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h
index 3d381c6..f1b8209 100644
--- a/sys/amd64/include/cpufunc.h
+++ b/sys/amd64/include/cpufunc.h
@@ -487,9 +487,8 @@ static __inline void
 invpcid(struct invpcid_descr *d, int type)
 {
=20
-	/* invpcid (%rdx),%rax */
-	__asm __volatile(".byte 0x66,0x0f,0x38,0x82,0x02"
-	    : : "d" (d), "a" ((u_long)type) : "memory");
+	__asm __volatile("invpcid (%0),%1"
+	    : : "r" (d), "r" ((u_long)type) : "memory");
 }
=20
 static __inline u_short

--KQVDJCmBkPV8WfA9
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.21 (FreeBSD)

iQIcBAEBAgAGBQJSJ9PtAAoJEJDCuSvBvK1B/9QP/3Tex+554ueh15zJUeuw0AXd
5e9/r9h7SeNeZEX8yOJIjYyHVQxvVRv13yLGFrekQSBriTU0MH8IX4OapdJGkYGy
uwlt1a6HXOReYmPxFwuczt7JS/RajqhADc76X6qfa2VLaVewLMM2DhN4kY7JPaLZ
Yoq/7Iam3nMvYCVf39JTacyqOxXYsAhEAKOFfH77tfKKAUlmHgWbVhNxFqTiZaNZ
OWXRhnaUggJ0Vf0wWMoYou9UkoxjzN72UtluZyo5fICJDJdtG/zHUZAWgo6k2sfZ
vNzWydvdO73tT8bp8rgjneu+Q7+9MOffmw56ENzVQF12HQBmFjlElRM1w/FQikVx
S6fbQOnogoQy7BmRmqqxA3b7rRE44OAwai2qXgCCKvkKT0CGqtO978C/dPT5Ke/P
SI1fvZHYZy7H6o8TuOBSase9W5dkV/8qcD8gkAnHTfEqpOgXiZmPKFingFw/2GeN
4vj0YFByiElOLheQhq0QTKXBdr54G50A8H/A2wVa4AkUUGqp8Fxtr5NcN5KGQ0Qc
TwNnsDafVnQSYNm4gGydEUUT/XPn1NQ9Be+hkMoJENBIT+5E6vRajz3XAwnkSop3
VtZ8LtdnhuRdr/QSYSgKK0FWp/eK73BFdPFbn3FsjFXP3U2qr2EwpeJ+98Xly7rS
QwAthbt0hsAcK82siEMf
=LTI9
-----END PGP SIGNATURE-----

--KQVDJCmBkPV8WfA9--



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