From: "André Hentschel" Subject: [PATCH 11/23] server: Add PPC64 support Message-Id: <20210131173433.114385-12-nerv@dawncrow.de> Date: Sun, 31 Jan 2021 18:34:21 +0100 In-Reply-To: <20210131173433.114385-1-nerv@dawncrow.de> References: <20210131173433.114385-1-nerv@dawncrow.de> From: Timothy Pearson Signed-off-by: André Hentschel --- 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 9c51aa3bec7..a0d72b29a01 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -688,6 +688,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; } @@ -758,6 +762,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; } if (clr.Flags & COMIMAGE_FLAGS_32BITPREFERRED) mapping->image.image_flags |= IMAGE_FLAGS_ComPlusPrefer32bit; diff --git a/server/process.h b/server/process.h index 5901e8fa3de..f4ba7d94666 100644 --- a/server/process.h +++ b/server/process.h @@ -100,7 +100,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 853f9dbae01..2d2b37ee6bb 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 296f0848027..8bef09136f1 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__) @@ -1294,11 +1296,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 4d59b06d040..305f1a16138 100644 --- a/server/trace.c +++ b/server/trace.c @@ -155,6 +155,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; @@ -695,6 +696,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