blob: 666dad520a613d495791960a44be0502cc226950 [file] [log] [blame]
From d8f3041c669e04d001299d45ac9273988dd4bab8 Mon Sep 17 00:00:00 2001
From: Dan Padgett <dpadgett@google.com>
Date: Thu, 24 Mar 2016 13:53:15 -0700
Subject: [PATCH 05/17] brcm auxv patch.
---
package/uclibc/uclibc-0064-brcm-auxvec.patch | 81 ++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
create mode 100644 package/uclibc/uclibc-0064-brcm-auxvec.patch
diff --git a/package/uclibc/uclibc-0064-brcm-auxvec.patch b/package/uclibc/uclibc-0064-brcm-auxvec.patch
new file mode 100644
index 0000000..4dc0310
--- /dev/null
+++ b/package/uclibc/uclibc-0064-brcm-auxvec.patch
@@ -0,0 +1,81 @@
+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 632a252..4bb36cc 100644
+--- a/libc/misc/internals/__uClibc_main.c
++++ b/libc/misc/internals/__uClibc_main.c
+@@ -28,6 +28,7 @@
+ #ifndef __ARCH_HAS_NO_LDSO__
+ #include <fcntl.h>
+ #endif
++#include <libc-internal.h>
+ #ifdef __UCLIBC_HAS_THREADS_NATIVE__
+ #include <pthread-functions.h>
+ #include <not-cancel.h>
+@@ -173,6 +174,12 @@ weak_alias (__progname_full, program_invocation_name)
+ # endif
+ #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.
+@@ -342,7 +349,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
+ {
+ #if !defined __ARCH_HAS_NO_LDSO__ && !defined SHARED
+ unsigned long *aux_dat;
+- ElfW(auxv_t) auxvt[AT_EGID + 1];
++ ElfW(auxv_t) auxvt[AT_MAX + 1];
+ #endif
+
+ #ifdef __UCLIBC_HAS_THREADS_NATIVE__
+@@ -376,7 +383,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;
+@@ -398,6 +405,9 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc,
+ __pagesize = _dl_pagesize;
+
+ #ifndef SHARED
++ __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. */
+ if ((auxvt[AT_UID].a_un.a_val == (size_t)-1 && __check_suid()) ||
--
2.8.0.rc3.226.g39d4020