1dda28197Spatrick //===-- RegisterContextMinidump_x86_32.cpp --------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "RegisterContextMinidump_x86_32.h"
10061da546Spatrick
11061da546Spatrick #include "lldb/Utility/DataBufferHeap.h"
12061da546Spatrick
13061da546Spatrick // C includes
14061da546Spatrick // C++ includes
15061da546Spatrick
16061da546Spatrick using namespace lldb_private;
17061da546Spatrick using namespace minidump;
18061da546Spatrick
writeRegister(const void * reg_src,llvm::MutableArrayRef<uint8_t> reg_dest)19061da546Spatrick static void writeRegister(const void *reg_src,
20061da546Spatrick llvm::MutableArrayRef<uint8_t> reg_dest) {
21061da546Spatrick memcpy(reg_dest.data(), reg_src, reg_dest.size());
22061da546Spatrick }
23061da546Spatrick
ConvertMinidumpContext_x86_32(llvm::ArrayRef<uint8_t> source_data,RegisterInfoInterface * target_reg_interface)24061da546Spatrick lldb::DataBufferSP lldb_private::minidump::ConvertMinidumpContext_x86_32(
25061da546Spatrick llvm::ArrayRef<uint8_t> source_data,
26061da546Spatrick RegisterInfoInterface *target_reg_interface) {
27061da546Spatrick
28061da546Spatrick const RegisterInfo *reg_info = target_reg_interface->GetRegisterInfo();
29061da546Spatrick
30*f6aab3d8Srobert lldb::WritableDataBufferSP result_context_buf(
31061da546Spatrick new DataBufferHeap(target_reg_interface->GetGPRSize(), 0));
32061da546Spatrick uint8_t *result_base = result_context_buf->GetBytes();
33061da546Spatrick
34061da546Spatrick if (source_data.size() < sizeof(MinidumpContext_x86_32))
35061da546Spatrick return nullptr;
36061da546Spatrick
37061da546Spatrick const MinidumpContext_x86_32 *context;
38061da546Spatrick consumeObject(source_data, context);
39061da546Spatrick
40061da546Spatrick const MinidumpContext_x86_32_Flags context_flags =
41061da546Spatrick static_cast<MinidumpContext_x86_32_Flags>(
42061da546Spatrick static_cast<uint32_t>(context->context_flags));
43061da546Spatrick auto x86_32_Flag = MinidumpContext_x86_32_Flags::x86_32_Flag;
44061da546Spatrick auto ControlFlag = MinidumpContext_x86_32_Flags::Control;
45061da546Spatrick auto IntegerFlag = MinidumpContext_x86_32_Flags::Integer;
46061da546Spatrick auto SegmentsFlag = MinidumpContext_x86_32_Flags::Segments;
47061da546Spatrick
48061da546Spatrick if ((context_flags & x86_32_Flag) != x86_32_Flag) {
49061da546Spatrick return nullptr;
50061da546Spatrick }
51061da546Spatrick
52061da546Spatrick if ((context_flags & ControlFlag) == ControlFlag) {
53061da546Spatrick writeRegister(&context->ebp,
54061da546Spatrick reg_info[lldb_ebp_i386].mutable_data(result_base));
55061da546Spatrick writeRegister(&context->eip,
56061da546Spatrick reg_info[lldb_eip_i386].mutable_data(result_base));
57061da546Spatrick writeRegister(&context->cs,
58061da546Spatrick reg_info[lldb_cs_i386].mutable_data(result_base));
59061da546Spatrick writeRegister(&context->eflags,
60061da546Spatrick reg_info[lldb_eflags_i386].mutable_data(result_base));
61061da546Spatrick writeRegister(&context->esp,
62061da546Spatrick reg_info[lldb_esp_i386].mutable_data(result_base));
63061da546Spatrick writeRegister(&context->ss,
64061da546Spatrick reg_info[lldb_ss_i386].mutable_data(result_base));
65061da546Spatrick }
66061da546Spatrick
67061da546Spatrick if ((context_flags & SegmentsFlag) == SegmentsFlag) {
68061da546Spatrick writeRegister(&context->ds,
69061da546Spatrick reg_info[lldb_ds_i386].mutable_data(result_base));
70061da546Spatrick writeRegister(&context->es,
71061da546Spatrick reg_info[lldb_es_i386].mutable_data(result_base));
72061da546Spatrick writeRegister(&context->fs,
73061da546Spatrick reg_info[lldb_fs_i386].mutable_data(result_base));
74061da546Spatrick writeRegister(&context->gs,
75061da546Spatrick reg_info[lldb_gs_i386].mutable_data(result_base));
76061da546Spatrick }
77061da546Spatrick
78061da546Spatrick if ((context_flags & IntegerFlag) == IntegerFlag) {
79061da546Spatrick writeRegister(&context->eax,
80061da546Spatrick reg_info[lldb_eax_i386].mutable_data(result_base));
81061da546Spatrick writeRegister(&context->ecx,
82061da546Spatrick reg_info[lldb_ecx_i386].mutable_data(result_base));
83061da546Spatrick writeRegister(&context->edx,
84061da546Spatrick reg_info[lldb_edx_i386].mutable_data(result_base));
85061da546Spatrick writeRegister(&context->ebx,
86061da546Spatrick reg_info[lldb_ebx_i386].mutable_data(result_base));
87061da546Spatrick writeRegister(&context->esi,
88061da546Spatrick reg_info[lldb_esi_i386].mutable_data(result_base));
89061da546Spatrick writeRegister(&context->edi,
90061da546Spatrick reg_info[lldb_edi_i386].mutable_data(result_base));
91061da546Spatrick }
92061da546Spatrick
93061da546Spatrick // TODO parse the floating point registers
94061da546Spatrick
95061da546Spatrick return result_context_buf;
96061da546Spatrick }
97