Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/um/sys-ppc/miscthings.c
10817 views
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
43
44