/* * efi_rt_stack_top[-1] contains the value the stack pointer had before * switching to the EFI runtime stack.
*/ #define current_in_efi() \
(!preemptible() && efi_rt_stack_top != NULL && \
on_task_stack(current, READ_ONCE(efi_rt_stack_top[-1]), 1))
/* * Even when Linux uses IRQ priorities for IRQ disabling, EFI does not. * And EFI shouldn't really play around with priority masking as it is not aware * which priorities the OS has assigned to its interrupts.
*/ #define arch_efi_save_flags(state_flags) \
((void)((state_flags) = read_sysreg(daif)))
/* arch specific definitions used by the stub code */
/* * In some configurations (e.g. VMAP_STACK && 64K pages), stacks built into the * kernel need greater alignment than we require the segments to be padded to.
*/ #define EFI_KIMG_ALIGN \
(SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN : THREAD_ALIGN)
/* * On arm64, we have to ensure that the initrd ends up in the linear region, * which is a 1 GB aligned region of size '1UL << (VA_BITS_MIN - 1)' that is * guaranteed to cover the kernel Image. * * Since the EFI stub is part of the kernel Image, we can relax the * usual requirements in Documentation/arch/arm64/booting.rst, which still * apply to other bootloaders, and are required for some kernel * configurations.
*/ staticinlineunsignedlong efi_get_max_initrd_addr(unsignedlong image_addr)
{ return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
}
/* * Although relocatable kernels can fix up the misalignment with * respect to MIN_KIMG_ALIGN, the resulting virtual text addresses are * subtly out of sync with those recorded in the vmlinux when kaslr is * disabled but the image required relocation anyway. Therefore retain * 2M alignment if KASLR was explicitly disabled, even if it was not * going to be activated to begin with.
*/ return efi_nokaslr ? MIN_KIMG_ALIGN : EFI_KIMG_ALIGN;
}
/* * On ARM systems, virtually remapped UEFI runtime services are set up in two * distinct stages: * - The stub retrieves the final version of the memory map from UEFI, populates * the virt_addr fields and calls the SetVirtualAddressMap() [SVAM] runtime * service to communicate the new mapping to the firmware (Note that the new * mapping is not live at this time) * - During an early initcall(), the EFI system table is permanently remapped * and the virtual remapping of the UEFI Runtime Services regions is loaded * into a private set of page tables. If this all succeeds, the Runtime * Services are enabled and the EFI_RUNTIME_SERVICES bit set.
*/
if (system_uses_ttbr0_pan()) { if (mm != current->active_mm) { /* * Update the current thread's saved ttbr0 since it is * restored as part of a return from exception. Enable * access to the valid TTBR0_EL1 and invoke the errata * workaround directly since there is no return from * exception when invoking the EFI run-time services.
*/
update_saved_ttbr0(current, mm);
uaccess_ttbr0_enable();
post_ttbr_update_workaround();
} else { /* * Defer the switch to the current thread's TTBR0_EL1 * until uaccess_enable(). Restore the current * thread's saved ttbr0 corresponding to its active_mm
*/
uaccess_ttbr0_disable();
update_saved_ttbr0(current, current->active_mm);
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.