diff options
author | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-14 16:27:31 +0000 |
---|---|---|
committer | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-14 16:27:31 +0000 |
commit | 992f48a036cccf7101e31bf3e5d901ce5320e886 (patch) | |
tree | 5b7931bab0c9d92c266f87c0457b864cdd8b256b /linux-user/flatload.c | |
parent | b227a8e9aa5f27d29f77ba90d5eb9d0662a1175e (diff) |
Support for 32 bit ABI on 64 bit targets (only enabled Sparc64)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3396 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'linux-user/flatload.c')
-rw-r--r-- | linux-user/flatload.c | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/linux-user/flatload.c b/linux-user/flatload.c index db88e4b1c5..86b77f9889 100644 --- a/linux-user/flatload.c +++ b/linux-user/flatload.c @@ -63,13 +63,13 @@ #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ struct lib_info { - target_ulong start_code; /* Start of text segment */ - target_ulong start_data; /* Start of data segment */ - target_ulong end_data; /* Start of bss section */ - target_ulong start_brk; /* End of data segment */ - target_ulong text_len; /* Length of text segment */ - target_ulong entry; /* Start address for this module */ - target_ulong build_date; /* When this one was compiled */ + abi_ulong start_code; /* Start of text segment */ + abi_ulong start_data; /* Start of data segment */ + abi_ulong end_data; /* Start of bss section */ + abi_ulong start_brk; /* End of data segment */ + abi_ulong text_len; /* Length of text segment */ + abi_ulong entry; /* Start address for this module */ + abi_ulong build_date; /* When this one was compiled */ short loaded; /* Has this library been loaded? */ }; @@ -89,7 +89,7 @@ struct linux_binprm; */ /* Push a block of strings onto the guest stack. */ -static target_ulong copy_strings(target_ulong p, int n, char **s) +static abi_ulong copy_strings(abi_ulong p, int n, char **s) { int len; @@ -102,8 +102,8 @@ static target_ulong copy_strings(target_ulong p, int n, char **s) return p; } -int target_pread(int fd, target_ulong ptr, target_ulong len, - target_ulong offset) +int target_pread(int fd, abi_ulong ptr, abi_ulong len, + abi_ulong offset) { void *buf; int ret; @@ -262,15 +262,15 @@ out: /****************************************************************************/ -static target_ulong -calc_reloc(target_ulong r, struct lib_info *p, int curid, int internalp) +static abi_ulong +calc_reloc(abi_ulong r, struct lib_info *p, int curid, int internalp) { - target_ulong addr; + abi_ulong addr; int id; - target_ulong start_brk; - target_ulong start_data; - target_ulong text_len; - target_ulong start_code; + abi_ulong start_brk; + abi_ulong start_data; + abi_ulong text_len; + abi_ulong start_code; #ifdef CONFIG_BINFMT_SHARED_FLAT #error needs checking @@ -381,19 +381,19 @@ void old_reloc(struct lib_info *libinfo, uint32_t rl) /****************************************************************************/ static int load_flat_file(struct linux_binprm * bprm, - struct lib_info *libinfo, int id, target_ulong *extra_stack) + struct lib_info *libinfo, int id, abi_ulong *extra_stack) { struct flat_hdr * hdr; - target_ulong textpos = 0, datapos = 0, result; - target_ulong realdatastart = 0; - target_ulong text_len, data_len, bss_len, stack_len, flags; - target_ulong memp = 0; /* for finding the brk area */ - target_ulong extra; - target_ulong reloc = 0, rp; + abi_ulong textpos = 0, datapos = 0, result; + abi_ulong realdatastart = 0; + abi_ulong text_len, data_len, bss_len, stack_len, flags; + abi_ulong memp = 0; /* for finding the brk area */ + abi_ulong extra; + abi_ulong reloc = 0, rp; int i, rev, relocs = 0; - target_ulong fpos; - target_ulong start_code, end_code; - target_ulong indx_len; + abi_ulong fpos; + abi_ulong start_code, end_code; + abi_ulong indx_len; hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */ @@ -440,14 +440,14 @@ static int load_flat_file(struct linux_binprm * bprm, /* * calculate the extra space we need to map in */ - extra = relocs * sizeof(target_ulong); + extra = relocs * sizeof(abi_ulong); if (extra < bss_len + stack_len) extra = bss_len + stack_len; /* Add space for library base pointers. Make sure this does not misalign the doesn't misalign the data segment. */ - indx_len = MAX_SHARED_LIBS * sizeof(target_ulong); - indx_len = (indx_len + 15) & ~(target_ulong)15; + indx_len = MAX_SHARED_LIBS * sizeof(abi_ulong); + indx_len = (indx_len + 15) & ~(abi_ulong)15; /* * there are a couple of cases here, the separate code/data @@ -485,12 +485,12 @@ static int load_flat_file(struct linux_binprm * bprm, #ifdef CONFIG_BINFMT_ZFLAT if (flags & FLAT_FLAG_GZDATA) { result = decompress_exec(bprm, fpos, (char *) datapos, - data_len + (relocs * sizeof(target_ulong))) + data_len + (relocs * sizeof(abi_ulong))) } else #endif { result = target_pread(bprm->fd, datapos, - data_len + (relocs * sizeof(target_ulong)), + data_len + (relocs * sizeof(abi_ulong)), fpos); } if (result < 0) { @@ -544,7 +544,7 @@ static int load_flat_file(struct linux_binprm * bprm, text_len, 0); if (result >= 0) { result = target_pread(bprm->fd, datapos, - data_len + (relocs * sizeof(target_ulong)), + data_len + (relocs * sizeof(abi_ulong)), ntohl(hdr->data_start)); } } @@ -597,7 +597,7 @@ static int load_flat_file(struct linux_binprm * bprm, if (flags & FLAT_FLAG_GOTPIC) { rp = datapos; while (1) { - target_ulong addr; + abi_ulong addr; addr = tgetl(rp); if (addr == -1) break; @@ -607,7 +607,7 @@ static int load_flat_file(struct linux_binprm * bprm, return -ENOEXEC; tputl(rp, addr); } - rp += sizeof(target_ulong); + rp += sizeof(abi_ulong); } } @@ -624,12 +624,12 @@ static int load_flat_file(struct linux_binprm * bprm, */ if (rev > OLD_FLAT_VERSION) { for (i = 0; i < relocs; i++) { - target_ulong addr, relval; + abi_ulong addr, relval; /* Get the address of the pointer to be relocated (of course, the address has to be relocated first). */ - relval = tgetl(reloc + i * sizeof (target_ulong)); + relval = tgetl(reloc + i * sizeof (abi_ulong)); addr = flat_get_relocate_addr(relval); rp = calc_reloc(addr, libinfo, id, 1); if (rp == RELOC_FAILED) @@ -657,8 +657,8 @@ static int load_flat_file(struct linux_binprm * bprm, } } else { for (i = 0; i < relocs; i++) { - target_ulong relval; - relval = tgetl(reloc + i * sizeof (target_ulong)); + abi_ulong relval; + relval = tgetl(reloc + i * sizeof (abi_ulong)); old_reloc(&libinfo[0], relval); } } @@ -712,10 +712,10 @@ int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, struct image_info * info) { struct lib_info libinfo[MAX_SHARED_LIBS]; - target_ulong p = bprm->p; - target_ulong stack_len; - target_ulong start_addr; - target_ulong sp; + abi_ulong p = bprm->p; + abi_ulong stack_len; + abi_ulong start_addr; + abi_ulong sp; int res; int i, j; @@ -740,7 +740,7 @@ int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, /* Update data segment pointers for all libraries */ for (i=0; i<MAX_SHARED_LIBS; i++) { if (libinfo[i].loaded) { - target_ulong p; + abi_ulong p; p = libinfo[i].start_data; for (j=0; j<MAX_SHARED_LIBS; j++) { p -= 4; @@ -758,12 +758,12 @@ int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, p = copy_strings(p, bprm->envc, bprm->envp); p = copy_strings(p, bprm->argc, bprm->argv); /* Align stack. */ - sp = p & ~(target_ulong)(sizeof(target_ulong) - 1); + sp = p & ~(abi_ulong)(sizeof(abi_ulong) - 1); /* Enforce final stack alignment of 16 bytes. This is sufficient for all current targets, and excess alignment is harmless. */ stack_len = bprm->envc + bprm->argc + 2; stack_len += 3; /* argc, arvg, argp */ - stack_len *= sizeof(target_ulong); + stack_len *= sizeof(abi_ulong); if ((sp + stack_len) & 15) sp -= 16 - ((sp + stack_len) & 15); sp = loader_build_argptr(bprm->envc, bprm->argc, sp, p, 1); |