Module: wine Branch: master Commit: 02ebacca0cca65c2a45f0679a4151a60fbd7eb7d URL: https://gitlab.winehq.org/wine/wine/-/commit/02ebacca0cca65c2a45f0679a4151a6...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 13 11:56:51 2024 +0100
ntdll: Move find_function_info() to the CPU backends.
---
dlls/ntdll/exception.c | 36 ------------------------------------ dlls/ntdll/ntdll_misc.h | 1 - dlls/ntdll/signal_arm.c | 26 ++++++++++++++++++++++++++ dlls/ntdll/signal_arm64.c | 27 +++++++++++++++++++++++++++ dlls/ntdll/signal_arm64ec.c | 22 ++++++++++++++++++++++ dlls/ntdll/signal_x86_64.c | 22 ++++++++++++++++++++++ 6 files changed, 97 insertions(+), 37 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 935b57b36b9..ebc8d8cf807 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -626,42 +626,6 @@ RUNTIME_FUNCTION *lookup_dynamic_function_table( ULONG_PTR pc, ULONG_PTR *base, return ret; }
- -/* helper for lookup_function_info() */ -RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, - RUNTIME_FUNCTION *func, ULONG size ) -{ - int min = 0; - int max = size - 1; - - while (min <= max) - { -#ifdef __x86_64__ - int pos = (min + max) / 2; - if (pc < base + func[pos].BeginAddress) max = pos - 1; - else if (pc >= base + func[pos].EndAddress) min = pos + 1; - else - { - func += pos; - while (func->UnwindData & 1) /* follow chained entry */ - func = (RUNTIME_FUNCTION *)(base + (func->UnwindData & ~1)); - return func; - } -#elif defined(__arm__) - int pos = (min + max) / 2; - if (pc < base + (func[pos].BeginAddress & ~1)) max = pos - 1; - else if (pc >= base + get_runtime_function_end( &func[pos], base )) min = pos + 1; - else return func + pos; -#else /* __aarch64__ */ - int pos = (min + max) / 2; - if (pc < base + func[pos].BeginAddress) max = pos - 1; - else if (pc >= base + get_runtime_function_end( &func[pos], base )) min = pos + 1; - else return func + pos; -#endif - } - return NULL; -} - #endif /* __x86_64__ || __arm__ || __aarch64__ */
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 1aeed955bf4..4286fc48587 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -86,7 +86,6 @@ extern void (WINAPI *pWow64PrepareForException)( EXCEPTION_RECORD *rec, CONTEXT
#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) extern RUNTIME_FUNCTION *lookup_dynamic_function_table( ULONG_PTR pc, ULONG_PTR *base, ULONG *count ); -extern RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, RUNTIME_FUNCTION *func, ULONG size ); #endif
/* debug helpers */ diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 76dac1b850c..57731d52dd7 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -1113,6 +1113,32 @@ static void *unwind_full_data( ULONG_PTR base, ULONG_PTR pc, RUNTIME_FUNCTION *f return NULL; }
+/********************************************************************** + * find_function_info + */ +static RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, + RUNTIME_FUNCTION *func, ULONG size ) +{ + int min = 0; + int max = size - 1; + + while (min <= max) + { + int pos = (min + max) / 2; + ULONG_PTR start = base + (func[pos].BeginAddress & ~1); + + if (pc >= start) + { + struct unwind_info *info = (struct unwind_info *)(base + func[pos].UnwindData); + if (pc < start + 2 * (func[pos].Flag ? func[pos].FunctionLength : info->function_length)) + return func + pos; + min = pos + 1; + } + else max = pos - 1; + } + return NULL; +} + /*********************************************************************** * RtlVirtualUnwind (NTDLL.@) */ diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index cfb097bf7a2..f20a9c075a6 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -1014,6 +1014,33 @@ static void *unwind_full_data( ULONG_PTR base, ULONG_PTR pc, RUNTIME_FUNCTION *f }
+/********************************************************************** + * find_function_info + */ +static RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, + RUNTIME_FUNCTION *func, ULONG size ) +{ + int min = 0; + int max = size - 1; + + while (min <= max) + { + int pos = (min + max) / 2; + ULONG_PTR start = base + func[pos].BeginAddress; + + if (pc >= start) + { + ULONG len = func[pos].Flag ? func[pos].FunctionLength : + ((IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY_XDATA *)(base + func[pos].UnwindData))->FunctionLength; + if (pc < start + 4 * len) return func + pos; + min = pos + 1; + } + else max = pos - 1; + } + return NULL; +} + + /********************************************************************** * RtlVirtualUnwind (NTDLL.@) */ diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 4429bc4fcf9..0ee58a015f7 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -229,6 +229,28 @@ static void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ) memcpy( ec_ctx->V, arm_ctx->V, sizeof(ec_ctx->V) ); }
+static RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, + RUNTIME_FUNCTION *func, ULONG size ) +{ + int min = 0; + int max = size - 1; + + while (min <= max) + { + int pos = (min + max) / 2; + if (pc < base + func[pos].BeginAddress) max = pos - 1; + else if (pc >= base + func[pos].EndAddress) min = pos + 1; + else + { + func += pos; + while (func->UnwindData & 1) /* follow chained entry */ + func = (RUNTIME_FUNCTION *)(base + (func->UnwindData & ~1)); + return func; + } + } + return NULL; +} +
/******************************************************************* * syscalls diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 09658eaa408..1fcb0eda4e2 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -249,6 +249,28 @@ static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table ) (char *)base + table->ScopeRecord[i].JumpTarget ); }
+static RUNTIME_FUNCTION *find_function_info( ULONG_PTR pc, ULONG_PTR base, + RUNTIME_FUNCTION *func, ULONG size ) +{ + int min = 0; + int max = size - 1; + + while (min <= max) + { + int pos = (min + max) / 2; + if (pc < base + func[pos].BeginAddress) max = pos - 1; + else if (pc >= base + func[pos].EndAddress) min = pos + 1; + else + { + func += pos; + while (func->UnwindData & 1) /* follow chained entry */ + func = (RUNTIME_FUNCTION *)(base + (func->UnwindData & ~1)); + return func; + } + } + return NULL; +} +
/*********************************************************************** * virtual_unwind