https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1f44552d36f41397991d4…
commit 1f44552d36f41397991d4594edada88cd062a107
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Sat Jun 5 22:13:22 2021 +0200
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Mon Nov 15 19:57:35 2021 +0100
[DRWTSN32] Implement arm context reading
CORE-17605 CORE-17604
---
base/applications/drwtsn32/drwtsn32.cpp | 2 +-
base/applications/drwtsn32/main.cpp | 24 +++++++++++++++---
base/applications/drwtsn32/stacktrace.cpp | 42 ++++++++++++++++++++-----------
base/applications/drwtsn32/sysinfo.cpp | 2 +-
4 files changed, 51 insertions(+), 19 deletions(-)
diff --git a/base/applications/drwtsn32/drwtsn32.cpp
b/base/applications/drwtsn32/drwtsn32.cpp
index 598e4f0b6b6..c36e97b8558 100644
--- a/base/applications/drwtsn32/drwtsn32.cpp
+++ b/base/applications/drwtsn32/drwtsn32.cpp
@@ -2,7 +2,7 @@
* PROJECT: Dr. Watson crash reporter
* LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Debug loop
- * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen(a)reactos.org)
+ * COPYRIGHT: Copyright 2017 Mark Jansen <mark.jansen(a)reactos.org>
*/
#include "precomp.h"
diff --git a/base/applications/drwtsn32/main.cpp b/base/applications/drwtsn32/main.cpp
index f49346ec16a..277542153f2 100644
--- a/base/applications/drwtsn32/main.cpp
+++ b/base/applications/drwtsn32/main.cpp
@@ -2,7 +2,7 @@
* PROJECT: Dr. Watson crash reporter
* LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Entrypoint / main print function
- * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen(a)reactos.org)
+ * COPYRIGHT: Copyright 2017 Mark Jansen <mark.jansen(a)reactos.org>
*/
#include "precomp.h"
@@ -62,10 +62,15 @@ static void PrintThread(FILE* output, DumpData& data, DWORD tid,
ThreadData& thr
xfprintf(output, "eax:%p ebx:%p ecx:%p edx:%p esi:%p edi:%p" NEWLINE,
ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx, ctx.Esi, ctx.Edi);
#elif defined(_M_AMD64)
- xfprintf(output, "rax:%p rbx:%p rcx:%p rdx:%p rsi:%p rdi:%p" NEWLINE,
- ctx.Rax, ctx.Rbx, ctx.Rcx, ctx.Rdx, ctx.Rsi, ctx.Rdi);
+ xfprintf(output, "rax:%p rbx:%p rcx:%p rdx:%p rsi:%p rdi:%p rbp:%p
rsp:%p" NEWLINE,
+ ctx.Rax, ctx.Rbx, ctx.Rcx, ctx.Rdx, ctx.Rsi, ctx.Rdi, ctx.Rbp,
ctx.Rsp);
xfprintf(output, "r8:%p r9:%p r10:%p r11:%p r12:%p r13:%p r14:%p
r15:%p" NEWLINE,
ctx.R8, ctx.R9, ctx.R10, ctx.R11, ctx.R12, ctx.R13, ctx.R14, ctx.R15);
+#elif defined(_M_ARM)
+ xfprintf(output, "r0:%p r1:%p r2:%p r3:%p r4:%p r5:%p r6:%p" NEWLINE,
+ ctx.R0, ctx.R1, ctx.R2, ctx.R3, ctx.R4, ctx.R5, ctx.R6);
+ xfprintf(output, "r7:%p r8:%p r9:%p r10:%p r11:%p r12:%p" NEWLINE,
+ ctx.R7, ctx.R8, ctx.R9, ctx.R10, ctx.R11, ctx.R12);
#else
#error Unknown architecture
#endif
@@ -79,6 +84,9 @@ static void PrintThread(FILE* output, DumpData& data, DWORD tid,
ThreadData& thr
#elif defined(_M_AMD64)
xfprintf(output, "rip:%p rsp:%p rbp:%p" NEWLINE,
ctx.Rip, ctx.Rsp, ctx.Rbp);
+#elif defined(_M_ARM)
+ xfprintf(output, "sp:%p lr:%p pc:%p cpsr:%p" NEWLINE,
+ ctx.Sp, ctx.Lr, ctx.Pc, ctx.Cpsr);
#else
#error Unknown architecture
#endif
@@ -89,6 +97,16 @@ static void PrintThread(FILE* output, DumpData& data, DWORD tid,
ThreadData& thr
#if defined(_M_IX86) || defined(_M_AMD64)
xfprintf(output, "dr0:%p dr1:%p dr2:%p dr3:%p dr6:%p dr7:%p" NEWLINE,
ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr6, ctx.Dr7);
+#elif defined(_M_ARM)
+ for (int n = 0; n < ARM_MAX_BREAKPOINTS; ++n)
+ xfprintf(output, "Bvr%d:%p%s", n, ctx.Bvr[n], ((n + 1) ==
ARM_MAX_BREAKPOINTS) ? NEWLINE : " ");
+ for (int n = 0; n < ARM_MAX_BREAKPOINTS; ++n)
+ xfprintf(output, "Bcr%d:%p%s", n, ctx.Bcr[n], ((n + 1) ==
ARM_MAX_BREAKPOINTS) ? NEWLINE : " ");
+
+ for (int n = 0; n < ARM_MAX_WATCHPOINTS; ++n)
+ xfprintf(output, "Wvr%d:%p%s", n, ctx.Wvr[n], ((n + 1) ==
ARM_MAX_WATCHPOINTS) ? NEWLINE : " ");
+ for (int n = 0; n < ARM_MAX_WATCHPOINTS; ++n)
+ xfprintf(output, "Wcr%d:%p%s", n, ctx.Wcr[n], ((n + 1) ==
ARM_MAX_WATCHPOINTS) ? NEWLINE : " ");
#else
#error Unknown architecture
#endif
diff --git a/base/applications/drwtsn32/stacktrace.cpp
b/base/applications/drwtsn32/stacktrace.cpp
index cbd9697ed3b..4742349117b 100644
--- a/base/applications/drwtsn32/stacktrace.cpp
+++ b/base/applications/drwtsn32/stacktrace.cpp
@@ -2,7 +2,7 @@
* PROJECT: Dr. Watson crash reporter
* LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Print a stacktrace
- * COPYRIGHT: Copyright 2017,2018 Mark Jansen (mark.jansen(a)reactos.org)
+ * COPYRIGHT: Copyright 2017,2018 Mark Jansen <mark.jansen(a)reactos.org>
*/
#include "precomp.h"
@@ -38,25 +38,37 @@ void PrintStackBacktrace(FILE* output, DumpData& data,
ThreadData& thread)
DWORD MachineType;
STACKFRAME64 StackFrame = { { 0 } };
-#ifdef _M_X64
- MachineType = IMAGE_FILE_MACHINE_AMD64;
- StackFrame.AddrPC.Offset = thread.Context.Rip;
StackFrame.AddrPC.Mode = AddrModeFlat;
- StackFrame.AddrStack.Offset = thread.Context.Rsp;
- StackFrame.AddrStack.Mode = AddrModeFlat;
- StackFrame.AddrFrame.Offset = thread.Context.Rbp;
+ StackFrame.AddrReturn.Mode = AddrModeFlat;
StackFrame.AddrFrame.Mode = AddrModeFlat;
-#else
+ StackFrame.AddrStack.Mode = AddrModeFlat;
+ StackFrame.AddrBStore.Mode = AddrModeFlat;
+
+
+#if defined(_M_IX86)
MachineType = IMAGE_FILE_MACHINE_I386;
- StackFrame.AddrPC.Offset = thread.Context.Eip;
- StackFrame.AddrPC.Mode = AddrModeFlat;
+ StackFrame.AddrPC.Offset = thread.Context.Eip;
StackFrame.AddrStack.Offset = thread.Context.Esp;
- StackFrame.AddrStack.Mode = AddrModeFlat;
StackFrame.AddrFrame.Offset = thread.Context.Ebp;
- StackFrame.AddrFrame.Mode = AddrModeFlat;
+#elif defined(_M_AMD64)
+ MachineType = IMAGE_FILE_MACHINE_AMD64;
+ StackFrame.AddrPC.Offset = thread.Context.Rip;
+ StackFrame.AddrStack.Offset = thread.Context.Rsp;
+ StackFrame.AddrFrame.Offset = thread.Context.Rbp;
+#elif defined(_M_ARM)
+ MachineType = IMAGE_FILE_MACHINE_ARMNT;
+ StackFrame.AddrPC.Offset = thread.Context.Pc;
+ StackFrame.AddrStack.Offset = thread.Context.Sp;
+ StackFrame.AddrFrame.Offset = thread.Context.R11;
+#elif defined(_M_ARM64)
+ MachineType = IMAGE_FILE_MACHINE_ARM64;
+ StackFrame.AddrPC.Offset = thread.Context.Pc;
+ StackFrame.AddrStack.Offset = thread.Context.Sp;
+ StackFrame.AddrFrame.Offset = thread.Context.u.s.Fp;
+#else
+#error "Unknown architecture"
#endif
-
#define STACKWALK_MAX_NAMELEN 512
char buf[sizeof(SYMBOL_INFO) + STACKWALK_MAX_NAMELEN] = {0};
SYMBOL_INFO* sym = (SYMBOL_INFO *)buf;
@@ -64,7 +76,7 @@ void PrintStackBacktrace(FILE* output, DumpData& data,
ThreadData& thread)
LONG RecursionDepth = 0;
sym->SizeOfStruct = sizeof(sym);
- /* FIXME: dump x bytes at EIP here + disasm it! */
+ /* FIXME: dump x bytes at PC here + disasm it! */
xfprintf(output, NEWLINE "*----> Stack Back Trace <----*" NEWLINE
NEWLINE);
bool first = true;
@@ -116,6 +128,8 @@ void PrintStackBacktrace(FILE* output, DumpData& data,
ThreadData& thread)
ULONG_PTR stackPointer = thread.Context.Esp;
#elif defined(_M_AMD64)
ULONG_PTR stackPointer = thread.Context.Rsp;
+#elif defined(_M_ARM) || defined(_M_ARM64)
+ ULONG_PTR stackPointer = thread.Context.Sp;
#else
#error Unknown architecture
#endif
diff --git a/base/applications/drwtsn32/sysinfo.cpp
b/base/applications/drwtsn32/sysinfo.cpp
index bc96af0d00f..9884758303e 100644
--- a/base/applications/drwtsn32/sysinfo.cpp
+++ b/base/applications/drwtsn32/sysinfo.cpp
@@ -2,7 +2,7 @@
* PROJECT: Dr. Watson crash reporter
* LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Output system info
- * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen(a)reactos.org)
+ * COPYRIGHT: Copyright 2017 Mark Jansen <mark.jansen(a)reactos.org>
*/
#include "precomp.h"