blob: 121084c5208e3dfd38d6beef63887fd3b69804a5 [file] [log] [blame]
commit c8a44ca1203244e18be053bd90b6b6df88d93d67
Author: Kevin Cernekee <cernekee@gmail.com>
Date: Wed Apr 13 19:34:46 2011 -0700
Cache AT_PLATFORM and AT_L1D_CACHESHAPE from auxvec
Allow uClibc internal functions to make optimizations at runtime, based
on the CPU type or D$ line size retrieved from the auxiliary vector.
This would nominally be used for functions like memcpy(), on processors
that do not have an unprivileged instruction along the lines of "CPUID".
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 3ac0b05..ef5ce59 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -65,6 +65,10 @@ libc_hidden_proto(__glibc_strerror_r)
/* internal access to program name */
extern const char *__uclibc_progname attribute_hidden;
+/* internal access to auxvec AT_PLATFORM, cache info */
+extern const char *__auxv_platform attribute_hidden;
+extern int __auxv_l1d_cacheshape attribute_hidden;
+
# ifdef __UCLIBC_HAS_FORTIFY__
extern void __chk_fail(void) attribute_noreturn;
libc_hidden_proto(__chk_fail)
diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
index 315365a..bc2e253 100644
--- a/libc/misc/internals/__uClibc_main.c
+++ b/libc/misc/internals/__uClibc_main.c
@@ -30,6 +30,7 @@
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
+#include <libc-internal.h>
#ifdef __UCLIBC_HAS_THREADS_NATIVE__
#include <errno.h>
#include <pthread-functions.h>
@@ -156,6 +157,12 @@ weak_alias (program_invocation_short_name, __progname)
weak_alias (program_invocation_name, __progname_full)
#endif
+/* Highest numbered auxvec entry to copy into auxvt[] */
+#define AT_MAX AT_L3_CACHESHAPE
+
+attribute_hidden const char *__auxv_platform = NULL;
+attribute_hidden int __auxv_l1d_cacheshape = 0;
+
/*
* Declare the __environ global variable and create a weak alias environ.
* This must be initialized; we cannot have a weak alias into bss.
@@ -321,7 +328,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
{
#ifndef __ARCH_HAS_NO_LDSO__
unsigned long *aux_dat;
- ElfW(auxv_t) auxvt[AT_EGID + 1];
+ ElfW(auxv_t) auxvt[AT_MAX + 1];
#endif
#ifdef __UCLIBC_HAS_THREADS_NATIVE__
@@ -355,7 +362,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
aux_dat++;
while (*aux_dat) {
ElfW(auxv_t) *auxv_entry = (ElfW(auxv_t) *) aux_dat;
- if (auxv_entry->a_type <= AT_EGID) {
+ if (auxv_entry->a_type <= AT_MAX) {
memcpy(&(auxvt[auxv_entry->a_type]), auxv_entry, sizeof(ElfW(auxv_t)));
}
aux_dat += 2;
@@ -376,6 +383,8 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
#ifndef __ARCH_HAS_NO_LDSO__
/* Make certain getpagesize() gives the correct answer */
__pagesize = (auxvt[AT_PAGESZ].a_un.a_val)? auxvt[AT_PAGESZ].a_un.a_val : PAGE_SIZE;
+ __auxv_platform = (char *)auxvt[AT_PLATFORM].a_un.a_val;
+ __auxv_l1d_cacheshape = (int)auxvt[AT_L1D_CACHESHAPE].a_un.a_val;
/* Prevent starting SUID binaries where the stdin. stdout, and
* stderr file descriptors are not already opened. */