mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-20 04:33:55 +00:00
board-inspector: support buffer assignments and indexing
The ACPI specification allows both assigning to buffers and indexing to a certain byte of a buffer using the Index operator. This patch adds the implementation of these two operations in the interpreter. Tracked-On: #6287 Signed-off-by: Junjie Mao <junjie.mao@intel.com>
This commit is contained in:
parent
50cd8e2558
commit
185b5d22e2
@ -57,6 +57,9 @@ class BufferBase(Object):
|
|||||||
def create_field(self, name, offset, bitwidth, access_width):
|
def create_field(self, name, offset, bitwidth, access_width):
|
||||||
self.__fields[name] = (offset, bitwidth, access_width)
|
self.__fields[name] = (offset, bitwidth, access_width)
|
||||||
|
|
||||||
|
def field_bitwidth(self, name):
|
||||||
|
return self.__fields[name][1]
|
||||||
|
|
||||||
def read_field(self, name):
|
def read_field(self, name):
|
||||||
offset, bitwidth, access_width = self.__fields[name]
|
offset, bitwidth, access_width = self.__fields[name]
|
||||||
acc = 0
|
acc = 0
|
||||||
@ -155,6 +158,11 @@ class Buffer(BufferBase):
|
|||||||
def get(self):
|
def get(self):
|
||||||
return self.__data
|
return self.__data
|
||||||
|
|
||||||
|
def set(self, value):
|
||||||
|
data = value.to_buffer().get()
|
||||||
|
copy_length = min(len(data), len(self.__data))
|
||||||
|
self.__data[:copy_length] = data[:copy_length]
|
||||||
|
|
||||||
def to_hex_string(self):
|
def to_hex_string(self):
|
||||||
result = ",".join(map(lambda x:hex(x)[2:], self.__data))
|
result = ",".join(map(lambda x:hex(x)[2:], self.__data))
|
||||||
return String(result)
|
return String(result)
|
||||||
@ -218,6 +226,10 @@ class BufferField(Object):
|
|||||||
def to_integer(self):
|
def to_integer(self):
|
||||||
return Integer(self.get())
|
return Integer(self.get())
|
||||||
|
|
||||||
|
def to_buffer(self):
|
||||||
|
bitwidth = self.__buf.field_bitwidth(self.__field)
|
||||||
|
return Buffer(self.get().to_bytes((bitwidth + 7) // 8, sys.byteorder))
|
||||||
|
|
||||||
def to_string(self):
|
def to_string(self):
|
||||||
return f"BufferField({self.__field})"
|
return f"BufferField({self.__field})"
|
||||||
|
|
||||||
@ -291,8 +303,12 @@ class ObjectReference(Object):
|
|||||||
if self.__index is not None:
|
if self.__index is not None:
|
||||||
if isinstance(self.__obj, Package):
|
if isinstance(self.__obj, Package):
|
||||||
return self.__obj.elements[self.__index]
|
return self.__obj.elements[self.__index]
|
||||||
|
elif isinstance(self.__obj, Buffer):
|
||||||
|
name = f"byte_{hex(self.__index)[2:]}"
|
||||||
|
self.__obj.create_field(name, self.__index * 8, 8, 8)
|
||||||
|
return BufferField(self.__obj, name)
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError
|
raise NotImplementedError(self.__obj.__class__.__name__)
|
||||||
else:
|
else:
|
||||||
return self.__obj
|
return self.__obj
|
||||||
|
|
||||||
@ -375,12 +391,18 @@ class OperationRegion(Object):
|
|||||||
def read_field(self, name):
|
def read_field(self, name):
|
||||||
return self.__iobuf.read_field(name)
|
return self.__iobuf.read_field(name)
|
||||||
|
|
||||||
|
def field_bitwidth(self, name):
|
||||||
|
return self.__iobuf.field_bitwidth(name)
|
||||||
|
|
||||||
def write_field(self, name, value):
|
def write_field(self, name, value):
|
||||||
# Do not allow writes to stream I/O buffer unless the base is explicitly marked as writable
|
# Do not allow writes to stream I/O buffer unless the base is explicitly marked as writable
|
||||||
if name in self.__writable_fields:
|
if name in self.__writable_fields:
|
||||||
self.__iobuf.write_field(name, value)
|
self.__iobuf.write_field(name, value)
|
||||||
else:
|
else:
|
||||||
logging.info(f"Skip writing 0x{value:0X} to I/O field {name}")
|
if isinstance(value, int):
|
||||||
|
logging.info(f"Skip writing 0x{value:0X} to I/O field {name}")
|
||||||
|
else:
|
||||||
|
logging.info(f"Skip writing {value} to I/O field {name}")
|
||||||
|
|
||||||
def set_field_writable(self, name):
|
def set_field_writable(self, name):
|
||||||
self.__writable_fields.add(name)
|
self.__writable_fields.add(name)
|
||||||
|
Loading…
Reference in New Issue
Block a user