Hi Alex, Tested successfully on Khadas VIM board, fix my panic with efivars.
Tested-by: Loic Devulder <ldevul...@suse.de> On 12/11/18 10:00 AM, Alexander Graf wrote: > While changing the RTS alignment to 64KB in commit 7a82c3051c8f > ("efi_loader: Align runtime section to 64kb") the relocation code > started to break. > > The reason for that is that we didn't actually look at the real > relocation data. We merely took the RUNTIME_CODE section as a > hint and started to relocate based on self calculated data from > that point on. That calculation was now out of sync though. > > To ensure we're not running into such a situation again, this patch > makes the runtime relocation code a bit more robust. We can just > trust the phys/virt hints from the payload. We also should check that > we really only have a single section, as the code doesn't handle > multiple code relocations yet. > > Fixes: 7a82c3051c8f ("efi_loader: Align runtime section to 64kb") > Reported-by: Heinrich Schuchardt <xypron.g...@gmx.de> > Reported-by: Loic Devulder <ldevul...@suse.de> > Signed-off-by: Alexander Graf <ag...@suse.de> > > --- > > v1 -> v2: > > - Add more verbose comment explaining why we have the > sanity check. > --- > lib/efi_loader/efi_runtime.c | 34 +++++++++++++++++++++++++++++++--- > 1 file changed, 31 insertions(+), 3 deletions(-) > > diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c > index 95844efdb0..fff93f0960 100644 > --- a/lib/efi_loader/efi_runtime.c > +++ b/lib/efi_loader/efi_runtime.c > @@ -436,14 +436,42 @@ static efi_status_t EFIAPI efi_set_virtual_address_map( > uint32_t descriptor_version, > struct efi_mem_desc *virtmap) > { > - ulong runtime_start = (ulong)&__efi_runtime_start & > - ~(ulong)EFI_PAGE_MASK; > int n = memory_map_size / descriptor_size; > int i; > + int rt_code_sections = 0; > > EFI_ENTRY("%lx %lx %x %p", memory_map_size, descriptor_size, > descriptor_version, virtmap); > > + /* > + * TODO: > + * Further down we are cheating. While really we should implement > + * SetVirtualAddressMap() events and ConvertPointer() to allow > + * dynamically loaded drivers to expose runtime services, we don't > + * today. > + * > + * So let's ensure we see exactly one single runtime section, as > + * that is the built-in one. If we see more (or less), someone must > + * have tried adding or removing to that which we don't support yet. > + * In that case, let's better fail rather than expose broken runtime > + * services. > + */ > + for (i = 0; i < n; i++) { > + struct efi_mem_desc *map = (void*)virtmap + > + (descriptor_size * i); > + > + if (map->type == EFI_RUNTIME_SERVICES_CODE) > + rt_code_sections++; > + } > + > + if (rt_code_sections != 1) { > + /* > + * We expose exactly one single runtime code section, so > + * something is definitely going wrong. > + */ > + return EFI_EXIT(EFI_INVALID_PARAMETER); > + } > + > /* Rebind mmio pointers */ > for (i = 0; i < n; i++) { > struct efi_mem_desc *map = (void*)virtmap + > @@ -483,7 +511,7 @@ static efi_status_t EFIAPI efi_set_virtual_address_map( > map = (void*)virtmap + (descriptor_size * i); > if (map->type == EFI_RUNTIME_SERVICES_CODE) { > ulong new_offset = map->virtual_start - > - (runtime_start - gd->relocaddr); > + map->physical_start + gd->relocaddr; > > efi_runtime_relocate(new_offset, map); > /* Once we're virtual, we can no longer handle > -- Loic Devulder <ldevul...@suse.com> | ldevulder@irc 0x175A963893C85F55 | D220 DEF5 56A3 DE00 9DAA 78BA 175A 9638 93C8 5F55 Senior QA Engineer | Container & Storage Solutions Quality Assurance team (qa-css) SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nuernberg, Germany GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB, 21284 (AG Nuernberg) _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot