Commit 21c12ddc authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Fix CONTEXT definition for ARM64.

parent eb337adc
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <assert.h> #include <assert.h>
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "ntstatus.h" #include "ntstatus.h"
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "dbghelp_private.h" #include "dbghelp_private.h"
...@@ -166,41 +168,40 @@ static void* arm64_fetch_context_reg(CONTEXT* ctx, unsigned regno, unsigned* siz ...@@ -166,41 +168,40 @@ static void* arm64_fetch_context_reg(CONTEXT* ctx, unsigned regno, unsigned* siz
#ifdef __aarch64__ #ifdef __aarch64__
switch (regno) switch (regno)
{ {
case CV_ARM64_PSTATE: *size = sizeof(ctx->Cpsr); return &ctx->Cpsr; case CV_ARM64_X0 + 0:
case CV_ARM64_X0 + 0: *size = sizeof(ctx->X0); return &ctx->X0; case CV_ARM64_X0 + 1:
case CV_ARM64_X0 + 1: *size = sizeof(ctx->X1); return &ctx->X1; case CV_ARM64_X0 + 2:
case CV_ARM64_X0 + 2: *size = sizeof(ctx->X2); return &ctx->X2; case CV_ARM64_X0 + 3:
case CV_ARM64_X0 + 3: *size = sizeof(ctx->X3); return &ctx->X3; case CV_ARM64_X0 + 4:
case CV_ARM64_X0 + 4: *size = sizeof(ctx->X4); return &ctx->X4; case CV_ARM64_X0 + 5:
case CV_ARM64_X0 + 5: *size = sizeof(ctx->X5); return &ctx->X5; case CV_ARM64_X0 + 6:
case CV_ARM64_X0 + 6: *size = sizeof(ctx->X6); return &ctx->X6; case CV_ARM64_X0 + 7:
case CV_ARM64_X0 + 7: *size = sizeof(ctx->X7); return &ctx->X7; case CV_ARM64_X0 + 8:
case CV_ARM64_X0 + 8: *size = sizeof(ctx->X8); return &ctx->X8; case CV_ARM64_X0 + 9:
case CV_ARM64_X0 + 9: *size = sizeof(ctx->X9); return &ctx->X9; case CV_ARM64_X0 + 10:
case CV_ARM64_X0 + 10: *size = sizeof(ctx->X10); return &ctx->X10; case CV_ARM64_X0 + 11:
case CV_ARM64_X0 + 11: *size = sizeof(ctx->X11); return &ctx->X11; case CV_ARM64_X0 + 12:
case CV_ARM64_X0 + 12: *size = sizeof(ctx->X12); return &ctx->X12; case CV_ARM64_X0 + 13:
case CV_ARM64_X0 + 13: *size = sizeof(ctx->X13); return &ctx->X13; case CV_ARM64_X0 + 14:
case CV_ARM64_X0 + 14: *size = sizeof(ctx->X14); return &ctx->X14; case CV_ARM64_X0 + 15:
case CV_ARM64_X0 + 15: *size = sizeof(ctx->X15); return &ctx->X15; case CV_ARM64_X0 + 16:
case CV_ARM64_X0 + 16: *size = sizeof(ctx->X16); return &ctx->X16; case CV_ARM64_X0 + 17:
case CV_ARM64_X0 + 17: *size = sizeof(ctx->X17); return &ctx->X17; case CV_ARM64_X0 + 18:
case CV_ARM64_X0 + 18: *size = sizeof(ctx->X18); return &ctx->X18; case CV_ARM64_X0 + 19:
case CV_ARM64_X0 + 19: *size = sizeof(ctx->X19); return &ctx->X19; case CV_ARM64_X0 + 20:
case CV_ARM64_X0 + 20: *size = sizeof(ctx->X20); return &ctx->X20; case CV_ARM64_X0 + 21:
case CV_ARM64_X0 + 21: *size = sizeof(ctx->X21); return &ctx->X21; case CV_ARM64_X0 + 22:
case CV_ARM64_X0 + 22: *size = sizeof(ctx->X22); return &ctx->X22; case CV_ARM64_X0 + 23:
case CV_ARM64_X0 + 23: *size = sizeof(ctx->X23); return &ctx->X23; case CV_ARM64_X0 + 24:
case CV_ARM64_X0 + 24: *size = sizeof(ctx->X24); return &ctx->X24; case CV_ARM64_X0 + 25:
case CV_ARM64_X0 + 25: *size = sizeof(ctx->X25); return &ctx->X25; case CV_ARM64_X0 + 26:
case CV_ARM64_X0 + 26: *size = sizeof(ctx->X26); return &ctx->X26; case CV_ARM64_X0 + 27:
case CV_ARM64_X0 + 27: *size = sizeof(ctx->X27); return &ctx->X27; case CV_ARM64_X0 + 28: *size = sizeof(ctx->u.X[0]); return &ctx->u.X[regno - CV_ARM64_X0];
case CV_ARM64_X0 + 28: *size = sizeof(ctx->X28); return &ctx->X28; case CV_ARM64_PSTATE: *size = sizeof(ctx->Cpsr); return &ctx->Cpsr;
case CV_ARM64_FP: *size = sizeof(ctx->Fp); return &ctx->Fp;
case CV_ARM64_FP: *size = sizeof(ctx->Fp); return &ctx->Fp; case CV_ARM64_LR: *size = sizeof(ctx->Lr); return &ctx->Lr;
case CV_ARM64_LR: *size = sizeof(ctx->Lr); return &ctx->Lr; case CV_ARM64_SP: *size = sizeof(ctx->Sp); return &ctx->Sp;
case CV_ARM64_SP: *size = sizeof(ctx->Sp); return &ctx->Sp; case CV_ARM64_PC: *size = sizeof(ctx->Pc); return &ctx->Pc;
case CV_ARM64_PC: *size = sizeof(ctx->Pc); return &ctx->Pc;
} }
#endif #endif
FIXME("Unknown register %x\n", regno); FIXME("Unknown register %x\n", regno);
......
...@@ -48,6 +48,8 @@ ...@@ -48,6 +48,8 @@
# include <sys/ucontext.h> # include <sys/ucontext.h>
#endif #endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "ntstatus.h" #include "ntstatus.h"
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "windef.h" #include "windef.h"
...@@ -118,12 +120,7 @@ static inline BOOL is_valid_frame( void *frame ) ...@@ -118,12 +120,7 @@ static inline BOOL is_valid_frame( void *frame )
*/ */
static void save_context( CONTEXT *context, const ucontext_t *sigcontext ) static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
{ {
#define C(n) context->X##n = REGn_sig(n,sigcontext) DWORD i;
/* Save normal registers */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9);
C(10); C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19);
C(20); C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28);
#undef C
context->ContextFlags = CONTEXT_FULL; context->ContextFlags = CONTEXT_FULL;
context->Fp = FP_sig(sigcontext); /* Frame pointer */ context->Fp = FP_sig(sigcontext); /* Frame pointer */
...@@ -131,6 +128,7 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext ) ...@@ -131,6 +128,7 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
context->Sp = SP_sig(sigcontext); /* Stack pointer */ context->Sp = SP_sig(sigcontext); /* Stack pointer */
context->Pc = PC_sig(sigcontext); /* Program Counter */ context->Pc = PC_sig(sigcontext); /* Program Counter */
context->Cpsr = PSTATE_sig(sigcontext); /* Current State Register */ context->Cpsr = PSTATE_sig(sigcontext); /* Current State Register */
for (i = 0; i <= 28; i++) context->u.X[i] = REGn_sig( i, sigcontext );
} }
...@@ -141,18 +139,14 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext ) ...@@ -141,18 +139,14 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
*/ */
static void restore_context( const CONTEXT *context, ucontext_t *sigcontext ) static void restore_context( const CONTEXT *context, ucontext_t *sigcontext )
{ {
#define C(n) REGn_sig(n,sigcontext) = context->X##n DWORD i;
/* Restore normal registers */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9);
C(10); C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19);
C(20); C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28);
#undef C
FP_sig(sigcontext) = context->Fp; /* Frame pointer */ FP_sig(sigcontext) = context->Fp; /* Frame pointer */
LR_sig(sigcontext) = context->Lr; /* Link register */ LR_sig(sigcontext) = context->Lr; /* Link register */
SP_sig(sigcontext) = context->Sp; /* Stack pointer */ SP_sig(sigcontext) = context->Sp; /* Stack pointer */
PC_sig(sigcontext) = context->Pc; /* Program Counter */ PC_sig(sigcontext) = context->Pc; /* Program Counter */
PSTATE_sig(sigcontext) = context->Cpsr; /* Current State Register */ PSTATE_sig(sigcontext) = context->Cpsr; /* Current State Register */
for (i = 0; i <= 28; i++) REGn_sig( i, sigcontext ) = context->u.X[i];
} }
...@@ -255,12 +249,7 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags ) ...@@ -255,12 +249,7 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
} }
if (flags & CONTEXT_INTEGER) if (flags & CONTEXT_INTEGER)
{ {
#define C(n) to->X##n = from->X##n memcpy( to->u.X, from->u.X, sizeof(to->u.X) );
/* Restore normal registers */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9);
C(10); C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19);
C(20); C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28);
#undef C
} }
} }
...@@ -271,7 +260,7 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags ) ...@@ -271,7 +260,7 @@ static void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
*/ */
NTSTATUS context_to_server( context_t *to, const CONTEXT *from ) NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
{ {
DWORD flags = from->ContextFlags & ~CONTEXT_ARM64; /* get rid of CPU id */ DWORD i, flags = from->ContextFlags & ~CONTEXT_ARM64; /* get rid of CPU id */
memset( to, 0, sizeof(*to) ); memset( to, 0, sizeof(*to) );
to->cpu = CPU_ARM64; to->cpu = CPU_ARM64;
...@@ -288,12 +277,7 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from ) ...@@ -288,12 +277,7 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
if (flags & CONTEXT_INTEGER) if (flags & CONTEXT_INTEGER)
{ {
to->flags |= SERVER_CTX_INTEGER; to->flags |= SERVER_CTX_INTEGER;
#define C(n) to->integer.arm64_regs.x[n] = from->X##n for (i = 0; i <= 28; i++) to->integer.arm64_regs.x[i] = from->u.X[i];
/* Restore normal registers */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9);
C(10); C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19);
C(20); C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28);
#undef C
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
...@@ -306,6 +290,8 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from ) ...@@ -306,6 +290,8 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
*/ */
NTSTATUS context_from_server( CONTEXT *to, const context_t *from ) NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
{ {
DWORD i;
if (from->cpu != CPU_ARM64) return STATUS_INVALID_PARAMETER; if (from->cpu != CPU_ARM64) return STATUS_INVALID_PARAMETER;
to->ContextFlags = CONTEXT_ARM64; to->ContextFlags = CONTEXT_ARM64;
...@@ -321,12 +307,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from ) ...@@ -321,12 +307,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
if (from->flags & SERVER_CTX_INTEGER) if (from->flags & SERVER_CTX_INTEGER)
{ {
to->ContextFlags |= CONTEXT_INTEGER; to->ContextFlags |= CONTEXT_INTEGER;
#define C(n) to->X##n = from->integer.arm64_regs.x[n] for (i = 0; i <= 28; i++) to->u.X[i] = from->integer.arm64_regs.x[i];
/* Restore normal registers */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9);
C(10); C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19);
C(20); C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28);
#undef C
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
...@@ -971,14 +952,14 @@ static void thread_startup( void *param ) ...@@ -971,14 +952,14 @@ static void thread_startup( void *param )
/* build the initial context */ /* build the initial context */
context.ContextFlags = CONTEXT_FULL; context.ContextFlags = CONTEXT_FULL;
context.X0 = (DWORD_PTR)info->entry; context.u.s.X0 = (DWORD_PTR)info->entry;
context.X1 = (DWORD_PTR)info->arg; context.u.s.X1 = (DWORD_PTR)info->arg;
context.Sp = (DWORD_PTR)NtCurrentTeb()->Tib.StackBase; context.Sp = (DWORD_PTR)NtCurrentTeb()->Tib.StackBase;
context.Pc = (DWORD_PTR)info->start; context.Pc = (DWORD_PTR)info->start;
attach_dlls( &context, info->suspend ); attach_dlls( &context, info->suspend );
((thread_start_func)context.Pc)( (LPTHREAD_START_ROUTINE)context.X0, (void *)context.X1 ); ((thread_start_func)context.Pc)( (LPTHREAD_START_ROUTINE)context.u.s.X0, (void *)context.u.s.X1 );
} }
/*********************************************************************** /***********************************************************************
......
...@@ -1762,6 +1762,9 @@ PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry(ULONG_PTR,DWORD*,UNWIND_HISTORY_ ...@@ -1762,6 +1762,9 @@ PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry(ULONG_PTR,DWORD*,UNWIND_HISTORY_
#define EXCEPTION_WRITE_FAULT 1 #define EXCEPTION_WRITE_FAULT 1
#define EXCEPTION_EXECUTE_FAULT 8 #define EXCEPTION_EXECUTE_FAULT 8
#define ARM64_MAX_BREAKPOINTS 8
#define ARM64_MAX_WATCHPOINTS 2
typedef struct _RUNTIME_FUNCTION typedef struct _RUNTIME_FUNCTION
{ {
DWORD BeginAddress; DWORD BeginAddress;
...@@ -1801,50 +1804,74 @@ typedef struct _UNWIND_HISTORY_TABLE ...@@ -1801,50 +1804,74 @@ typedef struct _UNWIND_HISTORY_TABLE
UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE];
} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; } UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE;
typedef struct _CONTEXT { typedef union _NEON128
ULONG ContextFlags; {
ULONG Cpsr; struct
{
/* This section is specified/returned if the ContextFlags word contains ULONGLONG Low;
the flag CONTEXT_INTEGER. */ LONGLONG High;
ULONGLONG X0; } DUMMYSTRUCTNAME;
ULONGLONG X1; double D[2];
ULONGLONG X2; float S[4];
ULONGLONG X3; WORD H[8];
ULONGLONG X4; BYTE B[16];
ULONGLONG X5; } NEON128, *PNEON128;
ULONGLONG X6;
ULONGLONG X7;
ULONGLONG X8;
ULONGLONG X9;
ULONGLONG X10;
ULONGLONG X11;
ULONGLONG X12;
ULONGLONG X13;
ULONGLONG X14;
ULONGLONG X15;
ULONGLONG X16;
ULONGLONG X17;
ULONGLONG X18;
ULONGLONG X19;
ULONGLONG X20;
ULONGLONG X21;
ULONGLONG X22;
ULONGLONG X23;
ULONGLONG X24;
ULONGLONG X25;
ULONGLONG X26;
ULONGLONG X27;
ULONGLONG X28;
/* These are selected by CONTEXT_CONTROL */
ULONGLONG Fp;
ULONGLONG Lr;
ULONGLONG Sp;
ULONGLONG Pc;
/* These are selected by CONTEXT_FLOATING_POINT */ typedef struct _CONTEXT
/* FIXME */ {
ULONG ContextFlags; /* 000 */
/* CONTEXT_INTEGER */
ULONG Cpsr; /* 004 */
union
{
struct
{
DWORD64 X0; /* 008 */
DWORD64 X1; /* 010 */
DWORD64 X2; /* 018 */
DWORD64 X3; /* 020 */
DWORD64 X4; /* 028 */
DWORD64 X5; /* 030 */
DWORD64 X6; /* 038 */
DWORD64 X7; /* 040 */
DWORD64 X8; /* 048 */
DWORD64 X9; /* 050 */
DWORD64 X10; /* 058 */
DWORD64 X11; /* 060 */
DWORD64 X12; /* 068 */
DWORD64 X13; /* 070 */
DWORD64 X14; /* 078 */
DWORD64 X15; /* 080 */
DWORD64 X16; /* 088 */
DWORD64 X17; /* 090 */
DWORD64 X18; /* 098 */
DWORD64 X19; /* 0a0 */
DWORD64 X20; /* 0a8 */
DWORD64 X21; /* 0b0 */
DWORD64 X22; /* 0b8 */
DWORD64 X23; /* 0c0 */
DWORD64 X24; /* 0c8 */
DWORD64 X25; /* 0d0 */
DWORD64 X26; /* 0d8 */
DWORD64 X27; /* 0e0 */
DWORD64 X28; /* 0e8 */
} DUMMYSTRUCTNAME;
DWORD64 X[29]; /* 008 */
} DUMMYUNIONNAME;
/* CONTEXT_CONTROL */
DWORD64 Fp; /* 0f0 */
DWORD64 Lr; /* 0f8 */
DWORD64 Sp; /* 100 */
DWORD64 Pc; /* 108 */
/* CONTEXT_FLOATING_POINT */
NEON128 V[32]; /* 110 */
DWORD Fpcr; /* 310 */
DWORD Fpsr; /* 314 */
/* CONTEXT_DEBUG_REGISTERS */
DWORD Bcr[ARM64_MAX_BREAKPOINTS]; /* 318 */
DWORD64 Bvr[ARM64_MAX_BREAKPOINTS]; /* 338 */
DWORD Wcr[ARM64_MAX_WATCHPOINTS]; /* 378 */
DWORD64 Wvr[ARM64_MAX_WATCHPOINTS]; /* 380 */
} CONTEXT; } CONTEXT;
#endif /* __aarch64__ */ #endif /* __aarch64__ */
......
...@@ -83,17 +83,17 @@ static void be_arm64_print_context(HANDLE hThread, const CONTEXT* ctx, int all_r ...@@ -83,17 +83,17 @@ static void be_arm64_print_context(HANDLE hThread, const CONTEXT* ctx, int all_r
dbg_printf(" Pc:%016lx Sp:%016lx Lr:%016lx Cpsr:%08x(%s)\n", dbg_printf(" Pc:%016lx Sp:%016lx Lr:%016lx Cpsr:%08x(%s)\n",
ctx->Pc, ctx->Sp, ctx->Lr, ctx->Cpsr, buf); ctx->Pc, ctx->Sp, ctx->Lr, ctx->Cpsr, buf);
dbg_printf(" x0: %016lx x1: %016lx x2: %016lx x3: %016lx x4: %016lx\n", dbg_printf(" x0: %016lx x1: %016lx x2: %016lx x3: %016lx x4: %016lx\n",
ctx->X0, ctx->X1, ctx->X2, ctx->X3, ctx->X4); ctx->u.s.X0, ctx->u.s.X1, ctx->u.s.X2, ctx->u.s.X3, ctx->u.s.X4);
dbg_printf(" x5: %016lx x6: %016lx x7: %016lx x8: %016lx x9: %016lx\n", dbg_printf(" x5: %016lx x6: %016lx x7: %016lx x8: %016lx x9: %016lx\n",
ctx->X5, ctx->X6, ctx->X7, ctx->X8, ctx->X9); ctx->u.s.X5, ctx->u.s.X6, ctx->u.s.X7, ctx->u.s.X8, ctx->u.s.X9);
dbg_printf(" x10:%016lx x11:%016lx x12:%016lx x13:%016lx x14:%016lx\n", dbg_printf(" x10:%016lx x11:%016lx x12:%016lx x13:%016lx x14:%016lx\n",
ctx->X10, ctx->X11, ctx->X12, ctx->X13, ctx->X14); ctx->u.s.X10, ctx->u.s.X11, ctx->u.s.X12, ctx->u.s.X13, ctx->u.s.X14);
dbg_printf(" x15:%016lx ip0:%016lx ip1:%016lx x18:%016lx x19:%016lx\n", dbg_printf(" x15:%016lx ip0:%016lx ip1:%016lx x18:%016lx x19:%016lx\n",
ctx->X15, ctx->X16, ctx->X17, ctx->X18, ctx->X19); ctx->u.s.X15, ctx->u.s.X16, ctx->u.s.X17, ctx->u.s.X18, ctx->u.s.X19);
dbg_printf(" x20:%016lx x21:%016lx x22:%016lx x23:%016lx x24:%016lx\n", dbg_printf(" x20:%016lx x21:%016lx x22:%016lx x23:%016lx x24:%016lx\n",
ctx->X20, ctx->X21, ctx->X22, ctx->X23, ctx->X24); ctx->u.s.X20, ctx->u.s.X21, ctx->u.s.X22, ctx->u.s.X23, ctx->u.s.X24);
dbg_printf(" x25:%016lx x26:%016lx x27:%016lx x28:%016lx Fp:%016lx\n", dbg_printf(" x25:%016lx x26:%016lx x27:%016lx x28:%016lx Fp:%016lx\n",
ctx->X25, ctx->X26, ctx->X27, ctx->X28, ctx->Fp); ctx->u.s.X25, ctx->u.s.X26, ctx->u.s.X27, ctx->u.s.X28, ctx->Fp);
if (all_regs) dbg_printf( "Floating point ARM64 dump not implemented\n" ); if (all_regs) dbg_printf( "Floating point ARM64 dump not implemented\n" );
} }
...@@ -104,41 +104,41 @@ static void be_arm64_print_segment_info(HANDLE hThread, const CONTEXT* ctx) ...@@ -104,41 +104,41 @@ static void be_arm64_print_segment_info(HANDLE hThread, const CONTEXT* ctx)
static struct dbg_internal_var be_arm64_ctx[] = static struct dbg_internal_var be_arm64_ctx[] =
{ {
{CV_ARM64_PSTATE, "cpsr", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Cpsr), dbg_itype_unsigned_int}, {CV_ARM64_PSTATE, "cpsr", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Cpsr), dbg_itype_unsigned_int},
{CV_ARM64_X0 + 0, "x0", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X0), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 0, "x0", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X0), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 1, "x1", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X1), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 1, "x1", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X1), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 2, "x2", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X2), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 2, "x2", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X2), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 3, "x3", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X3), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 3, "x3", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X3), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 4, "x4", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X4), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 4, "x4", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X4), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 5, "x5", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X5), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 5, "x5", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X5), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 6, "x6", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X6), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 6, "x6", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X6), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 7, "x7", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X7), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 7, "x7", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X7), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 8, "x8", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X8), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 8, "x8", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X8), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 9, "x9", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X9), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 9, "x9", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X9), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 10, "x10", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X10), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 10, "x10", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X10), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 11, "x11", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X11), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 11, "x11", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X11), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 12, "x12", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X12), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 12, "x12", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X12), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 13, "x13", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X13), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 13, "x13", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X13), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 14, "x14", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X14), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 14, "x14", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X14), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 15, "x15", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X15), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 15, "x15", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X15), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 16, "x16", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X16), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 16, "x16", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X16), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 17, "x17", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X17), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 17, "x17", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X17), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 18, "x18", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X18), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 18, "x18", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X18), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 19, "x19", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X19), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 19, "x19", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X19), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 20, "x20", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X20), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 20, "x20", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X20), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 21, "x21", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X21), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 21, "x21", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X21), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 22, "x22", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X22), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 22, "x22", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X22), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 23, "x23", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X23), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 23, "x23", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X23), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 24, "x24", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X24), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 24, "x24", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X24), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 25, "x25", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X25), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 25, "x25", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X25), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 26, "x26", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X26), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 26, "x26", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X26), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 27, "x27", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X27), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 27, "x27", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X27), dbg_itype_unsigned_long_int},
{CV_ARM64_X0 + 28, "x28", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, X28), dbg_itype_unsigned_long_int}, {CV_ARM64_X0 + 28, "x28", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, u.s.X28), dbg_itype_unsigned_long_int},
{CV_ARM64_FP, "fp", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Fp), dbg_itype_unsigned_long_int}, {CV_ARM64_FP, "fp", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Fp), dbg_itype_unsigned_long_int},
{CV_ARM64_LR, "lr", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Lr), dbg_itype_unsigned_long_int}, {CV_ARM64_LR, "lr", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Lr), dbg_itype_unsigned_long_int},
{CV_ARM64_SP, "sp", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Sp), dbg_itype_unsigned_long_int}, {CV_ARM64_SP, "sp", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Sp), dbg_itype_unsigned_long_int},
{CV_ARM64_PC, "pc", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Pc), dbg_itype_unsigned_long_int}, {CV_ARM64_PC, "pc", (DWORD_PTR*)FIELD_OFFSET(CONTEXT, Pc), dbg_itype_unsigned_long_int},
{0, NULL, 0, dbg_itype_none} {0, NULL, 0, dbg_itype_none}
}; };
static BOOL be_arm64_is_step_over_insn(const void* insn) static BOOL be_arm64_is_step_over_insn(const void* insn)
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include <assert.h> #include <assert.h>
#include <stdarg.h> #include <stdarg.h>
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "ntstatus.h" #include "ntstatus.h"
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
......
...@@ -400,35 +400,35 @@ static struct cpu_register cpu_register_map[] = { ...@@ -400,35 +400,35 @@ static struct cpu_register cpu_register_map[] = {
static const char target_xml[] = ""; static const char target_xml[] = "";
static struct cpu_register cpu_register_map[] = { static struct cpu_register cpu_register_map[] = {
REG(Cpsr, 4, CONTEXT_CONTROL), REG(Cpsr, 4, CONTEXT_CONTROL),
REG(X0, 8, CONTEXT_INTEGER), REG(u.s.X0, 8, CONTEXT_INTEGER),
REG(X1, 8, CONTEXT_INTEGER), REG(u.s.X1, 8, CONTEXT_INTEGER),
REG(X2, 8, CONTEXT_INTEGER), REG(u.s.X2, 8, CONTEXT_INTEGER),
REG(X3, 8, CONTEXT_INTEGER), REG(u.s.X3, 8, CONTEXT_INTEGER),
REG(X4, 8, CONTEXT_INTEGER), REG(u.s.X4, 8, CONTEXT_INTEGER),
REG(X5, 8, CONTEXT_INTEGER), REG(u.s.X5, 8, CONTEXT_INTEGER),
REG(X6, 8, CONTEXT_INTEGER), REG(u.s.X6, 8, CONTEXT_INTEGER),
REG(X7, 8, CONTEXT_INTEGER), REG(u.s.X7, 8, CONTEXT_INTEGER),
REG(X8, 8, CONTEXT_INTEGER), REG(u.s.X8, 8, CONTEXT_INTEGER),
REG(X9, 8, CONTEXT_INTEGER), REG(u.s.X9, 8, CONTEXT_INTEGER),
REG(X10, 8, CONTEXT_INTEGER), REG(u.s.X10, 8, CONTEXT_INTEGER),
REG(X11, 8, CONTEXT_INTEGER), REG(u.s.X11, 8, CONTEXT_INTEGER),
REG(X12, 8, CONTEXT_INTEGER), REG(u.s.X12, 8, CONTEXT_INTEGER),
REG(X13, 8, CONTEXT_INTEGER), REG(u.s.X13, 8, CONTEXT_INTEGER),
REG(X14, 8, CONTEXT_INTEGER), REG(u.s.X14, 8, CONTEXT_INTEGER),
REG(X15, 8, CONTEXT_INTEGER), REG(u.s.X15, 8, CONTEXT_INTEGER),
REG(X16, 8, CONTEXT_INTEGER), REG(u.s.X16, 8, CONTEXT_INTEGER),
REG(X17, 8, CONTEXT_INTEGER), REG(u.s.X17, 8, CONTEXT_INTEGER),
REG(X18, 8, CONTEXT_INTEGER), REG(u.s.X18, 8, CONTEXT_INTEGER),
REG(X19, 8, CONTEXT_INTEGER), REG(u.s.X19, 8, CONTEXT_INTEGER),
REG(X20, 8, CONTEXT_INTEGER), REG(u.s.X20, 8, CONTEXT_INTEGER),
REG(X21, 8, CONTEXT_INTEGER), REG(u.s.X21, 8, CONTEXT_INTEGER),
REG(X22, 8, CONTEXT_INTEGER), REG(u.s.X22, 8, CONTEXT_INTEGER),
REG(X23, 8, CONTEXT_INTEGER), REG(u.s.X23, 8, CONTEXT_INTEGER),
REG(X24, 8, CONTEXT_INTEGER), REG(u.s.X24, 8, CONTEXT_INTEGER),
REG(X25, 8, CONTEXT_INTEGER), REG(u.s.X25, 8, CONTEXT_INTEGER),
REG(X26, 8, CONTEXT_INTEGER), REG(u.s.X26, 8, CONTEXT_INTEGER),
REG(X27, 8, CONTEXT_INTEGER), REG(u.s.X27, 8, CONTEXT_INTEGER),
REG(X28, 8, CONTEXT_INTEGER), REG(u.s.X28, 8, CONTEXT_INTEGER),
REG(Fp, 8, CONTEXT_INTEGER), REG(Fp, 8, CONTEXT_INTEGER),
REG(Lr, 8, CONTEXT_INTEGER), REG(Lr, 8, CONTEXT_INTEGER),
REG(Sp, 8, CONTEXT_CONTROL), REG(Sp, 8, CONTEXT_CONTROL),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment