| author | David Anderson <dvander@alliedmods.net> |
| Wed Aug 02 17:30:12 2006 +0000 (2006-08-02) | |
| changeset 48 | 01895ae26044 |
| parent 47 | 50d5e52ded7e |
| child 55 | ccaca168c18f |
| permissions | -rw-r--r-- |
| dvander@33 | 1 |
#ifndef _INCLUDE_SOURCEPAWN_VM_TYPES_H |
| dvander@33 | 2 |
#define _INCLUDE_SOURCEPAWN_VM_TYPES_H |
| dvander@33 | 3 |
|
| dvander@33 | 4 |
#include "sp_file_headers.h" |
| dvander@33 | 5 |
|
| dvander@33 | 6 |
typedef uint32_t ucell_t; |
| dvander@33 | 7 |
typedef int32_t cell_t; |
| dvander@33 | 8 |
|
| dvander@33 | 9 |
/** |
| dvander@33 | 10 |
* Error codes |
| dvander@33 | 11 |
*/ |
| dvander@33 | 12 |
#define SP_ERR_NONE 0 |
| dvander@33 | 13 |
#define SP_ERR_FILE_FORMAT 1 /* File format unrecognized */ |
| dvander@33 | 14 |
#define SP_ERR_DECOMPRESSOR 2 /* A decompressor was not found */ |
| dvander@37 | 15 |
#define SP_ERR_HEAPLOW 3 /* Not enough space left on the heap */ |
| dvander@37 | 16 |
#define SP_ERR_PARAM 4 /* Invalid parameter */ |
| dvander@37 | 17 |
#define SP_ERR_INVALID_ADDRESS 5 /* A memory address was not valid */ |
| faluco@43 | 18 |
#define SP_ERR_NOT_FOUND 6 /* The object in question was not found */ |
| faluco@47 | 19 |
#define SP_ERR_INDEX 7 /* Invalid index parameter */ |
| dvander@33 | 20 |
|
| dvander@33 | 21 |
/********************************************** |
| dvander@33 | 22 |
*** The following structures are reference structures. |
| dvander@33 | 23 |
*** They are not essential to the API, but are used |
| dvander@33 | 24 |
*** to hold the backend database format of the plugin |
| dvander@33 | 25 |
*** binary. |
| dvander@33 | 26 |
**********************************************/ |
| dvander@33 | 27 |
|
| dvander@33 | 28 |
/** |
| dvander@33 | 29 |
* Information about the core plugin tables. |
| dvander@33 | 30 |
* These may or may not be present! |
| dvander@33 | 31 |
*/ |
| dvander@34 | 32 |
typedef struct sp_plugin_infotab_s |
| dvander@33 | 33 |
{ |
| dvander@33 | 34 |
const char *stringbase; /* base of string table */ |
| dvander@33 | 35 |
uint32_t publics_num; /* number of publics */ |
| dvander@33 | 36 |
sp_file_publics_t *publics; /* public table */ |
| dvander@33 | 37 |
uint32_t natives_num; /* number of natives */ |
| dvander@33 | 38 |
sp_file_natives_t *natives; /* native table */ |
| dvander@33 | 39 |
uint32_t pubvars_num; /* number of pubvars */ |
| dvander@33 | 40 |
sp_file_pubvars_t *pubvars; /* pubvars table */ |
| dvander@34 | 41 |
} sp_plugin_infotab_t; |
| dvander@33 | 42 |
|
| dvander@33 | 43 |
/** |
| dvander@33 | 44 |
* Information about the plugin's debug tables. |
| dvander@33 | 45 |
* These are all present if one is present. |
| dvander@33 | 46 |
*/ |
| dvander@34 | 47 |
typedef struct sp_plugin_debug_s |
| dvander@33 | 48 |
{ |
| dvander@33 | 49 |
const char *stringbase; /* base of string table */ |
| dvander@33 | 50 |
uint32_t files_num; /* number of files */ |
| dvander@33 | 51 |
sp_fdbg_file_t *files; /* files table */ |
| dvander@33 | 52 |
uint32_t lines_num; /* number of lines */ |
| dvander@33 | 53 |
sp_fdbg_line_t *lines; /* lines table */ |
| dvander@33 | 54 |
uint32_t syms_num; /* number of symbols */ |
| dvander@33 | 55 |
sp_fdbg_symbol_t *symbols; /* symbol table */ |
| dvander@34 | 56 |
} sp_plugin_debug_t; |
| dvander@33 | 57 |
|
| dvander@33 | 58 |
#define SP_FA_SELF_EXTERNAL (1<<0) |
| dvander@33 | 59 |
#define SP_FA_BASE_EXTERNAL (1<<1) |
| dvander@33 | 60 |
|
| dvander@33 | 61 |
/** |
| dvander@33 | 62 |
* The rebased, in-memory format of a plugin. |
| dvander@33 | 63 |
* This differs from the on-disk structure to ensure |
| dvander@33 | 64 |
* that the format is properly read. |
| dvander@33 | 65 |
*/ |
| dvander@34 | 66 |
typedef struct sp_plugin_s |
| dvander@33 | 67 |
{ |
| dvander@33 | 68 |
uint8_t *base; /* base of memory */ |
| dvander@33 | 69 |
uint8_t *pcode; /* p-code */ |
| dvander@33 | 70 |
uint32_t pcode_size; /* size of p-code */ |
| dvander@33 | 71 |
uint8_t *data; /* data size */ |
| dvander@33 | 72 |
uint32_t data_size; /* size of data */ |
| dvander@33 | 73 |
uint32_t memory; /* required memory */ |
| dvander@33 | 74 |
uint16_t flags; /* code flags */ |
| dvander@33 | 75 |
uint32_t allocflags; /* allocation flags */ |
| dvander@48 | 76 |
sp_plugin_infotab_t info; /* base info table */ |
| dvander@48 | 77 |
sp_plugin_debug_t debug; /* debug info table */ |
| dvander@34 | 78 |
} sp_plugin_t; |
| dvander@33 | 79 |
|
| dvander@33 | 80 |
struct sp_context_s; |
| dvander@34 | 81 |
typedef int (*SPVM_NATIVE_FUNC)(struct sp_context_s *, cell_t *); |
| dvander@33 | 82 |
|
| dvander@33 | 83 |
/********************************************** |
| dvander@33 | 84 |
*** The following structures are bound to the VM/JIT. |
| dvander@33 | 85 |
*** Changing them will result in necessary recompilation. |
| dvander@33 | 86 |
**********************************************/ |
| dvander@33 | 87 |
|
| dvander@33 | 88 |
/** |
| dvander@33 | 89 |
* Offsets and names to a public function. |
| dvander@33 | 90 |
* By default, these point back to the string table |
| dvander@33 | 91 |
* in the sp_plugin_infotab_t structure. |
| dvander@33 | 92 |
*/ |
| dvander@34 | 93 |
typedef struct sp_public_s |
| dvander@33 | 94 |
{ |
| dvander@33 | 95 |
uint32_t offs; /* code offset */ |
| dvander@33 | 96 |
const char *name; /* name */ |
| dvander@34 | 97 |
} sp_public_t; |
| dvander@33 | 98 |
|
| dvander@33 | 99 |
/** |
| dvander@33 | 100 |
* Offsets and names to public variables. |
| dvander@33 | 101 |
* The offset is relocated and the name by default |
| dvander@33 | 102 |
* points back to the sp_plugin_infotab_t structure. |
| dvander@33 | 103 |
*/ |
| dvander@34 | 104 |
typedef struct sp_pubvar_s |
| dvander@33 | 105 |
{ |
| dvander@33 | 106 |
cell_t *offs; /* pointer to data */ |
| dvander@33 | 107 |
const char *name; /* name */ |
| dvander@34 | 108 |
} sp_pubvar_t; |
| dvander@33 | 109 |
|
| dvander@33 | 110 |
#define SP_NATIVE_NONE (0) /* Native is not yet found */ |
| dvander@33 | 111 |
#define SP_NATIVE_OKAY (1) /* Native has been added */ |
| dvander@33 | 112 |
#define SP_NATIVE_PENDING (2) /* Native is marked as usable but replaceable */ |
| dvander@33 | 113 |
|
| dvander@33 | 114 |
/** |
| dvander@33 | 115 |
* Native lookup table, by default names |
| dvander@33 | 116 |
* point back to the sp_plugin_infotab_t structure. |
| dvander@33 | 117 |
* A native is NULL if unit |
| dvander@33 | 118 |
*/ |
| dvander@34 | 119 |
typedef struct sp_native_s |
| dvander@33 | 120 |
{ |
| dvander@33 | 121 |
SPVM_NATIVE_FUNC pfn; /* function pointer */ |
| dvander@33 | 122 |
const char * name; /* name of function */ |
| dvander@33 | 123 |
uint32_t status; /* status flags */ |
| dvander@33 | 124 |
} sp_native_t; |
| dvander@33 | 125 |
|
| dvander@33 | 126 |
/** |
| dvander@33 | 127 |
* Debug file table |
| dvander@33 | 128 |
*/ |
| dvander@33 | 129 |
typedef struct sp_debug_file_s |
| dvander@33 | 130 |
{ |
| dvander@33 | 131 |
uint32_t addr; /* address into code */ |
| dvander@33 | 132 |
const char * name; /* name of file */ |
| dvander@33 | 133 |
} sp_debug_file_t; |
| dvander@33 | 134 |
|
| dvander@33 | 135 |
/** |
| dvander@33 | 136 |
* Note that line is missing. It is not necessary since |
| dvander@33 | 137 |
* this can be retrieved from the base plugin info. |
| dvander@33 | 138 |
*/ |
| dvander@33 | 139 |
typedef struct sp_debug_line_s |
| dvander@33 | 140 |
{ |
| dvander@33 | 141 |
uint32_t addr; /* address into code */ |
| dvander@33 | 142 |
uint32_t line; /* line no. */ |
| dvander@33 | 143 |
} sp_debug_line_t; |
| dvander@33 | 144 |
|
| dvander@33 | 145 |
typedef sp_fdbg_arraydim_t sp_debug_arraydim_t; |
| dvander@33 | 146 |
|
| dvander@33 | 147 |
/** |
| dvander@33 | 148 |
* The majority of this struct is already located in the parent |
| dvander@33 | 149 |
* block. Thus, only the relocated portions are required. |
| dvander@33 | 150 |
*/ |
| dvander@33 | 151 |
typedef struct sp_debug_symbol_s |
| dvander@33 | 152 |
{ |
| dvander@33 | 153 |
uint32_t codestart; /* relocated code address */ |
| dvander@33 | 154 |
uint32_t codeend; /* relocated code end address */ |
| dvander@33 | 155 |
const char * name; /* relocated name */ |
| dvander@33 | 156 |
sp_debug_arraydim_t *dims; /* relocated dimension struct, if any */ |
| dvander@33 | 157 |
sp_fdbg_symbol_t *sym; /* pointer to original symbol */ |
| dvander@33 | 158 |
} sp_debug_symbol_t; |
| dvander@33 | 159 |
|
| dvander@33 | 160 |
/** |
| dvander@33 | 161 |
* Executes a Context. |
| dvander@33 | 162 |
* @sp_context_s - Execution Context |
| dvander@33 | 163 |
* @uint32_t - Offset from code pointer |
| dvander@33 | 164 |
* @res - return value of function |
| dvander@33 | 165 |
* @return - error code (0=none) |
| dvander@33 | 166 |
*/ |
| dvander@33 | 167 |
typedef int (*SPVM_EXEC)(struct sp_context_s *, |
| dvander@33 | 168 |
uint32_t, |
| dvander@33 | 169 |
cell_t *res); |
| dvander@33 | 170 |
|
| dvander@33 | 171 |
#define SP_CONTEXT_DEBUG (1<<0) /* in debug mode */ |
| dvander@33 | 172 |
#define SP_CONTEXT_INHERIT_MEMORY (1<<1) /* inherits memory pointers */ |
| dvander@33 | 173 |
#define SP_CONTEXT_INHERIT_CODE (1<<2) /* inherits code pointers */ |
| dvander@33 | 174 |
|
| dvander@33 | 175 |
/** |
| dvander@33 | 176 |
* This is the heart of the VM. It contains all of the runtime |
| dvander@33 | 177 |
* information about a plugin context. |
| dvander@33 | 178 |
* It is split into three sections. |
| dvander@33 | 179 |
*/ |
| dvander@33 | 180 |
typedef struct sp_context_s |
| dvander@33 | 181 |
{ |
| dvander@33 | 182 |
/* parent information */ |
| dvander@33 | 183 |
void *base; /* base of generated code and memory */ |
| dvander@33 | 184 |
sp_plugin_t *plugin; /* pointer back to parent information */ |
| dvander@33 | 185 |
struct sp_context_s *parent; /* pointer to parent context */ |
| dvander@33 | 186 |
uint32_t flags; /* context flags */ |
| dvander@33 | 187 |
/* execution specific data */ |
| dvander@33 | 188 |
SPVM_EXEC exec; /* execution base */ |
| dvander@33 | 189 |
cell_t pri; /* PRI register */ |
| dvander@33 | 190 |
cell_t alt; /* ALT register */ |
| dvander@37 | 191 |
uint8_t *data; /* data chunk */ |
| dvander@37 | 192 |
cell_t heapbase; /* heap base */ |
| dvander@37 | 193 |
cell_t hp; /* heap pointer */ |
| dvander@37 | 194 |
cell_t sp; /* stack pointer */ |
| dvander@33 | 195 |
ucell_t memory; /* total memory size; */ |
| dvander@33 | 196 |
int32_t err; /* error code */ |
| dvander@33 | 197 |
uint32_t pushcount; /* push count */ |
| dvander@33 | 198 |
/* context rebased database */ |
| dvander@34 | 199 |
sp_public_t *publics; /* public functions table */ |
| dvander@33 | 200 |
sp_pubvar_t *pubvars; /* public variables table */ |
| dvander@33 | 201 |
sp_native_t *natives; /* natives table */ |
| dvander@33 | 202 |
sp_debug_file_t *files; /* files */ |
| dvander@33 | 203 |
sp_debug_line_t *lines; /* lines */ |
| dvander@33 | 204 |
sp_debug_symbol_t *symbols; /* symbols */ |
| dvander@33 | 205 |
} sp_context_t; |
| dvander@33 | 206 |
|
| dvander@33 | 207 |
#endif //_INCLUDE_SOURCEPAWN_VM_TYPES_H |
| dvander@33 | 208 |