Commit a1516e92b6ed887ef27f3a33a27a9acd772a5de4

Authored by bellard
1 parent 6fb883e8

ARM init fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@316 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 16 additions and 16 deletions
linux-user/elfload.c
... ... @@ -74,7 +74,8 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i
74 74 regs->ARM_sp = infop->start_stack;
75 75 regs->ARM_r2 = tswapl(stack[2]); /* envp */
76 76 regs->ARM_r1 = tswapl(stack[1]); /* argv */
77   - regs->ARM_r0 = tswapl(stack[0]); /* argc */
  77 + /* XXX: it seems that r0 is zeroed after ! */
  78 + // regs->ARM_r0 = tswapl(stack[0]); /* argc */
78 79 }
79 80  
80 81 #define USE_ELF_CORE_DUMP
... ... @@ -490,7 +491,7 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc,
490 491 * Force 16 byte alignment here for generality.
491 492 */
492 493 sp = (unsigned int *) (~15UL & (unsigned long) p);
493   - sp -= exec ? DLINFO_ITEMS*2 : 2;
  494 + sp -= DLINFO_ITEMS*2;
494 495 dlinfo = sp;
495 496 sp -= envc+1;
496 497 envp = sp;
... ... @@ -505,21 +506,20 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc,
505 506 put_user (tswapl(id), dlinfo++); \
506 507 put_user (tswapl(val), dlinfo++)
507 508  
508   - if (exec) { /* Put this here for an ELF program interpreter */
509   - NEW_AUX_ENT (AT_PHDR, (target_ulong)(load_addr + exec->e_phoff));
510   - NEW_AUX_ENT (AT_PHENT, (target_ulong)(sizeof (struct elf_phdr)));
511   - NEW_AUX_ENT (AT_PHNUM, (target_ulong)(exec->e_phnum));
512   - NEW_AUX_ENT (AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE));
513   - NEW_AUX_ENT (AT_BASE, (target_ulong)(interp_load_addr));
514   - NEW_AUX_ENT (AT_FLAGS, (target_ulong)0);
515   - NEW_AUX_ENT (AT_ENTRY, load_bias + exec->e_entry);
516   - NEW_AUX_ENT (AT_UID, (target_ulong) getuid());
517   - NEW_AUX_ENT (AT_EUID, (target_ulong) geteuid());
518   - NEW_AUX_ENT (AT_GID, (target_ulong) getgid());
519   - NEW_AUX_ENT (AT_EGID, (target_ulong) getegid());
520   - }
  509 + NEW_AUX_ENT (AT_PHDR, (target_ulong)(load_addr + exec->e_phoff));
  510 + NEW_AUX_ENT (AT_PHENT, (target_ulong)(sizeof (struct elf_phdr)));
  511 + NEW_AUX_ENT (AT_PHNUM, (target_ulong)(exec->e_phnum));
  512 + NEW_AUX_ENT (AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE));
  513 + NEW_AUX_ENT (AT_BASE, (target_ulong)(interp_load_addr));
  514 + NEW_AUX_ENT (AT_FLAGS, (target_ulong)0);
  515 + NEW_AUX_ENT (AT_ENTRY, load_bias + exec->e_entry);
  516 + NEW_AUX_ENT (AT_UID, (target_ulong) getuid());
  517 + NEW_AUX_ENT (AT_EUID, (target_ulong) geteuid());
  518 + NEW_AUX_ENT (AT_GID, (target_ulong) getgid());
  519 + NEW_AUX_ENT (AT_EGID, (target_ulong) getegid());
521 520 NEW_AUX_ENT (AT_NULL, 0);
522 521 #undef NEW_AUX_ENT
  522 +
523 523 put_user(tswapl(argc),--sp);
524 524 info->arg_start = (unsigned int)((unsigned long)p & 0xffffffff);
525 525 while (argc-->0) {
... ... @@ -1087,7 +1087,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * r
1087 1087 create_elf_tables((char *)bprm->p,
1088 1088 bprm->argc,
1089 1089 bprm->envc,
1090   - (interpreter_type == INTERPRETER_ELF ? &elf_ex : NULL),
  1090 + &elf_ex,
1091 1091 load_addr, load_bias,
1092 1092 interp_load_addr,
1093 1093 (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
... ...