hrev52971 adds 1 changeset to branch 'master'
old head: f82b4294d859dc13ebaf96c9e24019d368bb724a
new head: 29ec639a6da8cc3c6852d421116cddc291ec18d8
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=29ec639a6da8+%5Ef82b4294d859
----------------------------------------------------------------------------
29ec639a6da8: 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 <waddlesplash@xxxxxxxxx>
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>
[ Jérôme Duval <jerome.duval@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev52971
Commit: 29ec639a6da8cc3c6852d421116cddc291ec18d8
URL: https://git.haiku-os.org/haiku/commit/?id=29ec639a6da8
Author: Jérôme Duval <jerome.duval@xxxxxxxxx>
Date: Mon Mar 4 21:05:14 2019 UTC
Committer: waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Thu Mar 7 02:51:50 2019 UTC
----------------------------------------------------------------------------
3 files changed, 91 insertions(+), 13 deletions(-)
src/bin/debug/ltrace/arch/x86_64/Jamfile | 7 +-
.../debug/ltrace/arch/x86_64/arch_ltrace_stub.S | 72 ++++++++++++++++++++
src/bin/debug/ltrace/ltrace_stub.cpp | 25 +++----
----------------------------------------------------------------------------
diff --git a/src/bin/debug/ltrace/arch/x86_64/Jamfile
b/src/bin/debug/ltrace/arch/x86_64/Jamfile
index f2844ebb89..3d30ffd8dc 100644
--- a/src/bin/debug/ltrace/arch/x86_64/Jamfile
+++ b/src/bin/debug/ltrace/arch/x86_64/Jamfile
@@ -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
+;
diff --git a/src/bin/debug/ltrace/arch/x86_64/arch_ltrace_stub.S
b/src/bin/debug/ltrace/arch/x86_64/arch_ltrace_stub.S
new file mode 100644
index 0000000000..056b9f4c14
--- /dev/null
+++ b/src/bin/debug/ltrace/arch/x86_64/arch_ltrace_stub.S
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019, Jérôme Duval, jerome.duval@xxxxxxxxx.
+ * Copyright 2008, Ingo Weinhold, ingo_weinhold@xxxxxx.
+ * 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)
diff --git a/src/bin/debug/ltrace/ltrace_stub.cpp
b/src/bin/debug/ltrace/ltrace_stub.cpp
index f34949092b..28958da4ca 100644
--- a/src/bin/debug/ltrace/ltrace_stub.cpp
+++ b/src/bin/debug/ltrace/ltrace_stub.cpp
@@ -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);
}