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

VxWorks

开发平台:

C/C++

  1. /* vxShow.c - Intel Architecture processor show routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01g,12mar02,pai  Add an initialization routine for configuring the show
  8.                  routines into a build configuration (SPR 74103).  Added
  9.                  vxSseShow() routine and updated documentation.
  10. 01f,07mar02,hdn  updated with AP485 rev-019 for HTT (spr 73359)
  11. 01e,20nov01,hdn  doc clean up for 5.5
  12. 01d,07nov01,hdn  added header file vxI86Lib.h to shut off the warning
  13. 01c,01nov01,hdn  added vxDrShow() to see the debug registers
  14. 01b,11oct01,hdn  uncommented out the "Fast System Call" printing
  15. 01a,14aug01,hdn  taken from T31 ver 01h, added PENTIUM4 support
  16. */
  17. /*
  18. DESCRIPTION
  19. This library contains routines for printing various types of information
  20. on Intel Architecture CPUs.
  21. To use these routines, install the library using the vxShowInit()
  22. routine, which is called automatically when either of the following
  23. configuration methods is employed:
  24. .iP
  25. INCLUDE_SHOW_ROUTINES is defined in a BSP config.h file for
  26. command-line builds.
  27. .iP
  28. The INCLUDE_SHOW_ROUTINES Component is selected for Tornado
  29. Project Facility builds.
  30. .LP
  31. Included in this library is a routine for reporting details on Intel
  32. Architecture 80x86 and Pentium generation processors and coprocessors.
  33. This vxCpuShow() routine is essentially a VxWorks implementation of the
  34. code found in the Intel Application Note, "AP-485, Intel Processor
  35. Identification and the CPUID Instruction".  The vxCpuShow() routine may
  36. be useful for determining specific features found on the target processor
  37. upon which VxWorks is running.
  38. In addition to the vxCpuShow() routine, there are routines for showing
  39. processer register contents.  Some of these routines show certain processor
  40. registers independent of any task context, while others show register
  41. values associated with a particular task context.
  42. There is a simple routine for showing the contents of the processor debug
  43. registers.  The debug registers (DR0 through DR7) control, and allow
  44. monitoring of, the processor's debugging operations.
  45. This library provides a routine for showing a task's optional Streaming
  46. SIMD Extension (SSE) register context.  Target-based task information
  47. routines, such as ti(), will display a task's SSE context, if any, when
  48. this library is built into a VxWorks system.
  49. SEE ALSO:
  50. .pG "Configuration"
  51. */
  52. /* includes */
  53. #include "vxWorks.h"
  54. #include "regs.h"
  55. #include "vxLib.h"
  56. #include "stdio.h"
  57. #include "string.h"
  58. #include "taskLib.h"
  59. #include "fioLib.h"
  60. #include "fppLib.h"
  61. #include "arch/i86/pentiumLib.h"
  62. #include "private/funcBindP.h"
  63. /* defines */
  64. #define FPU_FLAG 0x00000001 /* floating point unit on chip */
  65. #define VME_FLAG  0x00000002 /* virtual mode extension */
  66. #define DE_FLAG  0x00000004 /* debugging extension */
  67. #define PSE_FLAG  0x00000008 /* page size extension */
  68. #define TSC_FLAG  0x00000010 /* time stamp counter */
  69. #define MSR_FLAG  0x00000020 /* model specific register */
  70. #define PAE_FLAG  0x00000040 /* physical address extension */
  71. #define MCE_FLAG  0x00000080 /* machine check exception */
  72. #define CX8_FLAG  0x00000100 /* CMPXCHG8 instruction supported */
  73. #define APIC_FLAG  0x00000200 /* on-chip APIC hardware support */
  74. #define SEP_FLAG  0x00000800 /* fast system call */
  75. #define MTRR_FLAG  0x00001000 /* memory type range registers */
  76. #define PGE_FLAG  0x00002000 /* page global enable */
  77. #define MCA_FLAG  0x00004000 /* machine check architecture */
  78. #define CMOV_FLAG  0x00008000 /* conditional move instruction */
  79. #define PAT_FLAG  0x00010000 /* page attribute table */
  80. #define PSE36_FLAG  0x00020000 /* 36-bit page size extension */
  81. #define PSNUM_FLAG  0x00040000 /* processor serial no is enabled */
  82. #define CLFLUSH_FLAG  0x00080000 /* CLFLUSH instruction supported */
  83. #define DTS_FLAG  0x00200000 /* Debug Trace Store */
  84. #define ACPI_FLAG  0x00400000 /* ACPI registers in MSR space */
  85. #define MMX_FLAG  0x00800000 /* IA MMX technology supported */
  86. #define FXSR_FLAG  0x01000000 /* fast floating point save, restore */
  87. #define SSE_FLAG  0x02000000 /* Streaming SIMD Extension */
  88. #define SSE2_FLAG  0x04000000 /* Streaming SIMD Extension 2 */
  89. #define SS_FLAG  0x08000000 /* Self Snoop */
  90. #define TM_FLAG  0x20000000 /* Thermal Monitor */
  91. #define HTT_FLAG  0x10000000 /* Hyper Threading Technology */
  92. #define BRAND_TABLE_SIZE 10 /* brand table size */
  93. typedef struct brand_entry /* brand table entry */
  94. {
  95. long brand_value; /* brand id */
  96. char * brand_string; /* corresponding brand name */
  97. } BRAND_ENTRY;
  98. /* externals */
  99. IMPORT CPUID sysCpuId;
  100. IMPORT int sysProcessor;
  101. IMPORT int sysCoprocessor;
  102. /* locals */
  103. #if FALSE /* Unlike AE, 5.5 does not have TSS per task */
  104. LOCAL const char * tssFmt0 = "n
  105. link : 0x%08xn
  106. esp0 : 0x%08x   ss0 : 0x%08xn
  107. esp1 : 0x%08x   ss1 : 0x%08xn
  108. esp2 : 0x%08x   ss2 : 0x%08xn
  109.  cr3 : 0x%08x   eip : 0x%08x eflags : 0x%08xn
  110.  eax : 0x%08x   ecx : 0x%08x    edx : 0x%08x    ebx : 0x%08xn
  111.  esp : 0x%08x   ebp : 0x%08x    esi : 0x%08x    edi : 0x%08xn
  112.   cs : 0x%08x    ds : 0x%08x     ss : 0x%08xn
  113.   es : 0x%08x    fs : 0x%08x     gs : 0x%08xn
  114.  ldt : 0x%08x tflag : 0x%08x iomapb : 0x%08xn";
  115. #endif
  116. LOCAL char intelId[] = "GenuineIntel";
  117. LOCAL BRAND_ENTRY brand_table [BRAND_TABLE_SIZE] =
  118. {
  119. {0x01, " Genuine Intel Celeron(R) CPU"},
  120. {0x02, " Genuine Intel Pentium(R) III CPU"},
  121. {0x03, " Genuine Intel Pentium(R) III Xeon(TM) CPU"},
  122. {0x04, " Genuine Intel Pentium(R) III CPU"},
  123. {0x06, " Genuine Mobile Intel Pentium(R) III CPU-M"},
  124. {0x07, " Genuine Mobile Intel Celeron(R) CPU"},
  125. {0x08, " Genuine Intel Pentium(R) 4 CPU"},
  126. {0x09, " Genuine Intel Pentium(R) 4 CPU"},
  127. {0x0B, " Genuine Intel Xeon(TM) CPU"},
  128. {0x0E, " Genuine Intel Xeon(TM) CPU"}
  129. };
  130. LOCAL const char * const dregFmt = "n
  131. dr0 : 0x%08x   dr1 : 0x%08x    dr2 : 0x%08x    dr3 : 0x%08xn
  132. dr4 : 0x%08x   dr5 : 0x%08x    dr6 : 0x%08x    dr7 : 0x%08xn";
  133. /* forward declarations */
  134. void vxCpuShow (void);
  135. void vxDrShow (void);
  136. void vxSseShow (int);
  137. /*******************************************************************************
  138. *
  139. * vxShowInit - initialize the Intel 80x86 and Pentium show routines
  140. *
  141. * This routine links Intel 80x86 and Pentium family show routines into
  142. * the VxWorks system.  It is called automatically when the show facility
  143. * is configured into VxWorks using either of the following methods:
  144. *
  145. * .iP
  146. * INCLUDE_SHOW_ROUTINES is defined in a BSP config.h file for
  147. * command-line builds.
  148. *
  149. * .iP
  150. * The INCLUDE_SHOW_ROUTINES Component is selected for Tornado
  151. * Project Facility builds.
  152. * .LP
  153. *
  154. * INTERNAL
  155. * This routine could be called before the RTOS is fully initialized.  The
  156. * routine is used primarilly as a linkage symbol to pull the library into
  157. * a build.  Other initialization should be very simple.  For example, set
  158. * the initial values for file-scope and global variables.  Do not try to
  159. * allocate memory in this routine.  Do not call VxWorks kernel routines.
  160. *
  161. * The <sysCpuId> structure is populated by calling sysCpuProbe().  Thus,
  162. * sysCpuProbe() must be called if there is to be any hope of correctly
  163. * determining whether to bind <_func_sseTaskRegsShow> to the SSE show
  164. * routine.
  165. *
  166. * RETURNS: N/A
  167. */
  168. void vxShowInit (void)
  169.     {
  170.     const int features_edx = sysCpuId.featuresEdx;
  171.     /* Bind the Streaming SIMD register show routine ? */
  172.     if ((features_edx & SSE_FLAG) || (features_edx & SSE2_FLAG))
  173.         {
  174.         _func_sseTaskRegsShow = (FUNCPTR) vxSseShow;
  175.         }
  176.     }
  177. #if FALSE /* Unlike AE, 5.5 does not have TSS per task */
  178. /*******************************************************************************
  179. *
  180. * vxTssShow - show content of the TSS (Task State Segment)
  181. *
  182. * This routine shows content of the TSS (Task State Segment)
  183. *
  184. * RETURNS: N/A
  185. *
  186. * NOMANUAL
  187. */
  188. void vxTssShow
  189.     (
  190.     int  tid                     /* task ID of task */
  191.     )
  192.     {
  193.     WIND_TCB * pTcb; /* pointer to TCB */
  194.     TSS * pTss; /* pointer to TSS */
  195.     if (tid == 0)
  196. pTcb = taskIdCurrent;
  197.     else
  198. pTcb = (WIND_TCB *) tid;
  199.     pTss = pTcb->tss; /* get the address of TSS */
  200.     printf (tssFmt0,     pTss->link,   pTss->esp0,  pTss->ss0,
  201.     pTss->esp1,  pTss->ss1,    pTss->esp2,  pTss->ss2,
  202.     pTss->cr3,   pTss->eip,    pTss->eflags,
  203.     pTss->eax,   pTss->ecx,    pTss->edx,   pTss->ebx,
  204.     pTss->esp,   pTss->ebp,    pTss->esi,   pTss->edi,
  205.     pTss->cs,    pTss->ds,     pTss->ss,
  206.     pTss->es,    pTss->fs,     pTss->gs,
  207.     pTss->ldt,   pTss->tflag,  pTss->iomapb);
  208.     }
  209. #endif
  210. /*******************************************************************************
  211. *
  212. * vxCpuShow - show CPU type, family, model, and supported features.
  213. *
  214. * This routine prints information on Intel Architecture processors
  215. * and coprocessors, including CPU type, family, model, and supported
  216. * features.
  217. *
  218. * INTERNAL
  219. * This source code came from Intel AP-485 and kept as is for ease of
  220. * future upgrade / maintenance.
  221. *
  222. * RETURNS: N/A
  223. */
  224. void vxCpuShow (void)
  225.     {
  226.     char cpu_type = (sysCpuId.signature & CPUID_FAMILY) >> 8; 
  227.     char fpu_type = 0;
  228.     int  cpu_signature = sysCpuId.signature; 
  229.     int  features_ebx = sysCpuId.featuresEbx;
  230. #if FALSE
  231.     int  features_ecx = sysCpuId.featuresEcx;
  232. #endif /* FALSE */
  233.     int  features_edx = sysCpuId.featuresEdx;
  234.     int  cache_eax = sysCpuId.cacheEax;  
  235.     int  cache_ebx = sysCpuId.cacheEbx;
  236.     int  cache_ecx = sysCpuId.cacheEcx;
  237.     int  cache_edx = sysCpuId.cacheEdx;
  238.     char cpuid_flag = (sysCpuId.highestValue != 0); 
  239.     char intel_CPU = FALSE; 
  240.     char vendor_id[12]; 
  241.     int  cache_temp; 
  242.     int  celeron_flag;
  243.     int  pentiumxeon_flag;
  244.     char brand_string[48];
  245.     int  brand_index = 0;
  246.     if (sysProcessor == NONE)
  247.         {
  248. printf ("sysCpuProbe() is not executed.n");
  249. return;
  250. }
  251.     if ((sysCoprocessor == X86FPU_387) || (sysCoprocessor == X86FPU_487))
  252.         fpu_type = 3;
  253.     bcopy ((char *)sysCpuId.vendorId, vendor_id, sizeof (vendor_id));
  254.     bcopy ((char *)sysCpuId.brandString, brand_string, sizeof (brand_string));
  255.     if (strncmp (intelId, (char *)sysCpuId.vendorId, sizeof (vendor_id)) == 0)
  256. intel_CPU = TRUE;
  257.     printf ("This system has a"); 
  258.     if (cpuid_flag == 0) 
  259.         {
  260. switch (cpu_type) 
  261.     { 
  262. #if FALSE
  263.     case 0: 
  264. printf ("n 8086/8088 CPU"); 
  265. if (fpu_type) 
  266.     printf (" and an 8087 math coCPU"); 
  267. break; 
  268.     case 2: 
  269. printf ("n 80286 CPU"); 
  270. if (fpu_type) 
  271.     printf (" and an 80287 math coCPU"); 
  272. break; 
  273. #endif /* FALSE */
  274.     case 3: 
  275. printf ("n 80386 CPU"); 
  276. if (fpu_type == 2) 
  277.     printf (" and an 80287 math coCPU"); 
  278. else if (fpu_type) 
  279.     printf (" and an 80387 math coCPU"); 
  280. break; 
  281.     case 4: 
  282. if (fpu_type) 
  283.     printf ("n 80486DX, 80486DX2 CPU or 80487SX math coCPU"); 
  284. else 
  285.     printf ("n 80486SX CPU"); 
  286. break; 
  287.     default: 
  288. printf ("n unknown CPU"); 
  289.     }
  290.         } 
  291.     else 
  292.         { 
  293. /* using cpuid instruction */ 
  294. if (brand_string[0])
  295.     {
  296.     brand_index = 0;
  297.     while ((brand_string[brand_index] == ' ') && (brand_index < 48))
  298. brand_index++; /* remove leading Space */
  299.     if (brand_index != 48)
  300. printf ("%s", &brand_string[brand_index]);
  301.     }
  302. if (intel_CPU) 
  303.     { 
  304.     if (cpu_type == 4) 
  305.         { 
  306. switch ((cpu_signature >> 4) & 0xf) 
  307.     { 
  308.     case 0: 
  309.     case 1: 
  310. printf (" Genuine Intel486(TM) DX CPU");
  311.         break; 
  312.     case 2: 
  313. printf (" Genuine Intel486(TM) SX CPU"); 
  314. break; 
  315.     case 3: 
  316. printf (" Genuine IntelDX2(TM) CPU"); 
  317. break; 
  318.     case 4: 
  319. printf (" Genuine Intel486(TM) CPU"); 
  320. break; 
  321.     case 5: 
  322. printf (" Genuine IntelSX2(TM) CPU"); 
  323. break; 
  324.     case 7: 
  325. printf (" Genuine WriteBack Enhanced IntelDX2(TM) CPU");
  326. break; 
  327.     case 8: 
  328. printf (" Genuine IntelDX4(TM) CPU"); 
  329. break; 
  330.     default: 
  331. printf (" Genuine Intel486(TM) CPU"); 
  332.     }
  333.         } 
  334.     else if (cpu_type == 5) 
  335. printf (" Genuine Intel Pentium(R) CPU"); 
  336.     else if ((cpu_type == 6) && (((cpu_signature >> 4) & 0xf) == 1)) 
  337. printf (" Genuine Intel Pentium(R) Pro CPU"); 
  338.     else if ((cpu_type == 6) && (((cpu_signature >> 4) & 0xf) == 3)) 
  339. printf (" Genuine Intel Pentium(R) II CPU, model 3"); 
  340.     else if (((cpu_type == 6) && (((cpu_signature >> 4) & 0xf) == 5)) ||
  341.      ((cpu_type == 6) && (((cpu_signature >> 4) & 0xf) == 7)))
  342. celeron_flag = 0; 
  343. pentiumxeon_flag = 0; 
  344. cache_temp = cache_eax & 0xFF000000; 
  345. if (cache_temp == 0x40000000) 
  346.     celeron_flag = 1; 
  347. if ((cache_temp >= 0x44000000) && (cache_temp <= 0x45000000)) 
  348.     pentiumxeon_flag = 1; 
  349. cache_temp = cache_eax & 0xFF0000; 
  350. if (cache_temp == 0x400000) 
  351.     celeron_flag = 1; 
  352. if ((cache_temp >= 0x440000) && (cache_temp <= 0x450000)) 
  353.     pentiumxeon_flag = 1;
  354. cache_temp = cache_eax & 0xFF00; 
  355. if (cache_temp == 0x4000) 
  356.     celeron_flag = 1; 
  357. if ((cache_temp >= 0x4400) && (cache_temp <= 0x4500))
  358.     pentiumxeon_flag = 1; 
  359. cache_temp = cache_ebx & 0xFF000000; 
  360. if (cache_temp == 0x40000000) 
  361.     celeron_flag = 1; 
  362. if ((cache_temp >= 0x44000000) && (cache_temp <= 0x45000000)) 
  363.     pentiumxeon_flag = 1; 
  364. cache_temp = cache_ebx & 0xFF0000; 
  365. if (cache_temp == 0x400000) 
  366.     celeron_flag = 1; 
  367. if ((cache_temp >= 0x440000) && (cache_temp <= 0x450000)) 
  368.     pentiumxeon_flag = 1;
  369. cache_temp = cache_ebx & 0xFF00; 
  370. if (cache_temp == 0x4000) 
  371.     celeron_flag = 1; 
  372. if ((cache_temp >= 0x4400) && (cache_temp <= 0x4500)) 
  373.     pentiumxeon_flag = 1; 
  374. cache_temp = cache_ebx & 0xFF; 
  375. if (cache_temp == 0x40) 
  376.     celeron_flag = 1; 
  377. if ((cache_temp >= 0x44) && (cache_temp <= 0x45)) 
  378.     pentiumxeon_flag = 1;
  379. cache_temp = cache_ecx & 0xFF000000; 
  380. if (cache_temp == 0x40000000) 
  381.     celeron_flag = 1; 
  382. if ((cache_temp >= 0x44000000) && (cache_temp <= 0x45000000)) 
  383.     pentiumxeon_flag = 1; 
  384. cache_temp = cache_ecx & 0xFF0000; 
  385. if (cache_temp == 0x400000) 
  386.     celeron_flag = 1; 
  387. if ((cache_temp >= 0x440000) && (cache_temp <= 0x450000)) 
  388.     pentiumxeon_flag = 1;
  389. cache_temp = cache_ecx & 0xFF00; 
  390. if (cache_temp == 0x4000) 
  391.     celeron_flag = 1; 
  392. if ((cache_temp >= 0x4400) && (cache_temp <= 0x4500)) 
  393.     pentiumxeon_flag = 1; 
  394. cache_temp = cache_ecx & 0xFF; 
  395. if (cache_temp == 0x40) 
  396.     celeron_flag = 1; 
  397. if ((cache_temp >= 0x44) && (cache_temp <= 0x45)) 
  398.     pentiumxeon_flag = 1;
  399. cache_temp = cache_edx & 0xFF000000; 
  400. if (cache_temp == 0x40000000) 
  401.     celeron_flag = 1; 
  402. if ((cache_temp >= 0x44000000) && (cache_temp <= 0x45000000)) 
  403.     pentiumxeon_flag = 1;
  404. cache_temp = cache_edx & 0xFF0000; 
  405. if (cache_temp == 0x400000) 
  406.     celeron_flag = 1; 
  407. if ((cache_temp >= 0x440000) && (cache_temp <= 0x450000)) 
  408.     pentiumxeon_flag = 1; 
  409. cache_temp = cache_edx & 0xFF00; 
  410. if (cache_temp == 0x4000) 
  411.     celeron_flag = 1; 
  412. if ((cache_temp >= 0x4400) && (cache_temp <= 0x4500)) 
  413.     pentiumxeon_flag = 1; 
  414. cache_temp = cache_edx & 0xFF; 
  415. if (cache_temp == 0x40) 
  416.     celeron_flag = 1; 
  417. if ((cache_temp >= 0x44) && (cache_temp <= 0x45)) 
  418.     pentiumxeon_flag = 1;
  419. if (celeron_flag == 1) 
  420.     printf (" Genuine Intel Celeron(R) CPU, model 5"); 
  421. else 
  422.     { 
  423.     if (pentiumxeon_flag == 1) 
  424.         { 
  425. printf (" Genuine Intel Pentium(R) "); 
  426. if (((cpu_signature >> 4) & 0x0f) == 5) 
  427.     printf ("II Xeon(TM) CPU"); 
  428. else 
  429.     printf ("III Xeon(TM) CPU");
  430. printf (" model 7");
  431.         } 
  432.     else 
  433.         { 
  434. if (((cpu_signature >> 4) & 0x0f) == 5)
  435.     { 
  436.     printf (" Genuine Intel Pentium(R) II CPU, "); 
  437.     printf ("model 5 or Intel Pentium(R) II Xeon(TM)");
  438.     printf (" CPU");
  439.     } 
  440. else 
  441.     { 
  442.     printf (" Genuine Intel Pentium(R) III CPU, ");
  443.     printf ("model 7 or Intel Pentium(R) III Xeon(TM)");
  444.     printf (" CPU, model 7");
  445.     }
  446.         }
  447.     }
  448.         }
  449.     else if ((cpu_type == 6) && (((cpu_signature >> 4) & 0xf) == 6))
  450. printf (" Genuine Intel Celeron(R) CPU, model 6");
  451.     else if ((features_ebx & 0xff) != 0) 
  452. {
  453. while ((brand_index < BRAND_TABLE_SIZE) &&
  454.        ((features_ebx & 0xff) != 
  455.        brand_table[brand_index].brand_value))
  456.     brand_index++;
  457. if (brand_index < BRAND_TABLE_SIZE)
  458.     {
  459.     if ((cpu_signature == 0x6B1) &&
  460.         (brand_table[brand_index].brand_value == 0x3))
  461. printf (" Genuine Intel Celeron(R) CPU");
  462.     else
  463.         printf ("%s", brand_table[brand_index].brand_string);
  464.     }
  465. else
  466.     printf ("n unknown Genuine Intel CPU"); 
  467. }
  468.     else 
  469. printf ("n unknown Genuine Intel CPU"); 
  470.     printf ("nProcessor Family: %X", cpu_type);
  471.     if (cpu_type == 0xf)
  472. printf ("n Extended Family: %x",(cpu_signature >> 20) & 0xff);
  473.     printf ("nModel: %X", (cpu_signature>>4) & 0xf); 
  474.     if (((cpu_signature >> 4) & 0xf) == 0xf)
  475. printf ("n Extended Model: %x", (cpu_signature >> 16) & 0xf);
  476.     printf ("nStepping: %Xn", cpu_signature & 0xf); 
  477.     if (cpu_signature & 0x1000) 
  478. printf ("nThe CPU is an OverDrive(R) CPU"); 
  479.     else if (cpu_signature & 0x2000) 
  480. printf ("nThe CPU is the upgrade CPU in a dual CPU system"); 
  481.     if (features_edx & FPU_FLAG) 
  482. printf ("nThe CPU contains an on-chip FPU"); 
  483.     if (features_edx & VME_FLAG) 
  484. printf ("nThe CPU supports Virtual Mode Extensions");
  485.     if (features_edx & DE_FLAG) 
  486. printf ("nThe CPU supports the Debugging Extensions"); 
  487.     if (features_edx & PSE_FLAG) 
  488. printf ("nThe CPU supports Page Size Extensions"); 
  489.     if (features_edx & TSC_FLAG) 
  490. printf ("nThe CPU supports Time Stamp Counter"); 
  491.     if (features_edx & MSR_FLAG) 
  492. printf ("nThe CPU supports Model Specific Registers"); 
  493.     if (features_edx & PAE_FLAG) 
  494. printf ("nThe CPU supports Physical Address Extension");
  495.     if (features_edx & MCE_FLAG) 
  496. printf ("nThe CPU supports Machine Check Exceptions");
  497.     if (features_edx & CX8_FLAG) 
  498. printf ("nThe CPU supports the CMPXCHG8B instruction");
  499.     if (features_edx & APIC_FLAG)
  500. printf ("nThe CPU contains an on-chip APIC");
  501.     if (features_edx & SEP_FLAG)
  502.         { 
  503. if ((cpu_type == 6) && ((cpu_signature & 0xff) < 0x33))
  504.     printf ("nThe CPU does not support the Fast System Call");
  505. else 
  506.     {
  507. #if FALSE /* no system call in T2.2 */
  508.          long long sysenterCs;
  509.          long long sysenterEsp;
  510.          long long sysenterEip;
  511.     printf ("nThe CPU supports the Fast System Call");
  512.     pentiumMsrGet (MSR_SYSENTER_CS, &sysenterCs);
  513.     pentiumMsrGet (MSR_SYSENTER_ESP, &sysenterEsp);
  514.     pentiumMsrGet (MSR_SYSENTER_EIP, &sysenterEip);
  515.     printf (":  CS=0x%x, ESP=0x%x, EIP=0x%x", (int)sysenterCs,
  516.     (int)sysenterEsp, (int)sysenterEip);
  517. #else
  518.     printf ("nThe CPU supports the Fast System Call");
  519. #endif /* FALSE */
  520.     }
  521.         }
  522.     if (features_edx & MTRR_FLAG) 
  523. printf ("nThe CPU supports the Memory Type Range Registers"); 
  524.     if (features_edx & PGE_FLAG) 
  525. printf ("nThe CPU supports Page Global Enable"); 
  526.     if (features_edx & MCA_FLAG) 
  527. printf ("nThe CPU supports the Machine Check Architecture");
  528.     if (features_edx & CMOV_FLAG) 
  529. printf ("nThe CPU supports the Conditional Move Instruction");
  530.     if (features_edx & PAT_FLAG)
  531. printf ("nThe CPU supports the Page Attribute Table");
  532.     if (features_edx & PSE36_FLAG)
  533. printf ("nThe CPU supports 36-bit Page Size Extension");
  534.     if (features_edx & PSNUM_FLAG)
  535. printf ("nThe CPU supports the CPU serial number");
  536.     if (features_edx & CLFLUSH_FLAG)
  537. printf ("nThe CPU supports the CLFLUSH instruction");
  538.     if (features_edx & DTS_FLAG)
  539. printf ("nThe CPU supports the Debug Trace Store feature");
  540.     if (features_edx & ACPI_FLAG)
  541. printf ("nThe CPU supports ACPI registers in MSR space");
  542.     if (features_edx & MMX_FLAG)
  543. printf ("nThe CPU supports Intel Architecture MMX(TM)");
  544.     if (features_edx & FXSR_FLAG)
  545. printf ("nThe CPU supports the Fast FPP save and restore");
  546.     if (features_edx & SSE_FLAG)
  547. printf ("nThe CPU supports the Streaming SIMD Extensions");
  548.     if (features_edx & SSE2_FLAG)
  549. printf ("nThe CPU supports the Streaming SIMD Extensions 2");
  550.     if (features_edx & SS_FLAG)
  551. printf ("nThe CPU supports Self-Snoop");
  552.     if ((features_edx & HTT_FLAG) && 
  553. (((features_ebx >> 16) & 0x0FF) > 1))
  554. printf ("nThe CPU supports the Hyper-Threading Technology");
  555.     if (features_edx & TM_FLAG)
  556. printf ("nThe CPU supports the Thermal Monitor");
  557.     }
  558. else 
  559.     { 
  560.     printf ("t least an 80486 CPU. n"); 
  561.     printf ("It does not contain a Genuine Intel part andn");
  562.     printf ("as a result, the CPUID detection informationn"); 
  563.     printf ("cannot be determined at this time.");
  564.     }
  565.         }
  566.     printf ("n");
  567.     }
  568. /*******************************************************************************
  569. *
  570. * vxDrShow - show content of the Debug Registers 0 to 7
  571. *
  572. * This routine prints the contents of the Debug Registers 0 to 7 (DR0
  573. * through DR7) to the standard output device.  The displayed register
  574. * context is not associated with any particular task context, as this
  575. * routine will simply fetch the current content of each physical debug
  576. * register when it is called.
  577. *
  578. * Note that debug registers DR4 and DR5 are reserved when debug extensions
  579. * are enabled (when the DE flag in control register CR4 is set), and
  580. * attempts to reference the DR4 and DR5 registers cause an invalid-opcode
  581. * exception to be generated.  When debug extensions are not enabled (when
  582. * the DE flag is clear), these registers are aliased to debug registers
  583. * DR6 and DR7.
  584. *
  585. * RETURNS: N/A
  586. */
  587. void vxDrShow (void)
  588.     {
  589.     int dreg[8]; /* debug registers */
  590.     vxDrGet (&dreg[0], &dreg[1], &dreg[2], &dreg[3],
  591.           &dreg[4], &dreg[5], &dreg[6], &dreg[7]);
  592.     printf (dregFmt, dreg[0], dreg[1], dreg[2], dreg[3],
  593.           dreg[4], dreg[5], dreg[6], dreg[7]);
  594.     }
  595. /*******************************************************************************
  596. *
  597. * vxSseShow - print the contents of a task's SIMD registers
  598. *
  599. * This routine prints the contents of a task's Streaming SIMD
  600. * Extension (SSE) register context, if any, to the standard output
  601. * device.
  602. *
  603. * RETURNS: N/A
  604. */
  605. void vxSseShow
  606.     (
  607.     int taskId          /* ID of task to display SSE registers for */
  608.     )
  609.     {
  610.     const int features_edx = sysCpuId.featuresEdx;
  611.     if ((features_edx & SSE_FLAG) || (features_edx & SSE2_FLAG))
  612.         {
  613.         const FP_CONTEXT *     pFpContext;
  614.         const WIND_TCB * const pTcb = taskTcb (taskId);
  615.         if ((pTcb != NULL) && ((pFpContext = pTcb->pFpContext) != NULL))
  616.             {
  617.             const FPX_CONTEXT * const pFpxContext = &(pFpContext->u.x);
  618.             const UINT32 * pInt = (UINT32 *) &(pFpxContext->xmm[0]);
  619.             printf ("nxmm0   = %08x_%08x_%08x_%08xn",
  620.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  621.             pInt = (UINT32 *) &(pFpxContext->xmm[1]);
  622.             printf ("xmm1   = %08x_%08x_%08x_%08xn",
  623.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  624.             pInt = (UINT32 *) &(pFpxContext->xmm[2]);
  625.             printf ("xmm2   = %08x_%08x_%08x_%08xn",
  626.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  627.             pInt = (UINT32 *) &(pFpxContext->xmm[3]);
  628.             printf ("xmm3   = %08x_%08x_%08x_%08xn",
  629.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  630.             pInt = (UINT32 *) &(pFpxContext->xmm[4]);
  631.             printf ("xmm4   = %08x_%08x_%08x_%08xn",
  632.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  633.             pInt = (UINT32 *) &(pFpxContext->xmm[5]);
  634.             printf ("xmm5   = %08x_%08x_%08x_%08xn",
  635.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  636.             pInt = (UINT32 *) &(pFpxContext->xmm[6]);
  637.             printf ("xmm6   = %08x_%08x_%08x_%08xn",
  638.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  639.             pInt = (UINT32 *) &(pFpxContext->xmm[7]);
  640.             printf ("xmm7   = %08x_%08x_%08x_%08xn",
  641.                     pInt[3], pInt[2], pInt[1], pInt[0]);
  642.             return;
  643.             }
  644.         printf ("ntask does not have SIMD contextn");
  645.         return;
  646.         }
  647.     printf ("nCPU does not support SIMDn");
  648.     }