Merge tag 'gpio-for-v3.11-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6.git] / arch / um / sys-ppc / miscthings.c
blob25908d26ce079282cb6461f100ed459fdcc1090c
1 #include <linux/threads.h>
2 #include <linux/stddef.h> // for NULL
3 #include <linux/elf.h> // for AT_NULL
5 /* The following function nicked from arch/ppc/kernel/process.c and
6 * adapted slightly */
7 /*
8 * XXX ld.so expects the auxiliary table to start on
9 * a 16-byte boundary, so we have to find it and
10 * move it up. :-(
12 void shove_aux_table(unsigned long sp)
14 int argc;
15 char *p;
16 unsigned long e;
17 unsigned long aux_start, offset;
19 argc = *(int *)sp;
20 sp += sizeof(int) + (argc + 1) * sizeof(char *);
21 /* skip over the environment pointers */
22 do {
23 p = *(char **)sp;
24 sp += sizeof(char *);
25 } while (p != NULL);
26 aux_start = sp;
27 /* skip to the end of the auxiliary table */
28 do {
29 e = *(unsigned long *)sp;
30 sp += 2 * sizeof(unsigned long);
31 } while (e != AT_NULL);
32 offset = ((aux_start + 15) & ~15) - aux_start;
33 if (offset != 0) {
34 do {
35 sp -= sizeof(unsigned long);
36 e = *(unsigned long *)sp;
37 *(unsigned long *)(sp + offset) = e;
38 } while (sp > aux_start);
41 /* END stuff taken from arch/ppc/kernel/process.c */