1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PARISC_MMU_CONTEXT_H
3 #define __PARISC_MMU_CONTEXT_H
6 #include <linux/sched.h>
7 #include <linux/atomic.h>
8 #include <asm-generic/mm_hooks.h>
10 /* on PA-RISC, we actually have enough contexts to justify an allocator
13 extern unsigned long alloc_sid(void);
14 extern void free_sid(unsigned long);
16 #define init_new_context init_new_context
18 init_new_context(struct task_struct
*tsk
, struct mm_struct
*mm
)
20 BUG_ON(atomic_read(&mm
->mm_users
) != 1);
22 mm
->context
= alloc_sid();
26 #define destroy_context destroy_context
28 destroy_context(struct mm_struct
*mm
)
30 free_sid(mm
->context
);
34 static inline unsigned long __space_to_prot(mm_context_t context
)
36 #if SPACEID_SHIFT == 0
39 return context
>> (SPACEID_SHIFT
- 1);
43 static inline void load_context(mm_context_t context
)
46 mtctl(__space_to_prot(context
), 8);
49 static inline void switch_mm_irqs_off(struct mm_struct
*prev
,
50 struct mm_struct
*next
, struct task_struct
*tsk
)
53 mtctl(__pa(next
->pgd
), 25);
54 load_context(next
->context
);
58 static inline void switch_mm(struct mm_struct
*prev
,
59 struct mm_struct
*next
, struct task_struct
*tsk
)
66 local_irq_save(flags
);
67 switch_mm_irqs_off(prev
, next
, tsk
);
68 local_irq_restore(flags
);
70 #define switch_mm_irqs_off switch_mm_irqs_off
72 #define activate_mm activate_mm
73 static inline void activate_mm(struct mm_struct
*prev
, struct mm_struct
*next
)
76 * Activate_mm is our one chance to allocate a space id
77 * for a new mm created in the exec path. There's also
78 * some lazy tlb stuff, which is currently dead code, but
79 * we only allocate a space id if one hasn't been allocated
80 * already, so we should be OK.
83 BUG_ON(next
== &init_mm
); /* Should never happen */
85 if (next
->context
== 0)
86 next
->context
= alloc_sid();
88 switch_mm(prev
,next
,current
);
91 #include <asm-generic/mmu_context.h>