|
dvander@372
|
1 |
/** |
|
dvander@375
|
2 |
* vim: set ts=4 : |
|
dvander@372
|
3 |
* ================================================================ |
|
dvander@376
|
4 |
* SourcePawn, Copyright (C) 2004-2007 AlliedModders LLC. |
|
dvander@376
|
5 |
* All rights reserved. |
|
dvander@372
|
6 |
* ================================================================ |
|
dvander@372
|
7 |
* |
|
dvander@379
|
8 |
* This file is part of the SourceMod/SourcePawn SDK. This file may only be |
|
dvander@379
|
9 |
* used or modified under the Terms and Conditions of its License Agreement, |
|
dvander@379
|
10 |
* which is found in public/licenses/LICENSE.txt. As of this notice, derivative |
|
dvander@379
|
11 |
* works must be licensed under the GNU General Public License (version 2 or |
|
dvander@379
|
12 |
* greater). A copy of the GPL is included under public/licenses/GPL.txt. |
|
dvander@379
|
13 |
* |
|
dvander@379
|
14 |
* To view the latest information, see: http://www.sourcemod.net/license.php |
|
dvander@372
|
15 |
* |
|
dvander@372
|
16 |
* Version: $Id$ |
|
dvander@372
|
17 |
*/ |
|
dvander@372
|
18 |
|
|
dvander@324
|
19 |
#ifndef _INCLUDE_SOURCEPAWN_VM_TYPES_H |
|
dvander@324
|
20 |
#define _INCLUDE_SOURCEPAWN_VM_TYPES_H |
|
dvander@324
|
21 |
|
|
dvander@372
|
22 |
/** |
|
dvander@372
|
23 |
* @file sp_vm_types.h |
|
dvander@372
|
24 |
* @brief Contains all run-time SourcePawn structures. |
|
dvander@372
|
25 |
*/ |
|
dvander@372
|
26 |
|
|
dvander@324
|
27 |
#include "sp_file_headers.h" |
|
dvander@324
|
28 |
|
|
dvander@372
|
29 |
typedef uint32_t ucell_t; /**< Unsigned 32bit integer */ |
|
dvander@372
|
30 |
typedef int32_t cell_t; /**< Basic 32bit signed integer type for plugins */ |
|
dvander@372
|
31 |
typedef uint32_t funcid_t; /**< Function index code */ |
|
dvander@324
|
32 |
|
|
dvander@324
|
33 |
#include "sp_typeutil.h" |
|
dvander@324
|
34 |
|
|
dvander@372
|
35 |
#define SP_MAX_EXEC_PARAMS 32 /**< Maximum number of parameters in a function */ |
|
dvander@324
|
36 |
|
|
dvander@324
|
37 |
/** |
|
dvander@372
|
38 |
* @brief Error codes for SourcePawn routines. |
|
dvander@324
|
39 |
*/ |
|
dvander@372
|
40 |
#define SP_ERROR_NONE 0 /**< No error occurred */ |
|
dvander@372
|
41 |
#define SP_ERROR_FILE_FORMAT 1 /**< File format unrecognized */ |
|
dvander@372
|
42 |
#define SP_ERROR_DECOMPRESSOR 2 /**< A decompressor was not found */ |
|
dvander@372
|
43 |
#define SP_ERROR_HEAPLOW 3 /**< Not enough space left on the heap */ |
|
dvander@372
|
44 |
#define SP_ERROR_PARAM 4 /**< Invalid parameter or parameter type */ |
|
dvander@372
|
45 |
#define SP_ERROR_INVALID_ADDRESS 5 /**< A memory address was not valid */ |
|
dvander@372
|
46 |
#define SP_ERROR_NOT_FOUND 6 /**< The object in question was not found */ |
|
dvander@372
|
47 |
#define SP_ERROR_INDEX 7 /**< Invalid index parameter */ |
|
ds@729
|
48 |
#define SP_ERROR_STACKLOW 8 /**< Not enough space left on the stack */ |
|
dvander@372
|
49 |
#define SP_ERROR_NOTDEBUGGING 9 /**< Debug mode was not on or debug section not found */ |
|
dvander@372
|
50 |
#define SP_ERROR_INVALID_INSTRUCTION 10 /**< Invalid instruction was encountered */ |
|
dvander@372
|
51 |
#define SP_ERROR_MEMACCESS 11 /**< Invalid memory access */ |
|
dvander@372
|
52 |
#define SP_ERROR_STACKMIN 12 /**< Stack went beyond its minimum value */ |
|
dvander@372
|
53 |
#define SP_ERROR_HEAPMIN 13 /**< Heap went beyond its minimum value */ |
|
dvander@372
|
54 |
#define SP_ERROR_DIVIDE_BY_ZERO 14 /**< Division by zero */ |
|
dvander@372
|
55 |
#define SP_ERROR_ARRAY_BOUNDS 15 /**< Array index is out of bounds */ |
|
dvander@372
|
56 |
#define SP_ERROR_INSTRUCTION_PARAM 16 /**< Instruction had an invalid parameter */ |
|
dvander@372
|
57 |
#define SP_ERROR_STACKLEAK 17 /**< A native leaked an item on the stack */ |
|
dvander@372
|
58 |
#define SP_ERROR_HEAPLEAK 18 /**< A native leaked an item on the heap */ |
|
dvander@372
|
59 |
#define SP_ERROR_ARRAY_TOO_BIG 19 /**< A dynamic array is too big */ |
|
dvander@372
|
60 |
#define SP_ERROR_TRACKER_BOUNDS 20 /**< Tracker stack is out of bounds */ |
|
dvander@372
|
61 |
#define SP_ERROR_INVALID_NATIVE 21 /**< Native was pending or invalid */ |
|
dvander@372
|
62 |
#define SP_ERROR_PARAMS_MAX 22 /**< Maximum number of parameters reached */ |
|
dvander@372
|
63 |
#define SP_ERROR_NATIVE 23 /**< Error originates from a native */ |
|
dvander@372
|
64 |
#define SP_ERROR_NOT_RUNNABLE 24 /**< Function or plugin is not runnable */ |
|
dvander@560
|
65 |
#define SP_ERROR_ABORTED 25 /**< Function call was aborted */ |
|
dvander@372
|
66 |
//Hey you! Update the string table if you add to the end of me! */ |
|
dvander@324
|
67 |
|
|
dvander@324
|
68 |
/********************************************** |
|
dvander@324
|
69 |
*** The following structures are reference structures. |
|
dvander@324
|
70 |
*** They are not essential to the API, but are used |
|
dvander@324
|
71 |
*** to hold the back end database format of the plugin |
|
dvander@324
|
72 |
*** binary. |
|
dvander@324
|
73 |
**********************************************/ |
|
dvander@324
|
74 |
|
|
dvander@324
|
75 |
/** |
|
dvander@372
|
76 |
* @brief Information about the core plugin tables. These may or may not be present! |
|
dvander@324
|
77 |
*/ |
|
dvander@324
|
78 |
typedef struct sp_plugin_infotab_s |
|
dvander@324
|
79 |
{ |
|
dvander@372
|
80 |
const char *stringbase; /**< base of string table */ |
|
dvander@372
|
81 |
uint32_t publics_num; /**< number of publics */ |
|
dvander@372
|
82 |
sp_file_publics_t *publics; /**< public table */ |
|
dvander@372
|
83 |
uint32_t natives_num; /**< number of natives */ |
|
dvander@372
|
84 |
sp_file_natives_t *natives; /**< native table */ |
|
dvander@372
|
85 |
uint32_t pubvars_num; /**< number of pubvars */ |
|
faluco@381
|
86 |
sp_file_pubvars_t *pubvars; /**< pubvars table */ |
|
dvander@324
|
87 |
} sp_plugin_infotab_t; |
|
dvander@324
|
88 |
|
|
dvander@324
|
89 |
/** |
|
dvander@372
|
90 |
* @brief Information about the plugin's debug tables. These are all present if one is present. |
|
dvander@324
|
91 |
*/ |
|
dvander@324
|
92 |
typedef struct sp_plugin_debug_s |
|
dvander@324
|
93 |
{ |
|
dvander@372
|
94 |
const char *stringbase; /**< base of string table */ |
|
dvander@372
|
95 |
uint32_t files_num; /**< number of files */ |
|
dvander@372
|
96 |
sp_fdbg_file_t *files; /**< files table */ |
|
dvander@372
|
97 |
uint32_t lines_num; /**< number of lines */ |
|
dvander@372
|
98 |
sp_fdbg_line_t *lines; /**< lines table */ |
|
dvander@372
|
99 |
uint32_t syms_num; /**< number of symbols */ |
|
dvander@372
|
100 |
sp_fdbg_symbol_t *symbols; /**< symbol table */ |
|
dvander@324
|
101 |
} sp_plugin_debug_t; |
|
dvander@324
|
102 |
|
|
dvander@372
|
103 |
#define SP_FA_SELF_EXTERNAL (1<<0) /**< Allocation of structure is external */ |
|
dvander@372
|
104 |
#define SP_FA_BASE_EXTERNAL (1<<1) /**< Allocation of base is external */ |
|
dvander@324
|
105 |
|
|
dvander@324
|
106 |
/** |
|
dvander@372
|
107 |
* @brief The rebased memory format of a plugin. This differs from the on-disk structure |
|
dvander@372
|
108 |
* to ensure that the format is properly read. |
|
dvander@324
|
109 |
*/ |
|
dvander@324
|
110 |
typedef struct sp_plugin_s |
|
dvander@324
|
111 |
{ |
|
dvander@372
|
112 |
uint8_t *base; /**< Base of memory for this plugin. */ |
|
dvander@372
|
113 |
uint8_t *pcode; /**< P-Code of plugin */ |
|
dvander@372
|
114 |
uint32_t pcode_size; /**< Size of p-code */ |
|
dvander@372
|
115 |
uint8_t *data; /**< Data/memory layout */ |
|
dvander@372
|
116 |
uint32_t data_size; /**< Size of data */ |
|
dvander@372
|
117 |
uint32_t memory; /**< Required memory space */ |
|
dvander@372
|
118 |
uint16_t flags; /**< Code flags */ |
|
dvander@372
|
119 |
uint32_t allocflags; /**< Allocation flags */ |
|
dvander@372
|
120 |
sp_plugin_infotab_t info; /**< Base info table */ |
|
dvander@372
|
121 |
sp_plugin_debug_t debug; /**< Debug info table */ |
|
dvander@324
|
122 |
} sp_plugin_t; |
|
dvander@324
|
123 |
|
|
dvander@324
|
124 |
|
|
dvander@324
|
125 |
namespace SourcePawn |
|
dvander@324
|
126 |
{ |
|
dvander@324
|
127 |
class IPluginContext; |
|
dvander@324
|
128 |
class IVirtualMachine; |
|
dvander@324
|
129 |
}; |
|
dvander@324
|
130 |
|
|
dvander@324
|
131 |
struct sp_context_s; |
|
dvander@324
|
132 |
|
|
dvander@372
|
133 |
/** |
|
dvander@372
|
134 |
* @brief Native callback prototype, passed a context and a parameter stack (0=count, 1+=args). |
|
dvander@372
|
135 |
* A cell must be returned. |
|
dvander@372
|
136 |
*/ |
|
dvander@324
|
137 |
typedef cell_t (*SPVM_NATIVE_FUNC)(SourcePawn::IPluginContext *, const cell_t *); |
|
dvander@324
|
138 |
|
|
dvander@601
|
139 |
/** |
|
dvander@601
|
140 |
* @brief Fake native callback prototype, passed a context, parameter stack, and private data. |
|
dvander@601
|
141 |
* A cell must be returned. |
|
dvander@601
|
142 |
*/ |
|
dvander@601
|
143 |
typedef cell_t (*SPVM_FAKENATIVE_FUNC)(SourcePawn::IPluginContext *, const cell_t *, void *); |
|
dvander@601
|
144 |
|
|
dvander@324
|
145 |
/********************************************** |
|
dvander@324
|
146 |
*** The following structures are bound to the VM/JIT. |
|
dvander@324
|
147 |
*** Changing them will result in necessary recompilation. |
|
dvander@324
|
148 |
**********************************************/ |
|
dvander@324
|
149 |
|
|
dvander@324
|
150 |
/** |
|
dvander@372
|
151 |
* @brief Offsets and names to a public function. |
|
dvander@324
|
152 |
*/ |
|
dvander@324
|
153 |
typedef struct sp_public_s |
|
dvander@324
|
154 |
{ |
|
dvander@372
|
155 |
funcid_t funcid; /**< Encoded function id */ |
|
dvander@372
|
156 |
uint32_t code_offs; /**< Relocated code offset */ |
|
dvander@372
|
157 |
const char *name; /**< Name of function */ |
|
dvander@324
|
158 |
} sp_public_t; |
|
dvander@324
|
159 |
|
|
dvander@324
|
160 |
/** |
|
dvander@372
|
161 |
* @brief Offsets and names to public variables. |
|
dvander@372
|
162 |
* |
|
dvander@372
|
163 |
* The offset is relocated and the name by default points back to the sp_plugin_infotab_t structure. |
|
dvander@324
|
164 |
*/ |
|
dvander@324
|
165 |
typedef struct sp_pubvar_s |
|
dvander@324
|
166 |
{ |
|
dvander@372
|
167 |
cell_t *offs; /**< Pointer to data */ |
|
dvander@372
|
168 |
const char *name; /**< Name */ |
|
dvander@324
|
169 |
} sp_pubvar_t; |
|
dvander@324
|
170 |
|
|
dvander@372
|
171 |
#define SP_NATIVE_UNBOUND (0) /**< Native is undefined */ |
|
dvander@372
|
172 |
#define SP_NATIVE_BOUND (1) /**< Native is bound */ |
|
dvander@324
|
173 |
|
|
dvander@324
|
174 |
/** |
|
dvander@372
|
175 |
* @brief Native lookup table, by default names point back to the sp_plugin_infotab_t structure. |
|
dvander@324
|
176 |
*/ |
|
dvander@324
|
177 |
typedef struct sp_native_s |
|
dvander@324
|
178 |
{ |
|
dvander@372
|
179 |
SPVM_NATIVE_FUNC pfn; /**< Function pointer */ |
|
dvander@372
|
180 |
const char * name; /**< Name of function */ |
|
dvander@372
|
181 |
uint32_t status; /**< Status flags */ |
|
dvander@324
|
182 |
} sp_native_t; |
|
dvander@324
|
183 |
|
|
dvander@324
|
184 |
/** |
|
dvander@372
|
185 |
* @brief Used for setting natives from modules/host apps. |
|
dvander@324
|
186 |
*/ |
|
dvander@324
|
187 |
typedef struct sp_nativeinfo_s |
|
dvander@324
|
188 |
{ |
|
dvander@372
|
189 |
const char *name; /**< Name of the native */ |
|
dvander@372
|
190 |
SPVM_NATIVE_FUNC func; /**< Address of native implementation */ |
|
dvander@324
|
191 |
} sp_nativeinfo_t; |
|
dvander@324
|
192 |
|
|
dvander@324
|
193 |
/** |
|
dvander@372
|
194 |
* @brief Run-time debug file table |
|
dvander@324
|
195 |
*/ |
|
dvander@324
|
196 |
typedef struct sp_debug_file_s |
|
dvander@324
|
197 |
{ |
|
dvander@372
|
198 |
uint32_t addr; /**< Address into code */ |
|
dvander@372
|
199 |
const char * name; /**< Name of file */ |
|
dvander@324
|
200 |
} sp_debug_file_t; |
|
dvander@324
|
201 |
|
|
dvander@324
|
202 |
/** |
|
dvander@372
|
203 |
* @brief Contains run-time debug line table. |
|
dvander@324
|
204 |
*/ |
|
dvander@324
|
205 |
typedef struct sp_debug_line_s |
|
dvander@324
|
206 |
{ |
|
dvander@372
|
207 |
uint32_t addr; /**< Address into code */ |
|
dvander@372
|
208 |
uint32_t line; /**< Line number */ |
|
dvander@324
|
209 |
} sp_debug_line_t; |
|
dvander@324
|
210 |
|
|
dvander@372
|
211 |
/** |
|
dvander@372
|
212 |
* @brief These structures are equivalent. |
|
dvander@372
|
213 |
*/ |
|
dvander@324
|
214 |
typedef sp_fdbg_arraydim_t sp_debug_arraydim_t; |
|
dvander@324
|
215 |
|
|
dvander@324
|
216 |
/** |
|
dvander@372
|
217 |
* @brief The majority of this struct is already located in the parent |
|
dvander@372
|
218 |
* block. Thus, only the relocated portions are required. |
|
dvander@324
|
219 |
*/ |
|
dvander@324
|
220 |
typedef struct sp_debug_symbol_s |
|
dvander@324
|
221 |
{ |
|
dvander@372
|
222 |
uint32_t codestart; /**< Relocated code address */ |
|
ds@729
|
223 |
uint32_t codeend; /**< Relocated code end address */ |
|
dvander@372
|
224 |
const char * name; /**< Relocated name */ |
|
dvander@372
|
225 |
sp_debug_arraydim_t *dims; /**< Relocated dimension struct, if any */ |
|
dvander@372
|
226 |
sp_fdbg_symbol_t *sym; /**< Pointer to original symbol */ |
|
dvander@324
|
227 |
} sp_debug_symbol_t; |
|
dvander@324
|
228 |
|
|
dvander@324
|
229 |
/** |
|
dvander@324
|
230 |
* Breaks into a debugger |
|
dvander@324
|
231 |
* Params: |
|
dvander@324
|
232 |
* [0] - plugin context |
|
dvander@324
|
233 |
* [1] - frm |
|
dvander@324
|
234 |
* [2] - cip |
|
dvander@324
|
235 |
*/ |
|
dvander@324
|
236 |
typedef int (*SPVM_DEBUGBREAK)(struct sp_context_s *, uint32_t, uint32_t); |
|
dvander@324
|
237 |
|
|
dvander@372
|
238 |
#define SPFLAG_PLUGIN_DEBUG (1<<0) /**< plugin is in debug mode */ |
|
dvander@525
|
239 |
#define SPFLAG_PLUGIN_PAUSED (1<<1) /**< plugin is "paused" (blocked from executing) */ |
|
dvander@324
|
240 |
|
|
dvander@324
|
241 |
/** |
|
dvander@372
|
242 |
* @brief This is the heart of the VM. It contains all of the runtime |
|
dvander@372
|
243 |
* information about a plugin context. Note that user[0..3] can be used for any user based pointers. |
|
dvander@372
|
244 |
* However, vm[0..3] should not be touched, as it is reserved for the VM. |
|
dvander@324
|
245 |
*/ |
|
dvander@324
|
246 |
typedef struct sp_context_s |
|
dvander@324
|
247 |
{ |
|
dvander@372
|
248 |
void *codebase; /**< Base of generated code and memory */ |
|
dvander@372
|
249 |
sp_plugin_t *plugin; /**< Pointer back to parent information */ |
|
dvander@372
|
250 |
SourcePawn::IPluginContext *context; /**< Pointer to IPluginContext */ |
|
dvander@372
|
251 |
SourcePawn::IVirtualMachine *vmbase; /**< Pointer to IVirtualMachine */ |
|
dvander@372
|
252 |
void *user[4]; /**< User specific pointers */ |
|
dvander@372
|
253 |
void *vm[4]; /**< VM specific pointers */ |
|
dvander@372
|
254 |
uint32_t flags; /**< Compilation flags */ |
|
dvander@372
|
255 |
SPVM_DEBUGBREAK dbreak; /**< Debug break function */ |
|
dvander@372
|
256 |
uint8_t *memory; /**< Data chunk */ |
|
dvander@372
|
257 |
ucell_t mem_size; /**< Total memory size; */ |
|
dvander@372
|
258 |
cell_t data_size; /**< Data chunk size, always starts at 0 */ |
|
dvander@372
|
259 |
cell_t heap_base; /**< Where the heap starts */ |
|
dvander@372
|
260 |
cell_t hp; /**< Heap pointer */ |
|
dvander@372
|
261 |
cell_t sp; /**< Stack pointer */ |
|
dvander@372
|
262 |
cell_t frm; /**< Frame pointer */ |
|
dvander@372
|
263 |
uint32_t pushcount; /**< Push count */ |
|
dvander@372
|
264 |
int32_t n_err; /**< Error code set by a native */ |
|
dvander@372
|
265 |
uint32_t n_idx; /**< Current native index being executed */ |
|
dvander@372
|
266 |
sp_public_t *publics; /**< Public functions table */ |
|
dvander@372
|
267 |
sp_pubvar_t *pubvars; /**< Public variables table */ |
|
dvander@372
|
268 |
sp_native_t *natives; /**< Natives table */ |
|
dvander@372
|
269 |
sp_debug_file_t *files; /**< Files */ |
|
dvander@372
|
270 |
sp_debug_line_t *lines; /**< Lines */ |
|
dvander@372
|
271 |
sp_debug_symbol_t *symbols; /**< Symbols */ |
|
dvander@324
|
272 |
} sp_context_t; |
|
dvander@324
|
273 |
|
|
dvander@324
|
274 |
#endif //_INCLUDE_SOURCEPAWN_VM_TYPES_H |