Logo Search packages:      
Sourcecode: x86info version File versions  Download package

identify.c

/*
 *  $Id: identify.c,v 1.28 2003/11/04 02:02:43 davej Exp $
 *  This file is part of x86info.
 *  (C) 2001 Dave Jones.
 *
 *  Licensed under the terms of the GNU GPL License version 2.
 *
 */

#include <stdio.h>
#include "x86info.h"

void identify(struct cpudata *cpu)
{
      unsigned long maxi, maxei, vendor;

      cpuid(cpu->number, 0, &maxi, &vendor, NULL, NULL);
      maxi &= 0xffff;         /* The high-order word is non-zero on some Cyrix CPUs */
      cpu->maxi = maxi;

      cpuid(cpu->number, 0x80000000, &maxei, NULL, NULL, NULL);
      cpu->maxei = maxei;

      cpuid(cpu->number, 0xC0000000, &maxei, NULL, NULL, NULL);
      cpu->maxei2 = maxei;

      switch (vendor) {
      case 0x756e6547:  /* Intel */
            Identify_Intel(cpu);
            break;
      case 0x68747541:  /* AMD */
            Identify_AMD(cpu);
            break;
      case 0x69727943:  /* Cyrix */
            Identify_Cyrix(cpu);
            break;
      case 0x746e6543:  /* IDT */
            Identify_IDT(cpu);
            break;
      case 0x646f6547:  /* Natsemi Geode */
            Identify_NatSemi(cpu);
            break;
      case 0x52697365:  /* Rise This should be checked. Why 2 ? */
      case 0x65736952:  /* Rise */
            Identify_RiSE(cpu);
            break;
      case 0x20536953:  /* SiS */
            Identify_SiS(cpu);
            break;
      default:
            printf("Unknown vendor (%lx)\n", vendor);
            return;
      }
}

static void dumpregs (int cpunum, unsigned int begin, unsigned int end)
{
      unsigned int i;
      unsigned long eax, ebx, ecx, edx;

      /* Dump all the CPUID results in raw hex */
      for (i=begin; i<=end; i++) {
            cpuid (cpunum, i, &eax, &ebx, &ecx, &edx);
            printf ("eax in: 0x%08x, eax = %08lx ebx = %08lx ecx = %08lx edx = %08lx\n", i, eax, ebx, ecx, edx);
      }
      printf ("\n");
}

void show_info(struct cpudata *cpu)
{
      if (silent)
            return;

      if (show_registers) {
            dumpregs (cpu->number, 0, cpu->maxi);
            if (cpu->maxei >=0x80000000)
                  dumpregs (cpu->number, 0x80000000, cpu->maxei);

            if (cpu->maxei2 >=0xC0000000)
                  dumpregs (cpu->number, 0xC0000000, cpu->maxei2);
      }

      switch (cpu->vendor) {
      case VENDOR_AMD:
            display_AMD_info(cpu);
            break;

      case VENDOR_CYRIX:
            display_Cyrix_info(cpu);
            break;

      case VENDOR_CENTAUR:
            display_IDT_info(cpu);
            break;

      case VENDOR_INTEL:
            display_Intel_info(cpu);
            break;

      case VENDOR_NATSEMI:
            display_NatSemi_info(cpu);
            break;

      case VENDOR_RISE:
            display_RiSE_info(cpu);
            break;

      case VENDOR_SIS:
            display_SiS_info(cpu);
            break;

      default:
            break;
      }

      if (show_connector)
            decode_connector (cpu->connector);

      if (show_urls) {
            if (cpu->datasheet_url != NULL)
                  printf ("Datasheet: %s\n", cpu->datasheet_url);

            if (cpu->errata_url != NULL)
                  printf ("Errata: %s\n", cpu->errata_url);

            printf ("\n");
      }

      if (!user_is_root)
            return;

      if (show_mtrr)
            dump_mtrrs(cpu);
}


Generated by  Doxygen 1.6.0   Back to index