Alexandre Julliard : server: Add floating point and debug registers to the ARM context.

Alexandre Julliard julliard at winehq.org
Tue Dec 5 15:02:13 CST 2017


Module: wine
Branch: master
Commit: 4ba0f628f9d2c03e419304fc8acbc316afbb91b3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ba0f628f9d2c03e419304fc8acbc316afbb91b3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Dec  5 10:30:28 2017 +0100

server: Add floating point and debug registers to the ARM context.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_arm.c        | 39 +++++++++++++++++++++++++++++++++++++--
 include/wine/server_protocol.h |  4 +++-
 server/protocol.def            |  2 ++
 server/thread.c                |  2 +-
 server/trace.c                 | 17 +++++++++++++++++
 5 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index a0b7bb8..64ff1e0 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -347,6 +347,11 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
         to->R11 = from->R11;
         to->R12 = from->R12;
     }
+    if (flags & CONTEXT_FLOATING_POINT)
+    {
+        to->Fpscr = from->Fpscr;
+        memcpy( to->u.D, from->u.D, sizeof(to->u.D) );
+    }
 }
 
 
@@ -357,7 +362,7 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
  */
 NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
 {
-    DWORD flags = from->ContextFlags & ~CONTEXT_ARM;  /* get rid of CPU id */
+    DWORD i, flags = from->ContextFlags & ~CONTEXT_ARM;  /* get rid of CPU id */
 
     memset( to, 0, sizeof(*to) );
     to->cpu = CPU_ARM;
@@ -387,6 +392,20 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
         to->integer.arm_regs.r[11] = from->R11;
         to->integer.arm_regs.r[12] = from->R12;
     }
+    if (flags & CONTEXT_FLOATING_POINT)
+    {
+        to->flags |= SERVER_CTX_FLOATING_POINT;
+        for (i = 0; i < 32; i++) to->fp.arm_regs.d[i] = from->u.D[i];
+        to->fp.arm_regs.fpscr = from->Fpscr;
+    }
+    if (flags & CONTEXT_DEBUG_REGISTERS)
+    {
+        to->flags |= SERVER_CTX_DEBUG_REGISTERS;
+        for (i = 0; i < ARM_MAX_BREAKPOINTS; i++) to->debug.arm_regs.bvr[i] = from->Bvr[i];
+        for (i = 0; i < ARM_MAX_BREAKPOINTS; i++) to->debug.arm_regs.bcr[i] = from->Bcr[i];
+        for (i = 0; i < ARM_MAX_WATCHPOINTS; i++) to->debug.arm_regs.wvr[i] = from->Wvr[i];
+        for (i = 0; i < ARM_MAX_WATCHPOINTS; i++) to->debug.arm_regs.wcr[i] = from->Wcr[i];
+    }
     return STATUS_SUCCESS;
 }
 
@@ -398,6 +417,8 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
  */
 NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
 {
+    DWORD i;
+
     if (from->cpu != CPU_ARM) return STATUS_INVALID_PARAMETER;
 
     to->ContextFlags = CONTEXT_ARM;
@@ -425,7 +446,21 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
         to->R10 = from->integer.arm_regs.r[10];
         to->R11 = from->integer.arm_regs.r[11];
         to->R12 = from->integer.arm_regs.r[12];
-     }
+    }
+    if (from->flags & SERVER_CTX_FLOATING_POINT)
+    {
+        to->ContextFlags |= CONTEXT_FLOATING_POINT;
+        for (i = 0; i < 32; i++) to->u.D[i] = from->fp.arm_regs.d[i];
+        to->Fpscr = from->fp.arm_regs.fpscr;
+    }
+    if (from->flags & SERVER_CTX_DEBUG_REGISTERS)
+    {
+        to->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
+        for (i = 0; i < ARM_MAX_BREAKPOINTS; i++) to->Bvr[i] = from->debug.arm_regs.bvr[i];
+        for (i = 0; i < ARM_MAX_BREAKPOINTS; i++) to->Bcr[i] = from->debug.arm_regs.bcr[i];
+        for (i = 0; i < ARM_MAX_WATCHPOINTS; i++) to->Wvr[i] = from->debug.arm_regs.wvr[i];
+        for (i = 0; i < ARM_MAX_WATCHPOINTS; i++) to->Wcr[i] = from->debug.arm_regs.wcr[i];
+    }
     return STATUS_SUCCESS;
 }
 
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index d8a93b6..569a23f 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -155,12 +155,14 @@ 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 { unsigned __int64 d[32]; unsigned int fpscr; } arm_regs;
     } fp;
     union
     {
         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 int bvr[8], bcr[8], wvr[1], wcr[1]; } arm_regs;
     } debug;
     union
     {
@@ -6475,6 +6477,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 544
+#define SERVER_PROTOCOL_VERSION 545
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index a3f4640..9f11e67 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -171,12 +171,14 @@ 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 { unsigned __int64 d[32]; unsigned int fpscr; } arm_regs;
     } fp;  /* selected by SERVER_CTX_FLOATING_POINT */
     union
     {
         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 int bvr[8], bcr[8], wvr[1], wcr[1]; } arm_regs;
     } debug;  /* selected by SERVER_CTX_DEBUG_REGISTERS */
     union
     {
diff --git a/server/thread.c b/server/thread.c
index 2a57bc9..0d647c7 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1147,7 +1147,7 @@ static unsigned int get_context_system_regs( enum cpu_type 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 0;
+    case CPU_ARM:     return SERVER_CTX_DEBUG_REGISTERS;
     case CPU_ARM64:   return 0;
     }
     return 0;
diff --git a/server/trace.c b/server/trace.c
index 7f84e2a..89506e0 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -664,6 +664,23 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
                      ctx.ctl.arm_regs.pc, ctx.ctl.arm_regs.cpsr );
         if (ctx.flags & SERVER_CTX_INTEGER)
             for (i = 0; i < 13; i++) fprintf( stderr, ",r%u=%08x", i, ctx.integer.arm_regs.r[i] );
+        if (ctx.flags & SERVER_CTX_DEBUG_REGISTERS)
+        {
+            for (i = 0; i < 8; i++)
+                fprintf( stderr, ",bcr%u=%08x,bvr%u=%08x",
+                         i, ctx.debug.arm_regs.bcr[i], i, ctx.debug.arm_regs.bvr[i] );
+            fprintf( stderr, ",wcr0=%08x,wvr0=%08x",
+                     ctx.debug.arm_regs.wcr[0], ctx.debug.arm_regs.wvr[0] );
+        }
+        if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+        {
+            for (i = 0; i < 32; i++)
+            {
+                fprintf( stderr, ",d%u=", i );
+                dump_uint64( "", &ctx.fp.arm_regs.d[i] );
+            }
+            fprintf( stderr, ",fpscr=%08x", ctx.fp.arm_regs.fpscr );
+        }
         break;
     case CPU_ARM64:
         if (ctx.flags & SERVER_CTX_CONTROL)




More information about the wine-cvs mailing list