Example #1
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 #2
0
    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()
Example #3
0
    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()
Example #4
0
 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())
Example #5
0
 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)
Example #6
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))
Example #7
0
 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)
Example #8
0
    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')
Example #9
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()
Example #10
0
 def test_fulladdr_addrspace(self):
     addr = addrxlat.FullAddress(addrspace=addrxlat.KVADDR)
     self.assertEqual(addr.addrspace, addrxlat.KVADDR)
     self.assertEqual(addr.addr, 0)
Example #11
0
 def test_fulladdr_defaults(self):
     addr = addrxlat.FullAddress()
     self.assertEqual(addr.addrspace, addrxlat.NOADDR)
     self.assertEqual(addr.addr, 0)
Example #12
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))
Example #13
0
 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))
Example #14
0
 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))
Example #15
0
 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)
Example #16
0
 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))
Example #17
0
 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)
Example #18
0
 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)
Example #19
0
 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))
Example #20
0
 def test_fulladdr_addr(self):
     addr = addrxlat.FullAddress(addr=0xabcd)
     self.assertEqual(addr.addrspace, addrxlat.NOADDR)
     self.assertEqual(addr.addr, 0xabcd)
Example #21
0
    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))
Example #22
0
 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)
Example #23
0
 def first_step(step, addr):
     step.base = addrxlat.FullAddress(addrxlat.NOADDR, 0xabcdef)
     step.idx = (addr & 0xff, addr >> 8)
     step.remain = 2
Example #24
0
 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))
Example #25
0
 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))
Example #26
0
 def test_fulladdr_noteq(self):
     addr1 = addrxlat.FullAddress(addrxlat.KVADDR, 0x1234)
     addr2 = addrxlat.FullAddress(addrxlat.KVADDR, 0xabcd)
     self.assertNotEqual(addr1, addr2)