Example #1
0
 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)
Example #2
0
 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)
Example #3
0
    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
Example #4
0
 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)
Example #5
0
 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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
    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, )
Example #10
0
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()