Index: headers/os/kernel/OS.h
===================================================================
--- headers/os/kernel/OS.h	(revision 33430)
+++ headers/os/kernel/OS.h	(working copy)
@@ -482,8 +482,10 @@
 	B_CPU_INTEL_PENTIUM_M_MODEL_13		= 0x106d, /* Dothan */
 	B_CPU_INTEL_PENTIUM_CORE,
 	B_CPU_INTEL_PENTIUM_CORE_2,
-	B_CPU_INTEL_PENTIUM_CORE_2_EXTREME	= 0x11067, /* Core 2 Extreme or Xeon
-	                                                   model 23 on 45 nm */
+	B_CPU_INTEL_PENTIUM_CORE_2_45_NM	= 0x11067, /* Core 2 on 45 nm
+	                                                   (Core 2 Extreme,
+	                                                   Xeon model 23 or
+	                                                   Core 2 Duo/Quad) */
 	B_CPU_INTEL_PENTIUM_CORE_I7		= 0x1106a, /* Core i7 920 @ 2.6(6) */
 	B_CPU_INTEL_PENTIUM_IV				= 0x10f0,
 	B_CPU_INTEL_PENTIUM_IV_MODEL_1,
Index: headers/private/shared/cpu_type.h
===================================================================
--- headers/private/shared/cpu_type.h	(revision 33430)
+++ headers/private/shared/cpu_type.h	(working copy)
@@ -60,9 +60,68 @@
 }
 
 
+#ifdef __INTEL__
+/* parameter 'name' needs to point to an allocated array of 49 characters */
+void
+get_cpuid_model_string(char *name)
+{
+	/* references:
+	 *
+	 * http://grafi.ii.pw.edu.pl/gbm/x86/cpuid.html
+	 * http://www.sandpile.org/ia32/cpuid.htm
+	 * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/TN13.pdf (Duron erratum)
+	 */
+
+	cpuid_info baseInfo;
+	cpuid_info cpuInfo;
+	int32 maxStandardFunction, maxExtendedFunction = 0;
+
+	memset(name, 0, 49*sizeof(char));
+
+	if (get_cpuid(&baseInfo, 0, 0) != B_OK) {
+		// this CPU doesn't support cpuid
+		return;
+	}
+
+	maxStandardFunction = baseInfo.eax_0.max_eax;
+	if (maxStandardFunction >= 500)
+		maxStandardFunction = 0; /* old Pentium sample chips has cpu signature here */
+
+	/* Extended cpuid */
+
+	get_cpuid(&cpuInfo, 0x80000000, 0); /* hardcoded to CPU 0 */
+
+	// extended cpuid is only supported if max_eax is greater than the service id
+	if (cpuInfo.eax_0.max_eax > 0x80000000)
+		maxExtendedFunction = cpuInfo.eax_0.max_eax & 0xff;
+
+	if (maxExtendedFunction >=4 ) {
+		int32 i;
+		
+		for (i = 0; i < 3; i++) {
+			cpuid_info nameInfo;
+			get_cpuid(&nameInfo, 0x80000002 + i, 0);
+
+			memcpy(name, &nameInfo.regs.eax, 4);
+			memcpy(name + 4, &nameInfo.regs.ebx, 4);
+			memcpy(name + 8, &nameInfo.regs.ecx, 4);
+			memcpy(name + 12, &nameInfo.regs.edx, 4);
+			name += 16;
+		}
+	}
+
+	return;
+}
+#endif	// __INTEL__
+
+
 const char *
 get_cpu_model_string(system_info *info)
 {
+#if __INTEL__
+	char cpuid_name[49]; /* for use with get_cpuid_model_string() */
+#endif	// __INTEL__
+
 	// Determine CPU type
 	switch (info->cpu_type) {
 #if __POWERPC__
@@ -106,22 +165,42 @@
 			return "Pentium III";
 		case B_CPU_INTEL_PENTIUM_M:
 		case B_CPU_INTEL_PENTIUM_M_MODEL_13:
+			get_cpuid_model_string(cpuid_name);
+			if (strcasestr(cpuid_name, "Celeron") != NULL)
+				return "Pentium M Celeron";
 			return "Pentium M";
 		case B_CPU_INTEL_ATOM:
 			return "Atom";
 		case B_CPU_INTEL_PENTIUM_CORE:
 			return "Core";
 		case B_CPU_INTEL_PENTIUM_CORE_2:
+			get_cpuid_model_string(cpuid_name);
+			if (strcasestr(cpuid_name, "Xeon") != NULL)
+				return "Core 2 Xeon";
 			return "Core 2";
-		case B_CPU_INTEL_PENTIUM_CORE_2_EXTREME:
+		case B_CPU_INTEL_PENTIUM_CORE_2_45_NM:
+			get_cpuid_model_string(cpuid_name);
+			if (strcasestr(cpuid_name, "Duo") != NULL ||
+				strcasestr(cpuid_name, "Quad") != NULL)
+				return "Core 2";
+			if (strcasestr(cpuid_name, "Xeon") != NULL)
+				return "Core 2 Xeon";
 			return "Core 2 Extreme";
 		case B_CPU_INTEL_PENTIUM_CORE_I7:
+			get_cpuid_model_string(cpuid_name);
+			if (strcasestr(cpuid_name, "Xeon") != NULL)
+				return "Core i7 Xeon";
 			return "Core i7";
 		case B_CPU_INTEL_PENTIUM_IV:
 		case B_CPU_INTEL_PENTIUM_IV_MODEL_1:
 		case B_CPU_INTEL_PENTIUM_IV_MODEL_2:
 		case B_CPU_INTEL_PENTIUM_IV_MODEL_3:		
 		case B_CPU_INTEL_PENTIUM_IV_MODEL_4:
+			get_cpuid_model_string(cpuid_name);
+			if (strcasestr(cpuid_name, "Celeron") != NULL)
+				return "Pentium 4 Celeron";
+			if (strcasestr(cpuid_name, "Xeon") != NULL)
+				return "Pentium 4 Xeon";
 			return "Pentium 4";
 
 		/* AMD */
