10fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton//===-- RegisterContextKDP_x86_64.cpp ---------------------------*- C++ -*-===// 20fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// 30fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// The LLVM Compiler Infrastructure 40fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// 50fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// This file is distributed under the University of Illinois Open Source 60fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// License. See LICENSE.TXT for details. 70fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// 80fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton//===----------------------------------------------------------------------===// 90fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 100fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 110fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// C Includes 120fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// C++ Includes 130fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// Other libraries and framework includes 140fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton// Project includes 150fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton#include "RegisterContextKDP_x86_64.h" 16ec15f50fdd7011fc155ab4fe71d4887ffe31df4eGreg Clayton#include "ProcessKDP.h" 17ec15f50fdd7011fc155ab4fe71d4887ffe31df4eGreg Clayton#include "ThreadKDP.h" 180fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 190fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonusing namespace lldb; 200fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonusing namespace lldb_private; 210fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 220fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 23ec15f50fdd7011fc155ab4fe71d4887ffe31df4eGreg ClaytonRegisterContextKDP_x86_64::RegisterContextKDP_x86_64 (ThreadKDP &thread, uint32_t concrete_frame_idx) : 24ec15f50fdd7011fc155ab4fe71d4887ffe31df4eGreg Clayton RegisterContextDarwin_x86_64 (thread, concrete_frame_idx), 25ec15f50fdd7011fc155ab4fe71d4887ffe31df4eGreg Clayton m_kdp_thread (thread) 260fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 270fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 280fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 290fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::~RegisterContextKDP_x86_64() 300fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 310fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 320fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 330fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 340fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr) 350fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 36ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 37ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 38ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 39ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 40ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestReadRegisters (tid, GPRRegSet, &gpr, sizeof(gpr), error)) 41ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 42ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 43ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 44ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 45ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 460fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 470fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 480fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 490fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 500fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu) 510fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 52ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 53ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 54ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 55ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 56ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestReadRegisters (tid, FPURegSet, &fpu, sizeof(fpu), error)) 57ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 58ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 59ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 60ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 61ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 620fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 630fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 640fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 650fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 660fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc) 670fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 68ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 69ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 70ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 71ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 72ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestReadRegisters (tid, EXCRegSet, &exc, sizeof(exc), error)) 73ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 74ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 75ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 76ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 77ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 780fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 790fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 800fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 810fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 820fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr) 830fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 84ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 85ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 86ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 87ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 88ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestWriteRegisters (tid, GPRRegSet, &gpr, sizeof(gpr), error)) 89ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 90ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 91ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 92ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 93ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 940fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 950fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 960fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 970fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 980fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu) 990fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 100ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 101ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 102ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 103ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 104ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestWriteRegisters (tid, FPURegSet, &fpu, sizeof(fpu), error)) 105ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 106ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 107ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 108ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 109ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 1100fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 1110fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 1120fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton 1130fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Claytonint 1140fa512447e00da09d300fbabd18b5ce94f52fdaaGreg ClaytonRegisterContextKDP_x86_64::DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc) 1150fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton{ 116ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton ProcessSP process_sp (CalculateProcess()); 117ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (process_sp) 118ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 119ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton Error error; 120ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (static_cast<ProcessKDP *>(process_sp.get())->GetCommunication().SendRequestWriteRegisters (tid, EXCRegSet, &exc, sizeof(exc), error)) 121ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton { 122ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton if (error.Success()) 123ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton return 0; 124ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 125ea63601b1d4a21e46e477563f27d1b1c516136d8Greg Clayton } 1260fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton return -1; 1270fa512447e00da09d300fbabd18b5ce94f52fdaaGreg Clayton} 128