home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-powerpc / mmu_context.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.4 KB  |  92 lines

  1. #ifndef __ASM_POWERPC_MMU_CONTEXT_H
  2. #define __ASM_POWERPC_MMU_CONTEXT_H
  3. #ifdef __KERNEL__
  4.  
  5. #ifndef CONFIG_PPC64
  6. #include <asm-ppc/mmu_context.h>
  7. #else
  8.  
  9. #include <linux/kernel.h>    
  10. #include <linux/mm.h>    
  11. #include <asm/mmu.h>    
  12. #include <asm/cputable.h>
  13.  
  14. /*
  15.  * Copyright (C) 2001 PPC 64 Team, IBM Corp
  16.  *
  17.  * This program is free software; you can redistribute it and/or
  18.  * modify it under the terms of the GNU General Public License
  19.  * as published by the Free Software Foundation; either version
  20.  * 2 of the License, or (at your option) any later version.
  21.  */
  22.  
  23. /*
  24.  * Getting into a kernel thread, there is no valid user segment, mark
  25.  * paca->pgdir NULL so that SLB miss on user addresses will fault
  26.  */
  27. static inline void enter_lazy_tlb(struct mm_struct *mm,
  28.                   struct task_struct *tsk)
  29. {
  30. #ifdef CONFIG_PPC_64K_PAGES
  31.     get_paca()->pgdir = NULL;
  32. #endif /* CONFIG_PPC_64K_PAGES */
  33. }
  34.  
  35. #define NO_CONTEXT    0
  36. #define MAX_CONTEXT    (0x100000-1)
  37.  
  38. extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
  39. extern void destroy_context(struct mm_struct *mm);
  40.  
  41. extern void switch_stab(struct task_struct *tsk, struct mm_struct *mm);
  42. extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm);
  43.  
  44. /*
  45.  * switch_mm is the entry point called from the architecture independent
  46.  * code in kernel/sched.c
  47.  */
  48. static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
  49.                  struct task_struct *tsk)
  50. {
  51.     if (!cpu_isset(smp_processor_id(), next->cpu_vm_mask))
  52.         cpu_set(smp_processor_id(), next->cpu_vm_mask);
  53.  
  54.     /* No need to flush userspace segments if the mm doesnt change */
  55. #ifdef CONFIG_PPC_64K_PAGES
  56.     if (prev == next && get_paca()->pgdir == next->pgd)
  57.         return;
  58. #else
  59.     if (prev == next)
  60.         return;
  61. #endif /* CONFIG_PPC_64K_PAGES */
  62.  
  63. #ifdef CONFIG_ALTIVEC
  64.     if (cpu_has_feature(CPU_FTR_ALTIVEC))
  65.         asm volatile ("dssall");
  66. #endif /* CONFIG_ALTIVEC */
  67.  
  68.     if (cpu_has_feature(CPU_FTR_SLB))
  69.         switch_slb(tsk, next);
  70.     else
  71.         switch_stab(tsk, next);
  72. }
  73.  
  74. #define deactivate_mm(tsk,mm)    do { } while (0)
  75.  
  76. /*
  77.  * After we have set current->mm to a new value, this activates
  78.  * the context for the new mm so we see the new mappings.
  79.  */
  80. static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
  81. {
  82.     unsigned long flags;
  83.  
  84.     local_irq_save(flags);
  85.     switch_mm(prev, next, current);
  86.     local_irq_restore(flags);
  87. }
  88.  
  89. #endif /* CONFIG_PPC64 */
  90. #endif /* __KERNEL__ */
  91. #endif /* __ASM_POWERPC_MMU_CONTEXT_H */
  92.