def test_custom_notimpl(self): meth = addrxlat.CustomMethod(addrxlat.MACHPHYSADDR) self.assertEqual(meth.kind, addrxlat.CUSTOM) self.assertEqual(meth.target_as, addrxlat.MACHPHYSADDR) ctx = addrxlat.Context() step = addrxlat.Step(ctx=ctx, meth=meth) with self.assertRaisesRegexp(BaseException, "NULL callback"): meth.cb_first_step(step, 0x1234) with self.assertRaisesRegexp(BaseException, "NULL callback"): meth.cb_next_step(step)
def test_step_defaults(self): step = addrxlat.Step(self.ctx) 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.assertIs(step.base, None) self.assertIs(step.raw, None) idx = (0, ) * (addrxlat.FIELDS_MAX + 1) self.assertEqual(step.idx, idx)
def begin(self, addr: int) -> bool: meth = self.system.get_map(addrxlat.SYS_MAP_HW).search(addr) if meth == addrxlat.SYS_METH_NONE: meth = self.system.get_map(addrxlat.SYS_MAP_KV_PHYS).search(addr) if meth == addrxlat.SYS_METH_NONE: return False self.step = addrxlat.Step(self.context, self.system) self.step.meth = self.system.get_meth(meth) self.step.launch(addr) return True
def test_step_meth(self): meth = addrxlat.LinearMethod() step = addrxlat.Step(self.ctx, meth=meth) self.assertIs(step.ctx, self.ctx) self.assertIs(step.sys, None) self.assertIs(step.meth, meth) self.assertEqual(step.remain, 0) self.assertEqual(step.elemsz, 0) self.assertIs(step.base, None) self.assertIs(step.raw, None) idx = (0, ) * (addrxlat.FIELDS_MAX + 1) self.assertEqual(step.idx, idx)
def test_customdesc_extmod_cb(self): step = addrxlat.Step(ctx=self.ctx, meth=self.meth_extmod) self.assertIs(step.base, None) self.meth_extmod.cb_first_step(step, 0x1234) self.assertEqual(step.base.addrspace, addrxlat.NOADDR) self.assertEqual(step.base.addr, 0x4d795f4d61676963) self.assertEqual(step.idx[0], 0x34) self.assertEqual(step.idx[1], 0x12) self.meth_extmod.cb_next_step(step) self.assertEqual(step.base.addrspace, addrxlat.NOADDR) self.assertEqual(step.base.addr, 0x123456 + 0x12) self.assertEqual(step.idx[0], 0x34) self.assertEqual(step.idx[1], 0x12)
def test_customdesc_cb(self): step = addrxlat.Step(ctx=self.ctx, meth=self.meth) self.assertIs(step.base, None) self.meth.cb_first_step(step, 0x1234) self.assertEqual(step.base.addrspace, addrxlat.NOADDR) self.assertEqual(step.base.addr, 0xabcdef) self.assertEqual(step.idx[0], 0x34) self.assertEqual(step.idx[1], 0x12) self.meth.cb_next_step(step) self.assertEqual(step.base.addrspace, addrxlat.NOADDR) self.assertEqual(step.base.addr, 0x123456 + 0x12) self.assertEqual(step.idx[0], 0x34) self.assertEqual(step.idx[1], 0x12)
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 test_step_raw(self): step = addrxlat.Step(self.ctx) with self.assertRaisesRegexp(TypeError, 'cannot be changed'): step.raw = 0xabcd meth = addrxlat.PageTableMethod() step.meth = meth step.raw = 0xabcd self.assertIs(step.ctx, self.ctx) self.assertIs(step.sys, None) self.assertIs(step.meth, meth) self.assertEqual(step.remain, 0) self.assertEqual(step.elemsz, 0) self.assertIs(step.base, None) self.assertEqual(step.raw, 0xabcd) idx = (0, ) * (addrxlat.FIELDS_MAX + 1) self.assertEqual(step.idx, idx)
def test_step_idx(self): step = addrxlat.Step(self.ctx) idx = (1, 2, 3, 4) step.idx = idx 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.assertIs(step.base, None) self.assertIs(step.raw, None) idx = idx + (0, ) * (addrxlat.FIELDS_MAX + 1 - len(idx)) self.assertEqual(step.idx, idx) with self.assertRaisesRegexp(TypeError, 'not a sequence'): step.idx = None with self.assertRaisesRegexp(ValueError, 'more than [0-9]+ indices'): step.idx = (0, ) * (addrxlat.FIELDS_MAX + 2) with self.assertRaisesRegexp(TypeError, 'must be.* a number'): step.idx = (None, )
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()