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>