/* * Set TTBR0 to reserved_pg_dir. No translations will be possible via TTBR0.
*/ staticinlinevoid cpu_set_reserved_ttbr0_nosync(void)
{ unsignedlong ttbr = phys_to_ttbr(__pa_symbol(reserved_pg_dir));
/* * TCR.T0SZ value to use when the ID map is active.
*/ #define idmap_t0sz TCR_T0SZ(IDMAP_VA_BITS)
/* * Ensure TCR.T0SZ is set to the provided value.
*/ staticinlinevoid __cpu_set_tcr_t0sz(unsignedlong t0sz)
{ unsignedlong tcr = read_sysreg(tcr_el1);
/* * Remove the idmap from TTBR0_EL1 and install the pgd of the active mm. * * The idmap lives in the same VA range as userspace, but uses global entries * and may use a different TCR_EL1.T0SZ. To avoid issues resulting from * speculative TLB fetches, we must temporarily install the reserved page * tables while we invalidate the TLBs and set up the correct TCR_EL1.T0SZ. * * If current is a not a user task, the mm covers the TTBR1_EL1 page tables, * which should not be installed in TTBR0_EL1. In this case we can leave the * reserved page tables in place.
*/ staticinlinevoid cpu_uninstall_idmap(void)
{ struct mm_struct *mm = current->active_mm;
/* * Load our new page tables. A strict BBM approach requires that we ensure that * TLBs are free of any entries that may overlap with the global mappings we are * about to install. * * For a real hibernate/resume/kexec cycle TTBR0 currently points to a zero * page, but TLBs may contain stale ASID-tagged entries (e.g. for EFI runtime * services), while for a userspace-driven test_resume cycle it points to * userspace page tables (and we must point it at a zero page ourselves). * * We change T0SZ as part of installing the idmap. This is undone by * cpu_uninstall_idmap() in __cpu_suspend_exit().
*/ staticinlinevoid cpu_install_ttbr0(phys_addr_t ttbr0, unsignedlong t0sz)
{
cpu_set_reserved_ttbr0();
local_flush_tlb_all();
__cpu_set_tcr_t0sz(t0sz);
/* avoid cpu_switch_mm() and its SW-PAN and CNP interactions */
write_sysreg(ttbr0, ttbr0_el1);
isb();
}
staticinlinevoid cpu_replace_ttbr1(pgd_t *pgdp)
{ /* * Only for early TTBR1 replacement before cpucaps are finalized and * before we've decided whether to use CNP.
*/
WARN_ON(system_capabilities_finalized());
__cpu_replace_ttbr1(pgdp, false);
}
/* * It would be nice to return ASIDs back to the allocator, but unfortunately * that introduces a race with a generation rollover where we could erroneously * free an ASID allocated in a future generation. We could workaround this by * freeing the ASID from the context of the dying mm (e.g. in arch_exit_mmap), * but we'd then need to make sure that we didn't dirty any TLBs afterwards. * Setting a reserved TTBR0 or EPD0 would work, but it all gets ugly when you * take CPU migration into account.
*/ void check_and_switch_context(struct mm_struct *mm);
#define enter_lazy_tlb enter_lazy_tlb staticinlinevoid
enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
{ /* * We don't actually care about the ttbr0 mapping, so point it at the * zero page.
*/
update_saved_ttbr0(tsk, &init_mm);
}
staticinlinevoid __switch_mm(struct mm_struct *next)
{ /* * init_mm.pgd does not contain any user mappings and it is always * active for kernel addresses in TTBR1. Just set the reserved TTBR0.
*/ if (next == &init_mm) {
cpu_set_reserved_ttbr0(); return;
}
/* * Update the saved TTBR0_EL1 of the scheduled-in task as the previous * value may have not been initialised yet (activate_mm caller) or the * ASID has changed since the last run (following the context switch * of another thread of the same process).
*/
update_saved_ttbr0(tsk, next);
}
/* * Only enforce protection keys on the current process, because there is no * user context to access POR_EL0 for another address space.
*/ staticinlinebool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, bool execute, bool foreign)
{ if (!system_supports_poe()) returntrue;
/* allow access if the VMA is not one from this process */ if (foreign || vma_is_foreign(vma)) returntrue;
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.