On Wed, Mar 16, 2016 at 23:47 -0700, Mike Larkin wrote: > On Thu, Mar 17, 2016 at 03:31:45PM +0900, Masao Uebayashi wrote: > > On Wed, Mar 16, 2016 at 11:26:39PM -0700, Mike Larkin wrote: > > > On Thu, Mar 17, 2016 at 03:15:07PM +0900, Masao Uebayashi wrote: > > > > This is the intended use, avoid busy-polling of BIOS PC console if > > > > running on HV. Avoid 100% CPU usage at boot prompt on hypervisors. > > > > > > > > > > Which hypervisors have you tested this on? > > > > VMware ESXi > > KVM > > QEMU > > While I share some of Theo's concerns about testing this, this particular > diff seems ok to me. You probably at least need to get someone to test on > Hyper-V, and run these new bootblocks on a variety of machines (especially > older non-Intel/AMD i386 machines). > > -ml >
I've tested the diff and with a small adjustment to the efiboot/bootia32/Makefile below, I was able to rebuild stand/ and test the thing (with the follow up diff to the bioscons.c). As I've mentioned on ICB, Xen exposes this issue, while Hyper-V doesn't. The change doesn't help or harm Xen, no change on Hyper-V. But I think it's still useful if this helps KVM and VMware. > > > > > -ml > > > > > > > Originally I unconditionally reverted the polling part, which was > > > > introduced only for Intel Mac Mini. After brief discussion with mikeb@, > > > > I decided to leave that hack by checking HV bit in CPUID > > > > (cpu_ecxfeature). > > > > > > > > diff --git a/sys/arch/amd64/stand/libsa/bioscons.c > > > > b/sys/arch/amd64/stand/libsa/bioscons.c > > > > index bdff9a4..fa42751 100644 > > > > --- a/sys/arch/amd64/stand/libsa/bioscons.c > > > > +++ b/sys/arch/amd64/stand/libsa/bioscons.c > > > > @@ -30,6 +30,7 @@ > > > > > > > > #include <machine/biosvar.h> > > > > #include <machine/pio.h> > > > > +#include <machine/specialreg.h> > > > > > > > > #include <dev/cons.h> > > > > #include <dev/ic/mc146818reg.h> > > > > @@ -37,7 +38,7 @@ > > > > #include <dev/ic/ns16450reg.h> > > > > #include <dev/isa/isareg.h> > > > > > > > > -#include <lib/libsa/stand.h> > > > > +#include <libsa.h> > > > > > > > > #include "biosdev.h" > > > > > > > > @@ -82,14 +83,17 @@ pc_getc(dev_t dev) > > > > return (rv & 0xff); > > > > } > > > > > > > > - /* > > > > - * Wait for a character to actually become available. Appears > > > > to > > > > - * be necessary on (at least) the Intel Mac Mini. > > > > - */ > > > > - do { > > > > - __asm volatile(DOINT(0x16) "; setnz %b0" : "=a" (rv) : > > > > - "0" (0x100) : "%ecx", "%edx", "cc" ); > > > > - } while ((rv & 0xff) == 0); > > > > + if ((cpu_ecxfeature & CPUIDECX_HV) == 0) { > > > > + /* > > > > + * Wait for a character to actually become available. > > > > + * Appears to be necessary on (at least) the Intel Mac > > > > + * Mini. > > > > + */ > > > > + do { > > > > + __asm volatile(DOINT(0x16) "; setnz %b0" : "=a" > > > > (rv) : > > > > + "0" (0x100) : "%ecx", "%edx", "cc" ); > > > > + } while ((rv & 0xff) == 0); > > > > + } > > > > > > > > __asm volatile(DOINT(0x16) : "=a" (rv) : "0" (0x000) : > > > > "%ecx", "%edx", "cc" ); > > > > diff --git a/sys/arch/i386/stand/libsa/bioscons.c > > > > b/sys/arch/i386/stand/libsa/bioscons.c > > > > index 028bef3..b53abcf 100644 > > > > --- a/sys/arch/i386/stand/libsa/bioscons.c > > > > +++ b/sys/arch/i386/stand/libsa/bioscons.c > > > > @@ -27,15 +27,20 @@ > > > > */ > > > > > > > > #include <sys/types.h> > > > > + > > > > #include <machine/biosvar.h> > > > > #include <machine/pio.h> > > > > +#include <machine/specialreg.h> > > > > + > > > > #include <dev/isa/isareg.h> > > > > #include <dev/ic/mc146818reg.h> > > > > #include <dev/ic/comreg.h> > > > > #include <dev/ic/ns16450reg.h> > > > > /* #include <i386/isa/nvram.h> */ > > > > #include <dev/cons.h> > > > > -#include <lib/libsa/stand.h> > > > > + > > > > +#include <libsa.h> > > > > + > > > > #include "debug.h" > > > > #include "biosdev.h" > > > > > > > > @@ -80,14 +85,17 @@ pc_getc(dev_t dev) > > > > return (rv & 0xff); > > > > } > > > > > > > > - /* > > > > - * Wait for a character to actually become available. Appears > > > > to > > > > - * be necessary on (at least) the Intel Mac Mini. > > > > - */ > > > > - do { > > > > - __asm volatile(DOINT(0x16) "; setnz %b0" : "=a" (rv) : > > > > - "0" (0x100) : "%ecx", "%edx", "cc" ); > > > > - } while ((rv & 0xff) == 0); > > > > + if ((cpu_ecxfeature & CPUIDECX_HV) == 0) { > > > > + /* > > > > + * Wait for a character to actually become available. > > > > + * Appears to be necessary on (at least) the Intel Mac > > > > + * Mini. > > > > + */ > > > > + do { > > > > + __asm volatile(DOINT(0x16) "; setnz %b0" : "=a" > > > > (rv) : > > > > + "0" (0x100) : "%ecx", "%edx", "cc" ); > > > > + } while ((rv & 0xff) == 0); > > > > + } > > > > > > > > __asm volatile(DOINT(0x16) : "=a" (rv) : "0" (0x000) : > > > > "%ecx", "%edx", "cc" ); > > > > > > > > On Thu, Mar 17, 2016 at 02:58:58PM +0900, Masao Uebayashi wrote: > > > > > Factor out CPUID code in mdrandom(), invoke it once, then save the > > > > > result. I'll use it to switch behavior depending on HV or not. > > > > > > > > > > efiboot is not tested. > > > > > > > > > > Comments? > > > > > > > > > >From 104cb04bbbd0f7e40758938cc3103b2370a2285c Mon Sep 17 00:00:00 > > > > > >2001 > > > > > From: Masao Uebayashi <uebay...@tombiinc.com> > > > > > Date: Thu, 10 Mar 2016 21:03:07 +0900 > > > > > Subject: [PATCH 1/3] Factor out CPUID instruction in amd64 boot code > > > > > > > > > > --- > > > > > sys/arch/amd64/stand/boot/Makefile | 1 + > > > > > sys/arch/amd64/stand/boot/srt0.S | 1 + > > > > > sys/arch/amd64/stand/cdboot/Makefile | 1 + > > > > > sys/arch/amd64/stand/cdboot/srt0.S | 2 + > > > > > sys/arch/amd64/stand/libsa/cpuid.S | 69 > > > > > ++++++++++++++++++++++++++++++++ > > > > > sys/arch/amd64/stand/libsa/libsa.h | 7 ++++ > > > > > sys/arch/amd64/stand/libsa/random_i386.S | 22 +--------- > > > > > sys/arch/amd64/stand/pxeboot/Makefile | 1 + > > > > > sys/arch/amd64/stand/pxeboot/srt0.S | 2 + > > > > > 9 files changed, 86 insertions(+), 20 deletions(-) > > > > > create mode 100644 sys/arch/amd64/stand/libsa/cpuid.S > > > > > > > > > > diff --git a/sys/arch/amd64/stand/boot/Makefile > > > > > b/sys/arch/amd64/stand/boot/Makefile > > > > > index 359ea31..5811646 100644 > > > > > --- a/sys/arch/amd64/stand/boot/Makefile > > > > > +++ b/sys/arch/amd64/stand/boot/Makefile > > > > > @@ -26,6 +26,7 @@ SRCS+= boot.c bootarg.c cmd.c vars.c > > > > > > > > > > .PATH: ${SADIR}/libsa > > > > > SRCS+= gidt.S random_i386.S > > > > > +SRCS+= cpuid.S > > > > > SRCS+= cmd_i386.c dev_i386.c exec_i386.c gateA20.c machdep.c > > > > > SRCS+= bioscons.c biosdev.c diskprobe.c memprobe.c time.c > > > > > .if ${SOFTRAID:L} == "yes" > > > > > diff --git a/sys/arch/amd64/stand/boot/srt0.S > > > > > b/sys/arch/amd64/stand/boot/srt0.S > > > > > index 9e1ede6..c2a5b2a 100644 > > > > > --- a/sys/arch/amd64/stand/boot/srt0.S > > > > > +++ b/sys/arch/amd64/stand/boot/srt0.S > > > > > @@ -87,6 +87,7 @@ _start: > > > > > rep; stosb > > > > > > > > > > call _ASM_LABEL(pmm_init) > > > > > + call _C_LABEL(initcpuid) > > > > > call _C_LABEL(boot) > > > > > > > > > > jmp _C_LABEL(_rtt) > > > > > diff --git a/sys/arch/amd64/stand/cdboot/Makefile > > > > > b/sys/arch/amd64/stand/cdboot/Makefile > > > > > index 23a261f..04ba1e9 100644 > > > > > --- a/sys/arch/amd64/stand/cdboot/Makefile > > > > > +++ b/sys/arch/amd64/stand/cdboot/Makefile > > > > > @@ -19,6 +19,7 @@ BINMODE=644 > > > > > SRCS+= machdep.c dev_i386.c exec_i386.c cmd_i386.c > > > > > SRCS+= gidt.S random_i386.S biosdev.c bioscons.c gateA20.c \ > > > > > memprobe.c diskprobe.c time.c > > > > > +SRCS+= cpuid.S > > > > > SRCS+= softraid.c > > > > > > > > > > .PATH: ${S}/stand/boot > > > > > diff --git a/sys/arch/amd64/stand/cdboot/srt0.S > > > > > b/sys/arch/amd64/stand/cdboot/srt0.S > > > > > index 82ff009..abe40d4 100644 > > > > > --- a/sys/arch/amd64/stand/cdboot/srt0.S > > > > > +++ b/sys/arch/amd64/stand/cdboot/srt0.S > > > > > @@ -177,6 +177,8 @@ relocated: > > > > > movl %eax, _C_LABEL(bios_bootdev) > > > > > movl %eax, _C_LABEL(bios_cddev) > > > > > > > > > > + call _C_LABEL(initcpuid) > > > > > + > > > > > /* > > > > > * Now call "main()". > > > > > * > > > > > diff --git a/sys/arch/amd64/stand/libsa/cpuid.S > > > > > b/sys/arch/amd64/stand/libsa/cpuid.S > > > > > new file mode 100644 > > > > > index 0000000..c3ca1ac > > > > > --- /dev/null > > > > > +++ b/sys/arch/amd64/stand/libsa/cpuid.S > > > > > @@ -0,0 +1,69 @@ > > > > > +/* $OpenBSD$ */ > > > > > + > > > > > +/* > > > > > + * Copyright (c) 2016 Masao Uebayashi <uebay...@tombiinc.com> > > > > > + * Copyright (c) 2013 Joel Sing <js...@openbsd.org> > > > > > + * > > > > > + * Permission to use, copy, modify, and distribute this software for > > > > > any > > > > > + * purpose with or without fee is hereby granted, provided that the > > > > > above > > > > > + * copyright notice and this permission notice appear in all copies. > > > > > + * > > > > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL > > > > > WARRANTIES > > > > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > > > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE > > > > > LIABLE FOR > > > > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY > > > > > DAMAGES > > > > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER > > > > > IN AN > > > > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING > > > > > OUT OF > > > > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > > > > + */ > > > > > + > > > > > +#include <machine/param.h> > > > > > +#include <machine/asm.h> > > > > > +#include <machine/psl.h> > > > > > +#include <machine/specialreg.h> > > > > > + > > > > > + .data > > > > > + > > > > > + .globl _C_LABEL(cpu_id) > > > > > + .globl _C_LABEL(cpu_feature) > > > > > + .globl _C_LABEL(cpu_ebxfeature) > > > > > + .globl _C_LABEL(cpu_ecxfeature) > > > > > + > > > > > +_C_LABEL(cpu_id): .long 0 > > > > > +_C_LABEL(cpu_feature): .long 0 > > > > > +_C_LABEL(cpu_ebxfeature): .long 0 > > > > > +_C_LABEL(cpu_ecxfeature): .long 0 > > > > > + > > > > > + .text > > > > > + > > > > > +ENTRY(initcpuid) > > > > > + pushal > > > > > + > > > > > + // See if we have CPU identification. > > > > > + pushfl > > > > > + popl %eax > > > > > + movl %eax, %ecx > > > > > + orl $PSL_ID, %eax > > > > > + pushl %eax > > > > > + popfl > > > > > + pushfl > > > > > + popl %eax > > > > > + pushl %ecx > > > > > + popfl > > > > > + andl $PSL_ID, %eax > > > > > + jz done > > > > > + > > > > > + // CPUID leaf = 1, subleaf = 0 > > > > > + movl $1, %eax > > > > > + movl $0, %ecx > > > > > + cpuid > > > > > + > > > > > + movl %eax, _C_LABEL(cpu_id) > > > > > + movl %ebx, _C_LABEL(cpu_ebxfeature) > > > > > + movl %ecx, _C_LABEL(cpu_ecxfeature) > > > > > + movl %edx, _C_LABEL(cpu_feature) > > > > > + > > > > > +done: > > > > > + popal > > > > > + ret > > > > > +END(initcpuid) > > > > > diff --git a/sys/arch/amd64/stand/libsa/libsa.h > > > > > b/sys/arch/amd64/stand/libsa/libsa.h > > > > > index fc65c6f..1934078 100644 > > > > > --- a/sys/arch/amd64/stand/libsa/libsa.h > > > > > +++ b/sys/arch/amd64/stand/libsa/libsa.h > > > > > @@ -77,3 +77,10 @@ extern u_int32_t bios_cksumlen; > > > > > #define MACHINE_CMD cmd_machine /* we have i386-specific commands */ > > > > > > > > > > #define CHECK_SKIP_CONF check_skip_conf /* we can skip > > > > > boot.conf with Ctrl */ > > > > > + > > > > > +/* cpuid.S */ > > > > > +void initcpuid(void); > > > > > +extern u_int32_t cpu_id; > > > > > +extern u_int32_t cpu_feature; > > > > > +extern u_int32_t cpu_ebxfeature; > > > > > +extern u_int32_t cpu_ecxfeature; > > > > > diff --git a/sys/arch/amd64/stand/libsa/random_i386.S > > > > > b/sys/arch/amd64/stand/libsa/random_i386.S > > > > > index 5e28b40..9d09379 100644 > > > > > --- a/sys/arch/amd64/stand/libsa/random_i386.S > > > > > +++ b/sys/arch/amd64/stand/libsa/random_i386.S > > > > > @@ -28,34 +28,16 @@ > > > > > ENTRY(mdrandom) > > > > > pushal > > > > > > > > > > - // See if we have CPU identification. > > > > > - pushfl > > > > > - popl %eax > > > > > - movl %eax, %ecx > > > > > - orl $PSL_ID, %eax > > > > > - pushl %eax > > > > > - popfl > > > > > - pushfl > > > > > - popl %eax > > > > > - pushl %ecx > > > > > - popfl > > > > > - andl $PSL_ID, %eax > > > > > - jz done > > > > > - > > > > > - // CPUID leaf = 1, subleaf = 0 > > > > > - movl $1, %eax > > > > > - movl $0, %ecx > > > > > - cpuid > > > > > - movl %edx, %eax > > > > > - > > > > > movl 36(%esp), %ebx > > > > > movl 40(%esp), %edx > > > > > xorl %edi, %edi > > > > > > > > > > + movl _C_LABEL(cpu_ecxfeature), %ecx > > > > > andl $CPUIDECX_RDRAND, %ecx // See if we have rdrand. > > > > > jnz userand > > > > > > > > > > movl %edx, %ecx > > > > > + movl _C_LABEL(cpu_feature), %eax > > > > > andl $CPUID_TSC, %eax // See if we have rdtsc. > > > > > jnz usetsc > > > > > > > > > > diff --git a/sys/arch/amd64/stand/pxeboot/Makefile > > > > > b/sys/arch/amd64/stand/pxeboot/Makefile > > > > > index ddf2880..468c7f0 100644 > > > > > --- a/sys/arch/amd64/stand/pxeboot/Makefile > > > > > +++ b/sys/arch/amd64/stand/pxeboot/Makefile > > > > > @@ -20,6 +20,7 @@ BINMODE=644 > > > > > SRCS+= machdep.c exec_i386.c cmd_i386.c > > > > > SRCS+= gidt.S random_i386.S biosdev.c bioscons.c gateA20.c \ > > > > > memprobe.c diskprobe.c time.c ## biosprobe.c > > > > > +SRCS+= cpuid.S > > > > > SRCS+= pxe.c pxe_call.S pxe_net.c pxe_udp.c > > > > > SRCS+= softraid.c > > > > > > > > > > diff --git a/sys/arch/amd64/stand/pxeboot/srt0.S > > > > > b/sys/arch/amd64/stand/pxeboot/srt0.S > > > > > index 9c9226d..ee79225 100644 > > > > > --- a/sys/arch/amd64/stand/pxeboot/srt0.S > > > > > +++ b/sys/arch/amd64/stand/pxeboot/srt0.S > > > > > @@ -172,6 +172,8 @@ relocated: > > > > > movl $pxe_progname, %eax > > > > > movl %eax, progname > > > > > > > > > > + call _C_LABEL(initcpuid) > > > > > + > > > > > /* > > > > > * Now call "main()". > > > > > * > > > > > -- > > > > > 2.7.0 > > > > > > > > > > > > > > >From c3072b7c101bd76d9c76b57bd317ce1829ebb153 Mon Sep 17 00:00:00 > > > > > >2001 > > > > > From: Masao Uebayashi <uebay...@tombiinc.com> > > > > > Date: Thu, 17 Mar 2016 14:48:20 +0900 > > > > > Subject: [PATCH 2/3] Implement CPUID in i386 boot loaders too > > > > > > > > > > --- > > > > > sys/arch/i386/stand/boot/Makefile | 1 + > > > > > sys/arch/i386/stand/boot/srt0.S | 1 + > > > > > sys/arch/i386/stand/cdboot/Makefile | 1 + > > > > > sys/arch/i386/stand/cdboot/srt0.S | 2 ++ > > > > > sys/arch/i386/stand/libsa/cpuid.S | 69 > > > > > ++++++++++++++++++++++++++++++++++++ > > > > > sys/arch/i386/stand/libsa/libsa.h | 7 ++++ > > > > > sys/arch/i386/stand/pxeboot/Makefile | 1 + > > > > > sys/arch/i386/stand/pxeboot/srt0.S | 2 ++ > > > > > 8 files changed, 84 insertions(+) > > > > > create mode 100644 sys/arch/i386/stand/libsa/cpuid.S > > > > > > > > > > diff --git a/sys/arch/i386/stand/boot/Makefile > > > > > b/sys/arch/i386/stand/boot/Makefile > > > > > index 4339b82..c01c160 100644 > > > > > --- a/sys/arch/i386/stand/boot/Makefile > > > > > +++ b/sys/arch/i386/stand/boot/Makefile > > > > > @@ -29,6 +29,7 @@ SRCS+= boot.c bootarg.c cmd.c vars.c > > > > > .PATH: ${SADIR}/libsa > > > > > SRCS+= debug_i386.S > > > > > SRCS+= gidt.S random_i386.S > > > > > +SRCS+= cpuid.S > > > > > SRCS+= apmprobe.c debug.c pciprobe.c ps2probe.c > > > > > SRCS+= cmd_i386.c dev_i386.c exec_i386.c gateA20.c machdep.c > > > > > SRCS+= bioscons.c biosdev.c diskprobe.c memprobe.c time.c > > > > > diff --git a/sys/arch/i386/stand/boot/srt0.S > > > > > b/sys/arch/i386/stand/boot/srt0.S > > > > > index 868b326..07f4240 100644 > > > > > --- a/sys/arch/i386/stand/boot/srt0.S > > > > > +++ b/sys/arch/i386/stand/boot/srt0.S > > > > > @@ -87,6 +87,7 @@ _start: > > > > > rep; stosb > > > > > > > > > > call _ASM_LABEL(pmm_init) > > > > > + call _C_LABEL(initcpuid) > > > > > call _C_LABEL(boot) > > > > > > > > > > jmp _C_LABEL(_rtt) > > > > > diff --git a/sys/arch/i386/stand/cdboot/Makefile > > > > > b/sys/arch/i386/stand/cdboot/Makefile > > > > > index 6306887..a533af4 100644 > > > > > --- a/sys/arch/i386/stand/cdboot/Makefile > > > > > +++ b/sys/arch/i386/stand/cdboot/Makefile > > > > > @@ -18,6 +18,7 @@ CLEANFILES+= crt0.o ${PROG}.whole > > > > > > > > > > .PATH: ${SADIR}/libsa > > > > > SRCS+= debug_i386.S gidt.S random_i386.S > > > > > +SRCS+= cpuid.S > > > > > SRCS+= cmd_i386.c dev_i386.c exec_i386.c gateA20.c machdep.c > > > > > SRCS+= apmprobe.c bioscons.c biosdev.c debug.c diskprobe.c > > > > > memprobe.c \ > > > > > pciprobe.c ps2probe.c time.c > > > > > diff --git a/sys/arch/i386/stand/cdboot/srt0.S > > > > > b/sys/arch/i386/stand/cdboot/srt0.S > > > > > index 5a721e2..b9b1a19 100644 > > > > > --- a/sys/arch/i386/stand/cdboot/srt0.S > > > > > +++ b/sys/arch/i386/stand/cdboot/srt0.S > > > > > @@ -177,6 +177,8 @@ relocated: > > > > > movl %eax, _C_LABEL(bios_bootdev) > > > > > movl %eax, _C_LABEL(bios_cddev) > > > > > > > > > > + call _C_LABEL(initcpuid) > > > > > + > > > > > /* > > > > > * Now call "main()". > > > > > * > > > > > diff --git a/sys/arch/i386/stand/libsa/cpuid.S > > > > > b/sys/arch/i386/stand/libsa/cpuid.S > > > > > new file mode 100644 > > > > > index 0000000..c3ca1ac > > > > > --- /dev/null > > > > > +++ b/sys/arch/i386/stand/libsa/cpuid.S > > > > > @@ -0,0 +1,69 @@ > > > > > +/* $OpenBSD$ */ > > > > > + > > > > > +/* > > > > > + * Copyright (c) 2016 Masao Uebayashi <uebay...@tombiinc.com> > > > > > + * Copyright (c) 2013 Joel Sing <js...@openbsd.org> > > > > > + * > > > > > + * Permission to use, copy, modify, and distribute this software for > > > > > any > > > > > + * purpose with or without fee is hereby granted, provided that the > > > > > above > > > > > + * copyright notice and this permission notice appear in all copies. > > > > > + * > > > > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL > > > > > WARRANTIES > > > > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > > > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE > > > > > LIABLE FOR > > > > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY > > > > > DAMAGES > > > > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER > > > > > IN AN > > > > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING > > > > > OUT OF > > > > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > > > > + */ > > > > > + > > > > > +#include <machine/param.h> > > > > > +#include <machine/asm.h> > > > > > +#include <machine/psl.h> > > > > > +#include <machine/specialreg.h> > > > > > + > > > > > + .data > > > > > + > > > > > + .globl _C_LABEL(cpu_id) > > > > > + .globl _C_LABEL(cpu_feature) > > > > > + .globl _C_LABEL(cpu_ebxfeature) > > > > > + .globl _C_LABEL(cpu_ecxfeature) > > > > > + > > > > > +_C_LABEL(cpu_id): .long 0 > > > > > +_C_LABEL(cpu_feature): .long 0 > > > > > +_C_LABEL(cpu_ebxfeature): .long 0 > > > > > +_C_LABEL(cpu_ecxfeature): .long 0 > > > > > + > > > > > + .text > > > > > + > > > > > +ENTRY(initcpuid) > > > > > + pushal > > > > > + > > > > > + // See if we have CPU identification. > > > > > + pushfl > > > > > + popl %eax > > > > > + movl %eax, %ecx > > > > > + orl $PSL_ID, %eax > > > > > + pushl %eax > > > > > + popfl > > > > > + pushfl > > > > > + popl %eax > > > > > + pushl %ecx > > > > > + popfl > > > > > + andl $PSL_ID, %eax > > > > > + jz done > > > > > + > > > > > + // CPUID leaf = 1, subleaf = 0 > > > > > + movl $1, %eax > > > > > + movl $0, %ecx > > > > > + cpuid > > > > > + > > > > > + movl %eax, _C_LABEL(cpu_id) > > > > > + movl %ebx, _C_LABEL(cpu_ebxfeature) > > > > > + movl %ecx, _C_LABEL(cpu_ecxfeature) > > > > > + movl %edx, _C_LABEL(cpu_feature) > > > > > + > > > > > +done: > > > > > + popal > > > > > + ret > > > > > +END(initcpuid) > > > > > diff --git a/sys/arch/i386/stand/libsa/libsa.h > > > > > b/sys/arch/i386/stand/libsa/libsa.h > > > > > index 76bf1e0..9539376 100644 > > > > > --- a/sys/arch/i386/stand/libsa/libsa.h > > > > > +++ b/sys/arch/i386/stand/libsa/libsa.h > > > > > @@ -81,3 +81,10 @@ extern u_int32_t bios_cksumlen; > > > > > #define MACHINE_CMD cmd_machine /* we have i386-specific commands */ > > > > > > > > > > #define CHECK_SKIP_CONF check_skip_conf /* we can skip > > > > > boot.conf with Ctrl */ > > > > > + > > > > > +/* cpuid.S */ > > > > > +void initcpuid(void); > > > > > +extern u_int32_t cpu_id; > > > > > +extern u_int32_t cpu_feature; > > > > > +extern u_int32_t cpu_ebxfeature; > > > > > +extern u_int32_t cpu_ecxfeature; > > > > > diff --git a/sys/arch/i386/stand/pxeboot/Makefile > > > > > b/sys/arch/i386/stand/pxeboot/Makefile > > > > > index 9227246..f26e020 100644 > > > > > --- a/sys/arch/i386/stand/pxeboot/Makefile > > > > > +++ b/sys/arch/i386/stand/pxeboot/Makefile > > > > > @@ -21,6 +21,7 @@ SRCS+= debug_i386.S gidt.S random_i386.S > > > > > SRCS+= cmd_i386.c exec_i386.c gateA20.c machdep.c > > > > > SRCS+= apmprobe.c bioscons.c biosdev.c debug.c diskprobe.c > > > > > memprobe.c \ > > > > > pciprobe.c ps2probe.c time.c > > > > > +SRCS+= cpuid.S > > > > > SRCS+= pxe_call.S pxe.c pxe_net.c pxe_udp.c > > > > > SRCS+= softraid.c > > > > > > > > > > diff --git a/sys/arch/i386/stand/pxeboot/srt0.S > > > > > b/sys/arch/i386/stand/pxeboot/srt0.S > > > > > index 16a0313..a62ee6a 100644 > > > > > --- a/sys/arch/i386/stand/pxeboot/srt0.S > > > > > +++ b/sys/arch/i386/stand/pxeboot/srt0.S > > > > > @@ -172,6 +172,8 @@ relocated: > > > > > movl $pxe_progname, %eax > > > > > movl %eax, progname > > > > > > > > > > + call _C_LABEL(initcpuid) > > > > > + > > > > > /* > > > > > * Now call "main()". > > > > > * > > > > > -- > > > > > 2.7.0 > > > > > > > > > > > > diff --git sys/arch/amd64/stand/efiboot/bootia32/Makefile sys/arch/amd64/stand/efiboot/bootia32/Makefile index 7945650..d4e82d9 100644 --- sys/arch/amd64/stand/efiboot/bootia32/Makefile +++ sys/arch/amd64/stand/efiboot/bootia32/Makefile @@ -4,11 +4,11 @@ PROG= BOOTIA32.EFI NOMAN= # OBJFMT= efi-app-ia32 SOFTRAID= yes -SRCS+= start_i386.S random_i386.S +SRCS+= start_i386.S random_i386.S cpuid.S LDSCRIPT= ldscript.i386 COPTS= -I${EFIDIR}/include/i386 .include "${.CURDIR}/../Makefile.common"