mapi_func entry_generate(int slot) { void *code = u_execmem_alloc(entry_stub_size); if (!code) { return NULL; } // Add 1 to the base address to force Thumb mode when jumping to the stub code = (void *)((char *)code + 1); entry_generate_default_code(code, slot); return (mapi_func) code; }
/** * Generate a dispatch function (entrypoint) which jumps through * the given slot number (offset) in the current dispatch table. * We need assembly language in order to accomplish this. */ _glapi_proc generate_entrypoint(unsigned int functionOffset) { /* 32 is chosen as something of a magic offset. For x86, the dispatch * at offset 32 is the first one where the offset in the * "jmp OFFSET*4(%eax)" can't be encoded in a single byte. */ const GLubyte * const template_func = gl_dispatch_functions_start + (DISPATCH_FUNCTION_SIZE * 32); GLubyte * const code = (GLubyte *) u_execmem_alloc(DISPATCH_FUNCTION_SIZE); if ( code != NULL ) { (void) memcpy(code, template_func, DISPATCH_FUNCTION_SIZE); fill_in_entrypoint_offset( (_glapi_proc) code, functionOffset ); } return (_glapi_proc) code; }