static int get_vendor(void){
int eax, ebx, ecx, edx;
- char vendor[13];
+
+ union
+ {
+ char vchar[16];
+ int vint[4];
+ } vendor;
cpuid(0, &eax, &ebx, &ecx, &edx);
-
- *(int *)(&vendor[0]) = ebx;
- *(int *)(&vendor[4]) = edx;
- *(int *)(&vendor[8]) = ecx;
- vendor[12] = (char)0;
- if (!strcmp(vendor, "GenuineIntel")) return VENDOR_INTEL;
- if (!strcmp(vendor, "AuthenticAMD")) return VENDOR_AMD;
- if (!strcmp(vendor, "CentaurHauls")) return VENDOR_CENTAUR;
+ *(&vendor.vint[0]) = ebx;
+ *(&vendor.vint[1]) = edx;
+ *(&vendor.vint[2]) = ecx;
+
+ vendor.vchar[12] = '\0';
+
+ if (!strcmp(vendor.vchar, "GenuineIntel")) return VENDOR_INTEL;
+ if (!strcmp(vendor.vchar, "AuthenticAMD")) return VENDOR_AMD;
+ if (!strcmp(vendor.vchar, "CentaurHauls")) return VENDOR_CENTAUR;
if ((eax == 0) || ((eax & 0x500) != 0)) return VENDOR_INTEL;
if (family <= 0xe) {
// Verify that CPU has 3dnow and 3dnowext before claiming it is Athlon
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
- if (eax & 0xffff >= 0x01) {
+ if ( (eax & 0xffff) >= 0x01) {
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
if ((edx & (1 << 30)) == 0 || (edx & (1 << 31)) == 0)
return NULL;