=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: server: Add ARM64 support.
Alexandre Julliard
julliard at winehq.org
Wed Jan 16 13:47:43 CST 2013
Module: wine
Branch: master
Commit: d11e72f9258df06c2fc45d72746f30d5611e8639
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d11e72f9258df06c2fc45d72746f30d5611e8639
Author: André Hentschel <nerv at dawncrow.de>
Date: Wed Jan 16 00:49:36 2013 +0100
server: Add ARM64 support.
---
dlls/ntdll/server.c | 2 +
include/wine/server_protocol.h | 6 +++-
server/protocol.def | 4 ++-
server/thread.c | 6 +++++
server/trace.c | 42 ++++++++++++++++++++++++++++++++++++++++
5 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index 2fe7877..af2ce06 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -102,6 +102,8 @@ static const enum cpu_type client_cpu = CPU_POWERPC;
static const enum cpu_type client_cpu = CPU_SPARC;
#elif defined(__arm__)
static const enum cpu_type client_cpu = CPU_ARM;
+#elif defined(__aarch64__)
+static const enum cpu_type client_cpu = CPU_ARM64;
#else
#error Unsupported CPU
#endif
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 2a181fc..99bcfae 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -129,7 +129,7 @@ typedef union
enum cpu_type
{
- CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_SPARC
+ CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_SPARC
};
typedef int cpu_type_t;
@@ -145,6 +145,7 @@ typedef struct
unsigned int cs, ss, flags, __pad; } x86_64_regs;
struct { unsigned int iar, msr, ctr, lr, dar, dsisr, trap, __pad; } powerpc_regs;
struct { unsigned int sp, lr, pc, cpsr; } arm_regs;
+ struct { unsigned __int64 sp, pc, pstate; } arm64_regs;
struct { unsigned int psr, pc, npc, y, wim, tbr; } sparc_regs;
} ctl;
union
@@ -154,6 +155,7 @@ typedef struct
r8, r9, r10, r11, r12, r13, r14, r15; } x86_64_regs;
struct { unsigned int gpr[32], cr, xer; } powerpc_regs;
struct { unsigned int r[13]; } arm_regs;
+ struct { unsigned __int64 x[31]; } arm64_regs;
struct { unsigned int g[8], o[8], l[8], i[8]; } sparc_regs;
} integer;
union
@@ -5713,6 +5715,6 @@ union generic_reply
struct set_suspend_context_reply set_suspend_context_reply;
};
-#define SERVER_PROTOCOL_VERSION 437
+#define SERVER_PROTOCOL_VERSION 438
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 886853f..4038e48 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -145,7 +145,7 @@ typedef union
/* supported CPU types */
enum cpu_type
{
- CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_SPARC
+ CPU_x86, CPU_x86_64, CPU_POWERPC, CPU_ARM, CPU_ARM64, CPU_SPARC
};
typedef int cpu_type_t;
@@ -161,6 +161,7 @@ typedef struct
unsigned int cs, ss, flags, __pad; } x86_64_regs;
struct { unsigned int iar, msr, ctr, lr, dar, dsisr, trap, __pad; } powerpc_regs;
struct { unsigned int sp, lr, pc, cpsr; } arm_regs;
+ struct { unsigned __int64 sp, pc, pstate; } arm64_regs;
struct { unsigned int psr, pc, npc, y, wim, tbr; } sparc_regs;
} ctl; /* selected by SERVER_CTX_CONTROL */
union
@@ -170,6 +171,7 @@ typedef struct
r8, r9, r10, r11, r12, r13, r14, r15; } x86_64_regs;
struct { unsigned int gpr[32], cr, xer; } powerpc_regs;
struct { unsigned int r[13]; } arm_regs;
+ struct { unsigned __int64 x[31]; } arm64_regs;
struct { unsigned int g[8], o[8], l[8], i[8]; } sparc_regs;
} integer; /* selected by SERVER_CTX_INTEGER */
union
diff --git a/server/thread.c b/server/thread.c
index f9a575e..fdbc144 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -63,6 +63,8 @@ static const unsigned int supported_cpus = CPU_FLAG(CPU_POWERPC);
static const unsigned int supported_cpus = CPU_FLAG(CPU_SPARC);
#elif defined(__arm__)
static const unsigned int supported_cpus = CPU_FLAG(CPU_ARM);
+#elif defined(__aarch64__)
+static const unsigned int supported_cpus = CPU_FLAG(CPU_ARM64);
#else
#error Unsupported CPU
#endif
@@ -1023,6 +1025,7 @@ static unsigned int get_context_system_regs( enum cpu_type cpu )
case CPU_x86_64: return SERVER_CTX_DEBUG_REGISTERS;
case CPU_POWERPC: return 0;
case CPU_ARM: return 0;
+ case CPU_ARM64: return 0;
case CPU_SPARC: return 0;
}
return 0;
@@ -1056,6 +1059,9 @@ void break_thread( struct thread *thread )
case CPU_ARM:
data.exception.address = thread->context->ctl.arm_regs.pc;
break;
+ case CPU_ARM64:
+ data.exception.address = thread->context->ctl.arm64_regs.pc;
+ break;
}
generate_debug_event( thread, EXCEPTION_DEBUG_EVENT, &data );
thread->debug_break = 0;
diff --git a/server/trace.c b/server/trace.c
index dc5074f..41c5424 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -557,6 +557,48 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
if (ctx.flags & SERVER_CTX_INTEGER)
for (i = 0; i < 13; i++) fprintf( stderr, ",r%u=%08x", i, ctx.integer.arm_regs.r[i] );
break;
+ case CPU_ARM64:
+ if (ctx.flags & SERVER_CTX_CONTROL)
+ {
+ dump_uint64( ",sp=", &ctx.ctl.arm64_regs.sp );
+ dump_uint64( ",pc=", &ctx.ctl.arm64_regs.pc );
+ dump_uint64( ",pstate=", &ctx.ctl.arm64_regs.pstate );
+ }
+ if (ctx.flags & SERVER_CTX_INTEGER)
+ {
+ dump_uint64( ",x0=", &ctx.integer.arm64_regs.x[0] );
+ dump_uint64( ",x1=", &ctx.integer.arm64_regs.x[1] );
+ dump_uint64( ",x2=", &ctx.integer.arm64_regs.x[2] );
+ dump_uint64( ",x3=", &ctx.integer.arm64_regs.x[3] );
+ dump_uint64( ",x4=", &ctx.integer.arm64_regs.x[4] );
+ dump_uint64( ",x5=", &ctx.integer.arm64_regs.x[5] );
+ dump_uint64( ",x6=", &ctx.integer.arm64_regs.x[6] );
+ dump_uint64( ",x7=", &ctx.integer.arm64_regs.x[7] );
+ dump_uint64( ",x8=", &ctx.integer.arm64_regs.x[8] );
+ dump_uint64( ",x9=", &ctx.integer.arm64_regs.x[9] );
+ dump_uint64( ",x10=", &ctx.integer.arm64_regs.x[10] );
+ dump_uint64( ",x11=", &ctx.integer.arm64_regs.x[11] );
+ dump_uint64( ",x12=", &ctx.integer.arm64_regs.x[12] );
+ dump_uint64( ",x13=", &ctx.integer.arm64_regs.x[13] );
+ dump_uint64( ",x14=", &ctx.integer.arm64_regs.x[14] );
+ dump_uint64( ",x15=", &ctx.integer.arm64_regs.x[15] );
+ dump_uint64( ",x16=", &ctx.integer.arm64_regs.x[16] );
+ dump_uint64( ",x17=", &ctx.integer.arm64_regs.x[17] );
+ dump_uint64( ",x18=", &ctx.integer.arm64_regs.x[18] );
+ dump_uint64( ",x19=", &ctx.integer.arm64_regs.x[19] );
+ dump_uint64( ",x20=", &ctx.integer.arm64_regs.x[20] );
+ dump_uint64( ",x21=", &ctx.integer.arm64_regs.x[21] );
+ dump_uint64( ",x22=", &ctx.integer.arm64_regs.x[22] );
+ dump_uint64( ",x23=", &ctx.integer.arm64_regs.x[23] );
+ dump_uint64( ",x24=", &ctx.integer.arm64_regs.x[24] );
+ dump_uint64( ",x25=", &ctx.integer.arm64_regs.x[25] );
+ dump_uint64( ",x26=", &ctx.integer.arm64_regs.x[26] );
+ dump_uint64( ",x27=", &ctx.integer.arm64_regs.x[27] );
+ dump_uint64( ",x28=", &ctx.integer.arm64_regs.x[28] );
+ dump_uint64( ",x29=", &ctx.integer.arm64_regs.x[29] );
+ dump_uint64( ",x30=", &ctx.integer.arm64_regs.x[30] );
+ }
+ break;
case CPU_SPARC:
if (ctx.flags & SERVER_CTX_CONTROL)
fprintf( stderr, ",psr=%08x,pc=%08x,npc=%08x,y=%08x,wim=%08x,tbr=%08x",
More information about the wine-cvs
mailing list