1 //===-- RegisterContext.cpp -----------------------------------------------===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Target/RegisterContext.h" 10 #include "lldb/Core/Module.h" 11 #include "lldb/Core/Value.h" 12 #include "lldb/Expression/DWARFExpression.h" 13 #include "lldb/Target/ExecutionContext.h" 14 #include "lldb/Target/Process.h" 15 #include "lldb/Target/StackFrame.h" 16 #include "lldb/Target/Target.h" 17 #include "lldb/Target/Thread.h" 18 #include "lldb/Utility/DataExtractor.h" 19 #include "lldb/Utility/Endian.h" 20 #include "lldb/Utility/RegisterValue.h" 21 #include "lldb/Utility/Scalar.h" 22 23 using namespace lldb; 24 using namespace lldb_private; 25 26 RegisterContext::RegisterContext(Thread &thread, uint32_t concrete_frame_idx) 27 : m_thread(thread), m_concrete_frame_idx(concrete_frame_idx), 28 m_stop_id(thread.GetProcess()->GetStopID()) {} 29 30 RegisterContext::~RegisterContext() = default; 31 32 void RegisterContext::InvalidateIfNeeded(bool force) { 33 ProcessSP process_sp(m_thread.GetProcess()); 34 bool invalidate = force; 35 uint32_t process_stop_id = UINT32_MAX; 36 37 if (process_sp) 38 process_stop_id = process_sp->GetStopID(); 39 else 40 invalidate = true; 41 42 if (!invalidate) 43 invalidate = process_stop_id != GetStopID(); 44 45 if (invalidate) { 46 InvalidateAllRegisters(); 47 SetStopID(process_stop_id); 48 } 49 } 50 51 const RegisterInfo * 52 RegisterContext::GetRegisterInfoByName(llvm::StringRef reg_name, 53 uint32_t start_idx) { 54 if (reg_name.empty()) 55 return nullptr; 56 57 // Generic register names take precedence over specific register names. 58 // For example, on x86 we want "sp" to refer to the complete RSP/ESP register 59 // rather than the 16-bit SP pseudo-register. 60 uint32_t generic_reg = Args::StringToGenericRegister(reg_name); 61 if (generic_reg != LLDB_INVALID_REGNUM) { 62 const RegisterInfo *reg_info = 63 GetRegisterInfo(eRegisterKindGeneric, generic_reg); 64 if (reg_info) 65 return reg_info; 66 } 67 68 const uint32_t num_registers = GetRegisterCount(); 69 for (uint32_t reg = start_idx; reg < num_registers; ++reg) { 70 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); 71 72 if (reg_name.equals_insensitive(reg_info->name) || 73 reg_name.equals_insensitive(reg_info->alt_name)) 74 return reg_info; 75 } 76 77 return nullptr; 78 } 79 80 uint32_t 81 RegisterContext::UpdateDynamicRegisterSize(const lldb_private::ArchSpec &arch, 82 RegisterInfo *reg_info) { 83 ExecutionContext exe_ctx(CalculateThread()); 84 85 // In MIPS, the floating point registers size is depends on FR bit of SR 86 // register. if SR.FR == 1 then all floating point registers are 64 bits. 87 // else they are all 32 bits. 88 89 int expr_result; 90 uint32_t addr_size = arch.GetAddressByteSize(); 91 const uint8_t *dwarf_opcode_ptr = reg_info->dynamic_size_dwarf_expr_bytes; 92 const size_t dwarf_opcode_len = reg_info->dynamic_size_dwarf_len; 93 94 DataExtractor dwarf_data(dwarf_opcode_ptr, dwarf_opcode_len, 95 arch.GetByteOrder(), addr_size); 96 ModuleSP opcode_ctx; 97 DWARFExpression dwarf_expr(opcode_ctx, dwarf_data, nullptr); 98 Value result; 99 Status error; 100 if (dwarf_expr.Evaluate(&exe_ctx, this, opcode_ctx, dwarf_data, nullptr, 101 eRegisterKindDWARF, nullptr, nullptr, result, 102 &error)) { 103 expr_result = result.GetScalar().SInt(-1); 104 switch (expr_result) { 105 case 0: 106 return 4; 107 case 1: 108 return 8; 109 default: 110 return reg_info->byte_size; 111 } 112 } else { 113 printf("Error executing DwarfExpression::Evaluate %s\n", error.AsCString()); 114 return reg_info->byte_size; 115 } 116 } 117 118 const RegisterInfo *RegisterContext::GetRegisterInfo(lldb::RegisterKind kind, 119 uint32_t num) { 120 const uint32_t reg_num = ConvertRegisterKindToRegisterNumber(kind, num); 121 if (reg_num == LLDB_INVALID_REGNUM) 122 return nullptr; 123 return GetRegisterInfoAtIndex(reg_num); 124 } 125 126 const char *RegisterContext::GetRegisterName(uint32_t reg) { 127 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); 128 if (reg_info) 129 return reg_info->name; 130 return nullptr; 131 } 132 133 uint64_t RegisterContext::GetPC(uint64_t fail_value) { 134 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 135 LLDB_REGNUM_GENERIC_PC); 136 uint64_t pc = ReadRegisterAsUnsigned(reg, fail_value); 137 138 if (pc != fail_value) { 139 TargetSP target_sp = m_thread.CalculateTarget(); 140 if (target_sp) { 141 Target *target = target_sp.get(); 142 if (target) 143 pc = target->GetOpcodeLoadAddress(pc, AddressClass::eCode); 144 } 145 } 146 147 return pc; 148 } 149 150 bool RegisterContext::SetPC(uint64_t pc) { 151 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 152 LLDB_REGNUM_GENERIC_PC); 153 bool success = WriteRegisterFromUnsigned(reg, pc); 154 if (success) { 155 StackFrameSP frame_sp( 156 m_thread.GetFrameWithConcreteFrameIndex(m_concrete_frame_idx)); 157 if (frame_sp) 158 frame_sp->ChangePC(pc); 159 else 160 m_thread.ClearStackFrames(); 161 } 162 return success; 163 } 164 165 bool RegisterContext::GetPCForSymbolication(Address &address) { 166 addr_t pc = GetPC(LLDB_INVALID_ADDRESS); 167 if (pc == LLDB_INVALID_ADDRESS) 168 return false; 169 TargetSP target_sp = m_thread.CalculateTarget(); 170 if (!target_sp.get()) 171 return false; 172 173 if (!BehavesLikeZerothFrame() && pc != 0) 174 pc--; 175 address.SetLoadAddress(pc, target_sp.get()); 176 return true; 177 } 178 179 bool RegisterContext::SetPC(Address addr) { 180 TargetSP target_sp = m_thread.CalculateTarget(); 181 Target *target = target_sp.get(); 182 183 lldb::addr_t callAddr = addr.GetCallableLoadAddress(target); 184 if (callAddr == LLDB_INVALID_ADDRESS) 185 return false; 186 187 return SetPC(callAddr); 188 } 189 190 uint64_t RegisterContext::GetSP(uint64_t fail_value) { 191 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 192 LLDB_REGNUM_GENERIC_SP); 193 return ReadRegisterAsUnsigned(reg, fail_value); 194 } 195 196 bool RegisterContext::SetSP(uint64_t sp) { 197 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 198 LLDB_REGNUM_GENERIC_SP); 199 return WriteRegisterFromUnsigned(reg, sp); 200 } 201 202 uint64_t RegisterContext::GetFP(uint64_t fail_value) { 203 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 204 LLDB_REGNUM_GENERIC_FP); 205 return ReadRegisterAsUnsigned(reg, fail_value); 206 } 207 208 bool RegisterContext::SetFP(uint64_t fp) { 209 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 210 LLDB_REGNUM_GENERIC_FP); 211 return WriteRegisterFromUnsigned(reg, fp); 212 } 213 214 uint64_t RegisterContext::GetReturnAddress(uint64_t fail_value) { 215 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 216 LLDB_REGNUM_GENERIC_RA); 217 return ReadRegisterAsUnsigned(reg, fail_value); 218 } 219 220 uint64_t RegisterContext::GetFlags(uint64_t fail_value) { 221 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, 222 LLDB_REGNUM_GENERIC_FLAGS); 223 return ReadRegisterAsUnsigned(reg, fail_value); 224 } 225 226 uint64_t RegisterContext::ReadRegisterAsUnsigned(uint32_t reg, 227 uint64_t fail_value) { 228 if (reg != LLDB_INVALID_REGNUM) 229 return ReadRegisterAsUnsigned(GetRegisterInfoAtIndex(reg), fail_value); 230 return fail_value; 231 } 232 233 uint64_t RegisterContext::ReadRegisterAsUnsigned(const RegisterInfo *reg_info, 234 uint64_t fail_value) { 235 if (reg_info) { 236 RegisterValue value; 237 if (ReadRegister(reg_info, value)) 238 return value.GetAsUInt64(); 239 } 240 return fail_value; 241 } 242 243 bool RegisterContext::WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval) { 244 if (reg == LLDB_INVALID_REGNUM) 245 return false; 246 return WriteRegisterFromUnsigned(GetRegisterInfoAtIndex(reg), uval); 247 } 248 249 bool RegisterContext::WriteRegisterFromUnsigned(const RegisterInfo *reg_info, 250 uint64_t uval) { 251 if (reg_info) { 252 RegisterValue value; 253 if (value.SetUInt(uval, reg_info->byte_size)) 254 return WriteRegister(reg_info, value); 255 } 256 return false; 257 } 258 259 bool RegisterContext::CopyFromRegisterContext(lldb::RegisterContextSP context) { 260 uint32_t num_register_sets = context->GetRegisterSetCount(); 261 // We don't know that two threads have the same register context, so require 262 // the threads to be the same. 263 if (context->GetThreadID() != GetThreadID()) 264 return false; 265 266 if (num_register_sets != GetRegisterSetCount()) 267 return false; 268 269 RegisterContextSP frame_zero_context = m_thread.GetRegisterContext(); 270 271 for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx) { 272 const RegisterSet *const reg_set = GetRegisterSet(set_idx); 273 274 const uint32_t num_registers = reg_set->num_registers; 275 for (uint32_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) { 276 const uint32_t reg = reg_set->registers[reg_idx]; 277 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); 278 if (!reg_info || reg_info->value_regs) 279 continue; 280 RegisterValue reg_value; 281 282 // If we can reconstruct the register from the frame we are copying from, 283 // then do so, otherwise use the value from frame 0. 284 if (context->ReadRegister(reg_info, reg_value)) { 285 WriteRegister(reg_info, reg_value); 286 } else if (frame_zero_context->ReadRegister(reg_info, reg_value)) { 287 WriteRegister(reg_info, reg_value); 288 } 289 } 290 } 291 return true; 292 } 293 294 lldb::tid_t RegisterContext::GetThreadID() const { return m_thread.GetID(); } 295 296 uint32_t RegisterContext::NumSupportedHardwareBreakpoints() { return 0; } 297 298 uint32_t RegisterContext::SetHardwareBreakpoint(lldb::addr_t addr, 299 size_t size) { 300 return LLDB_INVALID_INDEX32; 301 } 302 303 // Used when parsing DWARF and EH frame information and any other object file 304 // sections that contain register numbers in them. 305 uint32_t 306 RegisterContext::ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 307 uint32_t num) { 308 const uint32_t num_regs = GetRegisterCount(); 309 310 assert(kind < kNumRegisterKinds); 311 for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 312 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg_idx); 313 314 if (reg_info->kinds[kind] == num) 315 return reg_idx; 316 } 317 318 return LLDB_INVALID_REGNUM; 319 } 320 321 bool RegisterContext::ClearHardwareBreakpoint(uint32_t hw_idx) { return false; } 322 323 uint32_t RegisterContext::NumSupportedHardwareWatchpoints() { return 0; } 324 325 uint32_t RegisterContext::SetHardwareWatchpoint(lldb::addr_t addr, size_t size, 326 bool read, bool write) { 327 return LLDB_INVALID_INDEX32; 328 } 329 330 bool RegisterContext::ClearHardwareWatchpoint(uint32_t hw_index) { 331 return false; 332 } 333 334 bool RegisterContext::HardwareSingleStep(bool enable) { return false; } 335 336 Status RegisterContext::ReadRegisterValueFromMemory( 337 const RegisterInfo *reg_info, lldb::addr_t src_addr, uint32_t src_len, 338 RegisterValue ®_value) { 339 Status error; 340 if (reg_info == nullptr) { 341 error.SetErrorString("invalid register info argument."); 342 return error; 343 } 344 345 // Moving from addr into a register 346 // 347 // Case 1: src_len == dst_len 348 // 349 // |AABBCCDD| Address contents 350 // |AABBCCDD| Register contents 351 // 352 // Case 2: src_len > dst_len 353 // 354 // Status! (The register should always be big enough to hold the data) 355 // 356 // Case 3: src_len < dst_len 357 // 358 // |AABB| Address contents 359 // |AABB0000| Register contents [on little-endian hardware] 360 // |0000AABB| Register contents [on big-endian hardware] 361 if (src_len > RegisterValue::kMaxRegisterByteSize) { 362 error.SetErrorString("register too small to receive memory data"); 363 return error; 364 } 365 366 const uint32_t dst_len = reg_info->byte_size; 367 368 if (src_len > dst_len) { 369 error.SetErrorStringWithFormat( 370 "%u bytes is too big to store in register %s (%u bytes)", src_len, 371 reg_info->name, dst_len); 372 return error; 373 } 374 375 ProcessSP process_sp(m_thread.GetProcess()); 376 if (process_sp) { 377 uint8_t src[RegisterValue::kMaxRegisterByteSize]; 378 379 // Read the memory 380 const uint32_t bytes_read = 381 process_sp->ReadMemory(src_addr, src, src_len, error); 382 383 // Make sure the memory read succeeded... 384 if (bytes_read != src_len) { 385 if (error.Success()) { 386 // This might happen if we read _some_ bytes but not all 387 error.SetErrorStringWithFormat("read %u of %u bytes", bytes_read, 388 src_len); 389 } 390 return error; 391 } 392 393 // We now have a memory buffer that contains the part or all of the 394 // register value. Set the register value using this memory data. 395 // TODO: we might need to add a parameter to this function in case the byte 396 // order of the memory data doesn't match the process. For now we are 397 // assuming they are the same. 398 reg_value.SetFromMemoryData(reg_info, src, src_len, 399 process_sp->GetByteOrder(), error); 400 } else 401 error.SetErrorString("invalid process"); 402 403 return error; 404 } 405 406 Status RegisterContext::WriteRegisterValueToMemory( 407 const RegisterInfo *reg_info, lldb::addr_t dst_addr, uint32_t dst_len, 408 const RegisterValue ®_value) { 409 uint8_t dst[RegisterValue::kMaxRegisterByteSize]; 410 411 Status error; 412 413 ProcessSP process_sp(m_thread.GetProcess()); 414 if (process_sp) { 415 416 // TODO: we might need to add a parameter to this function in case the byte 417 // order of the memory data doesn't match the process. For now we are 418 // assuming they are the same. 419 420 const uint32_t bytes_copied = reg_value.GetAsMemoryData( 421 reg_info, dst, dst_len, process_sp->GetByteOrder(), error); 422 423 if (error.Success()) { 424 if (bytes_copied == 0) { 425 error.SetErrorString("byte copy failed."); 426 } else { 427 const uint32_t bytes_written = 428 process_sp->WriteMemory(dst_addr, dst, bytes_copied, error); 429 if (bytes_written != bytes_copied) { 430 if (error.Success()) { 431 // This might happen if we read _some_ bytes but not all 432 error.SetErrorStringWithFormat("only wrote %u of %u bytes", 433 bytes_written, bytes_copied); 434 } 435 } 436 } 437 } 438 } else 439 error.SetErrorString("invalid process"); 440 441 return error; 442 } 443 444 lldb::ByteOrder RegisterContext::GetByteOrder() { 445 // Get the target process whose privileged thread was used for the register 446 // read. 447 lldb::ByteOrder byte_order = lldb::eByteOrderInvalid; 448 lldb_private::Process *process = CalculateProcess().get(); 449 450 if (process) 451 byte_order = process->GetByteOrder(); 452 return byte_order; 453 } 454 455 bool RegisterContext::ReadAllRegisterValues( 456 lldb_private::RegisterCheckpoint ®_checkpoint) { 457 return ReadAllRegisterValues(reg_checkpoint.GetData()); 458 } 459 460 bool RegisterContext::WriteAllRegisterValues( 461 const lldb_private::RegisterCheckpoint ®_checkpoint) { 462 return WriteAllRegisterValues(reg_checkpoint.GetData()); 463 } 464 465 TargetSP RegisterContext::CalculateTarget() { 466 return m_thread.CalculateTarget(); 467 } 468 469 ProcessSP RegisterContext::CalculateProcess() { 470 return m_thread.CalculateProcess(); 471 } 472 473 ThreadSP RegisterContext::CalculateThread() { 474 return m_thread.shared_from_this(); 475 } 476 477 StackFrameSP RegisterContext::CalculateStackFrame() { 478 // Register contexts might belong to many frames if we have inlined functions 479 // inside a frame since all inlined functions share the same registers, so we 480 // can't definitively say which frame we come from... 481 return StackFrameSP(); 482 } 483 484 void RegisterContext::CalculateExecutionContext(ExecutionContext &exe_ctx) { 485 m_thread.CalculateExecutionContext(exe_ctx); 486 } 487 488 bool RegisterContext::ConvertBetweenRegisterKinds(lldb::RegisterKind source_rk, 489 uint32_t source_regnum, 490 lldb::RegisterKind target_rk, 491 uint32_t &target_regnum) { 492 const uint32_t num_registers = GetRegisterCount(); 493 for (uint32_t reg = 0; reg < num_registers; ++reg) { 494 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); 495 496 if (reg_info->kinds[source_rk] == source_regnum) { 497 target_regnum = reg_info->kinds[target_rk]; 498 return (target_regnum != LLDB_INVALID_REGNUM); 499 } 500 } 501 return false; 502 } 503