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