ltrace: implement x86_64 arch specifics.

fix trace build on x86_64

Change-Id: I205bd9eee03efea9e298c2877cc0a6440770caf0
Reviewed-on: https://review.haiku-os.org/c/1148
Reviewed-by: waddlesplash <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Jérôme Duval
2019-03-07 02:51:50 +00:00
committed by waddlesplash
parent f82b4294d8
commit 29ec639a6d
3 changed files with 91 additions and 13 deletions
+6 -1
View File
@@ -1,3 +1,8 @@
SubDir HAIKU_TOP src bin debug ltrace arch x86_64 ;
# TODO: Implement!
UsePrivateSystemHeaders ;
StaticLibrary arch_ltrace_stub.a
:
arch_ltrace_stub.S
;
@@ -0,0 +1,72 @@
/*
* Copyright 2019, Jérôme Duval, jerome.duval@gmail.com.
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <asm_defs.h>
call_stub:
// push arguments on the stack
push %r9
push %r8
push %rcx
push %rdx
push %rsi
push %rdi
// pointer to ourself
lea call_stub(%rip), %rdi
// pointer to first argument
mov %rsp, %rsi
// call the wrapper function
movq (call_stub_callback_address - call_stub)(%rdi), %rax
call *%rax
// returns a pointer to the actual function
// restore arguments before calling
pop %rdi
pop %rsi
pop %rdx
pop %rcx
pop %r8
pop %r9
jmp *%rax
.align 8
call_stub_callback_address:
.long 0
call_stub_end:
// size_t arch_call_stub_size();
FUNCTION(arch_call_stub_size):
movq $(call_stub_end - call_stub), %rax
ret
FUNCTION_END(arch_call_stub_size)
// void arch_init_call_stub(void* stub,
// void* (*callback)(const void* stub, const void* args),
// void* function);
FUNCTION(arch_init_call_stub):
push %rbp
movq %rsp, %rbp
push %rsi
push %rdi
// copy the stub
movq $(call_stub_end - call_stub), %rdx
lea call_stub(%rip), %rsi
call memcpy@plt
// set the callback address in the stub
pop %rdi
pop %rsi
movq %rsi, (call_stub_callback_address - call_stub)(%rdi)
movq %rbp, %rsp
pop %rbp
ret
FUNCTION_END(arch_init_call_stub)
+13 -12
View File
@@ -33,6 +33,7 @@ struct PatchEntry {
static PatchEntry* Create(const char* name, void* function)
{
// TODO memory should be executable, use mmap with PROT_EXEC
void* memory = malloc(_ALIGN(sizeof(PatchEntry))
+ arch_call_stub_size());
if (memory == NULL)
@@ -125,7 +126,7 @@ TRACE_PRINTF("function_call_callback(): CALLED FOR UNKNOWN FUNCTION!\n");
size_t bufferSize = sizeof(buffer);
size_t written = 0;
const uint32* args = (const uint32*)_args;
const ulong* args = (const ulong*)_args;
written += snprintf(buffer, bufferSize, "ltrace: %s(",
entry->functionName);
for (int32 i = 0; i < 5; i++) {
@@ -143,7 +144,7 @@ static void
symbol_patcher(void* cookie, image_t* rootImage, image_t* image,
const char* name, image_t** foundInImage, void** symbol, int32* type)
{
TRACE_PRINTF("symbol_patcher(%p, %p, %p, \"%s\", %p, %p, %ld)\n",
TRACE_PRINTF("symbol_patcher(%p, %p, %p, \"%s\", %p, %p, %" B_PRId32 ")\n",
cookie, rootImage, image, name, *foundInImage, *symbol, *type);
// patch functions only
@@ -188,8 +189,8 @@ ltrace_stub_init(rld_export* standardInterface,
static void
ltrace_stub_image_loaded(image_t* image)
{
TRACE_PRINTF("ltrace_stub_image_loaded(%p): \"%s\" (%ld)\n", image, image->path,
image->id);
TRACE_PRINTF("ltrace_stub_image_loaded(%p): \"%s\" (%" B_PRId32 ")\n",
image, image->path, image->id);
if (sRuntimeLoaderAddOnInterface->register_undefined_symbol_patcher(image,
symbol_patcher, (void*)(addr_t)0xc0011eaf) != B_OK) {
@@ -201,32 +202,32 @@ ltrace_stub_image_loaded(image_t* image)
static void
ltrace_stub_image_relocated(image_t* image)
{
TRACE_PRINTF("ltrace_stub_image_relocated(%p): \"%s\" (%ld)\n", image,
image->path, image->id);
TRACE_PRINTF("ltrace_stub_image_relocated(%p): \"%s\" (%" B_PRId32 ")\n",
image, image->path, image->id);
}
static void
ltrace_stub_image_initialized(image_t* image)
{
TRACE_PRINTF("ltrace_stub_image_initialized(%p): \"%s\" (%ld)\n", image,
image->path, image->id);
TRACE_PRINTF("ltrace_stub_image_initialized(%p): \"%s\" (%" B_PRId32 ")\n",
image, image->path, image->id);
}
static void
ltrace_stub_image_uninitializing(image_t* image)
{
TRACE_PRINTF("ltrace_stub_image_uninitializing(%p): \"%s\" (%ld)\n", image,
image->path, image->id);
TRACE_PRINTF("ltrace_stub_image_uninitializing(%p): \"%s\" (%" B_PRId32
")\n",image, image->path, image->id);
}
static void
ltrace_stub_image_unloading(image_t* image)
{
TRACE_PRINTF("ltrace_stub_image_unloading(%p): \"%s\" (%ld)\n", image,
image->path, image->id);
TRACE_PRINTF("ltrace_stub_image_unloading(%p): \"%s\" (%" B_PRId32 ")\n",
image, image->path, image->id);
}