(self, vaddr:int, size:int, paddrs:list[tuple[int, int]], aspace:AddrSpace, uncached=False, snooped=False, boot=False)
| 197 | for _ in ctx.next(size, paddr=0): return [pt for pt, _, _ in ctx.pt_stack] |
| 198 | |
| 199 | def map_range(self, vaddr:int, size:int, paddrs:list[tuple[int, int]], aspace:AddrSpace, uncached=False, snooped=False, boot=False) -> VirtMapping: |
| 200 | if getenv("MM_DEBUG", 0): print(f"mm {self.dev.devfmt}: mapping {vaddr=:#x} ({size=:#x})") |
| 201 | |
| 202 | assert size == sum(p[1] for p in paddrs), f"Size mismatch {size=} {sum(p[1] for p in paddrs)=}" |
| 203 | |
| 204 | ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, boot=boot, inspect=True) |
| 205 | for _, pt, pte_idx, pte_cnt, _ in ctx.next(size): |
| 206 | for pte_off in range(pte_cnt): assert not pt.valid(pte_idx + pte_off), f"PTE already mapped: {pt.entry(pte_idx + pte_off):#x}" |
| 207 | |
| 208 | ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, create_pts=True, boot=boot) |
| 209 | for paddr, psize in paddrs: |
| 210 | for off, pt, pte_idx, pte_cnt, pte_covers in ctx.next(psize, paddr=paddr): |
| 211 | for pte_off in range(pte_cnt): |
| 212 | pt.set_entry(pte_idx + pte_off, paddr + off + pte_off * pte_covers, uncached=uncached, aspace=aspace, snooped=snooped, |
| 213 | frag=self._frag_size(ctx.vaddr+off, pte_cnt * pte_covers), valid=True) |
| 214 | |
| 215 | self.on_range_mapped() |
| 216 | return VirtMapping(vaddr, size, paddrs, aspace=aspace, uncached=uncached, snooped=snooped) |
| 217 | |
| 218 | def unmap_range(self, vaddr:int, size:int): |
| 219 | if getenv("MM_DEBUG", 0): print(f"mm {self.dev.devfmt}: unmapping {vaddr=:#x} ({size=:#x})") |
no test coverage detected