From 1616d034b61622836d3a36af53dcfca7624c844e Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Wed, 19 Dec 2018 19:03:12 -0200 Subject: 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 --- sysdeps/powerpc/dl-procinfo.h | 55 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) (limited to 'sysdeps/powerpc') 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; -- cgit 1.4.1