1254721Semaste//===-- RegisterContextDarwin_x86_64.h --------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_RegisterContextDarwin_x86_64_h_
11254721Semaste#define liblldb_RegisterContextDarwin_x86_64_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste// Other libraries and framework includes
16254721Semaste// Project includes
17254721Semaste#include "lldb/lldb-private.h"
18254721Semaste#include "lldb/Target/RegisterContext.h"
19254721Semaste
20254721Semasteclass RegisterContextDarwin_x86_64 : public lldb_private::RegisterContext
21254721Semaste{
22254721Semastepublic:
23254721Semaste    RegisterContextDarwin_x86_64 (lldb_private::Thread &thread,
24254721Semaste                                  uint32_t concrete_frame_idx);
25254721Semaste
26254721Semaste    virtual
27254721Semaste    ~RegisterContextDarwin_x86_64();
28254721Semaste
29254721Semaste    virtual void
30254721Semaste    InvalidateAllRegisters ();
31254721Semaste
32254721Semaste    virtual size_t
33254721Semaste    GetRegisterCount ();
34254721Semaste
35254721Semaste    virtual const lldb_private::RegisterInfo *
36254721Semaste    GetRegisterInfoAtIndex (size_t reg);
37254721Semaste
38254721Semaste    virtual size_t
39254721Semaste    GetRegisterSetCount ();
40254721Semaste
41254721Semaste    virtual const lldb_private::RegisterSet *
42254721Semaste    GetRegisterSet (size_t set);
43254721Semaste
44254721Semaste    virtual bool
45254721Semaste    ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
46254721Semaste
47254721Semaste    virtual bool
48254721Semaste    WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
49254721Semaste
50254721Semaste    virtual bool
51254721Semaste    ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
52254721Semaste
53254721Semaste    virtual bool
54254721Semaste    WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
55254721Semaste
56254721Semaste    virtual uint32_t
57254721Semaste    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num);
58254721Semaste
59254721Semaste    virtual bool
60254721Semaste    HardwareSingleStep (bool enable);
61254721Semaste
62254721Semaste    struct GPR
63254721Semaste    {
64254721Semaste        uint64_t rax;
65254721Semaste        uint64_t rbx;
66254721Semaste        uint64_t rcx;
67254721Semaste        uint64_t rdx;
68254721Semaste        uint64_t rdi;
69254721Semaste        uint64_t rsi;
70254721Semaste        uint64_t rbp;
71254721Semaste        uint64_t rsp;
72254721Semaste        uint64_t r8;
73254721Semaste        uint64_t r9;
74254721Semaste        uint64_t r10;
75254721Semaste        uint64_t r11;
76254721Semaste        uint64_t r12;
77254721Semaste        uint64_t r13;
78254721Semaste        uint64_t r14;
79254721Semaste        uint64_t r15;
80254721Semaste        uint64_t rip;
81254721Semaste        uint64_t rflags;
82254721Semaste        uint64_t cs;
83254721Semaste        uint64_t fs;
84254721Semaste        uint64_t gs;
85254721Semaste    };
86254721Semaste
87254721Semaste    struct MMSReg
88254721Semaste    {
89254721Semaste        uint8_t bytes[10];
90254721Semaste        uint8_t pad[6];
91254721Semaste    };
92254721Semaste
93254721Semaste    struct XMMReg
94254721Semaste    {
95254721Semaste        uint8_t bytes[16];
96254721Semaste    };
97254721Semaste
98254721Semaste    struct FPU
99254721Semaste    {
100254721Semaste        uint32_t    pad[2];
101254721Semaste        uint16_t    fcw;    // "fctrl"
102254721Semaste        uint16_t    fsw;    // "fstat"
103254721Semaste        uint8_t     ftw;    // "ftag"
104254721Semaste        uint8_t     pad1;
105254721Semaste        uint16_t    fop;    // "fop"
106254721Semaste        uint32_t    ip;     // "fioff"
107254721Semaste        uint16_t    cs;     // "fiseg"
108254721Semaste        uint16_t    pad2;
109254721Semaste        uint32_t    dp;     // "fooff"
110254721Semaste        uint16_t    ds;     // "foseg"
111254721Semaste        uint16_t    pad3;
112254721Semaste        uint32_t    mxcsr;
113254721Semaste        uint32_t    mxcsrmask;
114254721Semaste        MMSReg      stmm[8];
115254721Semaste        XMMReg      xmm[16];
116254721Semaste        uint8_t     pad4[6*16];
117254721Semaste        int         pad5;
118254721Semaste    };
119254721Semaste
120254721Semaste    struct EXC
121254721Semaste    {
122254721Semaste        uint32_t trapno;
123254721Semaste        uint32_t err;
124254721Semaste        uint64_t faultvaddr;
125254721Semaste    };
126254721Semaste
127254721Semasteprotected:
128254721Semaste
129254721Semaste    enum
130254721Semaste    {
131254721Semaste        GPRRegSet = 4,
132254721Semaste        FPURegSet = 5,
133254721Semaste        EXCRegSet = 6
134254721Semaste    };
135254721Semaste
136254721Semaste    enum
137254721Semaste    {
138254721Semaste        GPRWordCount = sizeof(GPR)/sizeof(uint32_t),
139254721Semaste        FPUWordCount = sizeof(FPU)/sizeof(uint32_t),
140254721Semaste        EXCWordCount = sizeof(EXC)/sizeof(uint32_t)
141254721Semaste    };
142254721Semaste
143254721Semaste    enum
144254721Semaste    {
145254721Semaste        Read = 0,
146254721Semaste        Write = 1,
147254721Semaste        kNumErrors = 2
148254721Semaste    };
149254721Semaste
150254721Semaste    GPR gpr;
151254721Semaste    FPU fpu;
152254721Semaste    EXC exc;
153254721Semaste    int gpr_errs[2]; // Read/Write errors
154254721Semaste    int fpu_errs[2]; // Read/Write errors
155254721Semaste    int exc_errs[2]; // Read/Write errors
156254721Semaste
157254721Semaste    void
158254721Semaste    InvalidateAllRegisterStates()
159254721Semaste    {
160254721Semaste        SetError (GPRRegSet, Read, -1);
161254721Semaste        SetError (FPURegSet, Read, -1);
162254721Semaste        SetError (EXCRegSet, Read, -1);
163254721Semaste    }
164254721Semaste
165254721Semaste    int
166254721Semaste    GetError (int flavor, uint32_t err_idx) const
167254721Semaste    {
168254721Semaste        if (err_idx < kNumErrors)
169254721Semaste        {
170254721Semaste            switch (flavor)
171254721Semaste            {
172254721Semaste            // When getting all errors, just OR all values together to see if
173254721Semaste            // we got any kind of error.
174254721Semaste            case GPRRegSet:    return gpr_errs[err_idx];
175254721Semaste            case FPURegSet:    return fpu_errs[err_idx];
176254721Semaste            case EXCRegSet:    return exc_errs[err_idx];
177254721Semaste            default: break;
178254721Semaste            }
179254721Semaste        }
180254721Semaste        return -1;
181254721Semaste    }
182254721Semaste
183254721Semaste    bool
184254721Semaste    SetError (int flavor, uint32_t err_idx, int err)
185254721Semaste    {
186254721Semaste        if (err_idx < kNumErrors)
187254721Semaste        {
188254721Semaste            switch (flavor)
189254721Semaste            {
190254721Semaste            case GPRRegSet:
191254721Semaste                gpr_errs[err_idx] = err;
192254721Semaste                return true;
193254721Semaste
194254721Semaste            case FPURegSet:
195254721Semaste                fpu_errs[err_idx] = err;
196254721Semaste                return true;
197254721Semaste
198254721Semaste            case EXCRegSet:
199254721Semaste                exc_errs[err_idx] = err;
200254721Semaste                return true;
201254721Semaste
202254721Semaste            default: break;
203254721Semaste            }
204254721Semaste        }
205254721Semaste        return false;
206254721Semaste    }
207254721Semaste
208254721Semaste    bool
209254721Semaste    RegisterSetIsCached (int set) const
210254721Semaste    {
211254721Semaste        return GetError(set, Read) == 0;
212254721Semaste    }
213254721Semaste
214254721Semaste    void
215254721Semaste    LogGPR (lldb_private::Log *log, const char *format, ...);
216254721Semaste
217254721Semaste    int
218254721Semaste    ReadGPR (bool force);
219254721Semaste
220254721Semaste    int
221254721Semaste    ReadFPU (bool force);
222254721Semaste
223254721Semaste    int
224254721Semaste    ReadEXC (bool force);
225254721Semaste
226254721Semaste    int
227254721Semaste    WriteGPR ();
228254721Semaste
229254721Semaste    int
230254721Semaste    WriteFPU ();
231254721Semaste
232254721Semaste    int
233254721Semaste    WriteEXC ();
234254721Semaste
235254721Semaste    // Subclasses override these to do the actual reading.
236254721Semaste    virtual int
237254721Semaste    DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr) = 0;
238254721Semaste
239254721Semaste    virtual int
240254721Semaste    DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu) = 0;
241254721Semaste
242254721Semaste    virtual int
243254721Semaste    DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc) = 0;
244254721Semaste
245254721Semaste    virtual int
246254721Semaste    DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
247254721Semaste
248254721Semaste    virtual int
249254721Semaste    DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
250254721Semaste
251254721Semaste    virtual int
252254721Semaste    DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc) = 0;
253254721Semaste
254254721Semaste    int
255254721Semaste    ReadRegisterSet (uint32_t set, bool force);
256254721Semaste
257254721Semaste    int
258254721Semaste    WriteRegisterSet (uint32_t set);
259254721Semaste
260254721Semaste    static uint32_t
261254721Semaste    GetRegisterNumber (uint32_t reg_kind, uint32_t reg_num);
262254721Semaste
263254721Semaste    static int
264254721Semaste    GetSetForNativeRegNum (int reg_num);
265254721Semaste
266254721Semaste    static size_t
267254721Semaste    GetRegisterInfosCount ();
268254721Semaste
269254721Semaste    static const lldb_private::RegisterInfo *
270254721Semaste    GetRegisterInfos ();
271254721Semaste
272254721Semaste};
273254721Semaste
274254721Semaste#endif  // liblldb_RegisterContextDarwin_x86_64_h_
275