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