1 #include "linux/threads.h"
2 #include "linux/stddef.h"  // for NULL
3 #include "linux/elf.h"  // for AT_NULL
4 
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. :-(
11  */
shove_aux_table(unsigned long sp)12 void shove_aux_table(unsigned long sp)
13 {
14 	int argc;
15 	char *p;
16 	unsigned long e;
17 	unsigned long aux_start, offset;
18 
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);
39 	}
40 }
41 /* END stuff taken from arch/ppc/kernel/process.c */
42 
43