Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.0-rc1 117 lines 3.3 kB view raw
1#ifndef __ASM_POWERPC_MMU_CONTEXT_H 2#define __ASM_POWERPC_MMU_CONTEXT_H 3#ifdef __KERNEL__ 4 5#include <linux/kernel.h> 6#include <linux/mm.h> 7#include <linux/sched.h> 8#include <linux/spinlock.h> 9#include <asm/mmu.h> 10#include <asm/cputable.h> 11#include <asm-generic/mm_hooks.h> 12#include <asm/cputhreads.h> 13 14/* 15 * Most if the context management is out of line 16 */ 17extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); 18extern void destroy_context(struct mm_struct *mm); 19 20extern void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next); 21extern void switch_stab(struct task_struct *tsk, struct mm_struct *mm); 22extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); 23extern void set_context(unsigned long id, pgd_t *pgd); 24 25#ifdef CONFIG_PPC_BOOK3S_64 26extern int __init_new_context(void); 27extern void __destroy_context(int context_id); 28static inline void mmu_context_init(void) { } 29#else 30extern unsigned long __init_new_context(void); 31extern void __destroy_context(unsigned long context_id); 32extern void mmu_context_init(void); 33#endif 34 35extern void switch_cop(struct mm_struct *next); 36extern int use_cop(unsigned long acop, struct mm_struct *mm); 37extern void drop_cop(unsigned long acop, struct mm_struct *mm); 38 39/* 40 * switch_mm is the entry point called from the architecture independent 41 * code in kernel/sched.c 42 */ 43static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, 44 struct task_struct *tsk) 45{ 46 /* Mark this context has been used on the new CPU */ 47 cpumask_set_cpu(smp_processor_id(), mm_cpumask(next)); 48 49 /* 32-bit keeps track of the current PGDIR in the thread struct */ 50#ifdef CONFIG_PPC32 51 tsk->thread.pgdir = next->pgd; 52#endif /* CONFIG_PPC32 */ 53 54 /* 64-bit Book3E keeps track of current PGD in the PACA */ 55#ifdef CONFIG_PPC_BOOK3E_64 56 get_paca()->pgd = next->pgd; 57#endif 58 /* Nothing else to do if we aren't actually switching */ 59 if (prev == next) 60 return; 61 62#ifdef CONFIG_PPC_ICSWX 63 /* Switch coprocessor context only if prev or next uses a coprocessor */ 64 if (prev->context.acop || next->context.acop) 65 switch_cop(next); 66#endif /* CONFIG_PPC_ICSWX */ 67 68 /* We must stop all altivec streams before changing the HW 69 * context 70 */ 71#ifdef CONFIG_ALTIVEC 72 if (cpu_has_feature(CPU_FTR_ALTIVEC)) 73 asm volatile ("dssall"); 74#endif /* CONFIG_ALTIVEC */ 75 76 /* The actual HW switching method differs between the various 77 * sub architectures. 78 */ 79#ifdef CONFIG_PPC_STD_MMU_64 80 if (mmu_has_feature(MMU_FTR_SLB)) 81 switch_slb(tsk, next); 82 else 83 switch_stab(tsk, next); 84#else 85 /* Out of line for now */ 86 switch_mmu_context(prev, next); 87#endif 88 89} 90 91#define deactivate_mm(tsk,mm) do { } while (0) 92 93/* 94 * After we have set current->mm to a new value, this activates 95 * the context for the new mm so we see the new mappings. 96 */ 97static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next) 98{ 99 unsigned long flags; 100 101 local_irq_save(flags); 102 switch_mm(prev, next, current); 103 local_irq_restore(flags); 104} 105 106/* We don't currently use enter_lazy_tlb() for anything */ 107static inline void enter_lazy_tlb(struct mm_struct *mm, 108 struct task_struct *tsk) 109{ 110 /* 64-bit Book3E keeps track of current PGD in the PACA */ 111#ifdef CONFIG_PPC_BOOK3E_64 112 get_paca()->pgd = NULL; 113#endif 114} 115 116#endif /* __KERNEL__ */ 117#endif /* __ASM_POWERPC_MMU_CONTEXT_H */