mmu_context.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __I386_MMU_CONTEXT_H
  2. #define __I386_MMU_CONTEXT_H
  3. #include <linux/config.h>
  4. #include <asm/desc.h>
  5. #include <asm/atomic.h>
  6. #include <asm/pgalloc.h>
  7. /*
  8.  * possibly do the LDT unload here?
  9.  */
  10. #define destroy_context(mm) do { } while(0)
  11. #define init_new_context(tsk,mm) 0
  12. #ifdef CONFIG_SMP
  13. static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
  14. {
  15. if(cpu_tlbstate[cpu].state == TLBSTATE_OK)
  16. cpu_tlbstate[cpu].state = TLBSTATE_LAZY;
  17. }
  18. #else
  19. static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
  20. {
  21. }
  22. #endif
  23. static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)
  24. {
  25. if (prev != next) {
  26. /* stop flush ipis for the previous mm */
  27. clear_bit(cpu, &prev->cpu_vm_mask);
  28. /*
  29.  * Re-load LDT if necessary
  30.  */
  31. if (prev->context.segments != next->context.segments)
  32. load_LDT(next);
  33. #ifdef CONFIG_SMP
  34. cpu_tlbstate[cpu].state = TLBSTATE_OK;
  35. cpu_tlbstate[cpu].active_mm = next;
  36. #endif
  37. set_bit(cpu, &next->cpu_vm_mask);
  38. set_bit(cpu, &next->context.cpuvalid);
  39. /* Re-load page tables */
  40. asm volatile("movl %0,%%cr3": :"r" (__pa(next->pgd)));
  41. }
  42. #ifdef CONFIG_SMP
  43. else {
  44. cpu_tlbstate[cpu].state = TLBSTATE_OK;
  45. if(cpu_tlbstate[cpu].active_mm != next)
  46. BUG();
  47. if(!test_and_set_bit(cpu, &next->cpu_vm_mask)) {
  48. /* We were in lazy tlb mode and leave_mm disabled 
  49.  * tlb flush IPI delivery. We must flush our tlb.
  50.  */
  51. local_flush_tlb();
  52. }
  53. if (!test_and_set_bit(cpu, &next->context.cpuvalid))
  54. load_LDT(next);
  55. }
  56. #endif
  57. }
  58. #define activate_mm(prev, next) 
  59. switch_mm((prev),(next),NULL,smp_processor_id())
  60. #endif