aboutsummaryrefslogtreecommitdiff
path: root/executor/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'executor/x86_64')
-rw-r--r--executor/x86_64/asm.c4
-rw-r--r--executor/x86_64/asm.h2
-rw-r--r--executor/x86_64/executor.c9
3 files changed, 10 insertions, 5 deletions
diff --git a/executor/x86_64/asm.c b/executor/x86_64/asm.c
index c741f15..f2bb801 100644
--- a/executor/x86_64/asm.c
+++ b/executor/x86_64/asm.c
@@ -210,7 +210,7 @@ static void asm_print_code_hex(Asm *self) {
}
#endif
-int asm_execute(Asm *self) {
+int asm_execute(Asm *self, u32 offset) {
void (*func)();
if(mprotect(self->code, self->allocated_size, PROT_READ | PROT_EXEC) != 0)
return -errno;
@@ -218,7 +218,7 @@ int asm_execute(Asm *self) {
/*asm_print_code_hex(self);*/
/* TODO: Verify if this is valid on all platforms. According to ISO C standard it isn't? */
- *(void**)(&func) = self->code;
+ *(void**)(&func) = self->code + offset;
func();
return 0;
}
diff --git a/executor/x86_64/asm.h b/executor/x86_64/asm.h
index 51f2d84..ace1ecf 100644
--- a/executor/x86_64/asm.h
+++ b/executor/x86_64/asm.h
@@ -49,7 +49,7 @@ void asm_deinit(Asm *self);
usize asm_get_size(Asm *self);
-CHECK_RESULT int asm_execute(Asm *self);
+CHECK_RESULT int asm_execute(Asm *self, u32 offset);
CHECK_RESULT int asm_nop(Asm *self);
diff --git a/executor/x86_64/executor.c b/executor/x86_64/executor.c
index fbe227a..335790a 100644
--- a/executor/x86_64/executor.c
+++ b/executor/x86_64/executor.c
@@ -64,9 +64,14 @@ void amal_executor_deinit(amal_executor *self) {
am_free(impl);
}
-int amal_executor_run(amal_executor *self) {
+int amal_executor_run(amal_executor *self, u32 offset) {
IMPL
- return asm_execute(&impl->asm);
+ return asm_execute(&impl->asm, offset);
+}
+
+u32 amal_exec_get_code_offset(amal_executor *self) {
+ IMPL
+ return asm_get_size(&impl->asm);
}
int amal_executor_instructions_start(amal_executor *self, u16 num_functions) {