Non-public function addresses are no longer accepted

Added a new VM function for pcode addresses (unused right now)

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40349
This commit is contained in:
David Anderson 2007-01-25 04:36:48 +00:00
parent dbf105cc71
commit aeb512c444
5 changed files with 68 additions and 6 deletions

View File

@ -150,7 +150,11 @@ int BaseContext::Execute(funcid_t funcid, cell_t *result)
}
code_addr = pubfunc->code_offs;
} else {
#if 0
code_addr = funcid >> 1;
#endif
assert(false);
return SP_ERROR_INVALID_ADDRESS;
}
PushCell(pushcount++);
@ -875,6 +879,7 @@ IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
pFunc = m_pub_funcs[func_id];
}
} else {
#if 0
func_id >>= 1;
unsigned int index;
if (!g_pVM->FunctionLookup(ctx, func_id, &index))
@ -887,6 +892,8 @@ IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
m_priv_funcs[func_id] = new CFunction(save, this);
pFunc = m_priv_funcs[func_id];
}
#endif
assert(false);
}
return pFunc;

View File

@ -794,6 +794,16 @@ namespace SourcePawn
* @return String describing CPU specific optimizations.
*/
virtual const char *GetCPUOptimizations() =0;
/**
* @brief Given a context and a p-code address, returns the index of the function.
*
* @param ctx Context to search.
* @param code_addr Index into the p-code section.
* @param result Pointer to store result into.
* @return True if code index is valid, false otherwise.
*/
virtual bool FunctionPLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result) =0;
};
};

View File

@ -2161,10 +2161,12 @@ jit_rewind:
functracker_t *fnc = new functracker_t;
ctx->vm[JITVARS_FUNCINFO] = fnc;
ctx->vm[JITVARS_REBASE] = data->rebase;
fnc->code_size = codemem;
fnc->num_functions = data->func_idx;
/* clean up relocation+compilation memory */
data->rebase = NULL;
AbortCompilation(co);
*err = SP_ERROR_NONE;
@ -2194,6 +2196,7 @@ void JITX86::FreeContext(sp_context_t *ctx)
delete [] ctx->publics;
delete [] ctx->pubvars;
delete [] ctx->symbols;
engine->BaseFree(ctx->vm[JITVARS_REBASE]);
free(((tracker_t *)(ctx->vm[JITVARS_TRACKER]))->pBase);
delete ctx->vm[JITVARS_TRACKER];
delete ctx;
@ -2247,15 +2250,51 @@ unsigned int JITX86::GetAPIVersion()
return SOURCEPAWN_VM_API_VERSION;
}
bool JITX86::FunctionLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result)
bool JITX86::FunctionPLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result)
{
functracker_t *fnc = (functracker_t *)ctx->vm[JITVARS_FUNCINFO];
uint8_t *rebase = (uint8_t *)ctx->vm[JITVARS_REBASE];
/* Is this within the pcode bounds? */
if (code_addr >= ctx->plugin->pcode_size - sizeof(uint32_t))
{
return false;
}
/* Relocate this */
code_addr = *(jitoffs_t *)(rebase + code_addr);
/* Check if this is in the relocation bounds */
functracker_t *fnc = (functracker_t *)ctx->vm[JITVARS_FUNCINFO];
if (code_addr >= fnc->code_size)
{
return false;
}
/* Get the function info and sanity check */
funcinfo_t *f = (funcinfo_t *)((char *)ctx->codebase + code_addr - sizeof(funcinfo_t));
if (f->magic != JIT_FUNCMAGIC || f->index >= fnc->num_functions)
{
return false;
}
if (result)
{
*result = f->index;
}
return true;
}
bool JITX86::FunctionLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result)
{
/* Check if this is in the relocation bounds */
functracker_t *fnc = (functracker_t *)ctx->vm[JITVARS_FUNCINFO];
if (code_addr >= fnc->code_size)
{
return false;
}
/* Get the function info and sanity check */
funcinfo_t *f = (funcinfo_t *)((char *)ctx->codebase + code_addr - sizeof(funcinfo_t));
if (f->magic != JIT_FUNCMAGIC || f->index >= fnc->num_functions)
{

View File

@ -14,6 +14,7 @@ using namespace SourcePawn;
#define JITVARS_TRACKER 0 //important: don't change this to avoid trouble
#define JITVARS_FUNCINFO 1 //important: don't change this aWOAWOGJQG I LIKE HAM
#define JITVARS_REBASE 2 //important: hi, i'm bail
typedef struct tracker_s
{
@ -80,6 +81,7 @@ public:
int ContextExecute(sp_context_t *ctx, uint32_t code_idx, cell_t *result);
unsigned int GetAPIVersion();
bool FunctionLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result);
bool FunctionPLookup(const sp_context_t *ctx, uint32_t code_addr, unsigned int *result);
unsigned int FunctionCount(const sp_context_t *ctx);
const char *GetVersionString();
const char *GetCPUOptimizations();

View File

@ -247,19 +247,23 @@
>
</File>
<File
RelativePath="..\..\..\include\sp_file_headers.h"
RelativePath="..\..\..\..\public\sourcepawn\sp_file_headers.h"
>
</File>
<File
RelativePath="..\..\..\include\sp_vm_api.h"
RelativePath="..\..\..\..\public\sourcepawn\sp_typeutil.h"
>
</File>
<File
RelativePath="..\..\..\include\sp_vm_base.h"
RelativePath="..\..\..\..\public\sourcepawn\sp_vm_api.h"
>
</File>
<File
RelativePath="..\..\..\include\sp_vm_types.h"
RelativePath="..\..\..\..\public\sourcepawn\sp_vm_base.h"
>
</File>
<File
RelativePath="..\..\..\..\public\sourcepawn\sp_vm_types.h"
>
</File>
</Filter>