intelcpuid: A small tool for OS.h
* Takes an Intel CPUID and converts it to a number for OS.h
This commit is contained in:
parent
c84fd0f0fe
commit
d995d3c634
96
src/tools/intelcpuid.c
Normal file
96
src/tools/intelcpuid.c
Normal file
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright 2012 Haiku, Inc. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Alexander von Gluck, kallisti5@unixzen.com
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pass an Intel CPUID in hex, and get out a CPUID for OS.h
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#define INTEL_VENDOR 0x100000
|
||||
|
||||
#define EXT_FAMILY_MASK 0xF00000
|
||||
#define EXT_MODEL_MASK 0x0F0000
|
||||
#define FAMILY_MASK 0x000F00
|
||||
#define MODEL_MASK 0x0000F0
|
||||
#define STEPPING_MASK 0x00000F
|
||||
|
||||
|
||||
// Converts a hexadecimal string to integer
|
||||
static int xtoi(const char* xs, unsigned int* result)
|
||||
{
|
||||
size_t szlen = strlen(xs);
|
||||
int i, xv, fact;
|
||||
|
||||
if (szlen > 0) {
|
||||
// Converting more than 32bit hexadecimal value?
|
||||
if (szlen>8) return 2; // exit
|
||||
|
||||
// Begin conversion here
|
||||
*result = 0;
|
||||
fact = 1;
|
||||
|
||||
// Run until no more character to convert
|
||||
for (i = szlen - 1; i>=0 ;i--) {
|
||||
if (isxdigit(*(xs+i))) {
|
||||
if (*(xs+i)>=97) {
|
||||
xv = ( *(xs+i) - 97) + 10;
|
||||
} else if ( *(xs+i) >= 65) {
|
||||
xv = (*(xs+i) - 65) + 10;
|
||||
} else {
|
||||
xv = *(xs+i) - 48;
|
||||
}
|
||||
*result += (xv * fact);
|
||||
fact *= 16;
|
||||
} else {
|
||||
// Conversion was abnormally terminated
|
||||
// by non hexadecimal digit, hence
|
||||
// returning only the converted with
|
||||
// an error value 4 (illegal hex character)
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Nothing to convert
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 2) {
|
||||
printf("Provide the Intel cpuid in hex, and you will get how we id it\n");
|
||||
printf("usage: intelcpuid <cpuid_hex>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned int cpuid;
|
||||
xtoi(argv[1], &cpuid);
|
||||
|
||||
printf("cpuid: 0x%X\n", cpuid);
|
||||
|
||||
unsigned int extFam = (cpuid & EXT_FAMILY_MASK) >> 20;
|
||||
unsigned int extMod = (cpuid & EXT_MODEL_MASK) >> 16;
|
||||
unsigned int family = (cpuid & FAMILY_MASK) >> 8;
|
||||
unsigned int model = (cpuid & MODEL_MASK) >> 4;
|
||||
unsigned int stepping = (cpuid & STEPPING_MASK);
|
||||
|
||||
// Haiku INTEL cpuid format: VVEFEM
|
||||
unsigned int intelHaiku = INTEL_VENDOR + ((extFam & 0xF) << 12)
|
||||
+ (family << 8) + (extMod << 4) + model;
|
||||
|
||||
printf("Haiku CPUID: 0x%lX\n", intelHaiku);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user