[PATCH 18/22] dbghelp: Add support for PPC64

André Hentschel nerv at dawncrow.de
Sun Aug 16 14:01:56 CDT 2020


Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
 dlls/dbghelp/Makefile.in |   1 +
 dlls/dbghelp/cpu_ppc64.c | 119 +++++++++++++++++++++++++++++++++++++++
 dlls/dbghelp/dbghelp.c   |   6 +-
 3 files changed, 124 insertions(+), 2 deletions(-)
 create mode 100644 dlls/dbghelp/cpu_ppc64.c

diff --git a/dlls/dbghelp/Makefile.in b/dlls/dbghelp/Makefile.in
index a370b94e7ce..531d36487bc 100644
--- a/dlls/dbghelp/Makefile.in
+++ b/dlls/dbghelp/Makefile.in
@@ -10,6 +10,7 @@ C_SRCS = \
 	cpu_arm.c \
 	cpu_arm64.c \
 	cpu_i386.c \
+	cpu_ppc64.c \
 	cpu_x86_64.c \
 	dbghelp.c \
 	dwarf.c \
diff --git a/dlls/dbghelp/cpu_ppc64.c b/dlls/dbghelp/cpu_ppc64.c
new file mode 100644
index 00000000000..52a5f10e3d5
--- /dev/null
+++ b/dlls/dbghelp/cpu_ppc64.c
@@ -0,0 +1,119 @@
+/*
+ * File cpu_ppc64.c
+ *
+ * Copyright (C) 2009 Eric Pouech
+ * Copyright (C) 2010-2013 André Hentschel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <assert.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "dbghelp_private.h"
+#include "winternl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
+
+static BOOL ppc64_get_addr(HANDLE hThread, const CONTEXT* ctx,
+                           enum cpu_addr ca, ADDRESS64* addr)
+{
+    return FALSE;
+}
+
+#ifdef __powerpc64__
+
+/* indexes in Reserved array */
+#define __CurrentModeCount      0
+
+#define curr_mode   (frame->Reserved[__CurrentModeCount] & 0x0F)
+#define curr_count  (frame->Reserved[__CurrentModeCount] >> 4)
+
+#define set_curr_mode(m) {frame->Reserved[__CurrentModeCount] &= ~0x0F; frame->Reserved[__CurrentModeCount] |= (m & 0x0F);}
+#define inc_curr_count() (frame->Reserved[__CurrentModeCount] += 0x10)
+
+/* fetch_next_frame()
+ *
+ * modify (at least) context.Pc using unwind information
+ * either out of debug info (dwarf), or simple Lr trace
+ */
+static BOOL fetch_next_frame(struct cpu_stack_walk* csw, union ctx *pcontext,
+    DWORD_PTR curr_pc)
+{
+    FIXME("stub\n");
+    return TRUE;
+}
+
+static BOOL ppc64_stack_walk(struct cpu_stack_walk *csw, STACKFRAME64 *frame,
+    union ctx *context)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+#else
+static BOOL ppc64_stack_walk(struct cpu_stack_walk* csw, STACKFRAME64 *frame,
+    union ctx *ctx)
+{
+    return FALSE;
+}
+#endif
+
+static unsigned ppc64_map_dwarf_register(unsigned regno, const struct module* module, BOOL eh_frame)
+{
+    FIXME("stub\n");
+    return 0;
+}
+
+static void *ppc64_fetch_context_reg(union ctx *pctx, unsigned regno, unsigned *size)
+{
+    FIXME("Unknown register %x\n", regno);
+    return NULL;
+}
+
+static const char* ppc64_fetch_regname(unsigned regno)
+{
+    FIXME("Unknown register %x\n", regno);
+    return NULL;
+}
+
+static BOOL ppc64_fetch_minidump_thread(struct dump_context* dc, unsigned index, unsigned flags, const CONTEXT* ctx)
+{
+    FIXME("stub\n");
+    return TRUE;
+}
+
+static BOOL ppc64_fetch_minidump_module(struct dump_context* dc, unsigned index, unsigned flags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+DECLSPEC_HIDDEN struct cpu cpu_ppc64 = {
+    IMAGE_FILE_MACHINE_POWERPC64,
+    8,
+    0,
+    ppc64_get_addr,
+    ppc64_stack_walk,
+    NULL,
+    ppc64_map_dwarf_register,
+    ppc64_fetch_context_reg,
+    ppc64_fetch_regname,
+    ppc64_fetch_minidump_thread,
+    ppc64_fetch_minidump_module,
+};
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c
index 9d33bc67f2b..53a2c481e74 100644
--- a/dlls/dbghelp/dbghelp.c
+++ b/dlls/dbghelp/dbghelp.c
@@ -147,9 +147,9 @@ const char* wine_dbgstr_addr(const ADDRESS64* addr)
     }
 }
 
-extern struct cpu       cpu_i386, cpu_x86_64, cpu_arm, cpu_arm64;
+extern struct cpu       cpu_i386, cpu_x86_64, cpu_arm, cpu_arm64, cpu_ppc64;
 
-static struct cpu*      dbghelp_cpus[] = {&cpu_i386, &cpu_x86_64, &cpu_arm, &cpu_arm64, NULL};
+static struct cpu*      dbghelp_cpus[] = {&cpu_i386, &cpu_x86_64, &cpu_arm, &cpu_arm64, &cpu_ppc64, NULL};
 struct cpu*             dbghelp_current_cpu =
 #if defined(__i386__)
     &cpu_i386
@@ -159,6 +159,8 @@ struct cpu*             dbghelp_current_cpu =
     &cpu_arm
 #elif defined(__aarch64__)
     &cpu_arm64
+#elif defined(__powerpc64__)
+    &cpu_ppc64
 #else
 #error define support for your CPU
 #endif
-- 
2.25.1




More information about the wine-devel mailing list