home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / s390 / include / asm / mmu_context.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.5 KB  |  91 lines

  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.  
  12. #include <asm/pgalloc.h>
  13. #include <asm/uaccess.h>
  14. #include <asm-generic/mm_hooks.h>
  15.  
  16. static inline int init_new_context(struct task_struct *tsk,
  17.                    struct mm_struct *mm)
  18. {
  19.     mm->context.asce_bits = _ASCE_TABLE_LENGTH | _ASCE_USER_BITS;
  20. #ifdef CONFIG_64BIT
  21.     mm->context.asce_bits |= _ASCE_TYPE_REGION3;
  22. #endif
  23.     if (current->mm->context.alloc_pgste) {
  24.         /*
  25.          * alloc_pgste indicates, that any NEW context will be created
  26.          * with extended page tables. The old context is unchanged. The
  27.          * page table allocation and the page table operations will
  28.          * look at has_pgste to distinguish normal and extended page
  29.          * tables. The only way to create extended page tables is to
  30.          * set alloc_pgste and then create a new context (e.g. dup_mm).
  31.          * The page table allocation is called after init_new_context
  32.          * and if has_pgste is set, it will create extended page
  33.          * tables.
  34.          */
  35.         mm->context.noexec = 0;
  36.         mm->context.has_pgste = 1;
  37.         mm->context.alloc_pgste = 1;
  38.     } else {
  39.         mm->context.noexec = s390_noexec;
  40.         mm->context.has_pgste = 0;
  41.         mm->context.alloc_pgste = 0;
  42.     }
  43.     mm->context.asce_limit = STACK_TOP_MAX;
  44.     crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
  45.     return 0;
  46. }
  47.  
  48. #define destroy_context(mm)             do { } while (0)
  49.  
  50. #ifndef __s390x__
  51. #define LCTL_OPCODE "lctl"
  52. #else
  53. #define LCTL_OPCODE "lctlg"
  54. #endif
  55.  
  56. static inline void update_mm(struct mm_struct *mm, struct task_struct *tsk)
  57. {
  58.     pgd_t *pgd = mm->pgd;
  59.  
  60.     S390_lowcore.user_asce = mm->context.asce_bits | __pa(pgd);
  61.     if (switch_amode) {
  62.         /* Load primary space page table origin. */
  63.         pgd = mm->context.noexec ? get_shadow_table(pgd) : pgd;
  64.         S390_lowcore.user_exec_asce = mm->context.asce_bits | __pa(pgd);
  65.         asm volatile(LCTL_OPCODE" 1,1,%0\n"
  66.                  : : "m" (S390_lowcore.user_exec_asce) );
  67.     } else
  68.         /* Load home space page table origin. */
  69.         asm volatile(LCTL_OPCODE" 13,13,%0"
  70.                  : : "m" (S390_lowcore.user_asce) );
  71.     set_fs(current->thread.mm_segment);
  72. }
  73.  
  74. static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
  75.                  struct task_struct *tsk)
  76. {
  77.     cpu_set(smp_processor_id(), next->cpu_vm_mask);
  78.     update_mm(next, tsk);
  79. }
  80.  
  81. #define enter_lazy_tlb(mm,tsk)    do { } while (0)
  82. #define deactivate_mm(tsk,mm)    do { } while (0)
  83.  
  84. static inline void activate_mm(struct mm_struct *prev,
  85.                                struct mm_struct *next)
  86. {
  87.         switch_mm(prev, next, current);
  88. }
  89.  
  90. #endif /* __S390_MMU_CONTEXT_H */
  91.