diff --git a/ebpfcat/arraymap.py b/ebpfcat/arraymap.py index 6f836f22541983b2cea349e8396c1dbd947f8794..b20934c2de3e6f797ebb18ab6f03e00a88e73850 100644 --- a/ebpfcat/arraymap.py +++ b/ebpfcat/arraymap.py @@ -19,7 +19,7 @@ from itertools import chain from mmap import mmap from struct import pack_into, unpack_from, calcsize -from .ebpf import FuncId, Map, Memory, MemoryDesc, Opcode, SubProgram +from .ebpf import FuncId, Map, MemoryDesc, Opcode, SubProgram from .bpf import create_map, lookup_elem, MapType, MapFlags, update_elem diff --git a/ebpfcat/ebpf.py b/ebpfcat/ebpf.py index a615bcfe783908e2a55beef1f4cca4bb99e0311e..ebe5555fabd1ba126cef05ce1bcc0513db8e44ce 100644 --- a/ebpfcat/ebpf.py +++ b/ebpfcat/ebpf.py @@ -721,14 +721,13 @@ class IAdd: class Memory(Expression): bits_to_opcode = {32: Opcode.W, 16: Opcode.H, 8: Opcode.B, 64: Opcode.DW} fmt_to_opcode = {'I': Opcode.W, 'H': Opcode.H, 'B': Opcode.B, 'Q': Opcode.DW, - 'i': Opcode.W, 'h': Opcode.H, 'b': Opcode.B, 'q': Opcode.DW} + 'i': Opcode.W, 'h': Opcode.H, 'b': Opcode.B, 'q': Opcode.DW, + 'A': Opcode.W} - def __init__(self, ebpf, fmt, address, signed=False, long=False): + def __init__(self, ebpf, fmt, address): self.ebpf = ebpf self.fmt = fmt self.address = address - self.signed = signed - self.long = long def __iadd__(self, value): if self.fmt in "qQiI": @@ -748,10 +747,10 @@ class Memory(Expression): with self.ebpf.get_free_register(dst) as dst: self.ebpf.append(Opcode.LD + self.fmt_to_opcode[self.fmt], dst, self.address.left.no, self.address.right, 0) - yield dst, self.long, self.signed + yield dst, self.fmt in "QqA", self.fmt.islower() else: with super().calculate(dst, long, signed, force) as (dst, _, _): - yield dst, self.long, self.signed + yield dst, self.fmt in "QqA", self.fmt.islower() @contextmanager def get_address(self, dst, long, signed, force=False): @@ -761,6 +760,10 @@ class Memory(Expression): def contains(self, no): return self.address.contains(no) + @property + def signed(self): + return isinstance(self.fmt, str) and self.fmt.islower() + class MemoryDesc: """A base class used by descriptors for memory @@ -774,8 +777,7 @@ class MemoryDesc: return self fmt, addr = self.fmt_addr(instance) return Memory(instance.ebpf, fmt, - instance.ebpf.r[self.base_register] + addr, - fmt.islower()) + instance.ebpf.r[self.base_register] + addr) def __set__(self, instance, value): ebpf = instance.ebpf @@ -822,11 +824,9 @@ class LocalVar(MemoryDesc): class MemoryMap: - def __init__(self, ebpf, fmt, signed=False, long=False): + def __init__(self, ebpf, fmt): self.ebpf = ebpf self.fmt = fmt - self.long = long - self.signed = signed def __setitem__(self, addr, value): with ExitStack() as exitStack: @@ -860,7 +860,7 @@ class MemoryMap: def __getitem__(self, addr): if isinstance(addr, Register): addr = addr + 0 - return Memory(self.ebpf, self.fmt, addr, self.signed, self.long) + return Memory(self.ebpf, self.fmt, addr) class Map(ABC): @@ -1017,8 +1017,8 @@ class EBPF: self.mB = MemoryMap(self, "B") self.mH = MemoryMap(self, "H") self.mI = MemoryMap(self, "I") - self.mA = MemoryMap(self, "I", False, True) - self.mQ = MemoryMap(self, "Q", False, True) + self.mA = MemoryMap(self, "A") # actually I, but treat as Q + self.mQ = MemoryMap(self, "Q") self.r = RegisterArray(self, True, False) self.sr = RegisterArray(self, True, True) diff --git a/ebpfcat/hashmap.py b/ebpfcat/hashmap.py index 63c9d545291735b02af8c620785b9ac76f123cfa..76f851872bef21b8a386461ebfe62941d01c200f 100644 --- a/ebpfcat/hashmap.py +++ b/ebpfcat/hashmap.py @@ -18,7 +18,7 @@ from contextlib import contextmanager from struct import pack, unpack, unpack -from .ebpf import AssembleError, Expression, Opcode, Map, FuncId, Memory +from .ebpf import AssembleError, Expression, Opcode, Map, FuncId from .bpf import create_map, lookup_elem, MapType, update_elem