summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_proc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_proc.cc')
-rw-r--r--winsup/cygwin/fhandler_proc.cc65
1 files changed, 32 insertions, 33 deletions
diff --git a/winsup/cygwin/fhandler_proc.cc b/winsup/cygwin/fhandler_proc.cc
index fca8265fe..d34bf3135 100644
--- a/winsup/cygwin/fhandler_proc.cc
+++ b/winsup/cygwin/fhandler_proc.cc
@@ -758,47 +758,46 @@ format_proc_cpuinfo (void *, char *&destbuf)
cache_alignment = clflush * 2;
if (is_intel)
{
- uint32_t cache_level = 0;
- uint32_t info, layout, sets;
+ extern long get_cpu_cache_intel (int sysc, uint32_t maxf);
+ long cs;
- for (int idx = 0; ; ++idx)
+ /* As on Linux, don't check for L3 cache. */
+ cs = get_cpu_cache_intel (_SC_LEVEL2_CACHE_SIZE, maxf);
+ if (cs == -1)
{
- cpuid (&info, &layout, &sets, &unused, 0x00000004, idx);
- uint32_t cache_type = (info & 0x1f);
- if (cache_type == 0)
- break;
- uint32_t cur_level = ((info >> 5) & 0x7);
- uint32_t ways = ((layout >> 22) & 0x3ff) + 1;
- uint32_t part = ((layout >> 12) & 0x3ff) + 1;
- uint32_t line = (layout & 0xfff) + 1;
- sets++;
- if (cur_level == cache_level)
- cache_size += ways * part * line * sets;
- else if (cur_level > cache_level)
- {
- cache_size = ways * part * line * sets;
- cache_level = cur_level;
- }
+ cs = get_cpu_cache_intel (_SC_LEVEL1_ICACHE_SIZE, maxf);
+ if (cs != -1)
+ cache_size = cs;
+ cs = get_cpu_cache_intel (_SC_LEVEL1_DCACHE_SIZE, maxf);
+ if (cs != -1)
+ cache_size += cs;
}
+ else
+ cache_size = cs;
if (cache_size != -1)
cache_size >>= 10;
}
- /* L2 Cache and L2 TLB Identifiers. */
- if (cache_size == -1 && maxe >= 0x80000006)
- {
- uint32_t l2;
- cpuid (&unused, &unused, &l2, &unused, 0x80000006);
-
- cache_size = l2 >> 16;
- }
- /* L1 Cache and TLB Identifiers. */
- if (cache_size == -1 && maxe >= 0x80000005)
+ else if (is_amd)
{
- uint32_t data_cache, inst_cache;
- cpuid (&unused, &unused, &data_cache, &inst_cache,
- 0x80000005);
+ extern long get_cpu_cache_amd (int sysc, uint32_t maxe);
+ long cs;
- cache_size = (inst_cache >> 24) + (data_cache >> 24);
+ cs = get_cpu_cache_amd (_SC_LEVEL3_CACHE_SIZE, maxe);
+ if (cs == -1)
+ cs = get_cpu_cache_amd (_SC_LEVEL2_CACHE_SIZE, maxe);
+ if (cs == -1)
+ {
+ cs = get_cpu_cache_amd (_SC_LEVEL1_ICACHE_SIZE, maxe);
+ if (cs != -1)
+ cache_size = cs;
+ cs = get_cpu_cache_amd (_SC_LEVEL1_DCACHE_SIZE, maxe);
+ if (cs != -1)
+ cache_size += cs;
+ }
+ else
+ cache_size = cs;
+ if (cache_size != -1)
+ cache_size >>= 10;
}
bufptr += __small_sprintf (bufptr, "cpu family\t: %d\n"
"model\t\t: %d\n"