Guest User

Untitled

a guest
Nov 16th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.76 KB | None | 0 0
  1. #include <linux/mm.h>
  2. #include <linux/mm_types.h>
  3. #include <linux/sched.h>
  4.  
  5. #include <asm/pgalloc.h>
  6. #include <asm/tlbflush.h>
  7.  
  8. //vaddr_h: vaddr above 4G
  9. long sys_cr3(unsigned long vaddr_h)
  10. {
  11.     unsigned long eax;
  12.     unsigned long vaddr=0x10000000 | (vaddr_h & 0xfff);
  13.     pgd_t *pgd;
  14.     pud_t *pud;
  15.     pmd_t *pmd, pmd_n;
  16.     pte_t *pte, *pte_h;
  17.     struct page *page;
  18.     pgprot_t pgprot;
  19.    
  20.     //get origen page above 4G
  21.     pgd = pgd_offset(current->mm, vaddr_h);
  22.     pud = pud_offset(pgd, vaddr_h);
  23.     pmd = pmd_offset(pud, vaddr_h);
  24.     pgprot = __pgprot(pmd_val(*pmd) & 0xfff);
  25.     pte_h = pte_offset_map(pmd, vaddr_h);
  26.    
  27.     //mapping vaddr_h above 4G to vaddr below 4G
  28.     //alloc page entry
  29.     pgd = pgd_offset(current->mm, vaddr);
  30.     if(pgd_none(*pgd)) {
  31.         printk("pgd entry not found, alloc new pud and set pgd entry\n");
  32.         /* FIXME */
  33.         //pud = pud_alloc(current->mm, current->mm->pgd, vaddr);
  34.         //set_pud(pgd, *pud);
  35.         pgd = pgd_alloc(current->mm);
  36.     }
  37.     pud = pud_offset(pgd, vaddr);
  38.     if(pud_none(*pud)) {
  39.         printk("pud entry not found, alloc new pmd and set pud entry\n");
  40.         /* FIXME */
  41.         pud = pud_alloc(current->mm, pgd, vaddr);
  42.     }
  43.     pmd = pmd_offset(pud, vaddr);
  44.     if(pmd_none(*pmd)) {
  45.         printk("pmd entry not found, alloc new pte and set pmd entry\n");
  46.         //pmd = pmd_alloc(current->mm, pud, vaddr);
  47.         page = pte_alloc_one(current->mm, vaddr);
  48.         pmd_n = mk_pmd(page, pgprot);
  49.         set_pmd(pmd, pmd_n);
  50.     }
  51.  
  52.     //pte = page table entry
  53.     pte = pte_offset_map(pmd, vaddr);
  54.    
  55.     //set new pte as origin pte_h
  56.     set_pte(pte, *pte_h);
  57.    
  58.     //update_mmu_cache(current->mm->mmap, vaddr, pte);
  59.     //flush_tlb_mm(current->mm);
  60. }
Add Comment
Please, Sign In to add comment