qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: riku voipio <riku.voipio@iki.fi>
To: Mike Frysinger <vapier@gentoo.org>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH] linux-user/FLAT: allow targets to override FLAT reloc processing
Date: Wed, 26 Jan 2011 23:21:04 +0200	[thread overview]
Message-ID: <4D409040.6020504@iki.fi> (raw)
In-Reply-To: <1295862517-6668-1-git-send-email-vapier@gentoo.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<vapier@gentoo.org>
> ---
>   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<target_flat.h>
>
>   //#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/<your arch>/
> + */
> +#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)

  parent reply	other threads:[~2011-01-26 21:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-24  9:48 [Qemu-devel] [PATCH] linux-user/FLAT: allow targets to override FLAT reloc processing Mike Frysinger
2011-01-25  6:15 ` [Qemu-devel] [PATCH v2] linux-user/FLAT: allow targets to override FLAT processing Mike Frysinger
2011-01-27  0:20   ` Mike Frysinger
2011-01-26 21:21 ` riku voipio [this message]
2011-01-27  0:19   ` [Qemu-devel] Re: [PATCH] linux-user/FLAT: allow targets to override FLAT reloc processing Mike Frysinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D409040.6020504@iki.fi \
    --to=riku.voipio@iki.fi \
    --cc=qemu-devel@nongnu.org \
    --cc=vapier@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).