vm.h (1803B)
1 #ifndef TA_VM_H
2 #define TA_VM_H
3
4 #include <stdint.h>
5 #include <stdbool.h>
6 #include <stddef.h>
7
8 typedef enum {
9 TA_VM_RUNNING,
10 TA_VM_HALTED,
11 TA_VM_YIELDED,
12 TA_VM_FAULT_ILLEGAL,
13 TA_VM_FAULT_MEMORY,
14 TA_VM_FAULT_MISALIGNED,
15 TA_VM_FAULT_EBREAK
16 } ta_vm_status;
17
18 typedef struct ta_vm ta_vm;
19 typedef ta_vm_status (*ta_vm_ecall)(ta_vm *vm, void *user);
20
21 struct ta_vm {
22 uint32_t regs[32];
23 uint32_t pc;
24 uint8_t *mem;
25 uint32_t mem_size;
26 ta_vm_ecall ecall;
27 void *user;
28 uint32_t steps;
29 };
30
31 #define TA_VM_REG_RA 1
32 #define TA_VM_REG_SP 2
33 #define TA_VM_REG_A0 10
34 #define TA_VM_REG_A1 11
35 #define TA_VM_REG_A2 12
36 #define TA_VM_REG_A3 13
37 #define TA_VM_REG_A4 14
38 #define TA_VM_REG_A5 15
39 #define TA_VM_REG_A6 16
40 #define TA_VM_REG_A7 17
41
42 void ta_vm_init(ta_vm *vm, uint8_t *mem, uint32_t mem_size, ta_vm_ecall ecall, void *user);
43 void ta_vm_reset(ta_vm *vm, uint32_t entry, uint32_t stack_top);
44 ta_vm_status ta_vm_run(ta_vm *vm, uint32_t max_steps);
45 bool ta_vm_read8(const ta_vm *vm, uint32_t addr, uint8_t *out);
46 bool ta_vm_read32(const ta_vm *vm, uint32_t addr, uint32_t *out);
47 bool ta_vm_write32(ta_vm *vm, uint32_t addr, uint32_t value);
48 void *ta_vm_translate_pointer(const ta_vm *vm, uint32_t addr, uint32_t size);
49 const char *ta_vm_cstr(const ta_vm *vm, uint32_t addr);
50
51 #ifndef TA_VM_RAM_SIZE
52 #define TA_VM_RAM_SIZE (256u * 1024u)
53 #endif
54
55 #ifndef TA_VM_STEPS_PER_CALL
56 #define TA_VM_STEPS_PER_CALL 200000u
57 #endif
58
59 extern bool ta_vm_running;
60
61 bool ta_vm_load(const uint8_t *binary, size_t size);
62 bool ta_vm_load_tab(const char *path);
63 void ta_vm_request_exec(uint8_t file);
64 bool ta_vm_exec_pending(void);
65 bool ta_vm_exec_apply(void);
66 bool ta_vm_call(uint32_t function, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t *result);
67 int32_t ta_vm_exit_code(void);
68 void ta_vm_unload(void);
69
70 #endif // TA_VM_H