[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 03:47, <konrad.wilk@xxxxxxxxxx> wrote:
>> > +static int move_payload(struct payload *payload, struct xsplice_elf *elf)
>> > +{
> .. snip..
>> > +    /* Compute size of different regions. */
>> > +    for ( i = 1; i < elf->hdr->e_shnum; i++ )
>> > +    {
>> > +        if ( (elf->sec[i].sec->sh_flags & (SHF_ALLOC|SHF_EXECINSTR)) ==
>> > +             (SHF_ALLOC|SHF_EXECINSTR) )
>> > +            calc_section(&elf->sec[i], &payload->text_size, &offset[i]);
>> 
>> This silently accepts writable text sections, yet the portion of the
>> memory this gets placed in will be mapped RX.
> 
> I am not sure I follow. We only accept if sh_flags have AX. Not WAX?
> How am I accepting writable text sections?

Because the & masks off SHF_WRITE, i.e. you only check that
SHF_ALLOC and SHF_EXECINSTR are set, but not that SHF_WRITE
is clear.

>> > +        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.*/;
>> > +        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;
>> > +        }
>> 
>> I saw this in the changelog, but I don't really understand these last
>> two conditionals. Wouldn't you want to bail on _any_ sections which
> 
> The first (/Do nothing/) is for sections such as .rela.* (which we can
> ditch after we are done), .symtab, .strtab (for which in later patches in
> build_symbol_table construct a copy), and:
> 
> [ 1] .note.gnu.build-i NOTE 0000000000000000  00000040
>        0000000000000024  0000000000000000   A       0     0     4
> 
> which value we just copy in struct payload->id.
> (also in later patch).

All of which would fall under the "ignore sections with SHF_ALLOC
clear" rule, as mentioned ...

>> have SHF_ALLOC set but don't get mapped to one of the three
>> blocks? And wouldn't you (silently) ignore any sections with SHF_ALLOC
>> clear?

... here.

>> > +int xsplice_elf_resolve_symbols(struct xsplice_elf *elf)
>> > +{
>> > +    unsigned int i;
>> > +    int rc = 0;
>> > +
>> > +    ASSERT(elf->sym);
>> > +
>> > +    for ( i = 1; i < elf->nsym; i++ )
>> > +    {
>> > +        unsigned int idx = elf->sym[i].sym->st_shndx;
>> > +        Elf_Sym *sym = (Elf_Sym *)elf->sym[i].sym;
>> 
>> Well, I admit that this is the more straightforward solution, but it
>> opens up all of what sym points to for writing. I.e. I'd have
>> considered it much better to really only do the casting away of
>> const in the one spot where you need it (see below).
> 
> OK. That may become a bit cumbersome. We would have in the later
> patches (xsplice,symbols: Implement symbol name resolution on addres)
> the SHN_UNDEF doing symbol lookup. And that one tries to set
> sym->st_value twice.
> 
> I can certainly cast it twice there, and then once in the default
> case if you would like.

How about calculating the new value into a local variable, and doing
the cast needed for the assignment just once after the switch()?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.