12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- #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 */
|