On Thu, Oct 30, 2014 at 1:18 PM, Jens Wiklander <jens.wiklan...@linaro.org>
wrote:

>
>
> On Thu, Oct 30, 2014 at 12:22 PM, Ard Biesheuvel <
> ard.biesheu...@linaro.org> wrote:
>
>> On 30 October 2014 11:31, Ard Biesheuvel <ard.biesheu...@linaro.org>
>> wrote:
>> > On 30 October 2014 11:20, Jens Wiklander <jens.wiklan...@linaro.org>
>> wrote:
>> >> Hi toolchain champions,
>> >>
>> >> [please keep me in cc as I'm not subscribed to
>> >> linaro-toolchain@lists.linaro.org]
>> >>
>> >> In OP-TEE we are going to activate a pager which is an integrated part
>> of
>> >> the statically linked secure OS binary (compiled for ARMv7/Aarch32
>> now, but
>> >> at some point also Aarch64).
>> >>
>> >> The pager in OP-TEE allows use of more memory than the amount of
>> available
>> >> physical memory. This makes it possible to for instance have an OP-TEE
>> >> binary that requires more memory than the amount of available memory.
>> What
>> >> the pager does is to map a physical page at the virtual address where
>> the
>> >> memory is needed and populate it which what is expected on demand. The
>> pager
>> >> also unmaps physical pages that hasn't been used in a while to be able
>> to
>> >> recycle it.
>> >>
>> >> The code used by the pager to map and populate a page must always be
>> mapped
>> >> since we would otherwise get a deadlock. The problem is that the pager
>> is
>> >> also part of OP-TEE so we need to partition the binary in a way that
>> all
>> >> code needed to handle a page fault is in one area in the binary and
>> always
>> >> mapped.
>> >>
>> >> Annotating functions and such as it's done in the Linux kernel with
>> __init
>> >> will not scale here since the pager will need routines from
>> "third-party"
>> >> libraries. We can make small changes to the libraries but identifying
>> and
>> >> annotating everything needed by the pager is too much. We would also
>> run
>> >> into troubles with strings.
>> >>
>> >> I have a couple ideas below that I need help exploring.
>> >>
>> >> What if we do an incremental linking of the entire TEE Core with
>> garbage
>> >> collect only keeping the entry functions of the pager? Then we would
>> get an
>> >> object file with everything the pager depends on included but not much
>> more.
>> >> It would be easy to put this single object file in a separate part of
>> the
>> >> OP-TEE binary. The procedure would be something like:
>> >>
>> >> Compile everything with -ffunction-sections -fdata-sections
>> >> ld -i --gc-sections -u pager_entry -o pager_code.o $(objs)
>> $(link-ldadd)
>> >> $(libgcc)
>> >> ld $(link-ldflags) pager_code.o $(objs) $(link-ldadd) $(libgcc)
>> >>
>> >> But the problem comes with linking in the rest of the code in the last
>> step,
>> >> we would get lots of multiple defined symbols. We could create a
>> >> libtee_core.a file where we put all the $(objs) files and the linker
>> would
>> >> only use the needed object files. But we would still have some multiple
>> >> defined symbols left since each .o file contains more than just one
>> section.
>> >>
>> >> Any ideas how to solve this?
>> >>
>>
>>
After lots of experimentation I've finally found something that seems to
work. What I do is something like:
Compile everything with -ffunction-sections -fdata-sections
ld -i --gc-sections -u pager_entry -o pager_code.o $(objs) $(link-ldadd)
$(libgcc)
to get all required sections. Then I have a script generating a list of all
the sections in a format suitable to include in our linker script. After
that I link the OP-TEE binary as usual and voila, all pager related
sections are in one area.

There's one small problem though, it seems that even if I compile
everything with "-ffunction-sections -fdata-sections" there's still some
stuff emitted in .rodata.
It seems that for instance:
printf("Hello world");
would result in putting the string "Hello world" in .rodata. Any ideas how
to get these constant strings in one .rodata.something each instead?

Regards,
Jens
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to