1 //===-- RegisterContext.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 // C Includes 11 // C++ Includes 12 // Other libraries and framework includes 13 // Project includes 14 #include "lldb/Target/RegisterContext.h" 15 #include "lldb/Core/DataExtractor.h" 16 #include "lldb/Core/RegisterValue.h" 17 #include "lldb/Core/Scalar.h" 18 #include "lldb/Host/Endian.h" 19 #include "lldb/Target/ExecutionContext.h" 20 #include "lldb/Target/StackFrame.h" 21 #include "lldb/Target/Process.h" 22 #include "lldb/Target/Thread.h" 23 24 using namespace lldb; 25 using namespace lldb_private; 26 27 RegisterContext::RegisterContext (Thread &thread, uint32_t concrete_frame_idx) : 28 m_thread (thread), 29 m_concrete_frame_idx (concrete_frame_idx), 30 m_stop_id (thread.GetProcess()->GetStopID()) 31 { 32 } 33 34 //---------------------------------------------------------------------- 35 // Destructor 36 //---------------------------------------------------------------------- 37 RegisterContext::~RegisterContext() 38 { 39 } 40 41 void 42 RegisterContext::InvalidateIfNeeded (bool force) 43 { 44 ProcessSP process_sp (m_thread.GetProcess()); 45 bool invalidate = force; 46 uint32_t process_stop_id = UINT32_MAX; 47 48 if (process_sp) 49 process_stop_id = process_sp->GetStopID(); 50 else 51 invalidate = true; 52 53 if (!invalidate) 54 invalidate = process_stop_id != GetStopID(); 55 56 if (invalidate) 57 { 58 InvalidateAllRegisters (); 59 SetStopID (process_stop_id); 60 } 61 } 62 63 64 const RegisterInfo * 65 RegisterContext::GetRegisterInfoByName (const char *reg_name, uint32_t start_idx) 66 { 67 if (reg_name && reg_name[0]) 68 { 69 const uint32_t num_registers = GetRegisterCount(); 70 for (uint32_t reg = start_idx; reg < num_registers; ++reg) 71 { 72 const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg); 73 74 if ((reg_info->name != NULL && ::strcasecmp (reg_info->name, reg_name) == 0) || 75 (reg_info->alt_name != NULL && ::strcasecmp (reg_info->alt_name, reg_name) == 0)) 76 { 77 return reg_info; 78 } 79 } 80 } 81 return NULL; 82 } 83 84 const char * 85 RegisterContext::GetRegisterName (uint32_t reg) 86 { 87 const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg); 88 if (reg_info) 89 return reg_info->name; 90 return NULL; 91 } 92 93 uint64_t 94 RegisterContext::GetPC(uint64_t fail_value) 95 { 96 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 97 return ReadRegisterAsUnsigned (reg, fail_value); 98 } 99 100 bool 101 RegisterContext::SetPC(uint64_t pc) 102 { 103 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 104 bool success = WriteRegisterFromUnsigned (reg, pc); 105 if (success) 106 { 107 StackFrameSP frame_sp(m_thread.GetFrameWithConcreteFrameIndex (m_concrete_frame_idx)); 108 if (frame_sp) 109 frame_sp->ChangePC(pc); 110 else 111 m_thread.ClearStackFrames (); 112 } 113 return success; 114 } 115 116 uint64_t 117 RegisterContext::GetSP(uint64_t fail_value) 118 { 119 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP); 120 return ReadRegisterAsUnsigned (reg, fail_value); 121 } 122 123 bool 124 RegisterContext::SetSP(uint64_t sp) 125 { 126 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP); 127 return WriteRegisterFromUnsigned (reg, sp); 128 } 129 130 uint64_t 131 RegisterContext::GetFP(uint64_t fail_value) 132 { 133 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP); 134 return ReadRegisterAsUnsigned (reg, fail_value); 135 } 136 137 bool 138 RegisterContext::SetFP(uint64_t fp) 139 { 140 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP); 141 return WriteRegisterFromUnsigned (reg, fp); 142 } 143 144 uint64_t 145 RegisterContext::GetReturnAddress (uint64_t fail_value) 146 { 147 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA); 148 return ReadRegisterAsUnsigned (reg, fail_value); 149 } 150 151 uint64_t 152 RegisterContext::GetFlags (uint64_t fail_value) 153 { 154 uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 155 return ReadRegisterAsUnsigned (reg, fail_value); 156 } 157 158 159 uint64_t 160 RegisterContext::ReadRegisterAsUnsigned (uint32_t reg, uint64_t fail_value) 161 { 162 if (reg != LLDB_INVALID_REGNUM) 163 return ReadRegisterAsUnsigned (GetRegisterInfoAtIndex (reg), fail_value); 164 return fail_value; 165 } 166 167 uint64_t 168 RegisterContext::ReadRegisterAsUnsigned (const RegisterInfo *reg_info, uint64_t fail_value) 169 { 170 if (reg_info) 171 { 172 RegisterValue value; 173 if (ReadRegister (reg_info, value)) 174 return value.GetAsUInt64(); 175 } 176 return fail_value; 177 } 178 179 bool 180 RegisterContext::WriteRegisterFromUnsigned (uint32_t reg, uint64_t uval) 181 { 182 if (reg == LLDB_INVALID_REGNUM) 183 return false; 184 return WriteRegisterFromUnsigned (GetRegisterInfoAtIndex (reg), uval); 185 } 186 187 bool 188 RegisterContext::WriteRegisterFromUnsigned (const RegisterInfo *reg_info, uint64_t uval) 189 { 190 if (reg_info) 191 { 192 RegisterValue value; 193 if (value.SetUInt(uval, reg_info->byte_size)) 194 return WriteRegister (reg_info, value); 195 } 196 return false; 197 } 198 199 bool 200 RegisterContext::CopyFromRegisterContext (lldb::RegisterContextSP context) 201 { 202 uint32_t num_register_sets = context->GetRegisterSetCount(); 203 // We don't know that two threads have the same register context, so require the threads to be the same. 204 if (context->GetThreadID() != GetThreadID()) 205 return false; 206 207 if (num_register_sets != GetRegisterSetCount()) 208 return false; 209 210 RegisterContextSP frame_zero_context = m_thread.GetRegisterContext(); 211 212 for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx) 213 { 214 const RegisterSet * const reg_set = GetRegisterSet(set_idx); 215 216 const uint32_t num_registers = reg_set->num_registers; 217 for (uint32_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) 218 { 219 const uint32_t reg = reg_set->registers[reg_idx]; 220 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); 221 if (!reg_info || reg_info->value_regs) 222 continue; 223 RegisterValue reg_value; 224 225 // If we can reconstruct the register from the frame we are copying from, then do so, otherwise 226 // use the value from frame 0. 227 if (context->ReadRegister(reg_info, reg_value)) 228 { 229 WriteRegister(reg_info, reg_value); 230 } 231 else if (frame_zero_context->ReadRegister(reg_info, reg_value)) 232 { 233 WriteRegister(reg_info, reg_value); 234 } 235 } 236 } 237 return true; 238 } 239 240 lldb::tid_t 241 RegisterContext::GetThreadID() const 242 { 243 return m_thread.GetID(); 244 } 245 246 uint32_t 247 RegisterContext::NumSupportedHardwareBreakpoints () 248 { 249 return 0; 250 } 251 252 uint32_t 253 RegisterContext::SetHardwareBreakpoint (lldb::addr_t addr, size_t size) 254 { 255 return LLDB_INVALID_INDEX32; 256 } 257 258 bool 259 RegisterContext::ClearHardwareBreakpoint (uint32_t hw_idx) 260 { 261 return false; 262 } 263 264 265 uint32_t 266 RegisterContext::NumSupportedHardwareWatchpoints () 267 { 268 return 0; 269 } 270 271 uint32_t 272 RegisterContext::SetHardwareWatchpoint (lldb::addr_t addr, size_t size, bool read, bool write) 273 { 274 return LLDB_INVALID_INDEX32; 275 } 276 277 bool 278 RegisterContext::ClearHardwareWatchpoint (uint32_t hw_index) 279 { 280 return false; 281 } 282 283 bool 284 RegisterContext::HardwareSingleStep (bool enable) 285 { 286 return false; 287 } 288 289 Error 290 RegisterContext::ReadRegisterValueFromMemory (const RegisterInfo *reg_info, 291 lldb::addr_t src_addr, 292 uint32_t src_len, 293 RegisterValue ®_value) 294 { 295 Error error; 296 if (reg_info == NULL) 297 { 298 error.SetErrorString ("invalid register info argument."); 299 return error; 300 } 301 302 303 // Moving from addr into a register 304 // 305 // Case 1: src_len == dst_len 306 // 307 // |AABBCCDD| Address contents 308 // |AABBCCDD| Register contents 309 // 310 // Case 2: src_len > dst_len 311 // 312 // Error! (The register should always be big enough to hold the data) 313 // 314 // Case 3: src_len < dst_len 315 // 316 // |AABB| Address contents 317 // |AABB0000| Register contents [on little-endian hardware] 318 // |0000AABB| Register contents [on big-endian hardware] 319 if (src_len > RegisterValue::kMaxRegisterByteSize) 320 { 321 error.SetErrorString ("register too small to receive memory data"); 322 return error; 323 } 324 325 const uint32_t dst_len = reg_info->byte_size; 326 327 if (src_len > dst_len) 328 { 329 error.SetErrorStringWithFormat("%u bytes is too big to store in register %s (%u bytes)", src_len, reg_info->name, dst_len); 330 return error; 331 } 332 333 ProcessSP process_sp (m_thread.GetProcess()); 334 if (process_sp) 335 { 336 uint8_t src[RegisterValue::kMaxRegisterByteSize]; 337 338 // Read the memory 339 const uint32_t bytes_read = process_sp->ReadMemory (src_addr, src, src_len, error); 340 341 // Make sure the memory read succeeded... 342 if (bytes_read != src_len) 343 { 344 if (error.Success()) 345 { 346 // This might happen if we read _some_ bytes but not all 347 error.SetErrorStringWithFormat("read %u of %u bytes", bytes_read, src_len); 348 } 349 return error; 350 } 351 352 // We now have a memory buffer that contains the part or all of the register 353 // value. Set the register value using this memory data. 354 // TODO: we might need to add a parameter to this function in case the byte 355 // order of the memory data doesn't match the process. For now we are assuming 356 // they are the same. 357 reg_value.SetFromMemoryData (reg_info, 358 src, 359 src_len, 360 process_sp->GetByteOrder(), 361 error); 362 } 363 else 364 error.SetErrorString("invalid process"); 365 366 return error; 367 } 368 369 Error 370 RegisterContext::WriteRegisterValueToMemory (const RegisterInfo *reg_info, 371 lldb::addr_t dst_addr, 372 uint32_t dst_len, 373 const RegisterValue ®_value) 374 { 375 376 uint8_t dst[RegisterValue::kMaxRegisterByteSize]; 377 378 Error error; 379 380 ProcessSP process_sp (m_thread.GetProcess()); 381 if (process_sp) 382 { 383 384 // TODO: we might need to add a parameter to this function in case the byte 385 // order of the memory data doesn't match the process. For now we are assuming 386 // they are the same. 387 388 const uint32_t bytes_copied = reg_value.GetAsMemoryData (reg_info, 389 dst, 390 dst_len, 391 process_sp->GetByteOrder(), 392 error); 393 394 if (error.Success()) 395 { 396 if (bytes_copied == 0) 397 { 398 error.SetErrorString("byte copy failed."); 399 } 400 else 401 { 402 const uint32_t bytes_written = process_sp->WriteMemory (dst_addr, dst, bytes_copied, error); 403 if (bytes_written != bytes_copied) 404 { 405 if (error.Success()) 406 { 407 // This might happen if we read _some_ bytes but not all 408 error.SetErrorStringWithFormat("only wrote %u of %u bytes", bytes_written, bytes_copied); 409 } 410 } 411 } 412 } 413 } 414 else 415 error.SetErrorString("invalid process"); 416 417 return error; 418 419 } 420 421 TargetSP 422 RegisterContext::CalculateTarget () 423 { 424 return m_thread.CalculateTarget(); 425 } 426 427 428 ProcessSP 429 RegisterContext::CalculateProcess () 430 { 431 return m_thread.CalculateProcess (); 432 } 433 434 ThreadSP 435 RegisterContext::CalculateThread () 436 { 437 return m_thread.shared_from_this(); 438 } 439 440 StackFrameSP 441 RegisterContext::CalculateStackFrame () 442 { 443 // Register contexts might belong to many frames if we have inlined 444 // functions inside a frame since all inlined functions share the 445 // same registers, so we can't definitively say which frame we come from... 446 return StackFrameSP(); 447 } 448 449 void 450 RegisterContext::CalculateExecutionContext (ExecutionContext &exe_ctx) 451 { 452 m_thread.CalculateExecutionContext (exe_ctx); 453 } 454 455 456 bool 457 RegisterContext::ConvertBetweenRegisterKinds (int source_rk, uint32_t source_regnum, int target_rk, uint32_t& target_regnum) 458 { 459 // FIXME: This works around a problem with 32-bit register mapping on Linux. 460 // A more general fix is needed. 461 if (target_rk == eRegisterKindLLDB) 462 { 463 target_regnum = ConvertRegisterKindToRegisterNumber(source_rk, source_regnum); 464 if (target_regnum != LLDB_INVALID_REGNUM) 465 return true; 466 } 467 468 const uint32_t num_registers = GetRegisterCount(); 469 for (uint32_t reg = 0; reg < num_registers; ++reg) 470 { 471 const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg); 472 473 if (reg_info->kinds[source_rk] == source_regnum) 474 { 475 target_regnum = reg_info->kinds[target_rk]; 476 if (target_regnum == LLDB_INVALID_REGNUM) 477 { 478 return false; 479 } 480 else 481 { 482 return true; 483 } 484 } 485 } 486 return false; 487 } 488 489 //bool 490 //RegisterContext::ReadRegisterValue (uint32_t reg, Scalar &value) 491 //{ 492 // DataExtractor data; 493 // if (!ReadRegisterBytes (reg, data)) 494 // return false; 495 // 496 // const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 497 // uint32_t offset = 0; 498 // switch (reg_info->encoding) 499 // { 500 // case eEncodingInvalid: 501 // case eEncodingVector: 502 // break; 503 // 504 // case eEncodingUint: 505 // switch (reg_info->byte_size) 506 // { 507 // case 1: 508 // { 509 // value = data.GetU8 (&offset); 510 // return true; 511 // } 512 // case 2: 513 // { 514 // value = data.GetU16 (&offset); 515 // return true; 516 // } 517 // case 4: 518 // { 519 // value = data.GetU32 (&offset); 520 // return true; 521 // } 522 // case 8: 523 // { 524 // value = data.GetU64 (&offset); 525 // return true; 526 // } 527 // } 528 // break; 529 // case eEncodingSint: 530 // switch (reg_info->byte_size) 531 // { 532 // case 1: 533 // { 534 // int8_t v; 535 // if (data.ExtractBytes (0, sizeof (int8_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int8_t)) 536 // return false; 537 // value = v; 538 // return true; 539 // } 540 // case 2: 541 // { 542 // int16_t v; 543 // if (data.ExtractBytes (0, sizeof (int16_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int16_t)) 544 // return false; 545 // value = v; 546 // return true; 547 // } 548 // case 4: 549 // { 550 // int32_t v; 551 // if (data.ExtractBytes (0, sizeof (int32_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int32_t)) 552 // return false; 553 // value = v; 554 // return true; 555 // } 556 // case 8: 557 // { 558 // int64_t v; 559 // if (data.ExtractBytes (0, sizeof (int64_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int64_t)) 560 // return false; 561 // value = v; 562 // return true; 563 // } 564 // } 565 // break; 566 // case eEncodingIEEE754: 567 // switch (reg_info->byte_size) 568 // { 569 // case sizeof (float): 570 // { 571 // float v; 572 // if (data.ExtractBytes (0, sizeof (float), lldb::endian::InlHostByteOrder(), &v) != sizeof (float)) 573 // return false; 574 // value = v; 575 // return true; 576 // } 577 // case sizeof (double): 578 // { 579 // double v; 580 // if (data.ExtractBytes (0, sizeof (double), lldb::endian::InlHostByteOrder(), &v) != sizeof (double)) 581 // return false; 582 // value = v; 583 // return true; 584 // } 585 // case sizeof (long double): 586 // { 587 // double v; 588 // if (data.ExtractBytes (0, sizeof (long double), lldb::endian::InlHostByteOrder(), &v) != sizeof (long double)) 589 // return false; 590 // value = v; 591 // return true; 592 // } 593 // } 594 // break; 595 // } 596 // return false; 597 //} 598 // 599 //bool 600 //RegisterContext::WriteRegisterValue (uint32_t reg, const Scalar &value) 601 //{ 602 // DataExtractor data; 603 // if (!value.IsValid()) 604 // return false; 605 // if (!value.GetData (data)) 606 // return false; 607 // 608 // return WriteRegisterBytes (reg, data); 609 //} 610