Commit b17780d52186c8bd94c722f6fc00d6d6b9fdcc5f
1 parent
34313956
endianness fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
18 additions
and
18 deletions
linux-user/elfload.c
| @@ -335,9 +335,8 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | @@ -335,9 +335,8 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | ||
| 335 | unsigned long interp_load_addr, int ibcs, | 335 | unsigned long interp_load_addr, int ibcs, |
| 336 | struct image_info *info) | 336 | struct image_info *info) |
| 337 | { | 337 | { |
| 338 | - unsigned int *argv, *envp, *dlinfo; | ||
| 339 | - unsigned int *sp; | ||
| 340 | - char **alpha_envp; | 338 | + target_ulong *argv, *envp, *dlinfo; |
| 339 | + target_ulong *sp; | ||
| 341 | 340 | ||
| 342 | /* | 341 | /* |
| 343 | * Force 16 byte alignment here for generality. | 342 | * Force 16 byte alignment here for generality. |
| @@ -350,14 +349,13 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | @@ -350,14 +349,13 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | ||
| 350 | sp -= argc+1; | 349 | sp -= argc+1; |
| 351 | argv = sp; | 350 | argv = sp; |
| 352 | if (!ibcs) { | 351 | if (!ibcs) { |
| 353 | - put_user(envp,--sp); | ||
| 354 | - put_user(argv,--sp); | 352 | + put_user(tswapl((target_ulong)envp),--sp); |
| 353 | + put_user(tswapl((target_ulong)argv),--sp); | ||
| 355 | } | 354 | } |
| 356 | - alpha_envp = (char **)malloc((envc+1) * sizeof(char *)); | ||
| 357 | 355 | ||
| 358 | #define NEW_AUX_ENT(id, val) \ | 356 | #define NEW_AUX_ENT(id, val) \ |
| 359 | - put_user ((id), dlinfo++); \ | ||
| 360 | - put_user ((val), dlinfo++) | 357 | + put_user (tswapl(id), dlinfo++); \ |
| 358 | + put_user (tswapl(val), dlinfo++) | ||
| 361 | 359 | ||
| 362 | if (exec) { /* Put this here for an ELF program interpreter */ | 360 | if (exec) { /* Put this here for an ELF program interpreter */ |
| 363 | struct elf_phdr * eppnt; | 361 | struct elf_phdr * eppnt; |
| @@ -377,22 +375,19 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | @@ -377,22 +375,19 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | ||
| 377 | } | 375 | } |
| 378 | NEW_AUX_ENT (AT_NULL, 0); | 376 | NEW_AUX_ENT (AT_NULL, 0); |
| 379 | #undef NEW_AUX_ENT | 377 | #undef NEW_AUX_ENT |
| 380 | - put_user((unsigned int)argc,--sp); | 378 | + put_user(tswapl(argc),--sp); |
| 381 | info->arg_start = (unsigned int)((unsigned long)p & 0xffffffff); | 379 | info->arg_start = (unsigned int)((unsigned long)p & 0xffffffff); |
| 382 | while (argc-->0) { | 380 | while (argc-->0) { |
| 383 | - put_user(p,argv++); | 381 | + put_user(tswapl((target_ulong)p),argv++); |
| 384 | while (get_user(p++)) /* nothing */ ; | 382 | while (get_user(p++)) /* nothing */ ; |
| 385 | } | 383 | } |
| 386 | put_user(0,argv); | 384 | put_user(0,argv); |
| 387 | info->arg_end = info->env_start = (unsigned int)((unsigned long)p & 0xffffffff); | 385 | info->arg_end = info->env_start = (unsigned int)((unsigned long)p & 0xffffffff); |
| 388 | - __environ = alpha_envp; | ||
| 389 | while (envc-->0) { | 386 | while (envc-->0) { |
| 390 | - *alpha_envp++ = (char *)p; | ||
| 391 | - put_user(p,envp++); | 387 | + put_user(tswapl((target_ulong)p),envp++); |
| 392 | while (get_user(p++)) /* nothing */ ; | 388 | while (get_user(p++)) /* nothing */ ; |
| 393 | } | 389 | } |
| 394 | put_user(0,envp); | 390 | put_user(0,envp); |
| 395 | - *alpha_envp = 0; | ||
| 396 | info->env_end = (unsigned int)((unsigned long)p & 0xffffffff); | 391 | info->env_end = (unsigned int)((unsigned long)p & 0xffffffff); |
| 397 | return sp; | 392 | return sp; |
| 398 | } | 393 | } |
| @@ -544,8 +539,8 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, | @@ -544,8 +539,8 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex, | ||
| 544 | 539 | ||
| 545 | 540 | ||
| 546 | 541 | ||
| 547 | -static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | ||
| 548 | - struct image_info * info) | 542 | +static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, |
| 543 | + struct image_info * info) | ||
| 549 | { | 544 | { |
| 550 | struct elfhdr elf_ex; | 545 | struct elfhdr elf_ex; |
| 551 | struct elfhdr interp_elf_ex; | 546 | struct elfhdr interp_elf_ex; |
| @@ -581,7 +576,6 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | @@ -581,7 +576,6 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | ||
| 581 | return -ENOEXEC; | 576 | return -ENOEXEC; |
| 582 | } | 577 | } |
| 583 | 578 | ||
| 584 | - | ||
| 585 | /* First of all, some simple consistency checks */ | 579 | /* First of all, some simple consistency checks */ |
| 586 | if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) || | 580 | if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) || |
| 587 | (! elf_check_arch(elf_ex.e_machine))) { | 581 | (! elf_check_arch(elf_ex.e_machine))) { |
| @@ -608,6 +602,12 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | @@ -608,6 +602,12 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | ||
| 608 | return -errno; | 602 | return -errno; |
| 609 | } | 603 | } |
| 610 | 604 | ||
| 605 | +#ifdef BSWAP_NEEDED | ||
| 606 | + elf_ppnt = elf_phdata; | ||
| 607 | + for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) { | ||
| 608 | + bswap_phdr(elf_ppnt); | ||
| 609 | + } | ||
| 610 | +#endif | ||
| 611 | elf_ppnt = elf_phdata; | 611 | elf_ppnt = elf_phdata; |
| 612 | 612 | ||
| 613 | elf_bss = 0; | 613 | elf_bss = 0; |
| @@ -909,7 +909,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | @@ -909,7 +909,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs, | ||
| 909 | 909 | ||
| 910 | 910 | ||
| 911 | int elf_exec(const char * filename, char ** argv, char ** envp, | 911 | int elf_exec(const char * filename, char ** argv, char ** envp, |
| 912 | - struct pt_regs * regs, struct image_info *infop) | 912 | + struct target_pt_regs * regs, struct image_info *infop) |
| 913 | { | 913 | { |
| 914 | struct linux_binprm bprm; | 914 | struct linux_binprm bprm; |
| 915 | int retval; | 915 | int retval; |