summaryrefslogtreecommitdiff
path: root/src/mapi/mapi/entry_x86-64_tls.h
diff options
context:
space:
mode:
authorChia-I Wu <olv@lunarg.com>2010-12-24 15:06:41 +0800
committerChia-I Wu <olv@lunarg.com>2010-12-24 17:33:49 +0800
commite6a7ef3ca6d7f1843a7ea3f873c8f16fe9efc48e (patch)
tree2d7e3bc66b180e579967357be6867f0371cd53b4 /src/mapi/mapi/entry_x86-64_tls.h
parent897bff67734ec9ab213191386cdf09ddd051aebb (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-64_tls.h')
-rw-r--r--src/mapi/mapi/entry_x86-64_tls.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/mapi/mapi/entry_x86-64_tls.h b/src/mapi/mapi/entry_x86-64_tls.h
index 2c02933802..d14bf1c394 100644
--- a/src/mapi/mapi/entry_x86-64_tls.h
+++ b/src/mapi/mapi/entry_x86-64_tls.h
@@ -49,6 +49,9 @@ __asm__("x86_64_current_tls:\n\t"
"movq u_current_table@GOTTPOFF(%rip), %rax\n\t"
"ret");
+__asm__(".balign 32\n"
+ "x86_64_entry_start:");
+
#define STUB_ASM_ENTRY(func) \
".globl " func "\n" \
".type " func ", @function\n" \
@@ -71,6 +74,13 @@ entry_patch_public(void)
{
}
+mapi_func
+entry_get_public(int slot)
+{
+ extern char x86_64_entry_start[];
+ return (mapi_func) (x86_64_entry_start + slot * 32);
+}
+
void
entry_patch(mapi_func entry, int slot)
{