#ifndef RVVMLIB_H
#define RVVMLIB_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#ifdef USE_LIB
#if defined(__GNUC__) || defined(__llvm__) || defined(__INTEL_COMPILER)
#define PUBLIC __attribute__((visibility("default")))
#define HIDDEN __attribute__((visibility("hidden")))
#elif defined(_WIN32)
#define PUBLIC __declspec(dllexport)
#define HIDDEN
#endif
#endif
#ifndef PUBLIC
#define PUBLIC
#define HIDDEN
#endif
#ifndef RVVM_VERSION
#define RVVM_VERSION "0.5"
#endif
#define RVVM_ABI_VERSION 3
#define RVVM_DEFAULT_MEMBASE 0x80000000
typedef struct rvvm_machine_t rvvm_machine_t;
struct fdt_node;
typedef uint64_t rvvm_addr_t;
typedef struct rvvm_mmio_dev_t rvvm_mmio_dev_t;
typedef int rvvm_mmio_handle_t;
#define RVVM_INVALID_MMIO (-1)
typedef struct {
void (*remove)(rvvm_mmio_dev_t* dev);
void (*update)(rvvm_mmio_dev_t* dev);
void (*reset)(rvvm_mmio_dev_t* dev);
const char* name;
} rvvm_mmio_type_t;
typedef bool (*rvvm_mmio_handler_t)(rvvm_mmio_dev_t* dev, void* dest, size_t offset, uint8_t size);
PUBLIC bool rvvm_mmio_none(rvvm_mmio_dev_t* dev, void* dest, size_t offset, uint8_t size);
struct rvvm_mmio_dev_t {
rvvm_addr_t addr; size_t size; void* data; rvvm_machine_t* machine; rvvm_mmio_type_t* type;
rvvm_mmio_handler_t read;
rvvm_mmio_handler_t write;
uint8_t min_op_size; uint8_t max_op_size;
};
typedef bool (*rvvm_reset_handler_t)(rvvm_machine_t* machine, void* data, bool reset);
PUBLIC rvvm_machine_t* rvvm_create_machine(rvvm_addr_t mem_base, size_t mem_size, size_t hart_count, bool rv64);
PUBLIC bool rvvm_write_ram(rvvm_machine_t* machine, rvvm_addr_t dest, const void* src, size_t size);
PUBLIC bool rvvm_read_ram(rvvm_machine_t* machine, void* dest, rvvm_addr_t src, size_t size);
PUBLIC void* rvvm_get_dma_ptr(rvvm_machine_t* machine, rvvm_addr_t addr, size_t size);
PUBLIC struct fdt_node* rvvm_get_fdt_root(rvvm_machine_t* machine);
PUBLIC struct fdt_node* rvvm_get_fdt_soc(rvvm_machine_t* machine);
PUBLIC void rvvm_set_dtb_addr(rvvm_machine_t* machine, rvvm_addr_t dtb_addr);
PUBLIC void rvvm_cmdline_set(rvvm_machine_t* machine, const char* str);
PUBLIC void rvvm_cmdline_append(rvvm_machine_t* machine, const char* str);
PUBLIC void rvvm_set_reset_handler(rvvm_machine_t* machine, rvvm_reset_handler_t handler, void* data);
PUBLIC bool rvvm_load_bootrom(rvvm_machine_t* machine, const char* path);
PUBLIC bool rvvm_load_kernel(rvvm_machine_t* machine, const char* path);
PUBLIC bool rvvm_load_dtb(rvvm_machine_t* machine, const char* path);
PUBLIC bool rvvm_dump_dtb(rvvm_machine_t* machine, const char* path);
PUBLIC void rvvm_start_machine(rvvm_machine_t* machine);
PUBLIC void rvvm_pause_machine(rvvm_machine_t* machine);
PUBLIC void rvvm_reset_machine(rvvm_machine_t* machine, bool reset);
PUBLIC bool rvvm_machine_powered_on(rvvm_machine_t* machine);
PUBLIC void rvvm_free_machine(rvvm_machine_t* machine);
PUBLIC rvvm_addr_t rvvm_mmio_zone_auto(rvvm_machine_t* machine, rvvm_addr_t addr, size_t size);
PUBLIC rvvm_mmio_handle_t rvvm_attach_mmio(rvvm_machine_t* machine, const rvvm_mmio_dev_t* mmio);
PUBLIC void rvvm_detach_mmio(rvvm_machine_t* machine, rvvm_addr_t mmio_addr, bool cleanup);
PUBLIC rvvm_mmio_dev_t* rvvm_get_mmio(rvvm_machine_t* machine, rvvm_mmio_handle_t handle);
PUBLIC void rvvm_enable_builtin_eventloop(bool enabled);
PUBLIC void rvvm_run_eventloop();
#endif