diff options
author | Chia-I Wu <olv@lunarg.com> | 2010-12-24 15:06:41 +0800 |
---|---|---|
committer | Chia-I Wu <olv@lunarg.com> | 2010-12-24 17:33:49 +0800 |
commit | e6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48e (patch) | |
tree | 2d7e3bc66b180e579967357be6867f0371cd53b4 /src/mapi/mapi/entry_x86_tls.h | |
parent | 897bff67734ec9ab213191386cdf09ddd051aebb (diff) |
mapi: Add and use entry_get_public.
Given a dispatch slot, entry_get_public returns the address of the
corresponding public entry point. There may be more than one of them.
But since they are all equivalent, it is fine to return any one of them.
With entry_get_public, the address of any public entry point can be
calculated at runtime when an assembly dispatcher is used. There is no
need to have a mapping table in such case. This omits the unnecessary
relocations from the binary.
Diffstat (limited to 'src/mapi/mapi/entry_x86_tls.h')
-rw-r--r-- | src/mapi/mapi/entry_x86_tls.h | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/mapi/mapi/entry_x86_tls.h b/src/mapi/mapi/entry_x86_tls.h index 3d0b7caffe..ea63490e1c 100644 --- a/src/mapi/mapi/entry_x86_tls.h +++ b/src/mapi/mapi/entry_x86_tls.h @@ -54,11 +54,12 @@ __asm__("x86_current_tls:\n\t" "ret"); #ifndef GLX_X86_READONLY_TEXT -__asm__(".section wtext, \"awx\", @progbits\n" - ".balign 16\n" - "x86_entry_start:"); +__asm__(".section wtext, \"awx\", @progbits"); #endif /* GLX_X86_READONLY_TEXT */ +__asm__(".balign 16\n" + "x86_entry_start:"); + #define STUB_ASM_ENTRY(func) \ ".globl " func "\n" \ ".type " func ", @function\n" \ @@ -101,6 +102,13 @@ entry_patch_public(void) #endif } +mapi_func +entry_get_public(int slot) +{ + extern char x86_entry_start[]; + return (mapi_func) (x86_entry_start + slot * 16); +} + void entry_patch(mapi_func entry, int slot) { |