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')
Personal tools