[RFC PATCH] arm64/efi: efistub: reuse EFI mapping for Image if it is lower

Ard Biesheuvel ard.biesheuvel at linaro.org
Wed Jul 16 02:43:31 PDT 2014


On 16 July 2014 11:20, Mark Rutland <mark.rutland at arm.com> wrote:
> Hi Ard,
>
> On Tue, Jul 15, 2014 at 05:50:30PM +0100, Ard Biesheuvel wrote:
>> The EFI loader may load Image at any available offset. This means Image may
>> reside very close to or at the base of DRAM, in which case the relocation
>> done by efi_entry() results in Image being moved up in memory, which is
>> undesirable (memory below the kernel is currently not usable).
>
> Rather than complicating this path I would prefer that we fixed not
> being able to address memory below stext - TEXT_OFFSET. That would
> simplify the bootloader's job regardless of UEFI, as any loader can then
> simply place the kernel at a 2MB-aligned address + TEXT_OFFSET (the
> kernel would have to not span a 512MB boundary to keep the initial page
> tables simple, but that's still a weaker requirement than what we
> currently need).
>
> The approach taken in this patch seems sane for the current way the VA
> space is laid out, but if we're not currently wasting an absurd amount
> of memory I'd rather we got the VA layout fixed such that we can address
> memory below the kernel image.
>
> How much memory are we seeing wasted as a result of the existing
> relocation code, and how often?
>

To be honest, I don't have any data that suggest that this is an actual problem.
The potential penalty is the size of Image rounded up to 2 megs.

But I agree it would be much more useful if the requirements regarding
where to locate Image can be relaxed somewhat.

>>       /*
>> +      * Check whether the original allocation done by the EFI loader is more
>> +      * favorable (i.e., closer to the base of DRAM) than the new one created
>> +      * by efi_entry(). If so, reuse the original one.
>> +      */
>> +     adr     x3, 0f
>> +     cmp     x3, x0
>> +     bgt     1f      // this image is loaded higher, so just proceed normally
>> +
>> +     /*
>> +      * Jump into the relocated image so we can move the original Image to
>> +      * a 2 MB boundary + TEXT_OFFSET inside the original mapping without
>> +      * overwriting ourselves.
>> +      */
>> +     sub     x3, x3, x22     // subtract current base offset
>> +     add     x3, x3, x0      // add base offset of relocated image
>> +     br      x3              // jump to next line, but in relocated image
>
> At this point I don't believe the necessary icache maintenance + isb
> have occurred to make the new image visible to the I-side and to ensure
> we don't have any stale prefetched instructions in the pipeline. That
> still seems to happen later. Have I missed something?
>

No you haven't. The cache maintenance needs to occur here for the
relocated Image if we intend to execute from it.
That's what I get for using Foundation model, I guess :-)

Anyway, I don't think this is a big deal, it's just one of the puzzle
pieces in the wider discussion about PE/COFF loading, relocation, APM
Mustang etc.

-- 
Ard.


>> +
>> +0:   mov     x1, x0                  // copy from relocated Image
>> +     sub     x0, x22, #1             // copy to base of original Image
>> +     orr     x0, x0, #(SZ_2M - 1)    // .. rounded up to 2 MB
>> +     ldr     x3, =(TEXT_OFFSET + 1)  // .. plus TEXT_OFFSET
>> +     add     x0, x0, x3
>> +     mov     x2, x24                 // copy 'size of Image' bytes
>> +     bl      memcpy
>> +     add     x21, x0, x23            // add stext_offset to entry point
>> +1:
>> +     /*
>>        * Flush dcache covering current runtime addresses
>>        * of kernel text/data. Then flush all of icache.
>>        */
>> -     adrp    x1, _text
>> -     add     x1, x1, #:lo12:_text
>> -     adrp    x2, _edata
>> -     add     x2, x2, #:lo12:_edata
>> -     sub     x1, x2, x1
>> -
>> +     mov     x1, x24                 // size of Image
>>       bl      __flush_dcache_area
>>       ic      ialluis
>
> Cheers,
> Mark.



More information about the linux-arm-kernel mailing list