aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/sys-ppc/miscthings.c
diff options
context:
space:
mode:
authorroot <root@artemis.panaceas.org>2015-12-25 04:40:36 +0000
committerroot <root@artemis.panaceas.org>2015-12-25 04:40:36 +0000
commit849369d6c66d3054688672f97d31fceb8e8230fb (patch)
tree6135abc790ca67dedbe07c39806591e70eda81ce /arch/um/sys-ppc/miscthings.c
downloadlinux-3.0.35-kobo-849369d6c66d3054688672f97d31fceb8e8230fb.tar.gz
linux-3.0.35-kobo-849369d6c66d3054688672f97d31fceb8e8230fb.tar.bz2
linux-3.0.35-kobo-849369d6c66d3054688672f97d31fceb8e8230fb.zip
initial_commit
Diffstat (limited to 'arch/um/sys-ppc/miscthings.c')
-rw-r--r--arch/um/sys-ppc/miscthings.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/arch/um/sys-ppc/miscthings.c b/arch/um/sys-ppc/miscthings.c
new file mode 100644
index 00000000..1c11aed9
--- /dev/null
+++ b/arch/um/sys-ppc/miscthings.c
@@ -0,0 +1,42 @@
+#include "linux/threads.h"
+#include "linux/stddef.h" // for NULL
+#include "linux/elf.h" // for AT_NULL
+
+/* The following function nicked from arch/ppc/kernel/process.c and
+ * adapted slightly */
+/*
+ * XXX ld.so expects the auxiliary table to start on
+ * a 16-byte boundary, so we have to find it and
+ * move it up. :-(
+ */
+void shove_aux_table(unsigned long sp)
+{
+ int argc;
+ char *p;
+ unsigned long e;
+ unsigned long aux_start, offset;
+
+ argc = *(int *)sp;
+ sp += sizeof(int) + (argc + 1) * sizeof(char *);
+ /* skip over the environment pointers */
+ do {
+ p = *(char **)sp;
+ sp += sizeof(char *);
+ } while (p != NULL);
+ aux_start = sp;
+ /* skip to the end of the auxiliary table */
+ do {
+ e = *(unsigned long *)sp;
+ sp += 2 * sizeof(unsigned long);
+ } while (e != AT_NULL);
+ offset = ((aux_start + 15) & ~15) - aux_start;
+ if (offset != 0) {
+ do {
+ sp -= sizeof(unsigned long);
+ e = *(unsigned long *)sp;
+ *(unsigned long *)(sp + offset) = e;
+ } while (sp > aux_start);
+ }
+}
+/* END stuff taken from arch/ppc/kernel/process.c */
+