Add Linux x86 createdump code.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Tue, 22 Feb 2022 14:58:35 +0000 (06:58 -0800)
committerGleb Balykov <g.balykov@samsung.com>
Tue, 27 Sep 2022 12:50:22 +0000 (15:50 +0300)
src/coreclr/CMakeLists.txt
src/coreclr/debug/createdump/threadinfo.h
src/coreclr/debug/createdump/threadinfounix.cpp

index 77bd6c7..ec64a93 100644 (file)
@@ -192,9 +192,9 @@ endif(CLR_CMAKE_TARGET_WIN32 AND FEATURE_EVENT_TRACE)
 add_subdirectory(debug/dbgutil)
 
 if(CLR_CMAKE_HOST_UNIX)
-  if(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
+  if(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ANDROID))
     add_subdirectory(debug/createdump)
-  endif(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
+  endif(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_ANDROID))
 
   # Include the dummy c++ include files
   include_directories("pal/inc/rt/cpp")
index 0cd8e05..cb88ce2 100644 (file)
@@ -120,6 +120,9 @@ public:
     inline const user_fpregs_struct* FPRegisters() const { return &m_fpRegisters; }
 #if defined(__i386__)
     inline const user_fpxregs_struct* FPXRegisters() const { return &m_fpxRegisters; }
+    inline const uint64_t GetInstructionPointer() const { return m_gpRegisters.eip; }
+    inline const uint64_t GetStackPointer() const { return m_gpRegisters.esp; }
+    inline const uint64_t GetFramePointer() const { return m_gpRegisters.ebp; }
 #elif defined(__arm__) && defined(__VFP_FP__) && !defined(__SOFTFP__)
     inline const user_vfpregs_struct* VFPRegisters() const { return &m_vfpRegisters; }
 #endif
index 37af34c..cf0a4dc 100644 (file)
@@ -57,6 +57,8 @@ ThreadInfo::Initialize()
     TRACE("Thread %04x PC %08lx SP %08lx\n", m_tid, (unsigned long)m_gpRegisters.ARM_pc, (unsigned long)m_gpRegisters.ARM_sp);
 #elif defined(__x86_64__)
     TRACE("Thread %04x RIP %016llx RSP %016llx\n", m_tid, (unsigned long long)m_gpRegisters.rip, (unsigned long long)m_gpRegisters.rsp);
+#elif defined(__i386__)
+    TRACE("Thread %04x EIP %08lx ESP %08lx\n", m_tid, (unsigned long)m_gpRegisters.eip, (unsigned long)m_gpRegisters.esp);
 #else
 #error "Unsupported architecture"
 #endif
@@ -188,6 +190,29 @@ ThreadInfo::GetThreadContext(uint32_t flags, CONTEXT* context) const
         context->Fpcr = m_fpRegisters.fpcr;
         context->Fpsr = m_fpRegisters.fpsr;
     }
+#elif defined(__i386__)
+    if ((flags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
+    {
+        context->Ebp = m_gpRegisters.ebp;
+        context->Eip = m_gpRegisters.eip;
+        context->EFlags = m_gpRegisters.eflags;
+        context->Esp = m_gpRegisters.esp;
+        context->SegCs = m_gpRegisters.xcs;
+        context->SegSs = m_gpRegisters.xss;
+        context->SegGs_PAL_Undefined = m_gpRegisters.xgs;
+        context->SegFs_PAL_Undefined = m_gpRegisters.xfs;
+        context->SegEs_PAL_Undefined = m_gpRegisters.xes;
+        context->SegDs_PAL_Undefined = m_gpRegisters.xds;
+    }
+    if ((flags & CONTEXT_INTEGER) == CONTEXT_INTEGER)
+    {
+        context->Edi = m_gpRegisters.edi;
+        context->Esi = m_gpRegisters.esi;
+        context->Ebx = m_gpRegisters.ebx;
+        context->Edx = m_gpRegisters.edx;
+        context->Ecx = m_gpRegisters.ecx;
+        context->Eax = m_gpRegisters.eax;
+    }
 #elif defined(__arm__)
     if ((flags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
     {