> /* > * This needs to follow the FPU initializtion, since EFI depends on it. > + * It also needs to precede the CR pinning setup, because we need to be > + * able to temporarily clear the CR4.LASS bit in order to execute the > + * set_virtual_address_map call, which resides in lower addresses and > + * would trip LASS if enabled. > */ Why are the temporary mappings used to patch kernel code in the lower half of the virtual address space? The comments in front of use_temporary_mm() say: * Using a temporary mm allows to set temporary mappings that are not accessible * by other CPUs. Such mappings are needed to perform sensitive memory writes * that override the kernel memory protections (e.g., W^X), without exposing the * temporary page-table mappings that are required for these write operations to * other CPUs. Using a temporary mm also allows to avoid TLB shootdowns when the * mapping is torn down. But couldn't we map into upper half and do some/all of: 1) Trust that there aren't stupid bugs that dereference random pointers into the temporary mapping? 2) Make a "this CPU only" mapping 3) Avoid preemption while patching so there is no need for TLB shootdown by other CPUs when the temporary mapping is torn down, just flush local TLB. -Tony