156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao/* 256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * linux/arch/unicore32/include/asm/mmu_context.h 356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * 456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * Code specific to PKUnity SoC and UniCore ISA 556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * 656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * Copyright (C) 2001-2010 GUAN Xue-tao 756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * 856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * This program is free software; you can redistribute it and/or modify 956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * it under the terms of the GNU General Public License version 2 as 1056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * published by the Free Software Foundation. 1156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao */ 1256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#ifndef __UNICORE_MMU_CONTEXT_H__ 1356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define __UNICORE_MMU_CONTEXT_H__ 1456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 1556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#include <linux/compiler.h> 1656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#include <linux/sched.h> 1756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#include <linux/io.h> 1856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 1956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#include <asm/cacheflush.h> 2056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#include <asm/cpu-single.h> 2156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 2256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define init_new_context(tsk, mm) 0 2356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 2456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define destroy_context(mm) do { } while (0) 2556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 2656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao/* 2756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * This is called when "tsk" is about to enter lazy TLB mode. 2856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * 2956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * mm: describes the currently active mm context 3056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * tsk: task which is entering lazy tlb 3156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * cpu: cpu number which is entering lazy tlb 3256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * 3356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * tsk->mm will be NULL 3456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao */ 3556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaostatic inline void 3656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaoenter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) 3756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao{ 3856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao} 3956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 4056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao/* 4156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * This is the actual mm switch as far as the scheduler 4256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * is concerned. No registers are touched. We avoid 4356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * calling the CPU specific function when the mm hasn't 4456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * actually changed. 4556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao */ 4656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaostatic inline void 4756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaoswitch_mm(struct mm_struct *prev, struct mm_struct *next, 4856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao struct task_struct *tsk) 4956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao{ 5056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao unsigned int cpu = smp_processor_id(); 5156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 5256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) || prev != next) 5356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao cpu_switch_mm(next->pgd, next); 5456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao} 5556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 5656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define deactivate_mm(tsk, mm) do { } while (0) 5756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define activate_mm(prev, next) switch_mm(prev, next, NULL) 5856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 5956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao/* 6056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * We are inserting a "fake" vma for the user-accessible vector page so 6156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * gdb and friends can get to it through ptrace and /proc/<pid>/mem. 6256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * But we also want to remove it before the generic code gets to see it 6356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * during process exit or the unmapping of it would cause total havoc. 6456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao * (the macro is used as remove_vma() is static to mm/mmap.c) 6556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao */ 6656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#define arch_exit_mmap(mm) \ 6756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaodo { \ 6856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao struct vm_area_struct *high_vma = find_vma(mm, 0xffff0000); \ 6956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao if (high_vma) { \ 7056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao BUG_ON(high_vma->vm_next); /* it should be last */ \ 7156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao if (high_vma->vm_prev) \ 7256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao high_vma->vm_prev->vm_next = NULL; \ 7356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao else \ 7456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao mm->mmap = NULL; \ 7556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao rb_erase(&high_vma->vm_rb, &mm->mm_rb); \ 7656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao mm->mmap_cache = NULL; \ 7756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao mm->map_count--; \ 7856372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao remove_vma(high_vma); \ 7956372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao } \ 8056372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao} while (0) 8156372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 8256372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetaostatic inline void arch_dup_mmap(struct mm_struct *oldmm, 8356372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao struct mm_struct *mm) 8456372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao{ 8556372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao} 8656372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao 8756372b0b2f533c9a25bd40a0577405f6ddb7cff2GuanXuetao#endif 88