Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
miscthings.c
Go to the documentation of this file.
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  */
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