@@ -38,6 +38,38 @@ print_hwcap_value (const char *label, int hwcap, unsigned long int value)
_dl_printf ("\"\n");
}
+static void
+print_cache_geometry_value (const char *label, unsigned long int geometry)
+{
+ unsigned long int assocty, line;
+
+ _dl_printf ("powerpc.cpu_features.%s=\"", label);
+
+ 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);
+ }
+ _dl_printf ("\"\n");
+}
+
void
_dl_diagnostics_cpu (void)
{
@@ -45,4 +77,21 @@ _dl_diagnostics_cpu (void)
print_hwcap_value ("hwcap2", AT_HWCAP2, GLRO(dl_hwcap2));
print_hwcap_value ("hwcap3", AT_HWCAP3, GLRO(dl_hwcap3));
print_hwcap_value ("hwcap4", AT_HWCAP4, GLRO(dl_hwcap4));
+
+ for (ElfW(auxv_t) *av = GLRO(dl_auxv); av->a_type != AT_NULL; ++av)
+ switch (av->a_type)
+ {
+ case AT_L1I_CACHEGEOMETRY:
+ print_cache_geometry_value ("l1i_cachegeometry", av->a_un.a_val);
+ break;
+ case AT_L1D_CACHEGEOMETRY:
+ print_cache_geometry_value ("l1d_cachegeometry", av->a_un.a_val);
+ break;
+ case AT_L2_CACHEGEOMETRY:
+ print_cache_geometry_value ("l2_cachegeometry", av->a_un.a_val);
+ break;
+ case AT_L3_CACHEGEOMETRY:
+ print_cache_geometry_value ("l3_cachegeometry", av->a_un.a_val);
+ break;
+ }
}
@@ -124,71 +124,6 @@ _dl_string_platform (const char *str)
return -1;
}
-#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)
-{
- switch(type)
- {
- 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:
- /* Fallback to generic output mechanism. */
- return -1;
- }
- _dl_printf ("\n");
- return 0;
-}
-#endif
+#define _dl_procinfo(type, word) -1
#endif /* dl-procinfo.h */