[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