Commit b17780d52186c8bd94c722f6fc00d6d6b9fdcc5f

Authored by bellard
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;