From 358838cb335e88b4a0eb841d15e941c225a70b66 Mon Sep 17 00:00:00 2001 From: Nicolas Kruse Date: Mon, 3 Nov 2025 21:51:58 +0100 Subject: [PATCH] New patch instruction for absolut addresses added PATCH_OBJECT_ABS --- src/copapy/_binwrite.py | 1 + src/copapy/_stencils.py | 6 +++++- src/coparun/runmem.c | 10 ++++++++++ src/coparun/runmem.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/copapy/_binwrite.py b/src/copapy/_binwrite.py index 036ff37..423436a 100644 --- a/src/copapy/_binwrite.py +++ b/src/copapy/_binwrite.py @@ -8,6 +8,7 @@ Command = Enum('Command', [('ALLOCATE_DATA', 1), ('COPY_DATA', 2), ('ALLOCATE_CODE', 3), ('COPY_CODE', 4), ('PATCH_FUNC', 0x1000), ('PATCH_OBJECT', 0x2000), ('PATCH_OBJECT_HI21', 0x2001), + ('PATCH_OBJECT_ABS', 0x2002), ('ENTRY_POINT', 7), ('RUN_PROG', 64), ('READ_DATA', 65), ('END_COM', 256), ('FREE_MEMORY', 257), ('DUMP_CODE', 258)]) diff --git a/src/copapy/_stencils.py b/src/copapy/_stencils.py index 269c72b..8a1164e 100644 --- a/src/copapy/_stencils.py +++ b/src/copapy/_stencils.py @@ -199,13 +199,17 @@ class stencil_database(): elif pr.type.endswith('_LDST32_ABS_LO12_NC'): # (S + A) & 0xFFF mask = 0b11_1111_1111_1100_0000_0000 - patch_value = (symbol_address + pr.fields['r_addend']) >> 2 + patch_value = (symbol_address + pr.fields['r_addend']) + symbol_type = symbol_type + 0x02 + scale = 4 #print(f" *> {patch_value=} {symbol_address=} {pr.fields['r_addend']=}, {function_offset=}") elif pr.type.endswith('_LDST64_ABS_LO12_NC'): # (S + A) & 0xFFF mask = 0b11_1111_1111_1100_0000_0000 patch_value = (symbol_address + pr.fields['r_addend']) >> 3 + symbol_type = symbol_type + 0x02 + scale = 8 #print(f" *> {patch_value=} {symbol_address=} {pr.fields['r_addend']=}, {function_offset=}") else: diff --git a/src/coparun/runmem.c b/src/coparun/runmem.c index 588bdb5..78d22e6 100644 --- a/src/coparun/runmem.c +++ b/src/coparun/runmem.c @@ -140,6 +140,16 @@ int parse_commands(uint8_t *bytes) { patch(executable_memory + offs, patch_mask, value / patch_scale + data_offs / patch_scale); break; + case PATCH_OBJECT_ABS: + offs = *(uint32_t*)bytes; bytes += 4; + patch_mask = *(uint32_t*)bytes; bytes += 4; + patch_scale = *(int32_t*)bytes; bytes += 4; + value = *(int32_t*)bytes; bytes += 4; + LOG("PATCH_OBJECT_ABS patch_offs=%i patch_mask=%#08x scale=%i value=%i\n", + offs, patch_mask, patch_scale, value); + patch(executable_memory + offs, patch_mask, value / patch_scale); + break; + case PATCH_OBJECT_HI21: offs = *(uint32_t*)bytes; bytes += 4; patch_mask = *(uint32_t*)bytes; bytes += 4; diff --git a/src/coparun/runmem.h b/src/coparun/runmem.h index f384e78..aab6dfa 100644 --- a/src/coparun/runmem.h +++ b/src/coparun/runmem.h @@ -11,6 +11,7 @@ #define PATCH_FUNC 0x1000 #define PATCH_OBJECT 0x2000 #define PATCH_OBJECT_HI21 0x2001 +#define PATCH_OBJECT_ABS 0x2002 #define ENTRY_POINT 7 #define RUN_PROG 64 #define READ_DATA 65