mmu_context.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * include/asm-s390/mmu_context.h
  3. *
  4. * S390 version
  5. *
  6. * Derived from "include/asm-i386/mmu_context.h"
  7. */
  8. #ifndef __S390_MMU_CONTEXT_H
  9. #define __S390_MMU_CONTEXT_H
  10. #include <asm/pgalloc.h>
  11. #include <asm-generic/mm_hooks.h>
  12. /*
  13. * get a new mmu context.. S390 don't know about contexts.
  14. */
  15. #define init_new_context(tsk,mm) 0
  16. #define destroy_context(mm) do { } while (0)
  17. #ifndef __s390x__
  18. #define LCTL_OPCODE "lctl"
  19. #else
  20. #define LCTL_OPCODE "lctlg"
  21. #endif
  22. static inline void update_mm(struct mm_struct *mm, struct task_struct *tsk)
  23. {
  24. pgd_t *pgd = mm->pgd;
  25. unsigned long asce_bits;
  26. /* Calculate asce bits from the first pgd table entry. */
  27. asce_bits = _ASCE_TABLE_LENGTH | _ASCE_USER_BITS;
  28. #ifdef CONFIG_64BIT
  29. asce_bits |= _ASCE_TYPE_REGION3;
  30. #endif
  31. S390_lowcore.user_asce = asce_bits | __pa(pgd);
  32. if (switch_amode) {
  33. /* Load primary space page table origin. */
  34. pgd_t *shadow_pgd = get_shadow_table(pgd) ? : pgd;
  35. S390_lowcore.user_exec_asce = asce_bits | __pa(shadow_pgd);
  36. asm volatile(LCTL_OPCODE" 1,1,%0\n"
  37. : : "m" (S390_lowcore.user_exec_asce) );
  38. } else
  39. /* Load home space page table origin. */
  40. asm volatile(LCTL_OPCODE" 13,13,%0"
  41. : : "m" (S390_lowcore.user_asce) );
  42. }
  43. static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
  44. struct task_struct *tsk)
  45. {
  46. if (unlikely(prev == next))
  47. return;
  48. cpu_set(smp_processor_id(), next->cpu_vm_mask);
  49. update_mm(next, tsk);
  50. }
  51. #define enter_lazy_tlb(mm,tsk) do { } while (0)
  52. #define deactivate_mm(tsk,mm) do { } while (0)
  53. static inline void activate_mm(struct mm_struct *prev,
  54. struct mm_struct *next)
  55. {
  56. switch_mm(prev, next, current);
  57. set_fs(current->thread.mm_segment);
  58. }
  59. #endif /* __S390_MMU_CONTEXT_H */