pentiumShow.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:5k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* pentiumShow.c - Pentium and Pentium[234] specific show routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01g,01nov01,hdn  added pentiumMsrShow()
  8. 01f,21aug01,hdn  updated CPUID structure for PENTIUM4
  9. 01e,05oct98,jmp  doc: cleanup.
  10. 01d,20may98,hdn  changed sysCpuid to sysCpuId.
  11. 01c,17apr98,hdn  fixed typo.
  12. 01b,17apr98,hdn  added documentation.
  13. 01a,09jul97,hdn  written.
  14. */
  15. /*
  16. DESCRIPTION
  17. This library provides Pentium and Pentium[234] specific show routines. 
  18. pentiumMcaShow() shows Machine Check Global Control Registers and
  19. Error Reporting Register Banks.  pentiumPmcShow() shows PMC0 and
  20. PMC1, and reset them if the parameter zap is TRUE.
  21. SEE ALSO:
  22. .pG "Configuration"
  23. */
  24. /* includes */
  25. #include "vxWorks.h"
  26. #include "regs.h"
  27. #include "arch/i86/pentiumLib.h"
  28. #include "stdio.h"
  29. #include "fioLib.h"
  30. /* defines */
  31. /* externals */
  32. IMPORT CPUID sysCpuId;
  33. IMPORT int sysProcessor;
  34. IMPORT PENTIUM_MSR pentiumMsrP5[];
  35. IMPORT INT32 pentiumMsrP5NumEnt;
  36. IMPORT PENTIUM_MSR pentiumMsrP6[];
  37. IMPORT INT32 pentiumMsrP6NumEnt;
  38. IMPORT PENTIUM_MSR pentiumMsrP7[];
  39. IMPORT INT32 pentiumMsrP7NumEnt;
  40. /* locals */
  41. /*******************************************************************************
  42. *
  43. * pentiumMcaShow - show MCA (Machine Check Architecture) registers 
  44. *
  45. * This routine shows Machine-Check global control registers and Error-Reporting
  46. * register banks.  Number of the Error-Reporting register banks is kept in a
  47. * variable mcaBanks.  MCi_ADDR and MCi_MISC registers in the Error-Reporting
  48. * register bank are showed if MCi_STATUS indicates that these registers are
  49. * valid.
  50. *
  51. * RETURNS: N/A
  52. */
  53. void pentiumMcaShow (void)
  54.     {
  55.     UINT32 zero[2] = {0,0};
  56.     UINT32 cap[2]; /* MCG_CAP */
  57.     UINT32 stat[2]; /* MCG_STATUS, MCI_STATUS */
  58.     UINT32 addr[2]; /* MCI_ADDR, P5_MC_ADDR */
  59.     UINT32 misc[2]; /* MCI_MISC, P5_MC_TYPE */
  60.     int mcaBanks; /* MCA Error-Reporting Bank Registers */
  61.     int ix;
  62.     if ((sysCpuId.featuresEdx & CPUID_MCE) == CPUID_MCE)
  63. {
  64.         if ((sysCpuId.featuresEdx & CPUID_MCA) == CPUID_MCA)
  65.     {
  66.     pentiumMsrGet (MSR_MCG_CAP, (LL_INT *)&cap);
  67.     mcaBanks = cap[0] & MCG_COUNT; /* get number of banks */
  68.     pentiumMsrGet (MSR_MCG_STATUS, (LL_INT *)&stat);
  69.     printExc ("MCG_STATUS: 0x%.8x%.8xn", stat[1], stat[0], 0, 0, 0);
  70.     for (ix = 0; ix < mcaBanks; ix++)
  71. {
  72. pentiumMsrGet (MSR_MC0_STATUS + (ix * 4), (LL_INT *)&stat);
  73. if (stat[1] & MCI_VAL)
  74.     {
  75.     if (stat[1] & MCI_ADDRV)
  76. pentiumMsrGet (MSR_MC0_ADDR + (ix * 4), 
  77.    (LL_INT *)&addr);
  78.     if (stat[1] & MCI_MISCV)
  79. pentiumMsrGet (MSR_MC0_MISC + (ix * 4), 
  80.    (LL_INT *)&misc);
  81.     }
  82. pentiumMsrSet (MSR_MC0_STATUS + (ix * 4), (LL_INT *)&zero);
  83. pentiumSerialize ();
  84. printExc ("MC%d_STATUS: 0x%.8x%.8xn", ix, stat[1], stat[0],
  85.   0, 0);
  86. if (stat[1] & MCI_ADDRV)
  87.     printExc ("MC%d_ADDR: 0x%.8x%.8xn", ix, addr[1], addr[0],
  88.       0, 0);
  89. if (stat[1] & MCI_MISCV)
  90.     printExc ("MC%d_MISC: 0x%.8x%.8xn", ix, misc[1], misc[0],
  91.       0, 0);
  92. }
  93.     }
  94. else
  95.     {
  96.             pentiumMsrGet (MSR_P5_MC_ADDR, (LL_INT *)&addr);
  97.             pentiumMsrGet (MSR_P5_MC_TYPE, (LL_INT *)&misc);
  98.     printExc ("P5_MC_ADDR: 0x%.8x%.8xn", addr[1], addr[0], 0, 0, 0);
  99.     printExc ("P5_MC_TYPE: 0x%.8x%.8xn", misc[1], misc[0], 0, 0, 0);
  100.     }
  101. pentiumMsrGet (MSR_MCG_STATUS, (LL_INT *)&stat);
  102. stat[0] &= ~MCG_MCIP;
  103. pentiumMsrSet (MSR_MCG_STATUS, (LL_INT *)&stat);
  104. }
  105.     }
  106. /*******************************************************************************
  107. *
  108. * pentiumPmcShow - show PMCs (Performance Monitoring Counters)
  109. *
  110. * This routine shows Performance Monitoring Counter 0 and 1.
  111. * Monitored events are selected by Performance Event Select Registers in 
  112. * in pentiumPmcStart ().  These counters are cleared to 0 if the parameter "zap"
  113. * is TRUE.
  114. *
  115. * RETURNS: N/A
  116. */
  117. void pentiumPmcShow
  118.     (
  119.     BOOL zap /* 1: reset PMC0 and PMC1 */
  120.     )
  121.     {
  122.     LL_INT pmcCtr0; /* PMC0 */
  123.     LL_INT pmcCtr1; /* PMC1 */
  124.     pentiumPmcGet (&pmcCtr0, &pmcCtr1);
  125.     printf ("PMC0=%d, PMC1=%dn", (int)pmcCtr0, (int)pmcCtr1);
  126.     if (zap)
  127. pentiumPmcReset ();
  128.     }
  129. /*******************************************************************************
  130. *
  131. * pentiumMsrShow - show all the MSR (Model Specific Register)
  132. *
  133. * This routine shows all the MSRs in the Pentium and Pentium[234].
  134. *
  135. * RETURNS: N/A
  136. */
  137. void pentiumMsrShow (void)
  138.     {
  139.     PENTIUM_MSR * pMsr; /* pointer to the MSR table */
  140.     INT32 msrNumEnt; /* number of entries */
  141.     UINT32 value[2];
  142.     int ix;
  143.     if ((sysCpuId.featuresEdx & CPUID_MSR) == 0)
  144. {
  145.         printf ("This CPU does not support RDMSR and WRMSRn");
  146. return;
  147. }
  148.     switch (sysProcessor)
  149. {
  150. case X86CPU_PENTIUM:
  151.     pMsr      = pentiumMsrP5;
  152.     msrNumEnt = pentiumMsrP5NumEnt;
  153.     break;
  154. case X86CPU_PENTIUMPRO:
  155.     pMsr      = pentiumMsrP6;
  156.     msrNumEnt = pentiumMsrP6NumEnt;
  157.     break;
  158. case X86CPU_PENTIUM4:
  159.     pMsr      = pentiumMsrP7;
  160.     msrNumEnt = pentiumMsrP7NumEnt;
  161.     break;
  162. default:
  163.     printf ("This CPU(sysProcessor=%d) doesn't have MSRsn", sysProcessor);
  164.     return;
  165. }
  166.     for (ix = 0; ix < msrNumEnt; ix++, pMsr++)
  167. {
  168. pentiumMsrGet (pMsr->addr, (LL_INT *)&value);
  169. printf ("addr=0x%04x [31:0]=0x%08x [63:32]=0x%08x name=%sn",
  170.         (UINT16)pMsr->addr, value[0], value[1], pMsr->name);
  171. }
  172.     }