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?
> >>
> >
> > If you can confirm that the first step correctly produces a kernel
> > with all the pager dependencies, couldn't you wrap all remaining code
> > into a static library and link against that? This would solve the
> > multiple definition issue as the archive members will be pulled in on
> > demand. The only thing you need to ensure is that the granularity is
> > sufficient, i.e., if the linker decides to pull a .o from the static
> > lib, it will pull all contents including symbols that may conflict,
> > but I would expect the -ffunction-sections -fdata-sections to take
> > care of that.
> >
>
> Hmm, I suppose that is what you meant with libtee_core.a?
>
Yes. :-)


>
> I suppose you can use objcopy to separate .text and .data sections
> into separate .o files and wrap those up into an archive.
> There is also --localize-symbol and --weaken-symbol options in
> objcopy, but I making all symbols weak in libtee_core.a is probably
> not the way to go.
>
> Is there any way to make sure the conflicts are over .text or .rodata
> symbols only? That would at least eliminate the duplicate data hazard,
> leaving only the code bloat due to duplication.
>
Yes, we could let all .data and .bss go into the pager, but I don't like
the code bloat.

Regards,
Jens

>
> --
> Ard.
>
>
> > Another trick that I know bionic uses for the loader is to prefix all
> > symbols using objcopy --prefix-symbols=...
> > That way, you can work around the multiple definitions, but you may
> > end up with duplicate data which is a bit of a hazard.
> >
> > --
> > Ard.
> >
> >
> >> We could perhaps split each .o file into several .o files each with
> only one
> >> section. Would it work? Would it make the resulting binary larger or
> >> inefficient?
> >>
> >> Another option could be to mark all symbols in libtee_core.a and other
> >> libaries as weak, but the problem here is that we already have some weak
> >> functions in TEE Core so this would break that. Perhaps if it would be
> >> possible to have different levels of weakness.
> >>
> >> Any ideas are welcome, either along this path or different approaches.
> >>
> >> Regards,
> >> Jens
>
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to