From ee725b84074975253e2eabe343abe183a3f824cf Mon Sep 17 00:00:00 2001 From: Mitchell Johnson Date: Sat, 14 Sep 2024 14:20:55 -0400 Subject: [PATCH 1/3] Support bitOffset and bitRange field specifiers --- __init__.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index 6582073..b259e77 100644 --- a/__init__.py +++ b/__init__.py @@ -41,8 +41,22 @@ def import_svd(bv: BinaryView): reg_fields = register['fields']['field'] for field in reg_fields: field_name: str = field['name'] - field_lsb: int = field['lsb'] - field_msb: int = field['msb'] + # one of the three following field bit specifications must be + # provided + if 'lsb' in field and 'msb' in field: + field_lsb: int = field['lsb'] + field_msb: int = field['msb'] + elif 'bitOffset' in field: + field_lsb: int = field['bitOffset'] + # The bitWidth field is optional + if 'bitWidth' in field: + field_msb: int = field['bitOffset'] + field['bitWidth'] - 1 + else: + field_msb: int = field['bitOffset'] + elif 'bitRange' in field: + msb_str, lsb_str = field['bitRange'].split(':', 1) + field_lsb: int = int(lsb_str[:-1]) + field_msb: int = int(msb_str[1:]) field_lsb_b: float = field_lsb / BYTE_SIZE field_msb_b: float = field_msb / BYTE_SIZE From a16794b7b4d603b2e4a9f364d3b3df42c563a7b8 Mon Sep 17 00:00:00 2001 From: Mitchell Johnson Date: Sat, 14 Sep 2024 14:21:11 -0400 Subject: [PATCH 2/3] Make registers an optional field for a peripheral --- __init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index b259e77..183ec7b 100644 --- a/__init__.py +++ b/__init__.py @@ -28,7 +28,12 @@ def import_svd(bv: BinaryView): per_base_addr: int = peripheral['baseAddress'] per_struct = StructureBuilder.create() - per_registers = peripheral['registers']['register'] + # the registers block is an optional 0..1 field in the SVD spec. Even + # if we don't get individual register definitions, we can create a + # memory region for a peripheral + per_registers = [] + if 'registers' in peripheral: + per_registers = peripheral['registers']['register'] for register in per_registers: reg_name: str = register['name'] reg_desc: str = register['description'] From 0c8dcc83cefb5a0b07b12c4dea5f8fd992fa0bcd Mon Sep 17 00:00:00 2001 From: Mitchell Johnson Date: Sat, 14 Sep 2024 14:40:59 -0400 Subject: [PATCH 3/3] Make peripheral descriptions optional --- __init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/__init__.py b/__init__.py index 183ec7b..abed052 100644 --- a/__init__.py +++ b/__init__.py @@ -24,7 +24,9 @@ def import_svd(bv: BinaryView): for peripheral in peripherals: per_name: str = peripheral['name'] - per_desc: str = peripheral['description'] + per_desc = None + if 'description' in peripheral: + per_desc: str = peripheral['description'] per_base_addr: int = peripheral['baseAddress'] per_struct = StructureBuilder.create() @@ -121,7 +123,7 @@ def import_svd(bv: BinaryView): bv.memory_map.add_memory_region(per_name, per_base_addr, bytearray(per_size)) # Add the peripheral description as a comment - if show_comments: + if show_comments and per_desc is not None: bv.set_comment_at(per_base_addr, per_desc) # Define the peripheral type and data var in the binary view. per_struct_ty = Type.structure_type(per_struct)