diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-10-25 17:39:49 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-10-25 17:43:54 +0100 |
commit | d33632f7167b48754bb35387e1cb91e5ed90de0d (patch) | |
tree | 3c3717bec669ef4726a4f510bae632d6d0a56c4b /main.c | |
parent | aace23ead78fa22edb2533565acfa379e451c5eb (diff) | |
download | avm-d33632f7167b48754bb35387e1cb91e5ed90de0d.tar.gz avm-d33632f7167b48754bb35387e1cb91e5ed90de0d.tar.bz2 avm-d33632f7167b48754bb35387e1cb91e5ed90de0d.zip |
The virtual machine has three major segments for data storage: main
memory, the registers and the stack.
They are laid out in a flat buffer adjacent to each other: main
memory, then the registers then the stack at the end. This would
allow, later on, for the stack to be extended via memory reallocation.
Crucially, registers cannot grow. This is intended to map closely to
the x86-64 machines which have a static number of general
registers (and also xmmp registers).
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 50 |
1 files changed, 49 insertions, 1 deletions
@@ -14,10 +14,58 @@ * Description: Entrypoint */ +#include <malloc.h> +#include <stdint.h> #include <stdio.h> +#include <string.h> + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef struct +{ + u8 *buffer; + u64 size_memory, size_stack, size_registers; +} vm_t; + +#define VM_DEFAULT_MEM_SIZE (1024) +#define VM_DEFAULT_STACK_SIZE (128 * sizeof(u64)) +#define VM_DEFAULT_REGISTERS_SIZE (8 * sizeof(u64)) + +#define VM_STACK(VM) ((VM)->buffer + (VM)->size_memory + (VM)->size_registers) +#define VM_REGISTERS(VM) ((u64 *)((VM)->buffer + (VM)->size_memory)) +#define VM_IP(VM) (VM_REGISTERS(VM)[0]) +#define VM_SP(VM) (VM_REGISTERS(VM)[1]) + +void vm_init_malloc(vm_t *vm) +{ + if (vm->size_stack == 0) + vm->size_stack = VM_DEFAULT_STACK_SIZE; + if (vm->size_registers == 0) + vm->size_registers = VM_DEFAULT_REGISTERS_SIZE; + if (vm->size_memory == 0) + vm->size_memory = VM_DEFAULT_MEM_SIZE; + + vm->buffer = calloc(1, vm->size_memory + vm->size_stack + vm->size_registers); +} + +void vm_stop(vm_t *vm) +{ + free(vm->buffer); + memset(vm, 0, sizeof(*vm)); +} int main(void) { - puts("Hello, world!"); + vm_t vm = {0}; + vm_init_malloc(&vm); + vm_stop(&vm); return 0; } |