def test_step_base_addrspace(self): step = addrxlat.Step(self.ctx) step.base = addrxlat.FullAddress(addrxlat.NOADDR, 0) step.base.addrspace = addrxlat.KVADDR self.assertIs(step.ctx, self.ctx) self.assertIs(step.sys, None) self.assertIs(step.meth, None) self.assertEqual(step.remain, 0) self.assertEqual(step.elemsz, 0) self.assertEqual(step.base, addrxlat.FullAddress(addrxlat.KVADDR, 0)) self.assertIs(step.raw, None) idx = (0, ) * (addrxlat.FIELDS_MAX + 1) self.assertEqual(step.idx, idx)
def execute(self, argv): ctx = addrxlat_context() sys = addrxlat_system() if addrxlat_is_non_auto(): pgt = LinuxNonAutoPGT(ctx, sys) else: pgt = LinuxPGT(ctx, sys) for addr in argv.args: addr = int(addr, 16) fulladdr = addrxlat.FullAddress(addrxlat.KVADDR, addr) print('{:16} {:16}'.format('VIRTUAL', 'PHYSICAL')) try: fulladdr.conv(addrxlat.KPHYSADDR, ctx, sys) phys = '{:x}'.format(fulladdr.addr) except addrxlat.BaseException: phys = '---' print('{:<16x} {:<16}\n'.format(addr, phys)) if pgt.begin(addr): while pgt.next(): print('{:>4}: {} => {}'.format(pgt.table, pgt.address(), pgt.value())) if pgt.step.remain: pgt.ptr = pgt.step.base print('PAGE: {}'.format(pgt.address())) else: print('NO TRANSLATION') print()
def execute(self, args: argparse.Namespace) -> None: if args.c: raise CommandError("support for the -c argument is unimplemented") trans = CrashAddressTranslation() # Silly mypy bug means the base class needs come first if not trans.is_non_auto: pgt = LinuxPGT(trans.context, trans.system) else: pgt = LinuxNonAutoPGT(trans.context, trans.system) for addr in args.args: try: addr = int(addr, 16) except ValueError: raise CommandLineError(f"{addr} is not a hex address") from None fulladdr = addrxlat.FullAddress(addrxlat.KVADDR, addr) print('{:16} {:16}'.format('VIRTUAL', 'PHYSICAL')) try: fulladdr.conv(addrxlat.KPHYSADDR, trans.context, trans.system) phys = '{:x}'.format(fulladdr.addr) except addrxlat.BaseException: phys = '---' print('{:<16x} {:<16}\n'.format(addr, phys)) if pgt.begin(addr): while pgt.next(): print('{:>4}: {} => {}'.format(pgt.table, pgt.address(), pgt.value())) if pgt.step.remain: pgt.ptr = pgt.step.base print('PAGE: {}'.format(pgt.address())) else: print('NO TRANSLATION') print()
def test_pgt_root(self): root = addrxlat.FullAddress(addrxlat.MACHPHYSADDR, 0x1000) meth = addrxlat.PageTableMethod(root=root) self.assertEqual(meth.kind, addrxlat.PGT) self.assertEqual(meth.target_as, addrxlat.NOADDR) self.assertEqual(meth.root, root) self.assertEqual(meth.pte_format, addrxlat.PTE_NONE) self.assertEqual(meth.fields, tuple())
def test_memarr_base(self): base = addrxlat.FullAddress(addrxlat.MACHPHYSADDR, 0x1234) meth = addrxlat.MemoryArrayMethod(base=base) self.assertEqual(meth.kind, addrxlat.MEMARR) self.assertEqual(meth.target_as, addrxlat.NOADDR) self.assertEqual(meth.base, base) self.assertEqual(meth.shift, 0) self.assertEqual(meth.elemsz, 0) self.assertEqual(meth.valsz, 0)
def test_subclass_memarr(self): "KV -> KPHYS using memory array and a subclass" class mycontext(addrxlat.Context): def __init__(self, *args, **kwargs): super(mycontext, self).__init__(*args, **kwargs) self.read_caps = addrxlat.CAPS(addrxlat.MACHPHYSADDR) def cb_read32(self, addr): # Memory array at 0x40 if addr.addr == 0x11000 + 0x40 * 4: return 0x12 ctx = mycontext() addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x4034) addr.conv(addrxlat.KPHYSADDR, ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0x1234))
def test_customdesc_extmod_conv(self): sys = addrxlat.System() map = addrxlat.Map() sys.set_meth(addrxlat.SYS_METH_CUSTOM, self.meth_extmod) map.set(0, addrxlat.Range(0xffff, addrxlat.SYS_METH_CUSTOM)) sys.set_map(addrxlat.SYS_MAP_KV_PHYS, map) addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x2345) addr.conv(addrxlat.KPHYSADDR, self.ctx, sys) self.assertEqual(addr.addrspace, addrxlat.KPHYSADDR) self.assertEqual(addr.addr, 0x123456 + 0x4523)
def test_op_direct(self): "Operator using directmap" class hexop(addrxlat.Operator): def __init__(self, prefix='', *args, **kwargs): super(hexop, self).__init__(*args, **kwargs) self.prefix = prefix def callback(self, addr): return '{}{:x}'.format(self.prefix, addr.addr) myop = hexop(ctx=self.ctx, sys=self.sys, caps=addrxlat.CAPS(addrxlat.KPHYSADDR), prefix='0x') result = myop(addrxlat.FullAddress(addrxlat.KVADDR, 0xabc)) self.assertEqual(result, '0x1abc')
def vtop(addr, ctx, sys): fulladdr = addrxlat.FullAddress(addrxlat.KVADDR, addr) print('{:16} {:16}'.format('VIRTUAL', 'PHYSICAL')) try: fulladdr.conv(addrxlat.KPHYSADDR, ctx, sys) print('{:<16x} {:<16x}\n'.format(addr, fulladdr.addr)) except addrxlat.BaseException: print('{:<16x} {:<16}\n'.format(addr, '---')) step = addrxlat.Step(ctx, sys) meth = sys.get_map(addrxlat.SYS_MAP_HW).search(addr) if meth == addrxlat.SYS_METH_NONE: meth = sys.get_map(addrxlat.SYS_MAP_KV_PHYS).search(addr) if meth == addrxlat.SYS_METH_NONE: print('NO METHOD') return step.meth = sys.get_meth(meth) step.launch(addr) note = kphysnote(ctx, sys) while step.remain: tbl = tbl_names[step.remain - 1] if step.remain > 1: addr = step.base.copy() addr.addr += step.idx[step.remain - 1] * step.elemsz else: addr = step.base remark = note.note(addr, ' ({})') print('{:>4}: {:16x}{}'.format(tbl, addr.addr, remark), end='') try: step.step() if step.remain and step.raw is not None: print(' => {:x}'.format(step.raw)) except addrxlat.NotPresentError: print(' => {:x} NOT PRESENT'.format(step.raw)) return print()
def test_fulladdr_addrspace(self): addr = addrxlat.FullAddress(addrspace=addrxlat.KVADDR) self.assertEqual(addr.addrspace, addrxlat.KVADDR) self.assertEqual(addr.addr, 0)
def test_fulladdr_defaults(self): addr = addrxlat.FullAddress() self.assertEqual(addr.addrspace, addrxlat.NOADDR) self.assertEqual(addr.addr, 0)
def test_fulladdr_conv_pgt(self): "KV -> KPHYS using page tables" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x6502) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0xc002))
def test_fulladdr_conv_rdirect(self): "KPHYS -> KV using reverse directmap" addr = addrxlat.FullAddress(addrxlat.KPHYSADDR, 0x2345) addr.conv(addrxlat.KVADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KVADDR, 0x1345))
def test_fulladdr_conv_memarr_pgt(self): "KV -> KPHYS using fallback from memory array to page tables" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x4155) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0xa955))
def test_fulladdr_fail_memarr(self): "KV -> KPHYS using memory array returns None" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x4255) with self.assertRaisesRegexp(addrxlat.NoMethodError, 'Callback returned None'): addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys)
def test_fulladdr_conv_lookup(self): "KV -> KPHYS using lookup" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x2055) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0xfa55))
def test_fulladdr_copy(self): addr1 = addrxlat.FullAddress(addrxlat.KVADDR, 0x1234) addr2 = addr1.copy() self.assertIsInstance(addr2, addrxlat.FullAddress) self.assertEqual(addr1.addrspace, addr2.addrspace) self.assertEqual(addr1.addr, addr2.addr)
def test_fulladdr_fail_machphys_kphys(self): "MACHPHYS -> KPHYS out of bounds" addr = addrxlat.FullAddress(addrxlat.MACHPHYSADDR, 0xabcd) with self.assertRaisesRegexp(addrxlat.NoMethodError, 'No way to translate'): addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys)
def test_fulladdr_conv_direct(self): "KV -> KPHYS using directmap" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x1234) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0x2234))
def test_fulladdr_addr(self): addr = addrxlat.FullAddress(addr=0xabcd) self.assertEqual(addr.addrspace, addrxlat.NOADDR) self.assertEqual(addr.addr, 0xabcd)
def setUp(self): def read32(addr): # Page table level 2 @ 0 if addr.addr == 0x10000: return 0x101 # Page table level 1 @ 0x65 if addr.addr == 0x10100 + 0x65 * 4: return 0x1c0 # Page table level 1 @ 0x41 if addr.addr == 0x10100 + 0x41 * 4: return 0x1a9 # Memory array at 0x40 if addr.addr == 0x11000 + 0x40 * 4: return 0xaa self.ctx = addrxlat.Context() self.ctx.read_caps = addrxlat.CAPS(addrxlat.MACHPHYSADDR) self.ctx.cb_read32 = read32 self.sys = addrxlat.System() map = addrxlat.Map() self.sys.set_map(addrxlat.SYS_MAP_HW, map) meth = addrxlat.PageTableMethod(addrxlat.MACHPHYSADDR) meth.root = addrxlat.FullAddress(addrxlat.MACHPHYSADDR, 0x10000) meth.pte_format = addrxlat.PTE_PFN32 meth.fields = (8, 8, 8) self.sys.set_meth(addrxlat.SYS_METH_PGT, meth) map.set(0, addrxlat.Range(0xffff, addrxlat.SYS_METH_PGT)) map = addrxlat.Map() self.sys.set_map(addrxlat.SYS_MAP_KV_PHYS, map) meth = addrxlat.LinearMethod(addrxlat.KPHYSADDR, 0x1000) self.sys.set_meth(addrxlat.SYS_METH_DIRECT, meth) map.set(0, addrxlat.Range(0x1fff, addrxlat.SYS_METH_DIRECT)) meth = addrxlat.LookupMethod(addrxlat.KPHYSADDR) meth.endoff = 0xff meth.tbl = ((0x2000, 0xfa00), (0x3000, 0xfb00), (0x3100, 0xff00)) self.sys.set_meth(addrxlat.SYS_METH_CUSTOM, meth) map.set(0x2000, addrxlat.Range(0x1fff, addrxlat.SYS_METH_CUSTOM)) meth = addrxlat.MemoryArrayMethod(addrxlat.KPHYSADDR) meth.base = addrxlat.FullAddress(addrxlat.KVADDR, 0) meth.shift = 8 meth.elemsz = 4 meth.valsz = 4 self.sys.set_meth(addrxlat.SYS_METH_CUSTOM + 1, meth) map.set(0x4000, addrxlat.Range(0x1fff, addrxlat.SYS_METH_CUSTOM + 1)) map.set(0x6000, addrxlat.Range(0x9fff, addrxlat.SYS_METH_PGT)) map = addrxlat.Map() self.sys.set_map(addrxlat.SYS_MAP_KPHYS_DIRECT, map) meth = addrxlat.LinearMethod(addrxlat.KVADDR, -0x1000) self.sys.set_meth(addrxlat.SYS_METH_RDIRECT, meth) map.set(0x1000, addrxlat.Range(0x1fff, addrxlat.SYS_METH_RDIRECT)) map = addrxlat.Map() self.sys.set_map(addrxlat.SYS_MAP_MACHPHYS_KPHYS, map) meth = addrxlat.LinearMethod(addrxlat.KPHYSADDR, -0x10000) self.sys.set_meth(addrxlat.SYS_METH_MACHPHYS_KPHYS, meth) map.set(0x10000, addrxlat.Range(0xffff, addrxlat.SYS_METH_MACHPHYS_KPHYS)) map = addrxlat.Map() self.sys.set_map(addrxlat.SYS_MAP_KPHYS_MACHPHYS, map) meth = addrxlat.LinearMethod(addrxlat.MACHPHYSADDR, 0x10000) self.sys.set_meth(addrxlat.SYS_METH_KPHYS_MACHPHYS, meth) map.set(0, addrxlat.Range(0xffff, addrxlat.SYS_METH_KPHYS_MACHPHYS))
def test_fulladdr_init_kwarg(self): addr = addrxlat.FullAddress(addr=0xabcd, addrspace=addrxlat.KVADDR) self.assertEqual(addr.addrspace, addrxlat.KVADDR) self.assertEqual(addr.addr, 0xabcd)
def first_step(step, addr): step.base = addrxlat.FullAddress(addrxlat.NOADDR, 0xabcdef) step.idx = (addr & 0xff, addr >> 8) step.remain = 2
def test_fulladdr_conv_memarr(self): "KV -> KPHYS using memory array" addr = addrxlat.FullAddress(addrxlat.KVADDR, 0x4055) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0xaa55))
def test_fulladdr_conv_machphys_kphys(self): "MACHPHYS -> KPHYS using offset" addr = addrxlat.FullAddress(addrxlat.MACHPHYSADDR, 0x1abcd) addr.conv(addrxlat.KPHYSADDR, self.ctx, self.sys) self.assertEqual(addr, addrxlat.FullAddress(addrxlat.KPHYSADDR, 0xabcd))
def test_fulladdr_noteq(self): addr1 = addrxlat.FullAddress(addrxlat.KVADDR, 0x1234) addr2 = addrxlat.FullAddress(addrxlat.KVADDR, 0xabcd) self.assertNotEqual(addr1, addr2)