OzVM API Description
typedef struct OzVM_struct OzVM;
The structure maintaining the OzVM virtual machine. The following fields may be accessed to modify the state of the virtual machine:r is an array of the 256, 64-bit general purpose registers. ip is the instruction pointer. mmask is the bit-mask used to force valid memory access. m points to the allocated interior memory.uint64 r[256]; uint32 ip; uint32 mmask; uint8* m; |
typedef void (*OzVM_trap_handler_type)( OzVM*, U4, U4 );
A pointer to an OzVM trap handler. The default trap handler can be replaced at run-time. |
typedef void (*OzVM_voidvoid_func_type)( OzVM* );
A pointer to an OzVM function that takes no extra parameters and returns no value. |
typedef int (*OzVM_vprintf_func_type)( void* opaque, const char* fmt, __va_list args );
A pointer to an OzVM function that can supercede the behavior of the OzVM printf and vprintf system calls. This may be removed or reworked in future versions of OzVM. |
void OzVM_specify_jit_func( OzVM_voidvoid_func_type jit_func );
Specify the function used for just-in-time compilation to the local architecture. If set to null (0), the interior program is executed using the OzVM interpreter. This function applies global configuration, so may be reworked in future versions of OzVM. |
void OzVM_specify_bootstrap_path( const char* bootstrap_path, int do_crop_tail );
Specify the directory path where bootstrap OzVM programs may reside, such as the bootstrap used to decompress compressed OzVM programs. If do_crop_tail is nonzero, all characters in bootstrap_path after the last path separator are ignored. This function applies global configuration, so may be reworked in future versions of OzVM. |
OzVM* OzVM_alloc();
Allocate and initialize an OzVM. |
void OzVM_init( OzVM* oz );
Initialize an already allocated OzVM. |
void OzVM_uninit( OzVM* oz );
Uninitialize an OzVM without deallocating it. |
void OzVM_free( OzVM* oz );
Unitialize and deallocate an OzVM. |
void OzVM_alloc_mem( OzVM* oz, unsigned int membits );
Allocate 2^membits bytes of RAM to be made available to the interior program. |
uint32 OzVM_lookup_symbol( OzVM* oz, const char* symbol_name );
Find the symbol symbol_name in the interior program and return its interior address. |
void OzVM_trap( OzVM* oz, U4 handle, U4 data );
The default trap handler for OzVM. It services the system calls listed below, in the table "OzVM Interior API". |
typedef size_t (*OzVM_read_func_type)( void* opaque, void* dest, size_t len );
A pointer to a general-purpose read function. opaque is an opaque pointer for internal use by the particular function. At most len bytes must be read into the buffer dest. The actual number of byte read must be returned. |
OzVM* OzVM_load_image( OzVM* _oz, OzVM_read_func_type read_func, void* read_opaque );
Load an OzVM image. The image data is supplied by read_func and read_opaque. If _oz is null (0), a new OzVM is allocated and initialized. Otherwise, the existing OzVM is initialized with the image data. |
void OzVM_run( OzVM* _oz );
Execute the OzVM _oz starting at the current value of the instruction pointer _oz->ip. |
_OzVM_entry
Transfer control to an interior routine specified in register 64, then exit. Specifically, the symbol _OzVM_entry points to the assembly codelink %64, %1 trap %0, %0 | |
_OzVM_STACK
This symbol points to the top of the OzVM stack, which is by default 65536 bytes. It is used to initialize register 2 before program execution, the default stack pointer register. |
System calls 0-1023 are reserved for the OzVM runtime. Unless otherwise noted, the system call argument acts as a read-only stack pointer for access to the function parameters.
System call | C Prototype, Description |
---|---|
0-49 reserved for OzVM specific functions. | |
0 |
extern void exit( int );
The system call argument is an exit code. That value is transferred to register 3, the standard function return value. Then, the OzVM program is terminated. |
1 |
extern void OzVM_error( int error_num, const char* error_msg );
Emit an error code and text. |
2 |
extern void *ozvaptr( void * );
Convert a pointer interior to the machine to a "handle" pointer (relative to the host). While not a security risk, this is a hack for varadic system calls. It is deprecated and will be removed as soon as I write a legitimate set of printf routines. |
3 |
extern unsigned int timednumber();
Return a number dependent on time that varies at least once a second. Useful for seeding a pseudo-random number generator. |
50-99 reserved for C-library stdio.h style functions.
Because these are varadic functions and I'm lazy :(, pointers (to strings) in the varadic region must be wrapped interior calls of ozvaptr. | |
50 | extern int printf(const char *, ...); |
51 | extern int vprintf(const char *, __va_list); |
52 | extern int snprintf(char *, size_t, const char *, ...); |
53 | extern int vsnprintf(char *, size_t, const char *, __va_list); |
100-149 reserved for C-library stdlib.h style functions. | |
100 | extern double atof(const char *); |
101 | extern int atoi(const char *); |
102 | extern int atoll(const char *); |
103 | extern int rand(void); |
104 | extern void srand(unsigned int); |
150-199 reserved for C-library string.h style functions.
These calls silently guarantee memory is accessed within the valid OzVM memory space. | |
150 | void *memset(void *, int c, size_t); |
151 | void *memcpy(void *, const void *, size_t); |
152 | void *memmove(void *, const void *, size_t); |
153 | char *strcpy(char *, const char *); |
154 | char *strncpy(char *, const char *, size_t); |
155 | char *strcat(char *, const char *); |
156 | char *strncat(char *, const char *, size_t); |
157 | int memcmp(const void *, const void *, size_t); |
158 | int strcmp(const char *, const char *); |
159 | int strncmp(const char *, const char *, size_t); |
160 | size_t strlen(const char *); |
200-249 reserved for C-library math.h style functions. | |
200 | extern double acos(double); |
201 | extern double asin(double); |
202 | extern double atan(double); |
203 | extern double atan2(double, double); |
204 | extern double cos(double); |
205 | extern double sin(double); |
206 | extern double tan(double); |
207 | extern double exp(double); |
208 | extern double log(double); |
209 | extern double log10(double); |
210 | extern double pow(double, double); |
211 | extern double sqrt(double); |
212 | extern double ceil(double); |
213 | extern double fabs(double); |
214 | extern double floor(double); |
215 | extern double fmod(double, double); |
$Revision: 1.1.1.1 $ $Date: 2001/09/18 10:45:25 $