#ifndef __SAGITTARIUS_H_ #define __SAGITTARIUS_H_ #include "SagittariusInst.h" #include #include #include #include "SagittariusBase.h" typedef struct SagittariusRegister { // 256 Usable + Overflow preventing purpose 256 extra bytes. uint8_t head[512]; } SagittariusRegister; typedef struct SagittariusMemory { uint8_t *data; uint64_t size; } SagittariusMemory; typedef struct SagittariusCore { SagittariusRegister reg; SagittariusMemory *memory; struct SagittariusVM *vm; uint64_t pc; } SagittariusCore; typedef int32_t (*SagittariusSyscall)(SagittariusCore *core); typedef int32_t (*SagittariusPanicHandler)(SagittariusCore *core, uint64_t panic_id, const char *msg); typedef struct SagittariusSyscallEntry { uint64_t id; SagittariusSyscall syscall; } SagittariusSyscallEntry; typedef struct SagittariusVM { SagittariusSyscallEntry *SagittariusSyscallEntries; uint64_t SagittariusSyscallCount; uint64_t SagittariusSyscallCapacity; SagittariusCore core; SagittariusMemory Memory; SagittariusPanicHandler panic_handler; } SagittariusVM; /** * The layout of program in byte form (without the head): * |0..31|32..95|96..159|160..|... * |format version|inst count|data size|instructions...|data...| * |uint32|uint64|uint64|inst1|inst2|...|data...| */ typedef struct SagittariusProgram { SagittariusInst *instructions; uint64_t instCount; uint8_t *data; uint64_t data_size; } SagittariusProgram; SAGITTARIUS_API SagittariusVM *sagittarius_vm_new(uint64_t memory_size); SAGITTARIUS_API void sagittarius_register_syscall(SagittariusVM *vm, uint64_t id, SagittariusSyscall syscall); SAGITTARIUS_API void sagittarius_vm_free(SagittariusVM *vm); SAGITTARIUS_API void sagittarius_step(SagittariusVM *vm); SAGITTARIUS_API void sagittarius_mem_resize(SagittariusVM *vm, uint64_t new_size); SAGITTARIUS_API uint64_t sagittarius_mem_getsize(SagittariusVM *vm); SAGITTARIUS_API void sagittarius_load_program_to_mem(SagittariusVM *vm, SagittariusProgram *program, uint64_t offset); SAGITTARIUS_API SagittariusProgram *sagittarius_load_program_from_byte_array(uint8_t *data, uint64_t size); #endif