1 //===-- RegisterContextMinidump_x86_64.cpp --------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "RegisterContextMinidump_x86_64.h"
11 #include "lldb/Utility/DataBufferHeap.h"
16 using namespace lldb_private
;
17 using namespace minidump
;
19 static llvm::MutableArrayRef
<uint8_t> getDestRegister(uint8_t *context
,
20 const RegisterInfo
®
) {
21 auto bytes
= reg
.mutable_data(context
);
23 switch (reg
.kinds
[lldb::eRegisterKindLLDB
]) {
30 return bytes
.take_front(2);
32 case lldb_rflags_x86_64
:
33 return bytes
.take_front(4);
36 return bytes
.take_front(8);
41 static void writeRegister(const void *reg_src
, uint8_t *context
,
42 const RegisterInfo
®
) {
43 llvm::MutableArrayRef
<uint8_t> reg_dest
= getDestRegister(context
, reg
);
44 memcpy(reg_dest
.data(), reg_src
, reg_dest
.size());
47 lldb::DataBufferSP
lldb_private::minidump::ConvertMinidumpContext_x86_64(
48 llvm::ArrayRef
<uint8_t> source_data
,
49 RegisterInfoInterface
*target_reg_interface
) {
51 const RegisterInfo
*reg_info
= target_reg_interface
->GetRegisterInfo();
53 lldb::WritableDataBufferSP
result_context_buf(
54 new DataBufferHeap(target_reg_interface
->GetGPRSize(), 0));
55 uint8_t *result_base
= result_context_buf
->GetBytes();
57 if (source_data
.size() < sizeof(MinidumpContext_x86_64
))
60 const MinidumpContext_x86_64
*context
;
61 consumeObject(source_data
, context
);
63 const MinidumpContext_x86_64_Flags context_flags
=
64 static_cast<MinidumpContext_x86_64_Flags
>(
65 static_cast<uint32_t>(context
->context_flags
));
66 auto x86_64_Flag
= MinidumpContext_x86_64_Flags::x86_64_Flag
;
67 auto ControlFlag
= MinidumpContext_x86_64_Flags::Control
;
68 auto IntegerFlag
= MinidumpContext_x86_64_Flags::Integer
;
69 auto SegmentsFlag
= MinidumpContext_x86_64_Flags::Segments
;
71 if ((context_flags
& x86_64_Flag
) != x86_64_Flag
)
74 if ((context_flags
& ControlFlag
) == ControlFlag
) {
75 writeRegister(&context
->cs
, result_base
, reg_info
[lldb_cs_x86_64
]);
76 writeRegister(&context
->ss
, result_base
, reg_info
[lldb_ss_x86_64
]);
77 writeRegister(&context
->eflags
, result_base
, reg_info
[lldb_rflags_x86_64
]);
78 writeRegister(&context
->rsp
, result_base
, reg_info
[lldb_rsp_x86_64
]);
79 writeRegister(&context
->rip
, result_base
, reg_info
[lldb_rip_x86_64
]);
82 if ((context_flags
& SegmentsFlag
) == SegmentsFlag
) {
83 writeRegister(&context
->ds
, result_base
, reg_info
[lldb_ds_x86_64
]);
84 writeRegister(&context
->es
, result_base
, reg_info
[lldb_es_x86_64
]);
85 writeRegister(&context
->fs
, result_base
, reg_info
[lldb_fs_x86_64
]);
86 writeRegister(&context
->gs
, result_base
, reg_info
[lldb_gs_x86_64
]);
89 if ((context_flags
& IntegerFlag
) == IntegerFlag
) {
90 writeRegister(&context
->rax
, result_base
, reg_info
[lldb_rax_x86_64
]);
91 writeRegister(&context
->rcx
, result_base
, reg_info
[lldb_rcx_x86_64
]);
92 writeRegister(&context
->rdx
, result_base
, reg_info
[lldb_rdx_x86_64
]);
93 writeRegister(&context
->rbx
, result_base
, reg_info
[lldb_rbx_x86_64
]);
94 writeRegister(&context
->rbp
, result_base
, reg_info
[lldb_rbp_x86_64
]);
95 writeRegister(&context
->rsi
, result_base
, reg_info
[lldb_rsi_x86_64
]);
96 writeRegister(&context
->rdi
, result_base
, reg_info
[lldb_rdi_x86_64
]);
97 writeRegister(&context
->r8
, result_base
, reg_info
[lldb_r8_x86_64
]);
98 writeRegister(&context
->r9
, result_base
, reg_info
[lldb_r9_x86_64
]);
99 writeRegister(&context
->r10
, result_base
, reg_info
[lldb_r10_x86_64
]);
100 writeRegister(&context
->r11
, result_base
, reg_info
[lldb_r11_x86_64
]);
101 writeRegister(&context
->r12
, result_base
, reg_info
[lldb_r12_x86_64
]);
102 writeRegister(&context
->r13
, result_base
, reg_info
[lldb_r13_x86_64
]);
103 writeRegister(&context
->r14
, result_base
, reg_info
[lldb_r14_x86_64
]);
104 writeRegister(&context
->r15
, result_base
, reg_info
[lldb_r15_x86_64
]);
107 // TODO parse the floating point registers
109 return result_context_buf
;