diff options
author | Jan Vorlicek <janvorli@microsoft.com> | 2015-07-31 21:48:05 +0200 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2015-07-31 21:48:05 +0200 |
commit | c906eafd4c0cd361b78b1772d7a3307ac284a452 (patch) | |
tree | 7f759e0862db6b5b7801b3268cfd3faa61442ec6 /src/unwinder | |
parent | ac53e056df86db99a4c353b5cf1e0a9612900e62 (diff) | |
parent | bb1d4ca091d129968f367bbf03755441ce5036ab (diff) | |
download | coreclr-c906eafd4c0cd361b78b1772d7a3307ac284a452.tar.gz coreclr-c906eafd4c0cd361b78b1772d7a3307ac284a452.tar.bz2 coreclr-c906eafd4c0cd361b78b1772d7a3307ac284a452.zip |
Merge pull request #1285 from benpye/linux-arm-stack-unwinding
Add unwinding for the ARM Linux platform
Diffstat (limited to 'src/unwinder')
-rw-r--r-- | src/unwinder/arm/unwinder_arm.cpp | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/src/unwinder/arm/unwinder_arm.cpp b/src/unwinder/arm/unwinder_arm.cpp index a07d9e74a1..8cf93f7a4e 100644 --- a/src/unwinder/arm/unwinder_arm.cpp +++ b/src/unwinder/arm/unwinder_arm.cpp @@ -20,8 +20,29 @@ #define STATUS_UNWIND_UNSUPPORTED_VERSION STATUS_UNSUCCESSFUL -#define UPDATE_CONTEXT_POINTERS(Params, RegisterNumber, Address) -#define UPDATE_FP_CONTEXT_POINTERS(Params, RegisterNumber, Address) +#define UPDATE_CONTEXT_POINTERS(Params, RegisterNumber, Address) \ +do { \ + PKNONVOLATILE_CONTEXT_POINTERS ContextPointers = (Params)->ContextPointers; \ + if (ARGUMENT_PRESENT(ContextPointers)) { \ + if (RegisterNumber >= 4 && RegisterNumber <= 11) { \ + (&ContextPointers->R4)[RegisterNumber - 4] = (PULONG)Address; \ + } else if (RegisterNumber == 14) { \ + ContextPointers->Lr = (PULONG)Address; \ + } \ + } \ +} while (0) + +#define UPDATE_FP_CONTEXT_POINTERS(Params, RegisterNumber, Address) \ +do { \ + PKNONVOLATILE_CONTEXT_POINTERS ContextPointers = (Params)->ContextPointers; \ + if (ARGUMENT_PRESENT(ContextPointers) && \ + (RegisterNumber >= 8) && \ + (RegisterNumber <= 15)) { \ + \ + (&ContextPointers->D8)[RegisterNumber - 8] = (PULONGLONG)Address; \ + } \ +} while (0) + #define VALIDATE_STACK_ADDRESS(Params, Context, DataSize, Alignment, OutStatus) #define UNWIND_PARAMS_SET_TRAP_FRAME(Params, Address) @@ -32,6 +53,10 @@ #define CONTEXT_REGISTER(ctx, idx) ((&(ctx)->R0)[idx]) +typedef struct _ARM_UNWIND_PARAMS +{ + PKNONVOLATILE_CONTEXT_POINTERS ContextPointers; +} ARM_UNWIND_PARAMS, *PARM_UNWIND_PARAMS; // // The ConditionTable is used to look up the state of a condition @@ -230,7 +255,7 @@ NTSTATUS RtlpUnwindCustom( __inout PT_CONTEXT ContextRecord, __in BYTE Opcode, - __in PVOID UnwindParams + __in PARM_UNWIND_PARAMS UnwindParams ) /*++ @@ -358,7 +383,7 @@ RtlpPopVfpRegisterRange( __inout PT_CONTEXT ContextRecord, __in ULONG RegStart, __in ULONG RegStop, - __in PVOID UnwindParams + __in PARM_UNWIND_PARAMS UnwindParams ) /*++ @@ -457,7 +482,7 @@ NTSTATUS RtlpPopRegisterMask( __inout PT_CONTEXT ContextRecord, __in WORD RegMask, - __in PVOID UnwindParams + __in PARM_UNWIND_PARAMS UnwindParams ) /*++ @@ -624,7 +649,7 @@ RtlpUnwindFunctionCompact( __out PULONG EstablisherFrame, __deref_opt_out_opt PEXCEPTION_ROUTINE *HandlerRoutine, __out PVOID *HandlerData, - __in PVOID UnwindParams + __in PARM_UNWIND_PARAMS UnwindParams ) { ULONG CBit; @@ -894,7 +919,7 @@ RtlpUnwindFunctionFull( __out PULONG EstablisherFrame, __deref_opt_out_opt PEXCEPTION_ROUTINE *HandlerRoutine, __out PVOID *HandlerData, - __in PVOID UnwindParams + __in PARM_UNWIND_PARAMS UnwindParams ) /*++ @@ -1480,8 +1505,41 @@ PEXCEPTION_ROUTINE RtlVirtualUnwind( __inout_opt PKNONVOLATILE_CONTEXT_POINTERS ContextPointers ) { - PORTABILITY_ASSERT("Implement for PAL"); + PEXCEPTION_ROUTINE handlerRoutine; + HRESULT res; + + IMAGE_ARM_RUNTIME_FUNCTION_ENTRY rfe; + rfe.BeginAddress = FunctionEntry->BeginAddress; + rfe.UnwindData = FunctionEntry->UnwindData; + + ARM_UNWIND_PARAMS unwindParams; + unwindParams.ContextPointers = ContextPointers; + + if ((FunctionEntry->UnwindData & 3) != 0) + { + res = RtlpUnwindFunctionCompact(ControlPc - ImageBase, + &rfe, + ContextRecord, + EstablisherFrame, + &handlerRoutine, + HandlerData, + &unwindParams); + + } + else + { + res = RtlpUnwindFunctionFull(ControlPc - ImageBase, + ImageBase, + &rfe, + ContextRecord, + EstablisherFrame, + &handlerRoutine, + HandlerData, + &unwindParams); + } + + _ASSERTE(SUCCEEDED(res)); - return NULL; + return handlerRoutine; } #endif |