Interpretación de los registros de tu CPU VIA C3 o C7

De NetBSD Mexico Wiki, la enciclopedia libre.

Este documento lo estoy construyendo... aún no está finalizado.

Resultados del dmesg


Esta es la salida del dmesg para mi CPU VIA C7

cpu0 at mainbus0 apid 0: (boot processor)
cpu0: VIA C7 Esther (686-class), 799.97 MHz, id 0x6a9
cpu0: features a7d9bbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR>
cpu0: features a7d9bbff<PGE,CMOV,PAT,MPC,NOX,MMXX,MMX>
cpu0: features a7d9bbff<FXSR,SSE,SSE2,LONG,3DNOW>
cpu0: features2 181<SSE3,EST,TM2>
cpu0: padlock features 3fcc<RNG,AES,AES/CTR,SHA1/SHA256,RSA>
in= 00000000 eax= 00000001 ebx= 746e6543 ecx= 736c7561 edx= 48727561
in= 00000001 eax= 000006a9 ebx= 00010800 ecx= 00000181 edx= a7c9bbff
in= 80000000 eax= 80000006 ebx= 00000000 ecx= 00000000 edx= 00000000
in= 80000001 eax= 00000000 ebx= 00000000 ecx= 00000000 edx= 00100000
in= 80000002 eax= 20202020 ebx= 20202020 ecx= 20202020 edx= 20202020
in= 80000003 eax= 56202020 ebx= 45204149 ecx= 65687473 edx= 72702072
in= 80000004 eax= 7365636f ebx= 20726f73 ecx= 30303031 edx= 007a484d
in= 80000005 eax= 00000000 ebx= 08800880 ecx= 40040140 edx= 40040140
in= 80000006 eax= 00000000 ebx= 00000000 ecx= 0080a140 edx= 00000000
in= c0000000 eax= c0000002 ebx= 00000000 ecx= 00000000 edx= 00000000
in= c0000001 eax= 00000000 ebx= 00000000 ecx= 00000000 edx= 00003fcc
in= c0000002 eax= 00003f00 ebx= 08000813 ecx= 08100a13 edx= 42000000
xxmsr1107= 9f1f1ac6 xxmsr110b= 0000004f
cpu0: "VIA Esther processor 1000MHz"
cpu0: I-cache 64 KB 64B/line 4-way, D-cache 64 KB 64B/line 4-way
cpu0: L2 cache 128 KB 64B/line 10-way
cpu0: ITLB 128 4 KB entries 8-way
cpu0: DTLB 128 4 KB entries 8-way
cpu0: using thermal monitor 2
cpu0: Enhanced SpeedStep (1004 mV) 800 MHz
cpu0: unknown Enhanced SpeedStep CPU.
cpu0: Enhanced SpeedStep frequencies available (MHz): 1000 900 800
cpu0: calibrating local timer
cpu0: apic clock running at 99 MHz
cpu0: 4 page colors

La funcion x86_cpuid(entrada, salida);


La funcion x86_cpuid(entrada, salida) de NetBSD nos permite pedir informacion al CPU

entrada es una variable de tipo int (4 bytes)
salida es un arreglo de 4 enteros (4 bytes)
La salida es la lectura de los cuatro registros del CPU: eax, ebx, ecx y edx.

x86_cpuid(0,salida)


Con una entrada de cero, pedimos al CPU que se identifique x86_cpuid(0, descs)

in= 00000000 eax= 00000001 ebx= 746e6543 ecx= 736c7561 edx= 48727561

En los registros ebx, ecx y edx aparece la identificacion del procesador. En cualquier tabla de valores ASCII en exadecimal podemos ver su significado. (/usr/share/misc/ascii)

746e6543 736c7561 48727561
 t n e C  s l u a  H r u a = "CentarHauls"

Adicionalmente, el registro eax nos regresa el valor de 1 (00000001). Eso significa que podemos dar a la variable de entrada el valor de 1 para pedir mas informacion.

x86_cpuid(1,salida)


in= 00000001 eax= 000006a9 ebx= 00010800 ecx= 00000181 edx= a7c9bbff

El procesador nos regresa en eax el valor 6a9, significa familia=6, modelo=a y el paso=9 (todo en hexadecimal).

En edx, el CPU nos regresa las capacidades del procesador a7c9bbff

<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR>
<PGE,CMOV,PAT,MPC,MMXX,MMX>
<FXSR,SSE,SSE2,LONG,3DNOW>

La explicacion de estos bits podras encontrarlos en cualquier manual de Pentium o en el codigo de x86/include/specialreg.h

En el registro ebx aparecen los bytes miscelaneos 00010800 y en ecx 00000181 que son las caracteristicas de feature2

<SSE3,EST,TM2>

x86_cpuid(0x80000000, salida)


Ahora vamos a preguntar por las caracteristicas extendidas del procesador:

El CPU nos regresa en eax el valor de 0x80000006 Eso significa que podemos dar al CPU en la variable de entrada los valores 80000000, 80000001, 80000002, hasta el 80000006

in= 80000000 eax= 80000006 ebx= 00000000 ecx= 00000000 edx= 00000000
in= 80000001 eax= 00000000 ebx= 00000000 ecx= 00000000 edx= 00100000
in= 80000002 eax= 20202020 ebx= 20202020 ecx= 20202020 edx= 20202020
in= 80000003 eax= 56202020 ebx= 45204149 ecx= 65687473 edx= 72702072
in= 80000004 eax= 7365636f ebx= 20726f73 ecx= 30303031 edx= 007a484d
in= 80000005 eax= 00000000 ebx= 08800880 ecx= 40040140 edx= 40040140
in= 80000006 eax= 00000000 ebx= 00000000 ecx= 0080a140 edx= 00000000

entrada = 80000000 Solo nos regresa en eax la entrada maxima

entrada = 80000001 Solo nos regresa en edx el valor 00100000 NOX (No Execute Page Protection)

entrada = 80000002, 80000003 y 80000004 Nos regresa el string

"VIA Esther processor 1000MHz"

entrada = 80000005 Información de los TLBs y del caché nivel 1

entrada = 80000006 Información del caché nivel 2

x86_cpuid(0xc0000000, salida)


Ahora vamos a preguntar por las caracteristicas MAS extendidas del procesador:

in= c0000000 eax= c0000002 ebx= 00000000 ecx= 00000000 edx= 00000000
in= c0000001 eax= 00000000 ebx= 00000000 ecx= 00000000 edx= 00003fcc
in= c0000002 eax= 00003f00 ebx= 08000813 ecx= 08100a13 edx= 42000000

entrada = c0000000 Nos regresa en eax el valor de c0000002 (max valor de entrada)

entrada = c0000001 Nos regresa en edx las capacidades de padlock de este procesador 00003fcc

<RNG,AES,AES/CTR,SHA1/SHA256,RSA>

Nota que en 00003fcc tambien informa si la caracteristica esta habilitada o no. Ver x86/include/specialreg.h

entrada = c0000002 Nos regresa en ecx las capacidades max y min de Enhanced SpeedStep del CPU

ecx = 08100a13
08 = 08 Velocidad minima (800 MHz)
10 = 10 Voltaje minimo de entrada (956 mV)
0a = 0a Velocidad maxima (1000 MHz)
13 = 13 Voltaje maximo de entrada (1004 mV)

Nos regresa en ebx los valores actuales del Enhanced SpeedStep del CPU

ebx = 08000813, solo en los dos bytes inferiores
08 = mi CPU corre a 800 MHz en este momento
13 = mi CPU tiene 1004 mV en este momento