Commit 0bccf03d6f6d0c9ecb4534d1d5b7bb49350bd84e
1 parent
89353a79
fix AUX vector entries (Paul Brook)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1554 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
24 additions
and
26 deletions
linux-user/elfload.c
| @@ -186,19 +186,17 @@ do { \ | @@ -186,19 +186,17 @@ do { \ | ||
| 186 | * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC, | 186 | * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC, |
| 187 | * even if DLINFO_ARCH_ITEMS goes to zero or is undefined. | 187 | * even if DLINFO_ARCH_ITEMS goes to zero or is undefined. |
| 188 | */ | 188 | */ |
| 189 | -#define DLINFO_ARCH_ITEMS 3 | 189 | +#define DLINFO_ARCH_ITEMS 5 |
| 190 | #define ARCH_DLINFO \ | 190 | #define ARCH_DLINFO \ |
| 191 | do { \ | 191 | do { \ |
| 192 | - sp -= DLINFO_ARCH_ITEMS * 2; \ | ||
| 193 | - NEW_AUX_ENT(0, AT_DCACHEBSIZE, 0x20); \ | ||
| 194 | - NEW_AUX_ENT(1, AT_ICACHEBSIZE, 0x20); \ | ||
| 195 | - NEW_AUX_ENT(2, AT_UCACHEBSIZE, 0); \ | 192 | + NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20); \ |
| 193 | + NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20); \ | ||
| 194 | + NEW_AUX_ENT(AT_UCACHEBSIZE, 0); \ | ||
| 196 | /* \ | 195 | /* \ |
| 197 | * Now handle glibc compatibility. \ | 196 | * Now handle glibc compatibility. \ |
| 198 | */ \ | 197 | */ \ |
| 199 | - sp -= 2*2; \ | ||
| 200 | - NEW_AUX_ENT(0, AT_IGNOREPPC, AT_IGNOREPPC); \ | ||
| 201 | - NEW_AUX_ENT(1, AT_IGNOREPPC, AT_IGNOREPPC); \ | 198 | + NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ |
| 199 | + NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \ | ||
| 202 | } while (0) | 200 | } while (0) |
| 203 | 201 | ||
| 204 | static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop) | 202 | static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop) |
| @@ -643,24 +641,24 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | @@ -643,24 +641,24 @@ static unsigned int * create_elf_tables(char *p, int argc, int envc, | ||
| 643 | if ((unsigned long)csp & 15UL) | 641 | if ((unsigned long)csp & 15UL) |
| 644 | sp -= ((unsigned long)csp & 15UL) / sizeof(*sp); | 642 | sp -= ((unsigned long)csp & 15UL) / sizeof(*sp); |
| 645 | 643 | ||
| 646 | -#define NEW_AUX_ENT(nr, id, val) \ | ||
| 647 | - put_user (id, sp + (nr * 2)); \ | ||
| 648 | - put_user (val, sp + (nr * 2 + 1)) | ||
| 649 | - sp -= 2; | ||
| 650 | - NEW_AUX_ENT (0, AT_NULL, 0); | ||
| 651 | - | ||
| 652 | - sp -= DLINFO_ITEMS*2; | ||
| 653 | - NEW_AUX_ENT( 0, AT_PHDR, (target_ulong)(load_addr + exec->e_phoff)); | ||
| 654 | - NEW_AUX_ENT( 1, AT_PHENT, (target_ulong)(sizeof (struct elf_phdr))); | ||
| 655 | - NEW_AUX_ENT( 2, AT_PHNUM, (target_ulong)(exec->e_phnum)); | ||
| 656 | - NEW_AUX_ENT( 3, AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE)); | ||
| 657 | - NEW_AUX_ENT( 4, AT_BASE, (target_ulong)(interp_load_addr)); | ||
| 658 | - NEW_AUX_ENT( 5, AT_FLAGS, (target_ulong)0); | ||
| 659 | - NEW_AUX_ENT( 6, AT_ENTRY, load_bias + exec->e_entry); | ||
| 660 | - NEW_AUX_ENT( 7, AT_UID, (target_ulong) getuid()); | ||
| 661 | - NEW_AUX_ENT( 8, AT_EUID, (target_ulong) geteuid()); | ||
| 662 | - NEW_AUX_ENT( 9, AT_GID, (target_ulong) getgid()); | ||
| 663 | - NEW_AUX_ENT(11, AT_EGID, (target_ulong) getegid()); | 644 | +#define NEW_AUX_ENT(id, val) \ |
| 645 | + sp -= 2; \ | ||
| 646 | + put_user (id, sp); \ | ||
| 647 | + put_user (val, sp + 1) | ||
| 648 | + NEW_AUX_ENT (AT_NULL, 0); | ||
| 649 | + | ||
| 650 | + /* There must be exactly DLINFO_ITEMS entries here. */ | ||
| 651 | + NEW_AUX_ENT(AT_PHDR, (target_ulong)(load_addr + exec->e_phoff)); | ||
| 652 | + NEW_AUX_ENT(AT_PHENT, (target_ulong)(sizeof (struct elf_phdr))); | ||
| 653 | + NEW_AUX_ENT(AT_PHNUM, (target_ulong)(exec->e_phnum)); | ||
| 654 | + NEW_AUX_ENT(AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE)); | ||
| 655 | + NEW_AUX_ENT(AT_BASE, (target_ulong)(interp_load_addr)); | ||
| 656 | + NEW_AUX_ENT(AT_FLAGS, (target_ulong)0); | ||
| 657 | + NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry); | ||
| 658 | + NEW_AUX_ENT(AT_UID, (target_ulong) getuid()); | ||
| 659 | + NEW_AUX_ENT(AT_EUID, (target_ulong) geteuid()); | ||
| 660 | + NEW_AUX_ENT(AT_GID, (target_ulong) getgid()); | ||
| 661 | + NEW_AUX_ENT(AT_EGID, (target_ulong) getegid()); | ||
| 664 | #ifdef ARCH_DLINFO | 662 | #ifdef ARCH_DLINFO |
| 665 | /* | 663 | /* |
| 666 | * ARCH_DLINFO must come last so platform specific code can enforce | 664 | * ARCH_DLINFO must come last so platform specific code can enforce |