[PATCH 11/22] server: Add PPC64 support
André Hentschel
nerv at dawncrow.de
Sun Aug 16 14:01:49 CDT 2020
From: Timothy Pearson <tpearson at raptorengineering.com>
Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
server/mapping.c | 5 +++++
server/process.h | 2 +-
server/protocol.def | 6 +++++-
server/thread.c | 13 ++++++++-----
server/trace.c | 36 ++++++++++++++++++++++++++++++++++++
5 files changed, 55 insertions(+), 7 deletions(-)
diff --git a/server/mapping.c b/server/mapping.c
index db0debe0af5..c33b3464ff5 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -668,6 +668,10 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
mapping->image.cpu = CPU_ARM64;
if (cpu_mask & (CPU_FLAG(CPU_ARM) | CPU_FLAG(CPU_ARM64))) break;
return STATUS_INVALID_IMAGE_FORMAT;
+ case IMAGE_FILE_MACHINE_POWERPC64:
+ mapping->image.cpu = CPU_POWERPC64;
+ if (cpu_mask & CPU_FLAG(CPU_POWERPC64)) break;
+ return STATUS_INVALID_IMAGE_FORMAT;
default:
return STATUS_INVALID_IMAGE_FORMAT;
}
@@ -736,6 +740,7 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
mapping->image.image_flags |= IMAGE_FLAGS_ComPlusNativeReady;
if (cpu_mask & CPU_FLAG(CPU_x86_64)) mapping->image.cpu = CPU_x86_64;
else if (cpu_mask & CPU_FLAG(CPU_ARM64)) mapping->image.cpu = CPU_ARM64;
+ else if (cpu_mask & CPU_FLAG(CPU_POWERPC64)) mapping->image.cpu = CPU_POWERPC64;
}
}
diff --git a/server/process.h b/server/process.h
index 3944a67d571..d2c9c0e204a 100644
--- a/server/process.h
+++ b/server/process.h
@@ -101,7 +101,7 @@ struct process
};
#define CPU_FLAG(cpu) (1 << (cpu))
-#define CPU_64BIT_MASK (CPU_FLAG(CPU_x86_64) | CPU_FLAG(CPU_ARM64))
+#define CPU_64BIT_MASK (CPU_FLAG(CPU_x86_64) | CPU_FLAG(CPU_ARM64) | CPU_FLAG(CPU_POWERPC64))
/* process functions */
diff --git a/server/protocol.def b/server/protocol.def
index 123f629a482..0132ef8f55a 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -133,7 +133,7 @@ typedef union
/* supported CPU types */
enum cpu_type
{
- CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64
+ CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_POWERPC64
};
typedef int client_cpu_t;
@@ -148,6 +148,7 @@ typedef struct
struct { unsigned __int64 rip, rbp, rsp;
unsigned int cs, ss, flags, __pad; } x86_64_regs;
struct { unsigned int iar, msr, ctr, lr, dar, dsisr, trap, __pad; } powerpc_regs;
+ struct { unsigned __int64 iar, msr, ctr, lr, dar, dsisr, trap, __pad; } powerpc64_regs;
struct { unsigned int sp, lr, pc, cpsr; } arm_regs;
struct { unsigned __int64 sp, pc, pstate; } arm64_regs;
} ctl; /* selected by SERVER_CTX_CONTROL */
@@ -157,6 +158,7 @@ typedef struct
struct { unsigned __int64 rax,rbx, rcx, rdx, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15; } x86_64_regs;
struct { unsigned int gpr[32], cr, xer; } powerpc_regs;
+ struct { unsigned __int64 gpr[32], cr, xer; } powerpc64_regs;
struct { unsigned int r[13]; } arm_regs;
struct { unsigned __int64 x[31]; } arm64_regs;
} integer; /* selected by SERVER_CTX_INTEGER */
@@ -171,6 +173,7 @@ typedef struct
unsigned char regs[80]; } i386_regs;
struct { struct { unsigned __int64 low, high; } fpregs[32]; } x86_64_regs;
struct { double fpr[32], fpscr; } powerpc_regs;
+ struct { double fpr[32]; unsigned __int64 fpscr; } powerpc64_regs;
struct { unsigned __int64 d[32]; unsigned int fpscr; } arm_regs;
struct { struct { unsigned __int64 low, high; } q[32]; unsigned int fpcr, fpsr; } arm64_regs;
} fp; /* selected by SERVER_CTX_FLOATING_POINT */
@@ -179,6 +182,7 @@ typedef struct
struct { unsigned int dr0, dr1, dr2, dr3, dr6, dr7; } i386_regs;
struct { unsigned __int64 dr0, dr1, dr2, dr3, dr6, dr7; } x86_64_regs;
struct { unsigned int dr[8]; } powerpc_regs;
+ struct { unsigned __int64 dr[8]; } powerpc64_regs;
struct { unsigned int bvr[8], bcr[8], wvr[1], wcr[1]; } arm_regs;
struct { unsigned __int64 bvr[8], wvr[2]; unsigned int bcr[8], wcr[2]; } arm64_regs;
} debug; /* selected by SERVER_CTX_DEBUG_REGISTERS */
diff --git a/server/thread.c b/server/thread.c
index 9b14174578e..8526c63c801 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -57,6 +57,8 @@
static const unsigned int supported_cpus = CPU_FLAG(CPU_x86);
#elif defined(__x86_64__)
static const unsigned int supported_cpus = CPU_FLAG(CPU_x86_64) | CPU_FLAG(CPU_x86);
+#elif defined(__powerpc64__)
+static const unsigned int supported_cpus = CPU_FLAG(CPU_POWERPC64);
#elif defined(__powerpc__)
static const unsigned int supported_cpus = CPU_FLAG(CPU_POWERPC);
#elif defined(__arm__)
@@ -1290,11 +1292,12 @@ static unsigned int get_context_system_regs( enum cpu_type cpu )
{
switch (cpu)
{
- case CPU_x86: return SERVER_CTX_DEBUG_REGISTERS;
- case CPU_x86_64: return SERVER_CTX_DEBUG_REGISTERS;
- case CPU_POWERPC: return 0;
- case CPU_ARM: return SERVER_CTX_DEBUG_REGISTERS;
- case CPU_ARM64: return SERVER_CTX_DEBUG_REGISTERS;
+ case CPU_x86: return SERVER_CTX_DEBUG_REGISTERS;
+ case CPU_x86_64: return SERVER_CTX_DEBUG_REGISTERS;
+ case CPU_POWERPC: return 0;
+ case CPU_POWERPC64: return SERVER_CTX_DEBUG_REGISTERS;
+ case CPU_ARM: return SERVER_CTX_DEBUG_REGISTERS;
+ case CPU_ARM64: return SERVER_CTX_DEBUG_REGISTERS;
}
return 0;
}
diff --git a/server/trace.c b/server/trace.c
index a276f542122..db7c41234dc 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -152,6 +152,7 @@ static void dump_client_cpu( const char *prefix, const client_cpu_t *code )
CASE(x86);
CASE(x86_64);
CASE(POWERPC);
+ CASE(POWERPC64);
CASE(ARM);
CASE(ARM64);
default: fprintf( stderr, "%s%u", prefix, *code ); break;
@@ -686,6 +687,41 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
fprintf( stderr, ",fpscr=%g", ctx.fp.powerpc_regs.fpscr );
}
break;
+ case CPU_POWERPC64:
+ if (ctx.flags & SERVER_CTX_CONTROL)
+ {
+ dump_uint64( ",iar=", &ctx.ctl.powerpc64_regs.iar );
+ dump_uint64( ",msr=", &ctx.ctl.powerpc64_regs.msr );
+ dump_uint64( ",ctr=", &ctx.ctl.powerpc64_regs.ctr );
+ dump_uint64( ",lr=", &ctx.ctl.powerpc64_regs.lr );
+ dump_uint64( ",dar=", &ctx.ctl.powerpc64_regs.dar );
+ dump_uint64( ",dsisr=", &ctx.ctl.powerpc64_regs.dsisr );
+ dump_uint64( ",trap=", &ctx.ctl.powerpc64_regs.trap );
+ }
+ if (ctx.flags & SERVER_CTX_INTEGER)
+ {
+ for (i = 0; i < 32; i++)
+ {
+ fprintf( stderr, ",gpr%u=", i );
+ dump_uint64( "", &ctx.integer.powerpc64_regs.gpr[i] );
+ }
+ dump_uint64( ",cr=", &ctx.integer.powerpc64_regs.cr );
+ dump_uint64( ",xer=", &ctx.integer.powerpc64_regs.xer );
+ }
+ if (ctx.flags & SERVER_CTX_DEBUG_REGISTERS)
+ {
+ for (i = 0; i < 8; i++)
+ {
+ fprintf( stderr, ",dr%u=", i );
+ dump_uint64( "", &ctx.debug.powerpc64_regs.dr[i] );
+ }
+ }
+ if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+ {
+ for (i = 0; i < 32; i++) fprintf( stderr, ",fpr%u=%g", i, ctx.fp.powerpc64_regs.fpr[i] );
+ dump_uint64( ",fpscr=", &ctx.fp.powerpc64_regs.fpscr );
+ }
+ break;
case CPU_ARM:
if (ctx.flags & SERVER_CTX_CONTROL)
fprintf( stderr, ",sp=%08x,lr=%08x,pc=%08x,cpsr=%08x",
--
2.25.1
More information about the wine-devel
mailing list