Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void memmap_dump_write(unsigned long vaddr, unsigned long paddr, unsigned int size);
- unsigned long get_paddr(unsigned long vaddr)
- {
- unsigned long paddr;
- ksceKernelGetPaddr(vaddr, &paddr);
- return paddr;
- }
- int find_paddr(unsigned long paddr, unsigned long vaddr, unsigned int size, unsigned int step, unsigned long *found_vaddr)
- {
- unsigned long vaddr_end = vaddr + size;
- for (; vaddr < vaddr_end; vaddr += step) {
- unsigned long cur_paddr = get_paddr(vaddr);
- if ((cur_paddr & ~(step - 1)) == (paddr & ~(step - 1))) {
- if (found_vaddr)
- *found_vaddr = vaddr;
- return 1;
- }
- }
- return 0;
- }
- unsigned long get_ttbr0(void)
- {
- unsigned long ttbr0;
- asm volatile("mrc p15, 0, %0, c2, c0, 0\n" : "=r"(ttbr0));
- return ttbr0;
- }
- unsigned long get_ttbr1(void)
- {
- unsigned long ttbr1;
- asm volatile("mrc p15, 0, %0, c2, c0, 1\n" : "=r"(ttbr1));
- return ttbr1;
- }
- unsigned long get_ttbcr(void)
- {
- unsigned long ttbcr;
- asm volatile("mrc p15, 0, %0, c2, c0, 2\n" : "=r"(ttbcr));
- return ttbcr;
- }
- unsigned long ttbcr_N = get_ttbcr() & 7;
- unsigned long ttbr0_addr = get_ttbr0() & ~((1 << (14 - ttbcr_N)) - 1);
- unsigned long ttbr1_addr = get_ttbr1() & ~((1 << (14 - ttbcr_N)) - 1);
- unsigned long ttbr0_vaddr;
- if (find_paddr(ttbr0_addr, 0, 0xFFFFFFFF, 0x1000, &ttbr0_vaddr)) {
- unsigned int num_entries = 1 << ((32 - ttbcr_N) - 20);
- unsigned int i;
- for (i = 0; i < num_entries; i++) {
- unsigned long pte = *(unsigned long *)(ttbr0_vaddr + i * 4);
- unsigned long pte_type = pte & 3;
- if (pte_type == 0b01) { /* Page table */
- unsigned int j;
- unsigned long ptlvl2_vaddr;
- const unsigned int num_entries_lvl2 = 256;
- unsigned long ptlvl2_paddr = pte & 0xFFFFFC00;
- if (find_paddr(ptlvl2_paddr, 0, 0xFFFFFFFF, 0x1000, &ptlvl2_vaddr)) {
- for (j = 0; j < num_entries_lvl2; j++) {
- unsigned long pte_lvl2 = *(unsigned long *)(ptlvl2_vaddr + j * 4);
- unsigned long pte_lvl2_type = pte_lvl2 & 3;
- unsigned long vaddr = (i << 20) | (j << 12);
- if (pte_lvl2_type == 0b01) { /* Large page */
- unsigned long paddr = pte_lvl2 & 0xFFFF0000;
- memmap_dump_write(vaddr, paddr, 1 << 16);
- j += 15;
- } else if (pte_lvl2_type & 0b10) { /* Small page */
- unsigned long paddr = pte_lvl2 & 0xFFFFF000;
- memmap_dump_write(vaddr, paddr, 1 << 12);
- }
- }
- }
- } else if (pte_type & 0b10) { /* Section or Supersection */
- unsigned long vaddr = i << 20;
- if (pte & (1 << 18)) { /* Section */
- unsigned long paddr = pte & 0xFFF00000;
- memmap_dump_write(vaddr, paddr, 1 << 20);
- } else { /* Supersection */
- unsigned long paddr = pte & 0xFF000000;
- memmap_dump_write(vaddr, paddr, 1 << 24);
- i += 15;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement