mmu_context.h 2.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
#ifndef __PARISC_MMU_CONTEXT_H
#define __PARISC_MMU_CONTEXT_H

#include <linux/mm.h>
A
Alexey Dobriyan 已提交
5
#include <linux/sched.h>
A
Arun Sharma 已提交
6
#include <linux/atomic.h>
L
Linus Torvalds 已提交
7 8
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
9
#include <asm-generic/mm_hooks.h>
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
{
}

/* on PA-RISC, we actually have enough contexts to justify an allocator
 * for them.  prumpf */

extern unsigned long alloc_sid(void);
extern void free_sid(unsigned long);

static inline int
init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
	BUG_ON(atomic_read(&mm->mm_users) != 1);

	mm->context = alloc_sid();
	return 0;
}

static inline void
destroy_context(struct mm_struct *mm)
{
	free_sid(mm->context);
	mm->context = 0;
}

37
static inline unsigned long __space_to_prot(mm_context_t context)
L
Linus Torvalds 已提交
38 39
{
#if SPACEID_SHIFT == 0
40
	return context << 1;
L
Linus Torvalds 已提交
41
#else
42
	return context >> (SPACEID_SHIFT - 1);
L
Linus Torvalds 已提交
43 44 45
#endif
}

46 47 48 49 50 51
static inline void load_context(mm_context_t context)
{
	mtsp(context, 3);
	mtctl(__space_to_prot(context), 8);
}

52 53
static inline void switch_mm_irqs_off(struct mm_struct *prev,
		struct mm_struct *next, struct task_struct *tsk)
L
Linus Torvalds 已提交
54 55 56 57 58 59 60
{
	if (prev != next) {
		mtctl(__pa(next->pgd), 25);
		load_context(next->context);
	}
}

61 62 63 64 65
static inline void switch_mm(struct mm_struct *prev,
		struct mm_struct *next, struct task_struct *tsk)
{
	unsigned long flags;

J
John David Anglin 已提交
66 67 68
	if (prev == next)
		return;

69 70 71 72 73 74
	local_irq_save(flags);
	switch_mm_irqs_off(prev, next, tsk);
	local_irq_restore(flags);
}
#define switch_mm_irqs_off switch_mm_irqs_off

L
Linus Torvalds 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#define deactivate_mm(tsk,mm)	do { } while (0)

static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
{
	/*
	 * Activate_mm is our one chance to allocate a space id
	 * for a new mm created in the exec path. There's also
	 * some lazy tlb stuff, which is currently dead code, but
	 * we only allocate a space id if one hasn't been allocated
	 * already, so we should be OK.
	 */

	BUG_ON(next == &init_mm); /* Should never happen */

	if (next->context == 0)
	    next->context = alloc_sid();

	switch_mm(prev,next,current);
}
#endif