New patch instruction for absolut addresses added PATCH_OBJECT_ABS

This commit is contained in:
Nicolas Kruse 2025-11-03 21:51:58 +01:00
parent 44d5721d9b
commit e935b11696
4 changed files with 17 additions and 1 deletions

View File

@ -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)])

View File

@ -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:

View File

@ -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;

View File

@ -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