PageRenderTime 26ms CodeModel.GetById 13ms app.highlight 8ms RepoModel.GetById 2ms app.codeStats 0ms

/arch/um/sys-ppc/miscthings.c

https://gitlab.com/tiler/tiler-omap4
C | 42 lines | 29 code | 3 blank | 10 comment | 7 complexity | ff5f375690549ded3c9a38a545781af0 MD5 | raw 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 */
12void 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