Support x86_64 in sysinfo.

Just changed all #ifdef __INTEL__ to __INTEL__ || __x86_64__, and
fixed all the printf format strings. The CPU detection code all
works the same.
This commit is contained in:
Alex Smith
2012-07-30 21:34:05 +01:00
parent 9be774b553
commit 533f3bb494
2 changed files with 54 additions and 41 deletions
+7 -7
View File
@@ -34,7 +34,7 @@ get_cpu_vendor_string(enum cpu_types type)
/* We're not that nice here. */ /* We're not that nice here. */
return "IBM/Motorola"; return "IBM/Motorola";
#endif #endif
#if __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
/* Determine x86 vendor name */ /* Determine x86 vendor name */
switch (type & B_CPU_x86_VENDOR_MASK) { switch (type & B_CPU_x86_VENDOR_MASK) {
case B_CPU_INTEL_x86: case B_CPU_INTEL_x86:
@@ -60,7 +60,7 @@ get_cpu_vendor_string(enum cpu_types type)
} }
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
/* Parameter 'name' needs to point to an allocated array of 49 characters. */ /* Parameter 'name' needs to point to an allocated array of 49 characters. */
void void
get_cpuid_model_string(char *name) get_cpuid_model_string(char *name)
@@ -115,16 +115,16 @@ get_cpuid_model_string(char *name)
} }
} }
} }
#endif /* __INTEL__ */ #endif /* __INTEL__ || __x86_64__ */
const char * const char *
get_cpu_model_string(system_info *info) get_cpu_model_string(system_info *info)
{ {
#if __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
char cpuidName[49]; char cpuidName[49];
/* for use with get_cpuid_model_string() */ /* for use with get_cpuid_model_string() */
#endif /* __INTEL__ */ #endif /* __INTEL__ || __x86_64__ */
/* Determine CPU type */ /* Determine CPU type */
switch (info->cpu_type) { switch (info->cpu_type) {
@@ -140,7 +140,7 @@ get_cpu_model_string(system_info *info)
case B_CPU_PPC_604e: case B_CPU_PPC_604e:
return "604e"; return "604e";
#endif /* __POWERPC__ */ #endif /* __POWERPC__ */
#if __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
case B_CPU_x86: case B_CPU_x86:
return "Unknown x86"; return "Unknown x86";
@@ -342,7 +342,7 @@ get_cpu_model_string(system_info *info)
/* National Semiconductor */ /* National Semiconductor */
case B_CPU_NATIONAL_GEODE_GX1: case B_CPU_NATIONAL_GEODE_GX1:
return "Geode GX1"; return "Geode GX1";
#endif /* __INTEL__ */ #endif /* __INTEL__ || __x86_64__ */
default: default:
return NULL; return NULL;
+47 -34
View File
@@ -17,7 +17,7 @@
// ToDo: -disable_cpu_sn option is not yet implemented // ToDo: -disable_cpu_sn option is not yet implemented
// ToDo: most of this file should go into an architecture dependent source file // ToDo: most of this file should go into an architecture dependent source file
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
struct cache_description { struct cache_description {
uint8 code; uint8 code;
@@ -210,7 +210,7 @@ print_intel_cache_descriptors(enum cpu_types type, cpuid_info *info)
} }
} }
#endif // __INTEL__ #endif // __INTEL__ || __x86_64__
static void static void
@@ -245,14 +245,15 @@ print_level2_cache(uint32 reg, const char *name)
uint32 linesPerTag = (reg >> 8) & 0xf; // intel does not define this uint32 linesPerTag = (reg >> 8) & 0xf; // intel does not define this
uint32 lineSize = reg & 0xff; uint32 lineSize = reg & 0xff;
printf("\t%s: %lu KB, ", name, size); printf("\t%s: %" B_PRIu32 " KB, ", name, size);
if (ways == 0xf) if (ways == 0xf)
printf("fully associative, "); printf("fully associative, ");
else if (ways == 0x1) else if (ways == 0x1)
printf("direct-mapped, "); printf("direct-mapped, ");
else else
printf("%lu-way set associative, ", 1UL << (ways / 2)); printf("%lu-way set associative, ", 1UL << (ways / 2));
printf("%lu lines/tag, %lu bytes/line\n", linesPerTag, lineSize); printf("%" B_PRIu32 " lines/tag, %" B_PRIu32 " bytes/line\n", linesPerTag,
lineSize);
} }
@@ -264,16 +265,17 @@ print_level1_cache(uint32 reg, const char *name)
uint32 linesPerTag = (reg >> 8) & 0xff; uint32 linesPerTag = (reg >> 8) & 0xff;
uint32 lineSize = reg & 0xff; uint32 lineSize = reg & 0xff;
printf("\t%s: %lu KB, ", name, size); printf("\t%s: %" B_PRIu32 " KB, ", name, size);
if (ways == 0xff) if (ways == 0xff)
printf("fully associative, "); printf("fully associative, ");
else else
printf("%lu-way set associative, ", ways); printf("%" B_PRIu32 "-way set associative, ", ways);
printf("%lu lines/tag, %lu bytes/line\n", linesPerTag, lineSize); printf("%" B_PRIu32 " lines/tag, %" B_PRIu32 " bytes/line\n", linesPerTag,
lineSize);
} }
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
static void static void
print_cache_desc(int32 cpu) print_cache_desc(int32 cpu)
@@ -315,7 +317,7 @@ print_intel_cache_desc(int32 cpu)
uint32 sets = info.regs.ecx; uint32 sets = info.regs.ecx;
printf("\tL%ld ",level); printf("\tL%" B_PRId32 " ",level);
switch (type) { switch (type) {
case 1: printf("Data cache "); break; case 1: printf("Data cache "); break;
@@ -327,8 +329,9 @@ print_intel_cache_desc(int32 cpu)
if (isFullyAssoc) if (isFullyAssoc)
printf("fully associative, "); printf("fully associative, ");
else else
printf("%lu-way set associative, ", ways); printf("%" B_PRIu32 "-way set associative, ", ways);
printf("%lu lines/tag, %lu bytes/line\n", linesPerTag, lineSize); printf("%" B_PRIu32 " lines/tag, %" B_PRIu32 " bytes/line\n", linesPerTag,
lineSize);
get_cpuid(&info, 0x80000006, cpu); get_cpuid(&info, 0x80000006, cpu);
print_level2_cache(sets, "L2 cache"); print_level2_cache(sets, "L2 cache");
@@ -342,7 +345,7 @@ print_transmeta_features(uint32 features)
printf("\t\tFCMOV\n"); printf("\t\tFCMOV\n");
} }
#endif // __INTEL__ #endif // __INTEL__ || __x86_64__
static void static void
@@ -456,14 +459,15 @@ print_features(uint32 features)
} }
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
static void static void
print_processor_signature(system_info *sys_info, cpuid_info *info, const char *prefix) print_processor_signature(system_info *sys_info, cpuid_info *info, const char *prefix)
{ {
if ((sys_info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_AMD_x86) { if ((sys_info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_AMD_x86) {
printf("\t%s%sype %lu, family %lu, model %u, stepping %lu, features 0x%08lx\n", printf("\t%s%sype %" B_PRIu32 ", family %" B_PRIu32 ", model %u, "
"stepping %" B_PRIu32 ", features 0x%08" B_PRIx32 "\n",
prefix ? prefix : "", prefix && prefix[0] ? "t" : "T", prefix ? prefix : "", prefix && prefix[0] ? "t" : "T",
info->eax_1.type, info->eax_1.type,
info->eax_1.family + (info->eax_1.family == 0xf ? info->eax_1.extended_family : 0), info->eax_1.family + (info->eax_1.family == 0xf ? info->eax_1.extended_family : 0),
@@ -472,7 +476,8 @@ print_processor_signature(system_info *sys_info, cpuid_info *info, const char *p
info->eax_1.features); info->eax_1.features);
} else if ((sys_info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_INTEL_x86) { } else if ((sys_info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_INTEL_x86) {
// model calculation is different for INTEL // model calculation is different for INTEL
printf("\t%s%sype %lu, family %lu, model %u, stepping %lu, features 0x%08lx\n", printf("\t%s%sype %" B_PRIu32 ", family %" B_PRIu32 ", model %u, "
"stepping %" B_PRIu32 ", features 0x%08" B_PRIx32 "\n",
prefix ? prefix : "", prefix && prefix[0] ? "t" : "T", prefix ? prefix : "", prefix && prefix[0] ? "t" : "T",
info->eax_1.type, info->eax_1.type,
info->eax_1.family + (info->eax_1.family == 0xf ? info->eax_1.extended_family : 0), info->eax_1.family + (info->eax_1.family == 0xf ? info->eax_1.extended_family : 0),
@@ -482,7 +487,7 @@ print_processor_signature(system_info *sys_info, cpuid_info *info, const char *p
} }
} }
#endif // __INTEL__ #endif // __INTEL__ || __x86_64__
static void static void
@@ -495,7 +500,7 @@ dump_platform(system_info *info)
} }
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
static void static void
dump_cpu(system_info *info, int32 cpu) dump_cpu(system_info *info, int32 cpu)
@@ -551,15 +556,15 @@ dump_cpu(system_info *info, int32 cpu)
// the BIOS may not have set the processor name // the BIOS may not have set the processor name
if (name[0]) if (name[0])
printf("CPU #%ld: \"%s\"\n", cpu, name); printf("CPU #%" B_PRId32 ": \"%s\"\n", cpu, name);
else { else {
// Intel CPUs don't seem to have the genuine vendor field // Intel CPUs don't seem to have the genuine vendor field
printf("CPU #%ld: %.12s\n", cpu, printf("CPU #%" B_PRId32 ": %.12s\n", cpu,
(info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_INTEL_x86 ? (info->cpu_type & B_CPU_x86_VENDOR_MASK) == B_CPU_INTEL_x86 ?
baseInfo.eax_0.vendor_id : cpuInfo.eax_0.vendor_id); baseInfo.eax_0.vendor_id : cpuInfo.eax_0.vendor_id);
} }
} else { } else {
printf("CPU #%ld: %.12s\n", cpu, baseInfo.eax_0.vendor_id); printf("CPU #%" B_PRId32 ": %.12s\n", cpu, baseInfo.eax_0.vendor_id);
if (maxStandardFunction == 0) if (maxStandardFunction == 0)
return; return;
} }
@@ -570,7 +575,7 @@ dump_cpu(system_info *info, int32 cpu)
if (maxStandardFunction >= 1) { if (maxStandardFunction >= 1) {
/* Extended features */ /* Extended features */
printf("\tExtended Intel: 0x%08lx\n", cpuInfo.eax_1.extended_features); printf("\tExtended Intel: 0x%08" B_PRIx32 "\n", cpuInfo.eax_1.extended_features);
print_extended_features(cpuInfo.eax_1.extended_features); print_extended_features(cpuInfo.eax_1.extended_features);
} }
@@ -619,7 +624,8 @@ dump_cpu(system_info *info, int32 cpu)
if (flagsInfo.eax_1.features & (1UL << 18)) { if (flagsInfo.eax_1.features & (1UL << 18)) {
get_cpuid(&cpuInfo, 3, cpu); get_cpuid(&cpuInfo, 3, cpu);
printf("Serial number: %04lx-%04lx-%04lx-%04lx-%04lx-%04lx\n", printf("Serial number: %04" B_PRIx32 "-%04" B_PRIx32 "-%04" B_PRIx32
"-%04" B_PRIx32 "-%04" B_PRIx32 "-%04" B_PRIx32 "\n",
flagsInfo.eax_1.features >> 16, flagsInfo.eax_1.features & 0xffff, flagsInfo.eax_1.features >> 16, flagsInfo.eax_1.features & 0xffff,
cpuInfo.regs.edx >> 16, cpuInfo.regs.edx & 0xffff, cpuInfo.regs.edx >> 16, cpuInfo.regs.edx & 0xffff,
cpuInfo.regs.ecx >> 16, cpuInfo.regs.edx & 0xffff); cpuInfo.regs.ecx >> 16, cpuInfo.regs.edx & 0xffff);
@@ -629,7 +635,7 @@ dump_cpu(system_info *info, int32 cpu)
putchar('\n'); putchar('\n');
} }
#endif // __INTEL__ #endif // __INTEL__ || __x86_64__
static void static void
@@ -646,28 +652,30 @@ dump_cpus(system_info *info)
snprintf(modelString, 32, "(Unknown %x)", info->cpu_type); snprintf(modelString, 32, "(Unknown %x)", info->cpu_type);
} }
printf("%ld %s%s%s, revision %04lx running at %LdMHz (ID: 0x%08lx 0x%08lx)\n\n", printf("%" B_PRId32 " %s%s%s, revision %04" B_PRIx32 " running at %"
B_PRId64 "MHz (ID: 0x%08" B_PRIx32 " 0x%08" B_PRIx32 ")\n\n",
info->cpu_count, info->cpu_count,
vendor ? vendor : "", vendor ? " " : "", model, vendor ? vendor : "", vendor ? " " : "", model,
info->cpu_revision, info->cpu_revision,
info->cpu_clock_speed / 1000000, info->cpu_clock_speed / 1000000,
info->id[0], info->id[1]); info->id[0], info->id[1]);
#ifdef __INTEL__ #if defined(__INTEL__) || defined(__x86_64__)
for (int32 cpu = 0; cpu < info->cpu_count; cpu++) for (int32 cpu = 0; cpu < info->cpu_count; cpu++)
dump_cpu(info, cpu); dump_cpu(info, cpu);
#endif // __INTEL__ #endif // __INTEL__ || __x86_64__
} }
static void static void
dump_mem(system_info *info) dump_mem(system_info *info)
{ {
printf("%10lu bytes free (used/max %10lu / %10lu)\n", printf("%10" B_PRIu32 " bytes free (used/max %10" B_PRIu32 " / %10"
B_PRIu32 ")\n",
B_PAGE_SIZE * (uint32)(info->max_pages - info->used_pages), B_PAGE_SIZE * (uint32)(info->max_pages - info->used_pages),
B_PAGE_SIZE * (uint32)info->used_pages, B_PAGE_SIZE * (uint32)info->used_pages,
B_PAGE_SIZE * (uint32)info->max_pages); B_PAGE_SIZE * (uint32)info->max_pages);
printf(" (cached %10lu)\n", printf(" (cached %10" B_PRIu32 ")\n",
B_PAGE_SIZE * (uint32)info->cached_pages); B_PAGE_SIZE * (uint32)info->cached_pages);
} }
@@ -675,7 +683,8 @@ dump_mem(system_info *info)
static void static void
dump_sem(system_info *info) dump_sem(system_info *info)
{ {
printf("%10ld semaphores free (used/max %10ld / %10ld)\n", printf("%10" B_PRId32 " semaphores free (used/max %10" B_PRId32 " / %10"
B_PRId32 ")\n",
info->max_sems - info->used_sems, info->max_sems - info->used_sems,
info->used_sems, info->max_sems); info->used_sems, info->max_sems);
} }
@@ -684,7 +693,8 @@ dump_sem(system_info *info)
static void static void
dump_ports(system_info *info) dump_ports(system_info *info)
{ {
printf("%10ld ports free (used/max %10ld / %10ld)\n", printf("%10" B_PRId32 " ports free (used/max %10" B_PRId32 " / %10"
B_PRId32 ")\n",
info->max_ports - info->used_ports, info->max_ports - info->used_ports,
info->used_ports, info->max_ports); info->used_ports, info->max_ports);
} }
@@ -693,7 +703,8 @@ dump_ports(system_info *info)
static void static void
dump_thread(system_info *info) dump_thread(system_info *info)
{ {
printf("%10ld threads free (used/max %10ld / %10ld)\n", printf("%10" B_PRId32 " threads free (used/max %10" B_PRId32 " / %10"
B_PRId32 ")\n",
info->max_threads - info->used_threads, info->max_threads - info->used_threads,
info->used_threads, info->max_threads); info->used_threads, info->max_threads);
} }
@@ -702,7 +713,8 @@ dump_thread(system_info *info)
static void static void
dump_team(system_info *info) dump_team(system_info *info)
{ {
printf("%10ld teams free (used/max %10ld / %10ld)\n", printf("%10" B_PRId32 " teams free (used/max %10" B_PRId32 " / %10"
B_PRId32 ")\n",
info->max_teams - info->used_teams, info->max_teams - info->used_teams,
info->used_teams, info->max_teams); info->used_teams, info->max_teams);
} }
@@ -711,7 +723,7 @@ dump_team(system_info *info)
static void static void
dump_kinfo(system_info *info) dump_kinfo(system_info *info)
{ {
printf("Kernel name: %s built on: %s %s version 0x%Lx\n", printf("Kernel name: %s built on: %s %s version 0x%" B_PRIx64 "\n",
info->kernel_name, info->kernel_name,
info->kernel_build_date, info->kernel_build_time, info->kernel_build_date, info->kernel_build_time,
info->kernel_version ); info->kernel_version );
@@ -752,7 +764,8 @@ main(int argc, char *argv[])
const char *opt = argv[i]; const char *opt = argv[i];
if (strncmp(opt, "-id", strlen(opt)) == 0) { if (strncmp(opt, "-id", strlen(opt)) == 0) {
/* note: the original also assumes this option on "sysinfo -" */ /* note: the original also assumes this option on "sysinfo -" */
printf("0x%.8lx 0x%.8lx\n", info.id[0], info.id[1]); printf("0x%.8" B_PRIx32 " 0x%.8" B_PRIx32 "\n", info.id[0],
info.id[1]);
} else if (strncmp(opt, "-cpu", strlen(opt)) == 0) { } else if (strncmp(opt, "-cpu", strlen(opt)) == 0) {
dump_cpus(&info); dump_cpus(&info);
} else if (strncmp(opt, "-mem", strlen(opt)) == 0) { } else if (strncmp(opt, "-mem", strlen(opt)) == 0) {