Parche para extraer los registros de tu CPU VIA C3 o C7
De NetBSD Mexico Wiki, la enciclopedia libre.
Parche para extraer los datos de tu CPU C3 o C7
Este parche te permitirá revisar los registros de tu procesador VIA C3 (Nehemiah) o VIA C7 (Esther).
Te permitirá revisar las capacidades denominadas "features", "features2" y "padlock" con tu sistema operativo NetBSD versión 4 ó superior. Al aplicar el parche en el archivo identcpu.c, compilar y reiniciar, podrás ver en el dmesg los atributos que extrae este parche en la sección "cpu0".
Debido al formato del parche y la manera como ha sido grabado en esta wiki, no es posible aplicarlo directamente. Te recomiendo que lo hagas manualmente... no es difícil ;=)
Mueve tu archivo identcpu.c al nombre de identcpu.c.orig para conserver intacto el programa original. Copia identcpu.c.orig a identcpu.c Este será nuestro archivo de trabajo y aquí aplicaremos el parche. Copia y pega las 5 partes del parche en el lugar adecuado. El nombre de las variables y constantes tiene el prefico xx y XX para evitar posibles conflictos. Compila e instala tu kernel. Reinicia la máquina. Al reiniciar, en la sección cpu0 aparecerán los valores de los registros de tu CPU. Copia y pega esa sección en algún archivo para revisarlo posteriormente. Debido a que ya no necesitarás este parche, copia nuevamente identcpu.c.orig a identcpu.c En la proxima compilacion de tu kernel, el objeto original de identcpu pasará a tu nuevo kernel sin el código del parche.
En un siguiente documento explicaremos el significado de los registros que hemos extraido de nuestro CPU.
Aqui va el parche
/* $NetBSD$ */
/*
* Parche para revisar los registros de tu procesador VIA C3 y C7.
* (c) 2007 Heron Gallegos
*/
/*
* Licencia
* Este parche lo puede usted copiar, lo puede modificar, lo puede
* regalar, lo puede vender, lo puede fiar, lo puede quemar, lo puede
* borrar, lo puede introducir donde mas sabroso sienta
* nomas no vaya a andar diciendo que usted lo escribio
*/
--- ./arch/i386/i386/identcpu.c.orig 2007-11-22 21:45:03.000000000 -0600
+++ ./arch/i386/i386/identcpu.c 2007-12-06 20:19:47.000000000 -0600
@@ -60,6 +60,12 @@
#include <x86/cpu_msr.h>
#include <x86/powernow.h>
+#define XXMIRAR 1 /* Parte 1 de 5*/
+#ifdef XXMIRAR
+unsigned int xxarreglo[16][5], xxi, xxj, xxrow;
+u_int xxmsr1107, xxmsr110b;
+#endif
+
static const struct x86_cache_info
intel_cpuid_cache_info[] = {
{ CAI_ITLB, 0x01, 4, 32, 4 * 1024, NULL },
@@ -680,6 +686,11 @@
if (lfunc < 0xc0000001) /* no ACE, no RNG */
return;
+#ifdef XXMIRAR /* Parte 2 de 5*/
+ xxmsr1107 = rdmsr(MSR_VIA_ACE);
+ xxmsr110b = rdmsr(MSR_VIA_RNG);
+#endif
+
x86_cpuid(0xc0000001, descs);
lfunc = descs[3];
if (model > 0x9 || stepping >= 8) { /* ACE */
@@ -918,6 +929,17 @@
ci->ci_vendor[1] = descs[3];
ci->ci_vendor[3] = 0;
+#ifdef XXMIRAR /* Parte 3 de 5*/
+ xxrow = 0;
+ x86_cpuid(0, descs);
+ xxarreglo[xxrow][0] = 0;
+ xxarreglo[xxrow][1] = descs[0];
+ xxarreglo[xxrow][2] = descs[1];
+ xxarreglo[xxrow][3] = descs[2];
+ xxarreglo[xxrow][4] = descs[3];
+ xxrow++;
+#endif
+
x86_cpuid(0x80000000, brand);
if (brand[0] >= 0x80000004) {
x86_cpuid(0x80000002, brand);
@@ -938,6 +960,42 @@
ci->ci_feature2_flags = descs[2];
ci->ci_feature_flags = descs[3];
+#ifdef XXMIRAR /* Parte 4 de 5*/
+ x86_cpuid(1, descs); /* Parte 4.1 */
+ xxarreglo[xxrow][0] = 1;
+ xxarreglo[xxrow][1] = descs[0];
+ xxarreglo[xxrow][2] = descs[1];
+ xxarreglo[xxrow][3] = descs[2];
+ xxarreglo[xxrow][4] = descs[3];
+ xxrow++;
+
+ x86_cpuid(0x80000000, descs); /* Parte 4.2 */
+ xxj = descs[0];
+
+ for (xxi = 0x80000000; xxi <= xxj; xxi++) { /* Parte 4.3 */
+ x86_cpuid(xxi, descs);
+ xxarreglo[xxrow][0] = xxi;
+ xxarreglo[xxrow][1] = descs[0];
+ xxarreglo[xxrow][2] = descs[1];
+ xxarreglo[xxrow][3] = descs[2];
+ xxarreglo[xxrow][4] = descs[3];
+ xxrow++;
+ }
+
+ x86_cpuid(0xc0000000, descs); /* Parte 4.4 */
+ xxj = descs[0];
+
+ for (xxi = 0xc0000000; xxi <= xxj; xxi++) { /* Parte 4.5 */
+ x86_cpuid(xxi, descs);
+ xxarreglo[xxrow][0] = xxi;
+ xxarreglo[xxrow][1] = descs[0];
+ xxarreglo[xxrow][2] = descs[1];
+ xxarreglo[xxrow][3] = descs[2];
+ xxarreglo[xxrow][4] = descs[3];
+ xxrow++;
+ }
+#endif
+
/* Brand is low order 8 bits of ebx */
ci->ci_brand_id = miscbytes & 0xff;
@@ -1462,6 +1520,19 @@
aprint_verbose("%s: padlock features %s\n", cpuname, buf);
}
+#ifdef XXMIRAR /* Parte 5 de 5*/
+ for (xxi = 0; xxi < xxrow; xxi++) {
+ aprint_verbose("in= %08x eax= %08x ebx= %08x ecx= %08x edx= %08x\n",
+ xxarreglo[xxi][0],
+ xxarreglo[xxi][1],
+ xxarreglo[xxi][2],
+ xxarreglo[xxi][3],
+ xxarreglo[xxi][4]
+ );
+ }
+ aprint_verbose("xxmsr1107= %08x xxmsr110b= %08x\n", xxmsr1107, xxmsr110b);
+#endif
+
free(buf, M_TEMP);
if (*cpu_brand_string != '\0')
