On Mon, Jul 04, 2022 at 08:04:14PM -0400, Daniel Dickman wrote:
> The patch below removes the (small) amount of code used to identify NexGen
> CPUs. I'm doubtful that these CPUs would be supported anymore and we don't
> do anything with the information once we identify a NexGen CPU.
>
> The code does a division early in the i386 boot process (in locore0) and
> checks the result of the ZF flag. Apparently ZF would have a different
> value on a NexGen vs an Intel CPU.
>
> According to my research some NexGen CPUs were:
> Nx586-P66
> Nx586-P75
> Nx586-P80
> Nx586-P90
> Nx586-P100
> Nx586-P110
> Nx586-P120
> Nx586-P133
>
> And:
> Nx586-PF100
> Nx586-PF110
>
> The models with a "P" did not include an FPU, while the models with "PF"
> did include an integrated FPU.
>
> According to this site, there were originally plans for a separate Nx587
> FPU but it was never officially released:
>
> https://www.x86-guide.net/en/fpu/NexGen-Nx587-2.html
>
> On our i386 page we state that we support:
>
> "All CPUs compatible with the Intel Pentium or later, with
> Intel-compatible hardware floating point support should work."
>
> Therefore none of the FPU-less NexGen CPUs are ones we state we support.
>
> Looking at what we implement for our recognition code, we only implement
> half of the algorithm to identify NexGen cpus that don't have the cpuid
> instruction. We ignore NexGen cpus that support the cpuid instruction
> (which would return the string "NexGenDriven"). So the ones lacking cpuid
> support probably don't have an FPU and aren't supported. While the ones
> with the FPU are likely ones that support the cpuid instruction, but our
> detection code doesn't detect them.
>
> So it looks like neither case would be supported in the current code.
>
> One thing I was not able to find out is the precise details of which of
> these CPUs do support the CPUID instruction and which ones don't. I've
> looked for these CPUs on ebay for the past few years but they seem to be
> fairly impossible to find with the last ones probably sitting in the hands
> of collectors. So the above is just a guess on my part.
>
> Finally I keep reading that the Nx586 is not actually Pentium clone, but
> rather an i386 clone. I don't have a good way to test this, but I've read
> that instructions like CMPXCHG8B (pentium), INVLPG (486), XADD (486) might
> not be directly supported by NexGen cpus. There is discussion of this
> here:
>
> https://www.cpu-world.com/forum/viewtopic.php?p=189409
>
> "...the truth is that the Nx586 is an extremely fast 386 processor. Later
> they added some 486 instructions via hypercode, which is stored in the
> BIOS EEPROM, but only the application-oriented ones. So while you can run
> most of the applications that were compiled for an 486, you can't run an
> operating system which requires a 486 or even a Pentium."
>
> Below diff tested on my transmeta notebook running i386 which continues to
> run fine and doesn't change the transmeta detection code.
>
> In the diff I left the ".Lis386" label even though it isn't needed
> anymore, but I think it's a useful comment to keep.
>
> ok?
CPU_* and CPUVENDOR_* aren't renumbered. I can't find use
where they are used as an index to an array so should be fine.
ok jsg@
>
>
> Index: i386/locore0.S
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/i386/locore0.S,v
> retrieving revision 1.5
> diff -u -p -u -r1.5 locore0.S
> --- i386/locore0.S 31 Dec 2021 10:44:05 -0000 1.5
> +++ i386/locore0.S 3 Jul 2022 21:06:50 -0000
> @@ -132,25 +132,6 @@ start: movw $0x1234,0x472 # warm
> boot
> testl %eax,%eax
> jnz .Ltry486
>
> - /*
> - * Try the test of a NexGen CPU -- ZF will not change on a DIV
> - * instruction on a NexGen, it will on an i386. Documented in
> - * Nx586 Processor Recognition Application Note, NexGen, Inc.
> - */
> - movl $0x5555,%eax
> - xorl %edx,%edx
> - movl $2,%ecx
> - divl %ecx
> - jnz .Lis386
> -
> -.Lisnx586:
> - /*
> - * Don't try cpuid, as Nx586s reportedly don't support the
> - * PSL_ID bit.
> - */
> - movl $CPU_NX586,RELOC(_C_LABEL(cpu))
> - jmp 2f
> -
> .Lis386:
> movl $CPU_386,RELOC(_C_LABEL(cpu))
> jmp 2f
> Index: i386/machdep.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/i386/machdep.c,v
> retrieving revision 1.648
> diff -u -p -u -r1.648 machdep.c
> --- i386/machdep.c 1 Feb 2022 20:29:55 -0000 1.648
> +++ i386/machdep.c 3 Jul 2022 21:06:51 -0000
> @@ -510,8 +510,6 @@ const struct cpu_nocpuid_nameclass i386_
> NULL}, /* CPU_486DLC */
> { CPUVENDOR_CYRIX, "Cyrix", "6x86", CPUCLASS_486,
> cyrix6x86_cpu_setup}, /* CPU_6x86 */
> - { CPUVENDOR_NEXGEN,"NexGen","586", CPUCLASS_386,
> - NULL}, /* CPU_NX586 */
> };
>
> const char *classnames[] = {
> Index: include/cputypes.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/include/cputypes.h,v
> retrieving revision 1.10
> diff -u -p -u -r1.10 cputypes.h
> --- include/cputypes.h 29 Dec 2003 08:14:18 -0000 1.10
> +++ include/cputypes.h 3 Jul 2022 21:06:51 -0000
> @@ -48,11 +48,10 @@
> #define CPU_486 3 /* Intel 80486DX */
> #define CPU_486DLC 4 /* Cyrix 486DLC */
> #define CPU_6x86 5 /* Cyrix/IBM 6x86 */
> -#define CPU_NX586 6 /* NexGen 586 */
> #define CPU_586 7 /* Intel P.....m (I hate lawyers; it's
> TM) */
> #define CPU_AM586 8 /* AMD Am486 and Am5x86 */
> #define CPU_K5 9 /* AMD K5 */
> -#define CPU_K6 10 /* NexGen 686 aka AMD K6 */
> +#define CPU_K6 10 /* AMD K6 */
> #define CPU_686 11 /* Intel P.....m Pro */
>
> /*
> @@ -62,7 +61,6 @@
> #define CPUVENDOR_UNKNOWN -1
> #define CPUVENDOR_INTEL 0
> #define CPUVENDOR_CYRIX 1
> -#define CPUVENDOR_NEXGEN 2
> #define CPUVENDOR_AMD 3
> #define CPUVENDOR_IDT 4
> #define CPUVENDOR_RISE 5
> Index: stand/libsa/cpuprobe.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/stand/libsa/cpuprobe.c,v
> retrieving revision 1.2
> diff -u -p -u -r1.2 cpuprobe.c
> --- stand/libsa/cpuprobe.c 29 Mar 2014 18:09:29 -0000 1.2
> +++ stand/libsa/cpuprobe.c 3 Jul 2022 21:06:51 -0000
> @@ -59,17 +59,6 @@ cpuprobe(void)
> * We try to toggle bit 21 (PSL_ID) in eflags. If it works, then
> * cpuid is supported. If not, there's no cpuid, and we don't
> * try it (don't want /boot to get an invalid opcode exception).
> - *
> - * XXX The NexGen Nx586 does not support this bit, so this is not
> - * a good method to detect the presence of cpuid on this
> - * processor. That's fine: the purpose here is to detect the
> - * absence of cpuid. We don't mind if the instruction's not
> - * there - this is not intended to determine exactly what
> - * processor is there, just whether it's i386 or amd64.
> - *
> - * The only thing that would cause us grief is a processor which
> - * does not support cpuid but which does allow the PSL_ID bit
> - * in eflags to be toggled.
> */
> __asm volatile(
> "pushfl\n\t"
> Index: stand/libsa/exec_i386.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/stand/libsa/exec_i386.c,v
> retrieving revision 1.51
> diff -u -p -u -r1.51 exec_i386.c
> --- stand/libsa/exec_i386.c 24 Oct 2021 17:49:19 -0000 1.51
> +++ stand/libsa/exec_i386.c 3 Jul 2022 21:06:51 -0000
> @@ -171,17 +171,6 @@ ucode_load(void)
> * We try to toggle bit 21 (PSL_ID) in eflags. If it works, then
> * cpuid is supported. If not, there's no cpuid, and we don't
> * try it (don't want /boot to get an invalid opcode exception).
> - *
> - * XXX The NexGen Nx586 does not support this bit, so this is not
> - * a good method to detect the presence of cpuid on this
> - * processor. That's fine: the purpose here is to detect the
> - * absence of cpuid. We don't mind if the instruction's not
> - * there - this is not intended to determine exactly what
> - * processor is there, just whether it's i386 or amd64.
> - *
> - * The only thing that would cause us grief is a processor which
> - * does not support cpuid but which does allow the PSL_ID bit
> - * in eflags to be toggled.
> */
> __asm volatile(
> "pushfl\n\t"
> Index: stand/libsa/machdep.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/i386/stand/libsa/machdep.c,v
> retrieving revision 1.39
> diff -u -p -u -r1.39 machdep.c
> --- stand/libsa/machdep.c 11 Jul 2018 18:08:05 -0000 1.39
> +++ stand/libsa/machdep.c 3 Jul 2022 21:06:51 -0000
> @@ -78,17 +78,6 @@ machdep(void)
> * We try to toggle bit 21 (PSL_ID) in eflags. If it works, then
> * cpuid is supported. If not, there's no cpuid, and we don't
> * try it (don't want /boot to get an invalid opcode exception).
> - *
> - * XXX The NexGen Nx586 does not support this bit, so this is not
> - * a good method to detect the presence of cpuid on this
> - * processor. That's fine: the purpose here is to detect the
> - * absence of cpuid. We don't mind if the instruction's not
> - * there - this is not intended to determine exactly what
> - * processor is there, just whether it's i386 or amd64.
> - *
> - * The only thing that would cause us grief is a processor which
> - * does not support cpuid but which does allow the PSL_ID bit
> - * in eflags to be toggled.
> */
> __asm volatile(
> "pushfl\n\t"
>
>