From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=34104 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PiCnk-00046A-7v for qemu-devel@nongnu.org; Wed, 26 Jan 2011 16:21:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PiCni-0004nY-Qx for qemu-devel@nongnu.org; Wed, 26 Jan 2011 16:21:16 -0500 Received: from afflict.kos.to ([92.243.29.197]:53824) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PiCni-0004m2-Eq for qemu-devel@nongnu.org; Wed, 26 Jan 2011 16:21:14 -0500 Message-ID: <4D409040.6020504@iki.fi> Date: Wed, 26 Jan 2011 23:21:04 +0200 From: riku voipio MIME-Version: 1.0 References: <1295862517-6668-1-git-send-email-vapier@gentoo.org> In-Reply-To: <1295862517-6668-1-git-send-email-vapier@gentoo.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH] linux-user/FLAT: allow targets to override FLAT reloc processing List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Mike Frysinger Cc: qemu-devel@nongnu.org On 01/24/2011 11:48 AM, Mike Frysinger wrote: > This brings flatload.c more in line with the current Linux FLAT loader > which allows targets to handle FLAT relocations in their own way. For > the common behavior, the new functions get stubbed out. Do you have some instructions howto build flat binaries for testing? I have to admit my knowledge of flat binaries is quite nonexisting. Riku > Signed-off-by: Mike Frysinger > --- > Makefile.target | 2 +- > linux-user/flatload.c | 24 +++++++++--------------- > linux-user/target_flat.h | 9 +++++++++ > 3 files changed, 19 insertions(+), 16 deletions(-) > create mode 100644 linux-user/target_flat.h > > diff --git a/Makefile.target b/Makefile.target > index cd2abde..282428b 100644 > --- a/Makefile.target > +++ b/Makefile.target > @@ -107,7 +107,7 @@ ifdef CONFIG_LINUX_USER > > $(call set-vpath, $(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR)) > > -QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) > +QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) -I$(SRC_PATH)/linux-user > obj-y = main.o syscall.o strace.o mmap.o signal.o thunk.o \ > elfload.o linuxload.o uaccess.o gdbstub.o cpu-uname.o \ > qemu-malloc.o $(oslib-obj-y) > diff --git a/linux-user/flatload.c b/linux-user/flatload.c > index d8b4476..c133732 100644 > --- a/linux-user/flatload.c > +++ b/linux-user/flatload.c > @@ -41,6 +41,8 @@ > > #include "qemu.h" > #include "flat.h" > +#define ntohl(x) be32_to_cpu(x) > +#include > > //#define DEBUG > > @@ -50,14 +52,6 @@ > #define DBG_FLT(...) > #endif > > -#define flat_reloc_valid(reloc, size) ((reloc)<= (size)) > -#define flat_old_ram_flag(flag) (flag) > -#ifdef TARGET_WORDS_BIGENDIAN > -#define flat_get_relocate_addr(relval) (relval) > -#else > -#define flat_get_relocate_addr(relval) bswap32(relval) > -#endif > - > #define RELOC_FAILED 0xff00ff01 /* Relocation incorrect somewhere */ > #define UNLOADED_LIB 0x7ff000ff /* Placeholder for unused library */ > > @@ -78,8 +72,6 @@ static int load_flat_shared_library(int id, struct lib_info *p); > > struct linux_binprm; > > -#define ntohl(x) be32_to_cpu(x) > - > /****************************************************************************/ > /* > * create_flat_tables() parses the env- and arg-strings in new user > @@ -625,6 +617,7 @@ static int load_flat_file(struct linux_binprm * bprm, > * __start to address 4 so that is okay). > */ > if (rev> OLD_FLAT_VERSION) { > + abi_ulong persistent = 0; > for (i = 0; i< relocs; i++) { > abi_ulong addr, relval; > > @@ -633,6 +626,9 @@ static int load_flat_file(struct linux_binprm * bprm, > relocated first). */ > if (get_user_ual(relval, reloc + i * sizeof(abi_ulong))) > return -EFAULT; > + relval = ntohl(relval); > + if (flat_set_persistent(relval,&persistent)) > + continue; > addr = flat_get_relocate_addr(relval); > rp = calc_reloc(addr, libinfo, id, 1); > if (rp == RELOC_FAILED) > @@ -641,22 +637,20 @@ static int load_flat_file(struct linux_binprm * bprm, > /* Get the pointer's value. */ > if (get_user_ual(addr, rp)) > return -EFAULT; > + addr = flat_get_addr_from_rp(rp, relval, flags,&persistent); > if (addr != 0) { > /* > * Do the relocation. PIC relocs in the data section are > * already in target order > */ > - > -#ifndef TARGET_WORDS_BIGENDIAN > if ((flags& FLAT_FLAG_GOTPIC) == 0) > - addr = bswap32(addr); > -#endif > + addr = ntohl(addr); > addr = calc_reloc(addr, libinfo, id, 0); > if (addr == RELOC_FAILED) > return -ENOEXEC; > > /* Write back the relocated pointer. */ > - if (put_user_ual(addr, rp)) > + if (flat_put_addr_at_rp(rp, addr, relval)) > return -EFAULT; > } > } > diff --git a/linux-user/target_flat.h b/linux-user/target_flat.h > new file mode 100644 > index 0000000..332b6e3 > --- /dev/null > +++ b/linux-user/target_flat.h > @@ -0,0 +1,9 @@ > +/* If your arch needs to do custom stuff, create your own target_flat.h > + * header file in linux-user// > + */ > +#define flat_reloc_valid(reloc, size) ((reloc)<= (size)) > +#define flat_old_ram_flag(flag) (flag) > +#define flat_get_relocate_addr(relval) (relval) > +#define flat_get_addr_from_rp(rp, relval, flags, persistent) (rp) > +#define flat_set_persistent(relval, persistent) (*persistent) > +#define flat_put_addr_at_rp(rp, addr, relval) put_user_ual(addr, rp)