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