mirror of https://github.com/Nonannet/copapy.git
New patch instruction for absolut addresses added PATCH_OBJECT_ABS
This commit is contained in:
parent
44d5721d9b
commit
e935b11696
|
|
@ -8,6 +8,7 @@ Command = Enum('Command', [('ALLOCATE_DATA', 1), ('COPY_DATA', 2),
|
||||||
('ALLOCATE_CODE', 3), ('COPY_CODE', 4),
|
('ALLOCATE_CODE', 3), ('COPY_CODE', 4),
|
||||||
('PATCH_FUNC', 0x1000), ('PATCH_OBJECT', 0x2000),
|
('PATCH_FUNC', 0x1000), ('PATCH_OBJECT', 0x2000),
|
||||||
('PATCH_OBJECT_HI21', 0x2001),
|
('PATCH_OBJECT_HI21', 0x2001),
|
||||||
|
('PATCH_OBJECT_ABS', 0x2002),
|
||||||
('ENTRY_POINT', 7),
|
('ENTRY_POINT', 7),
|
||||||
('RUN_PROG', 64), ('READ_DATA', 65),
|
('RUN_PROG', 64), ('READ_DATA', 65),
|
||||||
('END_COM', 256), ('FREE_MEMORY', 257), ('DUMP_CODE', 258)])
|
('END_COM', 256), ('FREE_MEMORY', 257), ('DUMP_CODE', 258)])
|
||||||
|
|
|
||||||
|
|
@ -199,13 +199,17 @@ class stencil_database():
|
||||||
elif pr.type.endswith('_LDST32_ABS_LO12_NC'):
|
elif pr.type.endswith('_LDST32_ABS_LO12_NC'):
|
||||||
# (S + A) & 0xFFF
|
# (S + A) & 0xFFF
|
||||||
mask = 0b11_1111_1111_1100_0000_0000
|
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=}")
|
#print(f" *> {patch_value=} {symbol_address=} {pr.fields['r_addend']=}, {function_offset=}")
|
||||||
|
|
||||||
elif pr.type.endswith('_LDST64_ABS_LO12_NC'):
|
elif pr.type.endswith('_LDST64_ABS_LO12_NC'):
|
||||||
# (S + A) & 0xFFF
|
# (S + A) & 0xFFF
|
||||||
mask = 0b11_1111_1111_1100_0000_0000
|
mask = 0b11_1111_1111_1100_0000_0000
|
||||||
patch_value = (symbol_address + pr.fields['r_addend']) >> 3
|
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=}")
|
#print(f" *> {patch_value=} {symbol_address=} {pr.fields['r_addend']=}, {function_offset=}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -140,6 +140,16 @@ int parse_commands(uint8_t *bytes) {
|
||||||
patch(executable_memory + offs, patch_mask, value / patch_scale + data_offs / patch_scale);
|
patch(executable_memory + offs, patch_mask, value / patch_scale + data_offs / patch_scale);
|
||||||
break;
|
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:
|
case PATCH_OBJECT_HI21:
|
||||||
offs = *(uint32_t*)bytes; bytes += 4;
|
offs = *(uint32_t*)bytes; bytes += 4;
|
||||||
patch_mask = *(uint32_t*)bytes; bytes += 4;
|
patch_mask = *(uint32_t*)bytes; bytes += 4;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#define PATCH_FUNC 0x1000
|
#define PATCH_FUNC 0x1000
|
||||||
#define PATCH_OBJECT 0x2000
|
#define PATCH_OBJECT 0x2000
|
||||||
#define PATCH_OBJECT_HI21 0x2001
|
#define PATCH_OBJECT_HI21 0x2001
|
||||||
|
#define PATCH_OBJECT_ABS 0x2002
|
||||||
#define ENTRY_POINT 7
|
#define ENTRY_POINT 7
|
||||||
#define RUN_PROG 64
|
#define RUN_PROG 64
|
||||||
#define READ_DATA 65
|
#define READ_DATA 65
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue