p = (void*)((ulong)rel->offset - base) + gd->relocaddr;
- /* The runtime services are updated in efi_runtime_detach() */
+ /*
+ * The runtime services table is updated in
+ * efi_relocate_runtime_table()
+ */
if (map && efi_is_runtime_service_pointer(p))
continue;
{
efi_uintn_t n = memory_map_size / descriptor_size;
efi_uintn_t i;
+ efi_status_t ret = EFI_INVALID_PARAMETER;
int rt_code_sections = 0;
struct efi_event *event;
EFI_ENTRY("%zx %zx %x %p", memory_map_size, descriptor_size,
descriptor_version, virtmap);
+ if (descriptor_version != EFI_MEMORY_DESCRIPTOR_VERSION ||
+ descriptor_size < sizeof(struct efi_mem_desc))
+ goto out;
+
efi_virtmap = virtmap;
efi_descriptor_size = descriptor_size;
efi_descriptor_count = n;
* We expose exactly one single runtime code section, so
* something is definitely going wrong.
*/
- return EFI_EXIT(EFI_INVALID_PARAMETER);
+ goto out;
}
/* Notify EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE */
}
}
- /*
- * Some runtime services are implemented in a way that we can only offer
- * them at boottime. Replace those function pointers.
- *
- * TODO: move this call to ExitBootServices().
- */
- efi_runtime_detach();
-
/* Relocate the runtime. See TODO above */
for (i = 0; i < n; i++) {
struct efi_mem_desc *map;
efi_relocate_runtime_table(new_offset);
efi_runtime_relocate(new_offset, map);
- return EFI_EXIT(EFI_SUCCESS);
+ ret = EFI_SUCCESS;
+ goto out;
}
}
- return EFI_EXIT(EFI_INVALID_PARAMETER);
+out:
+ return EFI_EXIT(ret);
}
/**