void entry_get_patch_addresses(mapi_func entry, void **writePtr, const void **execPtr) { // Get the actual beginning of the stub allocation void *entryBase = (void *) (((uintptr_t) entry) - 1); *execPtr = (const void *) entryBase; *writePtr = u_execmem_get_writable(entryBase); }
void entry_generate_default_code(char *entry, int slot) { char *writeEntry = u_execmem_get_writable(entry); memcpy(writeEntry, ENTRY_TEMPLATE, sizeof(ENTRY_TEMPLATE)); *((uint32_t *) (writeEntry + TEMPLATE_OFFSET_TLS_OFFSET)) = x86_current_tls(); *((uint32_t *) (writeEntry + TEMPLATE_OFFSET_SLOT)) = (uint32_t) (slot * sizeof(mapi_func)); }
void entry_generate_default_code(char *entry, int slot) { char *writeEntry = u_execmem_get_writable(entry); memcpy(writeEntry, ENTRY_TEMPLATE, sizeof(ENTRY_TEMPLATE)); *((uint32_t *) (writeEntry + TEMPLATE_OFFSET_SLOT)) = slot * sizeof(mapi_func); *((uintptr_t *) (writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE)) = (uintptr_t) _glapi_Current; *((uintptr_t *) (writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE_GET)) = (uintptr_t) _glapi_get_current; }
void entry_generate_default_code(char *entry, int slot) { char *writeEntry = u_execmem_get_writable(entry); uintptr_t getTableOffset; memcpy(writeEntry, ENTRY_TEMPLATE, sizeof(ENTRY_TEMPLATE)); *((uint32_t *) (writeEntry + TEMPLATE_OFFSET_SLOT1)) = slot * sizeof(mapi_func); *((uint32_t *) (writeEntry + TEMPLATE_OFFSET_SLOT2)) = slot * sizeof(mapi_func); *((uintptr_t *) (writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE)) = (uintptr_t) _glapi_Current; // Calculate the offset to patch for the CALL instruction to // _glapi_get_current. getTableOffset = (uintptr_t) _glapi_get_current; getTableOffset -= (((uintptr_t) entry) + TEMPLATE_OFFSET_CURRENT_TABLE_GET_RELATIVE); *((uintptr_t *) (writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE_GET)) = getTableOffset; }
void entry_generate_default_code(char *entry, int slot) { char *writeEntry; // Make sure the base address has the Thumb mode bit assert((uintptr_t)entry & (uintptr_t)0x1); // Get the pointer to the writable mapping. writeEntry = (char *) u_execmem_get_writable(entry - 1); memcpy(writeEntry, BYTECODE_TEMPLATE, ARMV7_BYTECODE_SIZE); *((uint32_t *)(writeEntry + TEMPLATE_OFFSET_SLOT)) = slot; *((uint32_t *)(writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE)) = (uint32_t)_glapi_Current; *((uint32_t *)(writeEntry + TEMPLATE_OFFSET_CURRENT_TABLE_GET)) = (uint32_t)_glapi_get_current; // See http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code __builtin___clear_cache(writeEntry, writeEntry + ARMV7_BYTECODE_SIZE); }