diff options
author | Lepton Wu <[email protected]> | 2019-10-25 16:54:35 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2019-10-29 17:18:06 -0700 |
commit | 1fb75bee90d769111573d6b6dd696b9cbd6d976a (patch) | |
tree | 17a3f8fe19fb0131f5b8261a0a32638918440001 /src/mapi | |
parent | 45206d7673adb1484cbdb3eadaf82e0849c9cdcf (diff) |
mapi: split entry_generate_or_patch for x86 tls
The code works exactly the same with before. Just split this function
out so we can reuse it.
Reviewed-by: Matt Turner <[email protected]>
Signed-off-by: Lepton Wu <[email protected]>
Diffstat (limited to 'src/mapi')
-rw-r--r-- | src/mapi/entry_x86_tls.h | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/mapi/entry_x86_tls.h b/src/mapi/entry_x86_tls.h index 545b5a3c786..a4e2a766382 100644 --- a/src/mapi/entry_x86_tls.h +++ b/src/mapi/entry_x86_tls.h @@ -80,6 +80,9 @@ x86_current_tls(); extern char x86_entry_start[] HIDDEN; extern char x86_entry_end[] HIDDEN; +static inline mapi_func +entry_generate_or_patch(int, char *, size_t); + void entry_patch_public(void) { @@ -110,19 +113,21 @@ entry_patch(mapi_func entry, int slot) *((unsigned long *) (code + 8)) = slot * sizeof(mapi_func); } -mapi_func -entry_generate(int slot) +static inline mapi_func +entry_generate_or_patch(int slot, char *code, size_t size) { const char code_templ[16] = { 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, /* movl %gs:0x0, %eax */ 0xff, 0xa0, 0x34, 0x12, 0x00, 0x00, /* jmp *0x1234(%eax) */ 0x90, 0x90, 0x90, 0x90 /* nop's */ }; - char *code; mapi_func entry; - code = u_execmem_alloc(sizeof(code_templ)); - if (!code) + if (code == NULL) { + size = sizeof(code_templ); + code = u_execmem_alloc(size); + } + if (!code || size < sizeof(code_templ)) return NULL; memcpy(code, code_templ, sizeof(code_templ)); @@ -134,4 +139,10 @@ entry_generate(int slot) return entry; } +mapi_func +entry_generate(int slot) +{ + return entry_generate_or_patch(slot, NULL, 0); +} + #endif /* MAPI_MODE_BRIDGE */ |