summary refs log tree commit diff
path: root/sysdeps/powerpc
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2018-12-19 19:03:12 -0200
committerTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2018-12-19 19:08:02 -0200
commit1616d034b61622836d3a36af53dcfca7624c844e (patch)
tree726bc44d1290e06f31f2ee84d813403176cc9fe3 /sysdeps/powerpc
parent61595e3d36ded374f97961503e843a314b0203c2 (diff)
downloadglibc-1616d034b61622836d3a36af53dcfca7624c844e.tar.gz
glibc-1616d034b61622836d3a36af53dcfca7624c844e.tar.xz
glibc-1616d034b61622836d3a36af53dcfca7624c844e.zip
Print cache size and geometry auxv types on LD_SHOW_AUXV=1
Add support for AT_L1I_CACHESIZE, AT_L1I_CACHEGEOMETRY,
AT_L1D_CACHESIZE, AT_L1D_CACHEGEOMETRY, AT_L2_CACHESIZE,
AT_L2_CACHEGEOMETRY, AT_L3_CACHESIZE and AT_L3_CACHEGEOMETRY when
LD_SHOW_AUXV=1.

AT_L*_CACHESIZE is printed as decimal and represent the number of
bytes of the cache.

AT_L*_CACHEGEOMETRY is treated in order to specify the cache line size
and its associativity.

Example output from a POWER8:

AT_L1I_CACHESIZE:     32768
AT_L1I_CACHEGEOMETRY: 128B line size, 8-way set associative
AT_L1D_CACHESIZE:     65536
AT_L1D_CACHEGEOMETRY: 128B line size, 8-way set associative
AT_L2_CACHESIZE:      524288
AT_L2_CACHEGEOMETRY:  128B line size, 8-way set associative
AT_L3_CACHESIZE:      8388608
AT_L3_CACHEGEOMETRY:  128B line size, 8-way set associative

Some of the new types are longer than the previous ones, requiring to
increase the indentation in order to keep the values aligned.

	* elf/dl-sysdep.c (auxvars): Add AT_L1I_CACHESIZE,
	AT_L1I_CACHEGEOMETRY, AT_L1D_CACHESIZE, AT_L1D_CACHEGEOMETRY,
	AT_L2_CACHESIZE, AT_L2_CACHEGEOMETRY, AT_L3_CACHESIZE and
	AT_L3_CACHEGEOMETRY.  Fix indentation when printing the other
	fields.
	(_dl_show_auxv): Give a special treatment to
	AT_L1I_CACHEGEOMETRY, AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY
	and AT_L3_CACHEGEOMETRY.
	* sysdeps/powerpc/dl-procinfo.h (cache_geometry): New function.
	(_dl_procinfo): Fix indentation when printing AT_HWCAP and
	AT_HWCAP2.  Add support for AT_L1I_CACHEGEOMETRY,
	AT_L1D_CACHEGEOMETRY, AT_L2_CACHEGEOMETRY and AT_L3_CACHEGEOMETRY.

Signed-off-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r--sysdeps/powerpc/dl-procinfo.h55
1 files changed, 53 insertions, 2 deletions
diff --git a/sysdeps/powerpc/dl-procinfo.h b/sysdeps/powerpc/dl-procinfo.h
index 3803379ab2..34bf80de9f 100644
--- a/sysdeps/powerpc/dl-procinfo.h
+++ b/sysdeps/powerpc/dl-procinfo.h
@@ -147,6 +147,37 @@ _dl_string_platform (const char *str)
 }
 
 #if IS_IN (rtld)
+static inline void
+cache_geometry (const char * name, unsigned long int geometry)
+{
+  unsigned long int assocty, line;
+
+  _dl_printf ("%s", name);
+
+  line = geometry & 0xffff;
+  assocty = (geometry >> 16) & 0xffff;
+
+  if (line == 0)
+    _dl_printf ("Unknown line size, ");
+  else
+    _dl_printf ("%luB line size, ", line);
+
+  switch (assocty)
+    {
+    case 0:
+      _dl_printf ("Unknown associativity");
+      break;
+    case 1:
+      _dl_printf ("Directly mapped");
+      break;
+    case 0xffff:
+      _dl_printf ("Fully associative");
+      break;
+    default:
+      _dl_printf ("%lu-way set associative", assocty);
+    }
+}
+
 static inline int
 __attribute__ ((unused))
 _dl_procinfo (unsigned int type, unsigned long int word)
@@ -154,7 +185,7 @@ _dl_procinfo (unsigned int type, unsigned long int word)
   switch(type)
     {
     case AT_HWCAP:
-      _dl_printf ("AT_HWCAP:       ");
+      _dl_printf ("AT_HWCAP:            ");
 
       for (int i = 0; i <= _DL_HWCAP_LAST; ++i)
        if (word & (1 << i))
@@ -164,7 +195,7 @@ _dl_procinfo (unsigned int type, unsigned long int word)
       {
        unsigned int offset = _DL_HWCAP_LAST + 1;
 
-       _dl_printf ("AT_HWCAP2:      ");
+       _dl_printf ("AT_HWCAP2:           ");
 
         /* We have to go through them all because the kernel added the
           AT_HWCAP2 features starting with the high bits.  */
@@ -173,6 +204,26 @@ _dl_procinfo (unsigned int type, unsigned long int word)
            _dl_printf (" %s", _dl_hwcap_string (offset + i));
        break;
       }
+    case AT_L1I_CACHEGEOMETRY:
+      {
+	cache_geometry ("AT_L1I_CACHEGEOMETRY: ", word);
+	break;
+      }
+    case AT_L1D_CACHEGEOMETRY:
+      {
+	cache_geometry ("AT_L1D_CACHEGEOMETRY: ", word);
+	break;
+      }
+    case AT_L2_CACHEGEOMETRY:
+      {
+	cache_geometry ("AT_L2_CACHEGEOMETRY:  ", word);
+	break;
+      }
+    case AT_L3_CACHEGEOMETRY:
+      {
+	cache_geometry ("AT_L3_CACHEGEOMETRY:  ", word);
+	break;
+      }
     default:
       /* This should not happen.  */
       return -1;