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