dvander@372: /** dvander@375: * vim: set ts=4 : dvander@372: * ================================================================ dvander@376: * SourcePawn, Copyright (C) 2004-2007 AlliedModders LLC. dvander@376: * All rights reserved. dvander@372: * ================================================================ dvander@372: * dvander@379: * This file is part of the SourceMod/SourcePawn SDK. This file may only be dvander@379: * used or modified under the Terms and Conditions of its License Agreement, dvander@379: * which is found in public/licenses/LICENSE.txt. As of this notice, derivative dvander@379: * works must be licensed under the GNU General Public License (version 2 or dvander@379: * greater). A copy of the GPL is included under public/licenses/GPL.txt. dvander@379: * dvander@379: * To view the latest information, see: http://www.sourcemod.net/license.php dvander@372: * dvander@372: * Version: $Id$ dvander@372: */ dvander@372: dvander@324: #ifndef _INCLUDE_SOURCEPAWN_VM_TYPES_H dvander@324: #define _INCLUDE_SOURCEPAWN_VM_TYPES_H dvander@324: dvander@372: /** dvander@372: * @file sp_vm_types.h dvander@372: * @brief Contains all run-time SourcePawn structures. dvander@372: */ dvander@372: dvander@324: #include "sp_file_headers.h" dvander@324: dvander@372: typedef uint32_t ucell_t; /**< Unsigned 32bit integer */ dvander@372: typedef int32_t cell_t; /**< Basic 32bit signed integer type for plugins */ dvander@372: typedef uint32_t funcid_t; /**< Function index code */ dvander@324: dvander@324: #include "sp_typeutil.h" dvander@324: dvander@372: #define SP_MAX_EXEC_PARAMS 32 /**< Maximum number of parameters in a function */ dvander@324: dvander@324: /** dvander@372: * @brief Error codes for SourcePawn routines. dvander@324: */ dvander@372: #define SP_ERROR_NONE 0 /**< No error occurred */ dvander@372: #define SP_ERROR_FILE_FORMAT 1 /**< File format unrecognized */ dvander@372: #define SP_ERROR_DECOMPRESSOR 2 /**< A decompressor was not found */ dvander@372: #define SP_ERROR_HEAPLOW 3 /**< Not enough space left on the heap */ dvander@372: #define SP_ERROR_PARAM 4 /**< Invalid parameter or parameter type */ dvander@372: #define SP_ERROR_INVALID_ADDRESS 5 /**< A memory address was not valid */ dvander@372: #define SP_ERROR_NOT_FOUND 6 /**< The object in question was not found */ dvander@372: #define SP_ERROR_INDEX 7 /**< Invalid index parameter */ dvander@372: #define SP_ERROR_STACKLOW 8 /**< Nnot enough space left on the stack */ dvander@372: #define SP_ERROR_NOTDEBUGGING 9 /**< Debug mode was not on or debug section not found */ dvander@372: #define SP_ERROR_INVALID_INSTRUCTION 10 /**< Invalid instruction was encountered */ dvander@372: #define SP_ERROR_MEMACCESS 11 /**< Invalid memory access */ dvander@372: #define SP_ERROR_STACKMIN 12 /**< Stack went beyond its minimum value */ dvander@372: #define SP_ERROR_HEAPMIN 13 /**< Heap went beyond its minimum value */ dvander@372: #define SP_ERROR_DIVIDE_BY_ZERO 14 /**< Division by zero */ dvander@372: #define SP_ERROR_ARRAY_BOUNDS 15 /**< Array index is out of bounds */ dvander@372: #define SP_ERROR_INSTRUCTION_PARAM 16 /**< Instruction had an invalid parameter */ dvander@372: #define SP_ERROR_STACKLEAK 17 /**< A native leaked an item on the stack */ dvander@372: #define SP_ERROR_HEAPLEAK 18 /**< A native leaked an item on the heap */ dvander@372: #define SP_ERROR_ARRAY_TOO_BIG 19 /**< A dynamic array is too big */ dvander@372: #define SP_ERROR_TRACKER_BOUNDS 20 /**< Tracker stack is out of bounds */ dvander@372: #define SP_ERROR_INVALID_NATIVE 21 /**< Native was pending or invalid */ dvander@372: #define SP_ERROR_PARAMS_MAX 22 /**< Maximum number of parameters reached */ dvander@372: #define SP_ERROR_NATIVE 23 /**< Error originates from a native */ dvander@372: #define SP_ERROR_NOT_RUNNABLE 24 /**< Function or plugin is not runnable */ dvander@372: //Hey you! Update the string table if you add to the end of me! */ dvander@324: dvander@324: /********************************************** dvander@324: *** The following structures are reference structures. dvander@324: *** They are not essential to the API, but are used dvander@324: *** to hold the back end database format of the plugin dvander@324: *** binary. dvander@324: **********************************************/ dvander@324: dvander@324: /** dvander@372: * @brief Information about the core plugin tables. These may or may not be present! dvander@324: */ dvander@324: typedef struct sp_plugin_infotab_s dvander@324: { dvander@372: const char *stringbase; /**< base of string table */ dvander@372: uint32_t publics_num; /**< number of publics */ dvander@372: sp_file_publics_t *publics; /**< public table */ dvander@372: uint32_t natives_num; /**< number of natives */ dvander@372: sp_file_natives_t *natives; /**< native table */ dvander@372: uint32_t pubvars_num; /**< number of pubvars */ faluco@381: sp_file_pubvars_t *pubvars; /**< pubvars table */ dvander@324: } sp_plugin_infotab_t; dvander@324: dvander@324: /** dvander@372: * @brief Information about the plugin's debug tables. These are all present if one is present. dvander@324: */ dvander@324: typedef struct sp_plugin_debug_s dvander@324: { dvander@372: const char *stringbase; /**< base of string table */ dvander@372: uint32_t files_num; /**< number of files */ dvander@372: sp_fdbg_file_t *files; /**< files table */ dvander@372: uint32_t lines_num; /**< number of lines */ dvander@372: sp_fdbg_line_t *lines; /**< lines table */ dvander@372: uint32_t syms_num; /**< number of symbols */ dvander@372: sp_fdbg_symbol_t *symbols; /**< symbol table */ dvander@324: } sp_plugin_debug_t; dvander@324: dvander@372: #define SP_FA_SELF_EXTERNAL (1<<0) /**< Allocation of structure is external */ dvander@372: #define SP_FA_BASE_EXTERNAL (1<<1) /**< Allocation of base is external */ dvander@324: dvander@324: /** dvander@372: * @brief The rebased memory format of a plugin. This differs from the on-disk structure dvander@372: * to ensure that the format is properly read. dvander@324: */ dvander@324: typedef struct sp_plugin_s dvander@324: { dvander@372: uint8_t *base; /**< Base of memory for this plugin. */ dvander@372: uint8_t *pcode; /**< P-Code of plugin */ dvander@372: uint32_t pcode_size; /**< Size of p-code */ dvander@372: uint8_t *data; /**< Data/memory layout */ dvander@372: uint32_t data_size; /**< Size of data */ dvander@372: uint32_t memory; /**< Required memory space */ dvander@372: uint16_t flags; /**< Code flags */ dvander@372: uint32_t allocflags; /**< Allocation flags */ dvander@372: sp_plugin_infotab_t info; /**< Base info table */ dvander@372: sp_plugin_debug_t debug; /**< Debug info table */ dvander@324: } sp_plugin_t; dvander@324: dvander@324: dvander@324: namespace SourcePawn dvander@324: { dvander@324: class IPluginContext; dvander@324: class IVirtualMachine; dvander@324: }; dvander@324: dvander@324: struct sp_context_s; dvander@324: dvander@372: /** dvander@372: * @brief Native callback prototype, passed a context and a parameter stack (0=count, 1+=args). dvander@372: * A cell must be returned. dvander@372: */ dvander@324: typedef cell_t (*SPVM_NATIVE_FUNC)(SourcePawn::IPluginContext *, const cell_t *); dvander@324: dvander@324: /********************************************** dvander@324: *** The following structures are bound to the VM/JIT. dvander@324: *** Changing them will result in necessary recompilation. dvander@324: **********************************************/ dvander@324: dvander@324: /** dvander@372: * @brief Offsets and names to a public function. dvander@324: */ dvander@324: typedef struct sp_public_s dvander@324: { dvander@372: funcid_t funcid; /**< Encoded function id */ dvander@372: uint32_t code_offs; /**< Relocated code offset */ dvander@372: const char *name; /**< Name of function */ dvander@324: } sp_public_t; dvander@324: dvander@324: /** dvander@372: * @brief Offsets and names to public variables. dvander@372: * dvander@372: * The offset is relocated and the name by default points back to the sp_plugin_infotab_t structure. dvander@324: */ dvander@324: typedef struct sp_pubvar_s dvander@324: { dvander@372: cell_t *offs; /**< Pointer to data */ dvander@372: const char *name; /**< Name */ dvander@324: } sp_pubvar_t; dvander@324: dvander@372: #define SP_NATIVE_UNBOUND (0) /**< Native is undefined */ dvander@372: #define SP_NATIVE_BOUND (1) /**< Native is bound */ dvander@324: dvander@324: /** dvander@372: * @brief Native lookup table, by default names point back to the sp_plugin_infotab_t structure. dvander@324: */ dvander@324: typedef struct sp_native_s dvander@324: { dvander@372: SPVM_NATIVE_FUNC pfn; /**< Function pointer */ dvander@372: const char * name; /**< Name of function */ dvander@372: uint32_t status; /**< Status flags */ dvander@324: } sp_native_t; dvander@324: dvander@324: /** dvander@372: * @brief Used for setting natives from modules/host apps. dvander@324: */ dvander@324: typedef struct sp_nativeinfo_s dvander@324: { dvander@372: const char *name; /**< Name of the native */ dvander@372: SPVM_NATIVE_FUNC func; /**< Address of native implementation */ dvander@324: } sp_nativeinfo_t; dvander@324: dvander@324: /** dvander@372: * @brief Run-time debug file table dvander@324: */ dvander@324: typedef struct sp_debug_file_s dvander@324: { dvander@372: uint32_t addr; /**< Address into code */ dvander@372: const char * name; /**< Name of file */ dvander@324: } sp_debug_file_t; dvander@324: dvander@324: /** dvander@372: * @brief Contains run-time debug line table. dvander@324: */ dvander@324: typedef struct sp_debug_line_s dvander@324: { dvander@372: uint32_t addr; /**< Address into code */ dvander@372: uint32_t line; /**< Line number */ dvander@324: } sp_debug_line_t; dvander@324: dvander@372: /** dvander@372: * @brief These structures are equivalent. dvander@372: */ dvander@324: typedef sp_fdbg_arraydim_t sp_debug_arraydim_t; dvander@324: dvander@324: /** dvander@372: * @brief The majority of this struct is already located in the parent dvander@372: * block. Thus, only the relocated portions are required. dvander@324: */ dvander@324: typedef struct sp_debug_symbol_s dvander@324: { dvander@372: uint32_t codestart; /**< Relocated code address */ dvander@372: uint32_t codeend; /**< relocated code end address */ dvander@372: const char * name; /**< Relocated name */ dvander@372: sp_debug_arraydim_t *dims; /**< Relocated dimension struct, if any */ dvander@372: sp_fdbg_symbol_t *sym; /**< Pointer to original symbol */ dvander@324: } sp_debug_symbol_t; dvander@324: dvander@324: /** dvander@324: * Breaks into a debugger dvander@324: * Params: dvander@324: * [0] - plugin context dvander@324: * [1] - frm dvander@324: * [2] - cip dvander@324: */ dvander@324: typedef int (*SPVM_DEBUGBREAK)(struct sp_context_s *, uint32_t, uint32_t); dvander@324: dvander@372: #define SPFLAG_PLUGIN_DEBUG (1<<0) /**< plugin is in debug mode */ dvander@324: dvander@324: /** dvander@372: * @brief This is the heart of the VM. It contains all of the runtime dvander@372: * information about a plugin context. Note that user[0..3] can be used for any user based pointers. dvander@372: * However, vm[0..3] should not be touched, as it is reserved for the VM. dvander@324: */ dvander@324: typedef struct sp_context_s dvander@324: { dvander@372: void *codebase; /**< Base of generated code and memory */ dvander@372: sp_plugin_t *plugin; /**< Pointer back to parent information */ dvander@372: SourcePawn::IPluginContext *context; /**< Pointer to IPluginContext */ dvander@372: SourcePawn::IVirtualMachine *vmbase; /**< Pointer to IVirtualMachine */ dvander@372: void *user[4]; /**< User specific pointers */ dvander@372: void *vm[4]; /**< VM specific pointers */ dvander@372: uint32_t flags; /**< Compilation flags */ dvander@372: SPVM_DEBUGBREAK dbreak; /**< Debug break function */ dvander@372: uint8_t *memory; /**< Data chunk */ dvander@372: ucell_t mem_size; /**< Total memory size; */ dvander@372: cell_t data_size; /**< Data chunk size, always starts at 0 */ dvander@372: cell_t heap_base; /**< Where the heap starts */ dvander@372: cell_t hp; /**< Heap pointer */ dvander@372: cell_t sp; /**< Stack pointer */ dvander@372: cell_t frm; /**< Frame pointer */ dvander@372: uint32_t pushcount; /**< Push count */ dvander@372: int32_t n_err; /**< Error code set by a native */ dvander@372: uint32_t n_idx; /**< Current native index being executed */ dvander@372: sp_public_t *publics; /**< Public functions table */ dvander@372: sp_pubvar_t *pubvars; /**< Public variables table */ dvander@372: sp_native_t *natives; /**< Natives table */ dvander@372: sp_debug_file_t *files; /**< Files */ dvander@372: sp_debug_line_t *lines; /**< Lines */ dvander@372: sp_debug_symbol_t *symbols; /**< Symbols */ dvander@324: } sp_context_t; dvander@324: dvander@324: #endif //_INCLUDE_SOURCEPAWN_VM_TYPES_H