}
}
+int __get_cpu_vendor(void)
+{
+ char v[16];
+ int cpuid_level;
+ memset(v, 0, 16);
+ cpuid(0x00000000, &cpuid_level,
+ (int *)&v[0],
+ (int *)&v[8],
+ (int *)&v[4]);
+ if (!strcmp(v, "GenuineIntel"))
+ return X86_VENDOR_INTEL;
+ else if (!strcmp(v, "AuthenticAMD"))
+ return X86_VENDOR_AMD;
+ else if (!strcmp(v, "CyrixInstead"))
+ return X86_VENDOR_CYRIX;
+// else if (!strcmp(v, "Geode by NSC"))
+// return X86_VENDOR_NSC;
+ else if (!strcmp(v, "UMC UMC UMC "))
+ return X86_VENDOR_UMC;
+ else if (!strcmp(v, "CentaurHauls"))
+ return X86_VENDOR_CENTAUR;
+ else if (!strcmp(v, "NexGenDriven"))
+ return X86_VENDOR_NEXGEN;
+ else if (!strcmp(v, "RiseRiseRise"))
+ return X86_VENDOR_RISE;
+ else if (!strcmp(v, "GenuineTMx86") ||
+ !strcmp(v, "TransmetaCPU"))
+ return X86_VENDOR_TRANSMETA;
+// else if (!strcmp(v, "SiS SiS SiS "))
+// return X86_VENDOR_SIS;
+ else
+ return X86_VENDOR_UNKNOWN;
+}
+
+
/*
* Find the highest page frame number we have available
*/
start = round_up(ei->addr, PAGE_SIZE);
end = round_down(ei->addr + ei->size, PAGE_SIZE);
+ if (__get_cpu_vendor() != X86_VENDOR_AMD)
+ end = round_down(min(end, 0xffffffff),PAGE_SIZE);
+
if (start >= end)
continue;
if (ei->type == E820_RAM) {