qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH v7 3/4] use elf_reset to reload e


From: Alexander Graf
Subject: Re: [Qemu-devel] [Qemu-ppc] [RFC PATCH v7 3/4] use elf_reset to reload elf image
Date: Sun, 2 Dec 2012 12:37:14 +0100

Missing patch description

On 29.11.2012, at 06:26, Olivia Yin wrote:

> Signed-off-by: Olivia Yin <address@hidden>
> ---
> elf.h        |   10 ++++++++++
> hw/elf_ops.h |   44 +++++++++++++++++++++++++++++++++++++++-----
> hw/loader.c  |   11 +++++++++++
> 3 files changed, 60 insertions(+), 5 deletions(-)
> 
> diff --git a/elf.h b/elf.h
> index a21ea53..335f1af 100644
> --- a/elf.h
> +++ b/elf.h
> @@ -1078,6 +1078,16 @@ typedef struct elf64_hdr {
>   Elf64_Half e_shstrndx;
> } Elf64_Ehdr;
> 
> +typedef struct ImageElf ImageElf;
> +struct ImageElf {
> +    char *name;
> +    uint64_t (*fn)(void *, uint64_t);
> +    void *opaque;
> +    int swab;
> +    int machine;
> +    int lsb;
> +};
> +
> /* These constants define the permissions on sections in the program
>    header, p_flags. */
> #define PF_R          0x4
> diff --git a/hw/elf_ops.h b/hw/elf_ops.h
> index 531a425..3ff8ffd 100644
> --- a/hw/elf_ops.h
> +++ b/hw/elf_ops.h
> @@ -187,12 +187,12 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, 
> int fd, int must_swab,
>     return -1;
> }
> 
> -static int glue(load_elf, SZ)(const char *name, int fd,
> +static int glue(elf_phy_loader, SZ)(const char *name, int fd,
>                               uint64_t (*translate_fn)(void *, uint64_t),
>                               void *translate_opaque,
>                               int must_swab, uint64_t *pentry,
>                               uint64_t *lowaddr, uint64_t *highaddr,
> -                              int elf_machine, int clear_lsb)
> +                              int elf_machine, int clear_lsb, int reset)
> {
>     struct elfhdr ehdr;
>     struct elf_phdr *phdr = NULL, *ph;
> @@ -202,6 +202,9 @@ static int glue(load_elf, SZ)(const char *name, int fd,
>     uint8_t *data = NULL;
>     char label[128];
> 
> +    if (reset) {
> +        fd = open(name, O_RDONLY | O_BINARY);
> +    }
>     if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
>         goto fail;
>     if (must_swab) {
> @@ -232,7 +235,9 @@ static int glue(load_elf, SZ)(const char *name, int fd,
>     if (pentry)
>       *pentry = (uint64_t)(elf_sword)ehdr.e_entry;
> 
> -    glue(load_symbols, SZ)(&ehdr, fd, must_swab, clear_lsb);
> +    if (!reset) {
> +        glue(load_symbols, SZ)(&ehdr, fd, must_swab, clear_lsb);
> +    }
> 
>     size = ehdr.e_phnum * sizeof(phdr[0]);
>     lseek(fd, ehdr.e_phoff, SEEK_SET);
> @@ -280,8 +285,12 @@ static int glue(load_elf, SZ)(const char *name, int fd,
>                 *pentry = ehdr.e_entry - ph->p_vaddr + ph->p_paddr;
>             }
> 
> -            snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
> -            rom_add_blob_fixed(label, data, mem_size, addr);
> +            if (!reset) {
> +                snprintf(label, sizeof(label), "phdr #%d: %s", i, name);
> +                rom_add_blob_fixed(label, data, mem_size, addr);
> +            } else {
> +                cpu_physical_memory_write(addr, data, mem_size);
> +            }
> 
>             total_size += mem_size;
>             if (addr < low)
> @@ -304,3 +313,28 @@ static int glue(load_elf, SZ)(const char *name, int fd,
>     g_free(phdr);
>     return -1;
> }
> +
> +static void glue(elf_reset, SZ)(void *opaque)
> +{
> +    ImageElf *elf = opaque;
> +    int fd;
> +    
> +    fd = open(elf->name, O_RDONLY | O_BINARY);
> +    glue(elf_phy_loader, SZ)(elf->name, fd, elf->fn, elf->opaque, elf->swab, 
> +                             NULL, NULL, NULL, elf->machine, elf->lsb, 1);
> +}
> +
> +static int glue(load_elf, SZ)(const char *name, int fd,
> +                              uint64_t (*translate_fn)(void *, uint64_t),
> +                              void *translate_opaque,
> +                              int must_swab, uint64_t *pentry,
> +                              uint64_t *lowaddr, uint64_t *highaddr,
> +                              int elf_machine, int clear_lsb)
> +{
> +    int ret;
> +
> +    ret = glue(elf_phy_loader, SZ)(name, fd, (*translate_fn), 
> translate_opaque,
> +                                   must_swab, pentry, lowaddr, highaddr,
> +                                   elf_machine, clear_lsb, 0);
> +    return ret;
> +}
> diff --git a/hw/loader.c b/hw/loader.c
> index 151ef20..10e5726 100644
> --- a/hw/loader.c
> +++ b/hw/loader.c
> @@ -342,13 +342,24 @@ int load_elf(const char *filename, uint64_t 
> (*translate_fn)(void *, uint64_t),
>         goto fail;
>     }
> 
> +    ImageElf *elf;
> +    elf = g_malloc0(sizeof(*elf));
> +    elf->name = g_strdup(filename);
> +    elf->fn = translate_fn;
> +    elf->opaque = translate_opaque;
> +    elf->swab = must_swab;
> +    elf->machine = elf_machine;
> +    elf->lsb = clear_lsb;

See my other mails on comments about these fields.


Alex

> +
>     lseek(fd, 0, SEEK_SET);
>     if (e_ident[EI_CLASS] == ELFCLASS64) {
>         ret = load_elf64(filename, fd, translate_fn, translate_opaque, 
> must_swab,
>                          pentry, lowaddr, highaddr, elf_machine, clear_lsb);
> +        qemu_register_reset(elf_reset64, elf);
>     } else {
>         ret = load_elf32(filename, fd, translate_fn, translate_opaque, 
> must_swab,
>                          pentry, lowaddr, highaddr, elf_machine, clear_lsb);
> +        qemu_register_reset(elf_reset32, elf);
>     }
> 
>     close(fd);
> -- 
> 1.7.1
> 
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]