2 * include/asm-s390/mmu_context.h
6 * Derived from "include/asm-i386/mmu_context.h"
9 #ifndef __S390_MMU_CONTEXT_H
10 #define __S390_MMU_CONTEXT_H
12 #include <asm/pgalloc.h>
13 #include <asm/uaccess.h>
14 #include <asm-generic/mm_hooks.h>
16 static inline int init_new_context(struct task_struct
*tsk
,
19 mm
->context
.asce_bits
= _ASCE_TABLE_LENGTH
| _ASCE_USER_BITS
;
21 mm
->context
.asce_bits
|= _ASCE_TYPE_REGION3
;
23 if (current
->mm
->context
.pgstes
) {
24 mm
->context
.noexec
= 0;
25 mm
->context
.pgstes
= 1;
27 mm
->context
.noexec
= s390_noexec
;
28 mm
->context
.pgstes
= 0;
30 mm
->context
.asce_limit
= STACK_TOP_MAX
;
31 crst_table_init((unsigned long *) mm
->pgd
, pgd_entry_type(mm
));
35 #define destroy_context(mm) do { } while (0)
38 #define LCTL_OPCODE "lctl"
40 #define LCTL_OPCODE "lctlg"
43 static inline void update_mm(struct mm_struct
*mm
, struct task_struct
*tsk
)
47 S390_lowcore
.user_asce
= mm
->context
.asce_bits
| __pa(pgd
);
49 /* Load primary space page table origin. */
50 pgd
= mm
->context
.noexec
? get_shadow_table(pgd
) : pgd
;
51 S390_lowcore
.user_exec_asce
= mm
->context
.asce_bits
| __pa(pgd
);
52 asm volatile(LCTL_OPCODE
" 1,1,%0\n"
53 : : "m" (S390_lowcore
.user_exec_asce
) );
55 /* Load home space page table origin. */
56 asm volatile(LCTL_OPCODE
" 13,13,%0"
57 : : "m" (S390_lowcore
.user_asce
) );
58 set_fs(current
->thread
.mm_segment
);
61 static inline void switch_mm(struct mm_struct
*prev
, struct mm_struct
*next
,
62 struct task_struct
*tsk
)
64 cpu_set(smp_processor_id(), next
->cpu_vm_mask
);
68 #define enter_lazy_tlb(mm,tsk) do { } while (0)
69 #define deactivate_mm(tsk,mm) do { } while (0)
71 static inline void activate_mm(struct mm_struct
*prev
,
72 struct mm_struct
*next
)
74 switch_mm(prev
, next
, current
);
77 #endif /* __S390_MMU_CONTEXT_H */