diff options
author | Ben Pye <ben@curlybracket.co.uk> | 2015-07-01 15:10:09 +0100 |
---|---|---|
committer | Ben Pye <ben@curlybracket.co.uk> | 2015-07-24 16:45:35 +0100 |
commit | 9cd8273572260317c6acc126333e5a6e56aaeb06 (patch) | |
tree | f125e83a6908151322aa20940b63c64c621c1169 /src/vm/arm/armsinglestepper.cpp | |
parent | acca43b33dcd97d1dc5d92147a3047a3bdfaf1ce (diff) | |
download | coreclr-9cd8273572260317c6acc126333e5a6e56aaeb06.tar.gz coreclr-9cd8273572260317c6acc126333e5a6e56aaeb06.tar.bz2 coreclr-9cd8273572260317c6acc126333e5a6e56aaeb06.zip |
Add ARM target for CoreCLR on Linux.
c_runtime/vprintf/test1 is disabled as casting NULL to va_list is
against the C specification.
Fix SetFilePointer tests on 32 bit platforms.
Define _FILE_OFFSET_BITS=64 so that we have long file support on 32 bit
platforms.
Implement context capture/restore for ARM.
Link libgcc_s before libunwind on ARM so C++ exceptions work.
Translate armasm to gas syntax.
Specify Thumb, VFPv3, ARMv7 for the ARM target.
Add ARM configuration to mscorlib build
Implement GetLogicalProcessorCacheSizeFromOS in PAL.
Set UNWIND_CONTEXT_IS_UCONTEXT_T from configure check.
Diffstat (limited to 'src/vm/arm/armsinglestepper.cpp')
-rw-r--r-- | src/vm/arm/armsinglestepper.cpp | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/vm/arm/armsinglestepper.cpp b/src/vm/arm/armsinglestepper.cpp index a5b1d68112..46df245243 100644 --- a/src/vm/arm/armsinglestepper.cpp +++ b/src/vm/arm/armsinglestepper.cpp @@ -90,7 +90,7 @@ void ITState::Set(T_CONTEXT *pCtx) // ArmSingleStepper::ArmSingleStepper() : m_originalPc(0), m_targetPc(0), m_rgCode(0), m_state(Disabled), - m_fEmulatedITInstruction(false), m_fRedirectedPc(false), m_fBypass(false), m_fEmulate(false), m_fSkipIT(false) + m_fEmulatedITInstruction(false), m_fRedirectedPc(false), m_fEmulate(false), m_fBypass(false), m_fSkipIT(false) { m_opcodes[0] = 0; m_opcodes[1] = 0; @@ -98,14 +98,14 @@ ArmSingleStepper::ArmSingleStepper() ArmSingleStepper::~ArmSingleStepper() { -#ifndef DACCESS_COMPILE +#if !defined(DACCESS_COMPILE) && !defined(FEATURE_PAL) DeleteExecutable(m_rgCode); #endif } void ArmSingleStepper::Init() { -#ifndef DACCESS_COMPILE +#if !defined(DACCESS_COMPILE) && !defined(FEATURE_PAL) if (m_rgCode == NULL) { m_rgCode = new (executable) WORD[kMaxCodeBuffer]; @@ -543,34 +543,50 @@ void ArmSingleStepper::SetReg(T_CONTEXT *pCtx, DWORD reg, DWORD value) // fault. bool ArmSingleStepper::GetMem(DWORD *pdwResult, DWORD_PTR pAddress, DWORD cbSize, bool fSignExtend) { - __try + struct Param { - switch (cbSize) + DWORD *pdwResult; + DWORD_PTR pAddress; + DWORD cbSize; + bool fSignExtend; + bool bReturnValue; + } param; + + param.pdwResult = pdwResult; + param.pAddress = pAddress; + param.cbSize = cbSize; + param.fSignExtend = fSignExtend; + param.bReturnValue = true; + + PAL_TRY(Param *, pParam, ¶m) + { + switch (pParam->cbSize) { case 1: - *pdwResult = *(BYTE*)pAddress; - if (fSignExtend && (*pdwResult & 0x00000080)) - *pdwResult |= 0xffffff00; + *pParam->pdwResult = *(BYTE*)pParam->pAddress; + if (pParam->fSignExtend && (*pParam->pdwResult & 0x00000080)) + *pParam->pdwResult |= 0xffffff00; break; case 2: - *pdwResult = *(WORD*)pAddress; - if (fSignExtend && (*pdwResult & 0x00008000)) - *pdwResult |= 0xffff0000; + *pParam->pdwResult = *(WORD*)pParam->pAddress; + if (pParam->fSignExtend && (*pParam->pdwResult & 0x00008000)) + *pParam->pdwResult |= 0xffff0000; break; case 4: - *pdwResult = *(DWORD*)pAddress; + *pParam->pdwResult = *(DWORD*)pParam->pAddress; break; default: UNREACHABLE(); - return false; + pParam->bReturnValue = false; } } - __except(EXCEPTION_EXECUTE_HANDLER) + PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - return false; + param.bReturnValue = false; } + PAL_ENDTRY; - return true; + return param.bReturnValue; } // Wrapper around GetMem above that will automatically return from TryEmulate() indicating the instruction |