Advertisement
xerpi

Vita kernel memmap read

Feb 9th, 2017
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.75 KB | None | 0 0
  1. void memmap_dump_write(unsigned long vaddr, unsigned long paddr, unsigned int size);
  2.  
  3. unsigned long get_paddr(unsigned long vaddr)
  4. {
  5.     unsigned long paddr;
  6.  
  7.     ksceKernelGetPaddr(vaddr, &paddr);
  8.  
  9.     return paddr;
  10. }
  11.  
  12. int find_paddr(unsigned long paddr, unsigned long vaddr, unsigned int size, unsigned int step, unsigned long *found_vaddr)
  13. {
  14.     unsigned long vaddr_end = vaddr + size;
  15.  
  16.     for (; vaddr < vaddr_end; vaddr += step) {
  17.         unsigned long cur_paddr = get_paddr(vaddr);
  18.  
  19.         if ((cur_paddr & ~(step - 1)) == (paddr & ~(step - 1))) {
  20.             if (found_vaddr)
  21.                 *found_vaddr = vaddr;
  22.             return 1;
  23.         }
  24.     }
  25.  
  26.     return 0;
  27. }
  28.  
  29. unsigned long get_ttbr0(void)
  30. {
  31.     unsigned long ttbr0;
  32.  
  33.     asm volatile("mrc p15, 0, %0, c2, c0, 0\n" : "=r"(ttbr0));
  34.  
  35.     return ttbr0;
  36. }
  37.  
  38. unsigned long get_ttbr1(void)
  39. {
  40.     unsigned long ttbr1;
  41.  
  42.     asm volatile("mrc p15, 0, %0, c2, c0, 1\n" : "=r"(ttbr1));
  43.  
  44.     return ttbr1;
  45. }
  46.  
  47. unsigned long get_ttbcr(void)
  48. {
  49.     unsigned long ttbcr;
  50.  
  51.     asm volatile("mrc p15, 0, %0, c2, c0, 2\n" : "=r"(ttbcr));
  52.  
  53.     return ttbcr;
  54. }
  55.  
  56. unsigned long ttbcr_N = get_ttbcr() & 7;
  57.  
  58. unsigned long ttbr0_addr = get_ttbr0() & ~((1 << (14 - ttbcr_N)) - 1);
  59. unsigned long ttbr1_addr = get_ttbr1() & ~((1 << (14 - ttbcr_N)) - 1);
  60.  
  61. unsigned long ttbr0_vaddr;
  62. if (find_paddr(ttbr0_addr, 0, 0xFFFFFFFF, 0x1000, &ttbr0_vaddr)) {
  63.  
  64.     unsigned int num_entries = 1 << ((32 - ttbcr_N) - 20);
  65.  
  66.     unsigned int i;
  67.     for (i = 0; i < num_entries; i++) {
  68.         unsigned long pte = *(unsigned long *)(ttbr0_vaddr + i * 4);
  69.         unsigned long pte_type = pte & 3;
  70.  
  71.         if (pte_type == 0b01) { /* Page table */
  72.             unsigned int j;
  73.             unsigned long ptlvl2_vaddr;
  74.             const unsigned int num_entries_lvl2 = 256;
  75.             unsigned long ptlvl2_paddr = pte & 0xFFFFFC00;
  76.  
  77.             if (find_paddr(ptlvl2_paddr, 0, 0xFFFFFFFF, 0x1000, &ptlvl2_vaddr)) {
  78.                 for (j = 0; j < num_entries_lvl2; j++) {
  79.                     unsigned long pte_lvl2 = *(unsigned long *)(ptlvl2_vaddr + j * 4);
  80.                     unsigned long pte_lvl2_type = pte_lvl2 & 3;
  81.                     unsigned long vaddr = (i << 20) | (j << 12);
  82.  
  83.                     if (pte_lvl2_type == 0b01) { /* Large page */
  84.                         unsigned long paddr = pte_lvl2 & 0xFFFF0000;
  85.  
  86.                         memmap_dump_write(vaddr, paddr, 1 << 16);
  87.  
  88.                         j += 15;
  89.                     } else if (pte_lvl2_type & 0b10) { /* Small page */
  90.                         unsigned long paddr = pte_lvl2 & 0xFFFFF000;
  91.  
  92.                         memmap_dump_write(vaddr, paddr, 1 << 12);
  93.                     }
  94.                 }
  95.             }
  96.  
  97.         } else if (pte_type & 0b10) { /* Section or Supersection */
  98.             unsigned long vaddr = i << 20;
  99.  
  100.             if (pte & (1 << 18)) { /* Section */
  101.                 unsigned long paddr = pte & 0xFFF00000;
  102.  
  103.                 memmap_dump_write(vaddr, paddr, 1 << 20);
  104.             } else { /* Supersection */
  105.                 unsigned long paddr = pte & 0xFF000000;
  106.  
  107.                 memmap_dump_write(vaddr, paddr, 1 << 24);
  108.  
  109.                 i += 15;
  110.             }
  111.         }
  112.  
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement