1 //===-- RegisterContextMinidump_x86_32.cpp ----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // Project includes 11 #include "RegisterContextMinidump_x86_32.h" 12 13 // Other libraries and framework includes 14 #include "lldb/Core/DataBufferHeap.h" 15 16 // C includes 17 // C++ includes 18 19 using namespace lldb_private; 20 using namespace minidump; 21 22 static void writeRegister(const void *reg_src, 23 llvm::MutableArrayRef<uint8_t> reg_dest) { 24 memcpy(reg_dest.data(), reg_src, reg_dest.size()); 25 } 26 27 lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_32( 28 llvm::ArrayRef<uint8_t> source_data, 29 RegisterInfoInterface *target_reg_interface) { 30 31 const RegisterInfo *reg_info = target_reg_interface->GetRegisterInfo(); 32 33 lldb::DataBufferSP result_context_buf( 34 new DataBufferHeap(target_reg_interface->GetGPRSize(), 0)); 35 uint8_t *result_base = result_context_buf->GetBytes(); 36 37 if (source_data.size() < sizeof(MinidumpContext_x86_32)) 38 return nullptr; 39 40 const MinidumpContext_x86_32 *context; 41 consumeObject(source_data, context); 42 43 const MinidumpContext_x86_32_Flags context_flags = 44 static_cast<MinidumpContext_x86_32_Flags>( 45 static_cast<uint32_t>(context->context_flags)); 46 auto x86_32_Flag = MinidumpContext_x86_32_Flags::x86_32_Flag; 47 auto ControlFlag = MinidumpContext_x86_32_Flags::Control; 48 auto IntegerFlag = MinidumpContext_x86_32_Flags::Integer; 49 auto SegmentsFlag = MinidumpContext_x86_32_Flags::Segments; 50 51 if ((context_flags & x86_32_Flag) != x86_32_Flag) { 52 return nullptr; 53 } 54 55 if ((context_flags & ControlFlag) == ControlFlag) { 56 writeRegister(&context->ebp, 57 reg_info[lldb_ebp_i386].mutable_data(result_base)); 58 writeRegister(&context->eip, 59 reg_info[lldb_eip_i386].mutable_data(result_base)); 60 writeRegister(&context->cs, 61 reg_info[lldb_cs_i386].mutable_data(result_base)); 62 writeRegister(&context->eflags, 63 reg_info[lldb_eflags_i386].mutable_data(result_base)); 64 writeRegister(&context->esp, 65 reg_info[lldb_esp_i386].mutable_data(result_base)); 66 writeRegister(&context->ss, 67 reg_info[lldb_ss_i386].mutable_data(result_base)); 68 } 69 70 if ((context_flags & SegmentsFlag) == SegmentsFlag) { 71 writeRegister(&context->ds, 72 reg_info[lldb_ds_i386].mutable_data(result_base)); 73 writeRegister(&context->es, 74 reg_info[lldb_es_i386].mutable_data(result_base)); 75 writeRegister(&context->fs, 76 reg_info[lldb_fs_i386].mutable_data(result_base)); 77 writeRegister(&context->gs, 78 reg_info[lldb_gs_i386].mutable_data(result_base)); 79 } 80 81 if ((context_flags & IntegerFlag) == IntegerFlag) { 82 writeRegister(&context->eax, 83 reg_info[lldb_eax_i386].mutable_data(result_base)); 84 writeRegister(&context->ecx, 85 reg_info[lldb_ecx_i386].mutable_data(result_base)); 86 writeRegister(&context->edx, 87 reg_info[lldb_edx_i386].mutable_data(result_base)); 88 writeRegister(&context->ebx, 89 reg_info[lldb_ebx_i386].mutable_data(result_base)); 90 writeRegister(&context->esi, 91 reg_info[lldb_esi_i386].mutable_data(result_base)); 92 writeRegister(&context->edi, 93 reg_info[lldb_edi_i386].mutable_data(result_base)); 94 } 95 96 // TODO parse the floating point registers 97 98 return result_context_buf; 99 } 100