Source code for crash.addrxlat
# -*- coding: utf-8 -*-
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
import addrxlat
import crash
from crash.cache.syscache import utsname
from crash.util import offsetof
from crash.util.symbols import Types
import gdb
types = Types(['uint32_t *', 'uint64_t *'])
[docs]class TranslationContext(addrxlat.Context):
def __init__(self, *args: int, **kwargs: int) -> None:
super().__init__(*args, **kwargs)
self.read_caps = addrxlat.CAPS(addrxlat.KVADDR)
[docs] def cb_sym(self, symtype: int, *args: str) -> int:
if symtype == addrxlat.SYM_VALUE:
ms = gdb.lookup_minimal_symbol(args[0])
if ms is not None:
return int(ms.value().address)
elif symtype == addrxlat.SYM_SIZEOF:
sym = gdb.lookup_symbol(args[0], None)[0]
if sym is not None:
return sym.type.sizeof
elif symtype == addrxlat.SYM_OFFSETOF:
sym = gdb.lookup_symbol(args[0], None, gdb.SYMBOL_STRUCT_DOMAIN)[0]
if sym is None:
# this works for typedefs:
sym = gdb.lookup_symbol(args[0], None)[0]
if sym is not None:
ret = offsetof(sym.type, args[1], True)
if ret is None:
raise RuntimeError("offsetof can't return None with errors=True")
return super().cb_sym(symtype, *args)
[docs] def cb_read32(self, faddr: addrxlat.FullAddress) -> int:
v = gdb.Value(faddr.addr).cast(types.uint32_t_p_type)
return int(v.dereference())
[docs] def cb_read64(self, faddr: addrxlat.FullAddress) -> int:
v = gdb.Value(faddr.addr).cast(types.uint64_t_p_type)
return int(v.dereference())
[docs]class CrashAddressTranslation:
def __init__(self) -> None:
try:
target = crash.current_target()
self.context = target.kdump.get_addrxlat_ctx()
self.system = target.kdump.get_addrxlat_sys()
except AttributeError:
self.context = TranslationContext()
self.system = addrxlat.System()
self.system.os_init(self.context,
arch=utsname.machine,
type=addrxlat.OS_LINUX)
self.is_non_auto = False
xlatmap = self.system.get_map(addrxlat.SYS_MAP_MACHPHYS_KPHYS)
for addr_range in xlatmap:
if addr_range.meth == addrxlat.SYS_METH_NONE:
continue
meth = self.system.get_meth(addr_range.meth)
if meth.kind != addrxlat.LINEAR or meth.off != 0:
self.is_non_auto = True
break