Advertisement
Guest User

Untitled

a guest
Jun 7th, 2014
471
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. while(tmp->vm_next && tmp->vm_next != start ){//&& count < 200){
  2. ... // local variable declarations and checks
  3. page = get_page_from_addr(tmp,addr);
  4. my_set_pte(tmp, addr);
  5. ...
  6. addr += PAGE_SIZE;
  7. ...
  8. tmp = tmp->vm_next;
  9. }
  10.  
  11. int my_set_pte(struct vm_area_struct *vma,unsigned long address)
  12. {
  13. unsigned long pfn;
  14. pgd_t *pgd;
  15. pud_t *pud;
  16. pmd_t *pmd;
  17. pte_t *ptep, pte, temp_pte;
  18. spinlock_t *ptl;
  19. struct page *page=NULL;
  20. struct mm_struct *mm = vma->vm_mm;
  21. pgd = pgd_offset(mm, address);
  22.  
  23. if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd)))
  24. goto out;
  25. pud = pud_offset(pgd, address);
  26. if (pud_none(*pud))
  27. goto out;
  28. if ((pud_val(*pud) & _PAGE_PSE) && vma->vm_flags & VM_HUGETLB) {
  29. page = follow_huge_PUD(mm, address, pud);
  30. goto out;
  31. }
  32. if (unlikely(pud_bad(*pud)))
  33. goto out;
  34.  
  35. pmd = pmd_offset(pud, address);
  36. if (pmd_none(*pmd))
  37. goto out;
  38. if ((pmd_val(*pmd) & _PAGE_PSE) && vma->vm_flags & VM_HUGETLB) {
  39. page = follow_huge_PMD(mm, address, pmd);
  40. goto out;
  41. }
  42. if (pmd_trans_huge(*pmd)){
  43. spin_lock(&mm->page_table_lock);
  44. if (likely(pmd_trans_huge(*pmd))) {
  45. page = follow_trans_huge_PMD(mm, address,
  46. pmd);
  47. spin_unlock(&mm->page_table_lock);
  48. goto out;
  49. } else
  50. spin_unlock(&mm->page_table_lock);
  51.  
  52. }
  53. if (unlikely(pmd_bad(*pmd)))
  54. goto out;
  55.  
  56. ptep = pte_offset_map_lock(mm, pmd, address, &ptl);
  57. pte = *ptep;
  58. if (!pte_present(pte))
  59. goto no_page;
  60. pfn = pte_pfn(pte);
  61. if(!pfn_valid(pfn))
  62. goto bad_page;
  63. page = pfn_to_page(pfn);
  64. if( (pte_flags(pte) & (_PAGE_PRESENT)) && !(pte_flags(pte) & (_PAGE_PROTNONE)))
  65. {
  66.  
  67. // this if condition makes sure that before our kernel module makes any changes to a page,
  68. //the page is present and also its protection bit is not set
  69.  
  70. flush_tlb_page(vma, address);
  71. // clear the present bit and set the prot bit and store this address in the array
  72.  
  73. pte_unmap_unlock(ptep, ptl);
  74. // !? check: Is there a lock required to be taken here?? ?!
  75.  
  76. temp_pte = pte_clear_flags(pte, _PAGE_PRESENT);
  77.  
  78. set_pte(ptep, temp_pte);
  79.  
  80. temp_pte = pte_set_flags(pte, _PAGE_PROTNONE);
  81.  
  82. set_pte(ptep, temp_pte);
  83.  
  84. arr[array_count].touched = 0;
  85. arr[array_count].addr = address;
  86. arr[array_count].pte = pte;
  87. array_count++;
  88. goto out;
  89.  
  90. }
  91.  
  92. if (unlikely(!page)) {
  93. if (page_to_pfn(ZERO_PAGE(0)) == pte_pfn(pte))
  94. goto bad_page;
  95. page = pte_page(pte);
  96. }
  97. pte_unmap_unlock(ptep, ptl);
  98. out:
  99.  
  100. return 1;
  101. bad_page:
  102.  
  103. pte_unmap_unlock(ptep, ptl);
  104. return 1;
  105. no_page:
  106.  
  107. pte_unmap_unlock(ptep, ptl);
  108. return 1;
  109.  
  110.  
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement