Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 7e89419

Browse files
authored
Merge pull request #25779 from sdmaclea/arm64debug30
Pull arm/arm64 critical 5.0 PAL/diagnostic changes into 3.0
2 parents cb650e0 + 194922d commit 7e89419

File tree

8 files changed

+186
-21
lines changed

8 files changed

+186
-21
lines changed

clrdefinitions.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ if (CLR_CMAKE_PLATFORM_UNIX)
6262
elseif (CLR_CMAKE_TARGET_ARCH_ARM)
6363
add_definitions(-DUNIX_ARM_ABI)
6464
add_definitions(-DFEATURE_DATATARGET4)
65+
elseif (CLR_CMAKE_TARGET_ARCH_ARM64)
66+
add_definitions(-DFEATURE_DATATARGET4)
6567
elseif (CLR_CMAKE_TARGET_ARCH_I386)
6668
add_definitions(-DUNIX_X86_ABI)
6769
endif()

src/debug/ee/arm64/arm64walker.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,15 @@ BYTE* NativeWalker::SetupOrSimulateInstructionForPatchSkip(T_CONTEXT * context,
200200
switch (opc)
201201
{
202202
case 0: //4byte data into St
203-
RegContents = 0xFFFFFFFF & RegContents; //zero the upper 32bit
204-
SetReg(context, RegNum, RegContents);
203+
SimdRegContents.Low = 0xFFFFFFFF & RegContents; //zero the upper 32bit
204+
SimdRegContents.High = 0;
205+
SetSimdReg(context, RegNum, SimdRegContents);
206+
break;
205207
case 1: //8byte data into Dt
206-
SetReg(context, RegNum, RegContents);
208+
SimdRegContents.Low = RegContents;
209+
SimdRegContents.High = 0;
210+
SetSimdReg(context, RegNum, SimdRegContents);
207211
break;
208-
209212
case 2: //SIMD 16 byte data
210213
SimdRegContents = GetSimdMem(ip);
211214
SetSimdReg(context, RegNum, SimdRegContents);

src/pal/src/arch/arm/exceptionhelper.S

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,27 @@ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
2121

2222
push_nonvol_reg {r7} /* FP. x64-RBP */
2323

24-
ldr r4, [r0, #(CONTEXT_R4)]
25-
ldr r5, [r0, #(CONTEXT_R5)]
26-
ldr r6, [r0, #(CONTEXT_R6)]
27-
ldr r7, [r0, #(CONTEXT_R7)]
28-
ldr r8, [r0, #(CONTEXT_R8)]
29-
ldr r9, [r0, #(CONTEXT_R9)]
30-
ldr r10, [r0, #(CONTEXT_R10)]
31-
ldr r11, [r0, #(CONTEXT_R11)]
32-
ldr sp, [r0, #(CONTEXT_Sp)]
33-
ldr lr, [r0, #(CONTEXT_Pc)]
24+
ldr r4, [r0, #(CONTEXT_R4)]
25+
ldr r5, [r0, #(CONTEXT_R5)]
26+
ldr r6, [r0, #(CONTEXT_R6)]
27+
ldr r7, [r0, #(CONTEXT_R7)]
28+
ldr r8, [r0, #(CONTEXT_R8)]
29+
ldr r9, [r0, #(CONTEXT_R9)]
30+
ldr r10, [r0, #(CONTEXT_R10)]
31+
ldr r11, [r0, #(CONTEXT_R11)]
32+
ldr sp, [r0, #(CONTEXT_Sp)]
33+
ldr lr, [r0, #(CONTEXT_Pc)]
34+
35+
vldr d8, [r0, #(CONTEXT_D8)]
36+
vldr d9, [r0, #(CONTEXT_D9)]
37+
vldr d10, [r0, #(CONTEXT_D10)]
38+
vldr d11, [r0, #(CONTEXT_D11)]
39+
vldr d12, [r0, #(CONTEXT_D12)]
40+
vldr d13, [r0, #(CONTEXT_D13)]
41+
vldr d14, [r0, #(CONTEXT_D14)]
42+
vldr d15, [r0, #(CONTEXT_D15)]
3443

3544
// The PAL_SEHException pointer
36-
mov r0, r1
37-
b EXTERNAL_C_FUNC(ThrowExceptionHelper)
45+
mov r0, r1
46+
b EXTERNAL_C_FUNC(ThrowExceptionHelper)
3847
LEAF_END ThrowExceptionFromContextInternal, _TEXT

src/pal/src/arch/arm64/asmconstants.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@
8888
#define CONTEXT_V29 CONTEXT_V28+16
8989
#define CONTEXT_V30 CONTEXT_V29+16
9090
#define CONTEXT_V31 CONTEXT_V30+16
91-
#define CONTEXT_FLOAT_CONTROL_OFFSET CONTEXT_V31
91+
#define CONTEXT_FLOAT_CONTROL_OFFSET CONTEXT_V31+16
9292
#define CONTEXT_Fpcr 0
93-
#define CONTEXT_Fpsr CONTEXT_Fpcr+4
93+
#define CONTEXT_Fpsr CONTEXT_Fpcr+8
9494

9595
#endif

src/pal/src/arch/arm64/context2.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,8 @@ LOCAL_LABEL(Done_CONTEXT_INTEGER):
9999
add x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET
100100
mrs x1, fpcr
101101
mrs x2, fpsr
102-
sub x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET
103102
stp x1, x2, [x0, CONTEXT_Fpcr]
104-
sub x0, x0, CONTEXT_NEON_OFFSET
103+
sub x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET + CONTEXT_NEON_OFFSET
105104

106105
LOCAL_LABEL(Done_CONTEXT_FLOATING_POINT):
107106
@@ -173,10 +172,11 @@ LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT):
173172
ldp q26, q27, [x16, CONTEXT_V26]
174173
ldp q28, q29, [x16, CONTEXT_V28]
175174
ldp q30, q31, [x16, CONTEXT_V30]
175+
add x16, x16, CONTEXT_FLOAT_CONTROL_OFFSET
176176
ldp x1, x2, [x16, CONTEXT_Fpcr]
177177
msr fpcr, x1
178178
msr fpsr, x2
179-
sub x16, x16, CONTEXT_NEON_OFFSET
179+
sub x16, x16, CONTEXT_FLOAT_CONTROL_OFFSET + CONTEXT_NEON_OFFSET
180180

181181
LOCAL_LABEL(No_Restore_CONTEXT_FLOATING_POINT):
182182
tbz w17, #CONTEXT_INTEGER_BIT, LOCAL_LABEL(No_Restore_CONTEXT_INTEGER)

src/pal/src/arch/arm64/exceptionhelper.S

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ LEAF_ENTRY ThrowExceptionFromContextInternal, _TEXT
3131
ldp x26,x27, [x0, #(CONTEXT_X26)]
3232
ldp x28,fp, [x0, #(CONTEXT_X28)]
3333
ldr lr, [x0, #(CONTEXT_Pc)]
34+
35+
// Restore the lower 64 bits of v8-v15
36+
add x2, x0, CONTEXT_NEON_OFFSET
37+
ldr d8, [x2, #(CONTEXT_V8 )]
38+
ldr d9, [x2, #(CONTEXT_V9 )]
39+
ldr d10, [x2, #(CONTEXT_V10)]
40+
ldr d11, [x2, #(CONTEXT_V11)]
41+
ldr d12, [x2, #(CONTEXT_V12)]
42+
ldr d13, [x2, #(CONTEXT_V13)]
43+
ldr d14, [x2, #(CONTEXT_V14)]
44+
ldr d15, [x2, #(CONTEXT_V15)]
45+
3446
ldr x2, [x0, #(CONTEXT_Sp)]
3547
mov sp, x2
3648

src/pal/src/include/pal/context.h

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,44 @@ inline void *FPREG_Xstate_Ymmh(const ucontext_t *uc)
277277
#define MCREG_Sp(mc) ((mc).sp)
278278
#define MCREG_Pc(mc) ((mc).pc)
279279
#define MCREG_Cpsr(mc) ((mc).pstate)
280+
281+
282+
inline
283+
fpsimd_context* GetNativeSigSimdContext(native_context_t *mc)
284+
{
285+
size_t size = 0;
286+
287+
do
288+
{
289+
fpsimd_context* fp = reinterpret_cast<fpsimd_context *>(&mc->uc_mcontext.__reserved[size]);
290+
291+
if(fp->head.magic == FPSIMD_MAGIC)
292+
{
293+
_ASSERTE(fp->head.size >= sizeof(fpsimd_context));
294+
_ASSERTE(size + fp->head.size <= sizeof(mc->uc_mcontext.__reserved));
295+
296+
return fp;
297+
}
298+
299+
if (fp->head.size == 0)
300+
{
301+
break;
302+
}
303+
304+
size += fp->head.size;
305+
} while (size + sizeof(fpsimd_context) <= sizeof(mc->uc_mcontext.__reserved));
306+
307+
_ASSERTE(false);
308+
309+
return nullptr;
310+
}
311+
312+
inline
313+
const fpsimd_context* GetConstNativeSigSimdContext(const native_context_t *mc)
314+
{
315+
return GetNativeSigSimdContext(const_cast<native_context_t*>(mc));
316+
}
317+
280318
#else
281319
// For FreeBSD, as found in x86/ucontext.h
282320
#define MCREG_Rbp(mc) ((mc).mc_rbp)
@@ -337,6 +375,59 @@ inline void *FPREG_Xstate_Ymmh(const ucontext_t *uc)
337375
#define MCREG_Pc(mc) ((mc).arm_pc)
338376
#define MCREG_Cpsr(mc) ((mc).arm_cpsr)
339377

378+
379+
// Flatterned layout of the arm kernel struct vfp_sigframe
380+
struct VfpSigFrame
381+
{
382+
DWORD magic;
383+
DWORD size;
384+
DWORD64 D[32]; // Some arm cpus have 16 D registers. The kernel will ignore the extra.
385+
DWORD Fpscr;
386+
DWORD Padding;
387+
DWORD Fpexc;
388+
DWORD Fpinst;
389+
DWORD Fpinst2;
390+
DWORD Padding2;
391+
};
392+
393+
inline
394+
VfpSigFrame* GetNativeSigSimdContext(native_context_t *mc)
395+
{
396+
size_t size = 0;
397+
398+
const DWORD VfpMagic = 0x56465001; // VFP_MAGIC from arm kernel
399+
400+
do
401+
{
402+
VfpSigFrame* fp = reinterpret_cast<VfpSigFrame *>(&mc->uc_regspace[size]);
403+
404+
if (fp->magic == VfpMagic)
405+
{
406+
_ASSERTE(fp->size == sizeof(VfpSigFrame));
407+
_ASSERTE(size + fp->size <= sizeof(mc->uc_regspace));
408+
409+
return fp;
410+
}
411+
412+
if (fp->size == 0)
413+
{
414+
break;
415+
}
416+
417+
size += fp->size;
418+
} while (size + sizeof(VfpSigFrame) <= sizeof(mc->uc_regspace));
419+
420+
// VFP is not required on all armv7 processors, this structure may not be present
421+
422+
return nullptr;
423+
}
424+
425+
inline
426+
const VfpSigFrame* GetConstNativeSigSimdContext(const native_context_t *mc)
427+
{
428+
return GetNativeSigSimdContext(const_cast<native_context_t*>(mc));
429+
}
430+
340431
#elif defined(_X86_)
341432

342433
#define MCREG_Ebx(mc) ((mc).mc_ebx)

src/pal/src/thread/context.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,27 @@ void CONTEXTToNativeContext(CONST CONTEXT *lpContext, native_context_t *native)
465465
{
466466
FPREG_Xmm(native, i) = lpContext->FltSave.XmmRegisters[i];
467467
}
468+
#elif defined(_ARM64_)
469+
fpsimd_context* fp = GetNativeSigSimdContext(native);
470+
if (fp)
471+
{
472+
fp->fpsr = lpContext->Fpsr;
473+
fp->fpcr = lpContext->Fpcr;
474+
for (int i = 0; i < 32; i++)
475+
{
476+
*(NEON128*) &fp->vregs[i] = lpContext->V[i];
477+
}
478+
}
479+
#elif defined(_ARM_)
480+
VfpSigFrame* fp = GetNativeSigSimdContext(native);
481+
if (fp)
482+
{
483+
fp->Fpscr = lpContext->Fpscr;
484+
for (int i = 0; i < 32; i++)
485+
{
486+
fp->D[i] = lpContext->D[i];
487+
}
488+
}
468489
#endif
469490
}
470491

@@ -563,6 +584,33 @@ void CONTEXTFromNativeContext(const native_context_t *native, LPCONTEXT lpContex
563584
{
564585
lpContext->FltSave.XmmRegisters[i] = FPREG_Xmm(native, i);
565586
}
587+
#elif defined(_ARM64_)
588+
const fpsimd_context* fp = GetConstNativeSigSimdContext(native);
589+
if (fp)
590+
{
591+
lpContext->Fpsr = fp->fpsr;
592+
lpContext->Fpcr = fp->fpcr;
593+
for (int i = 0; i < 32; i++)
594+
{
595+
lpContext->V[i] = *(NEON128*) &fp->vregs[i];
596+
}
597+
}
598+
#elif defined(_ARM_)
599+
const VfpSigFrame* fp = GetConstNativeSigSimdContext(native);
600+
if (fp)
601+
{
602+
lpContext->Fpscr = fp->Fpscr;
603+
for (int i = 0; i < 32; i++)
604+
{
605+
lpContext->D[i] = fp->D[i];
606+
}
607+
}
608+
else
609+
{
610+
// Floating point state is not valid
611+
// Mark the context correctly
612+
lpContext->ContextFlags &= ~(ULONG)CONTEXT_FLOATING_POINT;
613+
}
566614
#endif
567615
}
568616

0 commit comments

Comments
 (0)