sourcepawn/include/sp_vm_types.h
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--
flattened this structure out
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