Revision b346ff46 linux-user/elfload.c
b/linux-user/elfload.c | ||
---|---|---|
38 | 38 |
A value of 0 tells we have no such handler. */ |
39 | 39 |
#define ELF_PLAT_INIT(_r) _r->edx = 0 |
40 | 40 |
|
41 |
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop) |
|
42 |
{ |
|
43 |
regs->esp = infop->start_stack; |
|
44 |
regs->eip = infop->entry; |
|
45 |
} |
|
46 |
|
|
47 |
#define USE_ELF_CORE_DUMP |
|
48 |
#define ELF_EXEC_PAGESIZE 4096 |
|
49 |
|
|
50 |
#endif |
|
51 |
|
|
52 |
#ifdef TARGET_ARM |
|
53 |
|
|
54 |
#define ELF_START_MMAP 0x80000000 |
|
55 |
|
|
56 |
#define elf_check_arch(x) ( (x) == EM_ARM ) |
|
57 |
|
|
58 |
#define ELF_CLASS ELFCLASS32 |
|
59 |
#ifdef TARGET_WORDS_BIGENDIAN |
|
60 |
#define ELF_DATA ELFDATA2MSB |
|
61 |
#else |
|
62 |
#define ELF_DATA ELFDATA2LSB |
|
63 |
#endif |
|
64 |
#define ELF_ARCH EM_ARM |
|
65 |
|
|
66 |
#define ELF_PLAT_INIT(_r) _r->ARM_r0 = 0 |
|
67 |
|
|
68 |
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop) |
|
69 |
{ |
|
70 |
target_long *stack = (void *)infop->start_stack; |
|
71 |
memset(regs, 0, sizeof(*regs)); |
|
72 |
regs->ARM_cpsr = 0x10; |
|
73 |
regs->ARM_pc = infop->entry; |
|
74 |
regs->ARM_sp = infop->start_stack; |
|
75 |
regs->ARM_r2 = tswapl(stack[2]); /* envp */ |
|
76 |
regs->ARM_r1 = tswapl(stack[1]); /* argv */ |
|
77 |
regs->ARM_r0 = tswapl(stack[0]); /* argc */ |
|
78 |
} |
|
79 |
|
|
41 | 80 |
#define USE_ELF_CORE_DUMP |
42 | 81 |
#define ELF_EXEC_PAGESIZE 4096 |
43 | 82 |
|
... | ... | |
1148 | 1187 |
} |
1149 | 1188 |
if(retval>=0) { |
1150 | 1189 |
/* success. Initialize important registers */ |
1151 |
regs->esp = infop->start_stack; |
|
1152 |
regs->eip = infop->entry; |
|
1190 |
init_thread(regs, infop); |
|
1153 | 1191 |
return retval; |
1154 | 1192 |
} |
1155 | 1193 |
|
Also available in: Unified diff