Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * include/asm-s390/mmu_context.h | |
3 | * | |
4 | * S390 version | |
5 | * | |
6 | * Derived from "include/asm-i386/mmu_context.h" | |
7 | */ | |
8 | ||
9 | #ifndef __S390_MMU_CONTEXT_H | |
10 | #define __S390_MMU_CONTEXT_H | |
11 | ||
c1821c2e | 12 | #include <asm/pgalloc.h> |
d6dd61c8 JF |
13 | #include <asm-generic/mm_hooks.h> |
14 | ||
6f457e1a MS |
15 | static inline int init_new_context(struct task_struct *tsk, |
16 | struct mm_struct *mm) | |
17 | { | |
18 | mm->context = _ASCE_TABLE_LENGTH | _ASCE_USER_BITS; | |
19 | #ifdef CONFIG_64BIT | |
20 | mm->context |= _ASCE_TYPE_REGION3; | |
21 | #endif | |
22 | return 0; | |
23 | } | |
1da177e4 LT |
24 | |
25 | #define destroy_context(mm) do { } while (0) | |
26 | ||
c1821c2e GS |
27 | #ifndef __s390x__ |
28 | #define LCTL_OPCODE "lctl" | |
c1821c2e GS |
29 | #else |
30 | #define LCTL_OPCODE "lctlg" | |
c1821c2e GS |
31 | #endif |
32 | ||
3610cce8 | 33 | static inline void update_mm(struct mm_struct *mm, struct task_struct *tsk) |
1da177e4 | 34 | { |
6f457e1a | 35 | S390_lowcore.user_asce = mm->context | __pa(mm->pgd); |
3610cce8 MS |
36 | if (switch_amode) { |
37 | /* Load primary space page table origin. */ | |
6f457e1a MS |
38 | pgd_t *shadow_pgd = get_shadow_table(mm->pgd) ? : mm->pgd; |
39 | S390_lowcore.user_exec_asce = mm->context | __pa(shadow_pgd); | |
3610cce8 MS |
40 | asm volatile(LCTL_OPCODE" 1,1,%0\n" |
41 | : : "m" (S390_lowcore.user_exec_asce) ); | |
42 | } else | |
43 | /* Load home space page table origin. */ | |
44 | asm volatile(LCTL_OPCODE" 13,13,%0" | |
45 | : : "m" (S390_lowcore.user_asce) ); | |
1da177e4 LT |
46 | } |
47 | ||
48 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |
c1821c2e | 49 | struct task_struct *tsk) |
1da177e4 | 50 | { |
3610cce8 MS |
51 | if (unlikely(prev == next)) |
52 | return; | |
1da177e4 | 53 | cpu_set(smp_processor_id(), next->cpu_vm_mask); |
3610cce8 | 54 | update_mm(next, tsk); |
1da177e4 LT |
55 | } |
56 | ||
3610cce8 | 57 | #define enter_lazy_tlb(mm,tsk) do { } while (0) |
1da177e4 LT |
58 | #define deactivate_mm(tsk,mm) do { } while (0) |
59 | ||
4448aaf0 | 60 | static inline void activate_mm(struct mm_struct *prev, |
1da177e4 LT |
61 | struct mm_struct *next) |
62 | { | |
63 | switch_mm(prev, next, current); | |
64 | set_fs(current->thread.mm_segment); | |
65 | } | |
66 | ||
c1821c2e | 67 | #endif /* __S390_MMU_CONTEXT_H */ |