public/sourcepawn/sp_vm_types.h
author David Anderson <dvander@alliedmods.net>
Mon Mar 12 07:08:05 2007 +0000 (2007-03-12)
changeset 601 fe5b368fcedc
parent 560 54a5b5b35e89
child 729 110c14c99545
permissions -rw-r--r--
initial import of dynamic native code for both the JIT and plugins
note: dependency resolution is not done yet!
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 */
dvander@372
    48
#define SP_ERROR_STACKLOW				8	/**< Nnot 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 */
dvander@372
   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