mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
0b317c389c
When we gain MMID support we'll be storing MMIDs as atomic64_t values and accessing them via atomic64_* functions. This necessitates that we don't use cpu_context() as the left hand side of an assignment, ie. as a modifiable lvalue. In preparation for this introduce a new set_cpu_context() function & replace all assignments with cpu_context() on their left hand side with an equivalent call to set_cpu_context(). To enforce that cpu_context() should not be used for assignments, we rewrite it as a static inline function. Signed-off-by: Paul Burton <paul.burton@mips.com> Cc: linux-mips@vger.kernel.org
39 lines
887 B
C
39 lines
887 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/mmu_context.h>
|
|
|
|
void get_new_mmu_context(struct mm_struct *mm)
|
|
{
|
|
unsigned int cpu;
|
|
u64 asid;
|
|
|
|
cpu = smp_processor_id();
|
|
asid = asid_cache(cpu);
|
|
|
|
if (!((asid += cpu_asid_inc()) & cpu_asid_mask(&cpu_data[cpu]))) {
|
|
if (cpu_has_vtag_icache)
|
|
flush_icache_all();
|
|
local_flush_tlb_all(); /* start new asid cycle */
|
|
}
|
|
|
|
set_cpu_context(cpu, mm, asid);
|
|
asid_cache(cpu) = asid;
|
|
}
|
|
|
|
void check_mmu_context(struct mm_struct *mm)
|
|
{
|
|
unsigned int cpu = smp_processor_id();
|
|
|
|
/* Check if our ASID is of an older version and thus invalid */
|
|
if ((cpu_context(cpu, mm) ^ asid_cache(cpu)) & asid_version_mask(cpu))
|
|
get_new_mmu_context(mm);
|
|
}
|
|
|
|
void check_switch_mmu_context(struct mm_struct *mm)
|
|
{
|
|
unsigned int cpu = smp_processor_id();
|
|
|
|
check_mmu_context(mm);
|
|
write_c0_entryhi(cpu_asid(cpu, mm));
|
|
TLBMISS_HANDLER_SETUP_PGD(mm->pgd);
|
|
}
|