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; |