summaryrefslogtreecommitdiff
path: root/src/vm/arm/armsinglestepper.cpp
diff options
context:
space:
mode:
authorBen Pye <ben@curlybracket.co.uk>2015-07-01 15:10:09 +0100
committerBen Pye <ben@curlybracket.co.uk>2015-07-24 16:45:35 +0100
commit9cd8273572260317c6acc126333e5a6e56aaeb06 (patch)
treef125e83a6908151322aa20940b63c64c621c1169 /src/vm/arm/armsinglestepper.cpp
parentacca43b33dcd97d1dc5d92147a3047a3bdfaf1ce (diff)
downloadcoreclr-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.cpp48
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, &param)
+ {
+ 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