|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 11/27] xsplice: Implement payload loading
>>> On 27.04.16 at 17:48, <konrad@xxxxxxxxxx> wrote:
> Here is the inline patch:
At first I'll reply on just the particular issue in move_payload(); I'll
then go through the entire patch to see if anything else needs
commenting.
> +static int move_payload(struct payload *payload, struct xsplice_elf *elf)
> +{
> + void *text_buf, *ro_buf, *rw_buf;
> + unsigned int i;
> + size_t size = 0;
> + unsigned int *offset;
> + int rc = 0;
> +
> + offset = xmalloc_array(unsigned int, elf->hdr->e_shnum);
> + if ( !offset )
> + return -ENOMEM;
> +
> + /* Compute size of different regions. */
> + for ( i = 1; i < elf->hdr->e_shnum; i++ )
> + {
> + if ( (elf->sec[i].sec->sh_flags & SHF_ALLOC) &&
> + (elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
> + !(elf->sec[i].sec->sh_flags & SHF_WRITE) )
> + calc_section(&elf->sec[i], &payload->text_size, &offset[i]);
> + else if ( (elf->sec[i].sec->sh_flags & SHF_ALLOC) &&
> + !(elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
> + (elf->sec[i].sec->sh_flags & SHF_WRITE) )
> + calc_section(&elf->sec[i], &payload->rw_size, &offset[i]);
> + else if ( (elf->sec[i].sec->sh_flags & SHF_ALLOC) &&
> + !(elf->sec[i].sec->sh_flags & SHF_EXECINSTR) &&
> + !(elf->sec[i].sec->sh_flags & SHF_WRITE) )
> + calc_section(&elf->sec[i], &payload->ro_size, &offset[i]);
> + else if ( !elf->sec[i].sec->sh_flags ||
> + (elf->sec[i].sec->sh_flags & SHF_EXECINSTR) ||
> + (elf->sec[i].sec->sh_flags & SHF_MASKPROC) )
> + /*
> + * Do nothing. These are .rel.text, rel.*, .symtab, .strtab,
> + * and .shstrtab. For the non-relocate we allocate and copy these
> + * via other means - and the .rel we can ignore as we only use it
> + * once during loading.
> + */
> + offset[i] = UINT_MAX;
> + else if ( (elf->sec[i].sec->sh_flags & SHF_ALLOC) &&
> + (elf->sec[i].sec->sh_type == SHT_NOBITS) )
> + {
> + dprintk(XENLOG_DEBUG, XSPLICE "%s: Not supporting %s section!\n",
> + elf->name, elf->sec[i].name);
> + rc = -EOPNOTSUPP;
> + goto out;
> + }
> + else /* Such as .comment, or .debug_str. */
> + {
> + dprintk(XENLOG_DEBUG, XSPLICE "%s: Ignoring %s section!\n",
> + elf->name, elf->sec[i].name);
> + offset[i] = UINT_MAX;
> + }
I continue to not understand why SHT_NOBITS, SHF_MASKPROC, or
zero sh_flags need considering here at all. You really only care about
SHF_ALLOC sections here (as I think you confirmed on irc), so why
can't you just start this whole sequence with
if ( !(elf->sec[i].sec->sh_flags & SHF_ALLOC) )
<ignore-this-section>
then handle RX, RW, and RO just like you do now and finally have
an "else" covering unsupported SHF_ALLOC sections. Less code,
and easier to understand.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |