@@ -47,6 +47,7 @@ static inline void *thread_stack_alloc(void)
struct thread_info {
int cpu;
unsigned int flags;
+ void *pgtable;
#ifdef __arm__
exception_fn exception_handlers[EXCPTN_MAX];
#else
@@ -54,12 +54,13 @@ void mmu_mark_disabled(int cpu)
extern void asm_mmu_enable(phys_addr_t pgtable);
void mmu_enable(pgd_t *pgtable)
{
- int cpu = current_thread_info()->cpu;
+ struct thread_info *info = current_thread_info();
asm_mmu_enable(__pa(pgtable));
flush_tlb_all();
- mmu_mark_enabled(cpu);
+ info->pgtable = pgtable;
+ mmu_mark_enabled(info->cpu);
}
extern void asm_mmu_disable(void);
@@ -124,6 +124,7 @@ void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr)
sp_usr &= (~7UL); /* stack ptr needs 8-byte alignment */
thread_info_init(thread_info_sp(sp_usr), TIF_USER_MODE);
+ thread_info_sp(sp_usr)->pgtable = current_thread_info()->pgtable;
asm volatile(
"mrs r0, cpsr\n"
@@ -33,6 +33,7 @@ secondary_entry_fn secondary_cinit(void)
secondary_entry_fn entry;
thread_info_init(ti, 0);
+ ti->pgtable = mmu_idmap;
mmu_mark_enabled(ti->cpu);
/*
@@ -238,6 +238,7 @@ void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr)
sp_usr &= (~15UL); /* stack ptr needs 16-byte alignment */
__thread_info_init(thread_info_sp(sp_usr), TIF_USER_MODE);
+ thread_info_sp(sp_usr)->pgtable = current_thread_info()->pgtable;
asm volatile(
"mov x0, %0\n"
Signed-off-by: Andrew Jones <drjones@redhat.com> --- lib/arm/asm/thread_info.h | 1 + lib/arm/mmu.c | 5 +++-- lib/arm/processor.c | 1 + lib/arm/smp.c | 1 + lib/arm64/processor.c | 1 + 5 files changed, 7 insertions(+), 2 deletions(-)