1296417Sdim//===-- RegisterContextPOSIX_powerpc.h --------------------------*- C++ -*-===//
2278332Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6278332Semaste//
7278332Semaste//===----------------------------------------------------------------------===//
8278332Semaste
9296417Sdim#ifndef liblldb_RegisterContextPOSIX_powerpc_h_
10296417Sdim#define liblldb_RegisterContextPOSIX_powerpc_h_
11278332Semaste
12314564Sdim#include "RegisterContext_powerpc.h"
13314564Sdim#include "RegisterInfoInterface.h"
14296417Sdim#include "lldb/Target/RegisterContext.h"
15321369Sdim#include "lldb/Utility/Log.h"
16278332Semaste
17278332Semasteclass ProcessMonitor;
18278332Semaste
19278332Semaste// Internal codes for all powerpc registers.
20314564Sdimenum {
21314564Sdim  k_first_gpr_powerpc,
22314564Sdim  gpr_r0_powerpc = k_first_gpr_powerpc,
23314564Sdim  gpr_r1_powerpc,
24314564Sdim  gpr_r2_powerpc,
25314564Sdim  gpr_r3_powerpc,
26314564Sdim  gpr_r4_powerpc,
27314564Sdim  gpr_r5_powerpc,
28314564Sdim  gpr_r6_powerpc,
29314564Sdim  gpr_r7_powerpc,
30314564Sdim  gpr_r8_powerpc,
31314564Sdim  gpr_r9_powerpc,
32314564Sdim  gpr_r10_powerpc,
33314564Sdim  gpr_r11_powerpc,
34314564Sdim  gpr_r12_powerpc,
35314564Sdim  gpr_r13_powerpc,
36314564Sdim  gpr_r14_powerpc,
37314564Sdim  gpr_r15_powerpc,
38314564Sdim  gpr_r16_powerpc,
39314564Sdim  gpr_r17_powerpc,
40314564Sdim  gpr_r18_powerpc,
41314564Sdim  gpr_r19_powerpc,
42314564Sdim  gpr_r20_powerpc,
43314564Sdim  gpr_r21_powerpc,
44314564Sdim  gpr_r22_powerpc,
45314564Sdim  gpr_r23_powerpc,
46314564Sdim  gpr_r24_powerpc,
47314564Sdim  gpr_r25_powerpc,
48314564Sdim  gpr_r26_powerpc,
49314564Sdim  gpr_r27_powerpc,
50314564Sdim  gpr_r28_powerpc,
51314564Sdim  gpr_r29_powerpc,
52314564Sdim  gpr_r30_powerpc,
53314564Sdim  gpr_r31_powerpc,
54314564Sdim  gpr_lr_powerpc,
55314564Sdim  gpr_cr_powerpc,
56314564Sdim  gpr_xer_powerpc,
57314564Sdim  gpr_ctr_powerpc,
58314564Sdim  gpr_pc_powerpc,
59314564Sdim  k_last_gpr_powerpc = gpr_pc_powerpc,
60278332Semaste
61314564Sdim  k_first_fpr,
62314564Sdim  fpr_f0_powerpc = k_first_fpr,
63314564Sdim  fpr_f1_powerpc,
64314564Sdim  fpr_f2_powerpc,
65314564Sdim  fpr_f3_powerpc,
66314564Sdim  fpr_f4_powerpc,
67314564Sdim  fpr_f5_powerpc,
68314564Sdim  fpr_f6_powerpc,
69314564Sdim  fpr_f7_powerpc,
70314564Sdim  fpr_f8_powerpc,
71314564Sdim  fpr_f9_powerpc,
72314564Sdim  fpr_f10_powerpc,
73314564Sdim  fpr_f11_powerpc,
74314564Sdim  fpr_f12_powerpc,
75314564Sdim  fpr_f13_powerpc,
76314564Sdim  fpr_f14_powerpc,
77314564Sdim  fpr_f15_powerpc,
78314564Sdim  fpr_f16_powerpc,
79314564Sdim  fpr_f17_powerpc,
80314564Sdim  fpr_f18_powerpc,
81314564Sdim  fpr_f19_powerpc,
82314564Sdim  fpr_f20_powerpc,
83314564Sdim  fpr_f21_powerpc,
84314564Sdim  fpr_f22_powerpc,
85314564Sdim  fpr_f23_powerpc,
86314564Sdim  fpr_f24_powerpc,
87314564Sdim  fpr_f25_powerpc,
88314564Sdim  fpr_f26_powerpc,
89314564Sdim  fpr_f27_powerpc,
90314564Sdim  fpr_f28_powerpc,
91314564Sdim  fpr_f29_powerpc,
92314564Sdim  fpr_f30_powerpc,
93314564Sdim  fpr_f31_powerpc,
94314564Sdim  fpr_fpscr_powerpc,
95314564Sdim  k_last_fpr = fpr_fpscr_powerpc,
96278332Semaste
97314564Sdim  k_first_vmx,
98314564Sdim  vmx_v0_powerpc = k_first_vmx,
99314564Sdim  vmx_v1_powerpc,
100314564Sdim  vmx_v2_powerpc,
101314564Sdim  vmx_v3_powerpc,
102314564Sdim  vmx_v4_powerpc,
103314564Sdim  vmx_v5_powerpc,
104314564Sdim  vmx_v6_powerpc,
105314564Sdim  vmx_v7_powerpc,
106314564Sdim  vmx_v8_powerpc,
107314564Sdim  vmx_v9_powerpc,
108314564Sdim  vmx_v10_powerpc,
109314564Sdim  vmx_v11_powerpc,
110314564Sdim  vmx_v12_powerpc,
111314564Sdim  vmx_v13_powerpc,
112314564Sdim  vmx_v14_powerpc,
113314564Sdim  vmx_v15_powerpc,
114314564Sdim  vmx_v16_powerpc,
115314564Sdim  vmx_v17_powerpc,
116314564Sdim  vmx_v18_powerpc,
117314564Sdim  vmx_v19_powerpc,
118314564Sdim  vmx_v20_powerpc,
119314564Sdim  vmx_v21_powerpc,
120314564Sdim  vmx_v22_powerpc,
121314564Sdim  vmx_v23_powerpc,
122314564Sdim  vmx_v24_powerpc,
123314564Sdim  vmx_v25_powerpc,
124314564Sdim  vmx_v26_powerpc,
125314564Sdim  vmx_v27_powerpc,
126314564Sdim  vmx_v28_powerpc,
127314564Sdim  vmx_v29_powerpc,
128314564Sdim  vmx_v30_powerpc,
129314564Sdim  vmx_v31_powerpc,
130314564Sdim  vmx_vrsave_powerpc,
131314564Sdim  vmx_vscr_powerpc,
132314564Sdim  k_last_vmx = vmx_vscr_powerpc,
133288943Sdim
134314564Sdim  k_num_registers_powerpc,
135314564Sdim  k_num_gpr_registers_powerpc = k_last_gpr_powerpc - k_first_gpr_powerpc + 1,
136314564Sdim  k_num_fpr_registers_powerpc = k_last_fpr - k_first_fpr + 1,
137314564Sdim  k_num_vmx_registers_powerpc = k_last_vmx - k_first_vmx + 1,
138278332Semaste};
139278332Semaste
140314564Sdimclass RegisterContextPOSIX_powerpc : public lldb_private::RegisterContext {
141278332Semastepublic:
142314564Sdim  RegisterContextPOSIX_powerpc(
143314564Sdim      lldb_private::Thread &thread, uint32_t concrete_frame_idx,
144314564Sdim      lldb_private::RegisterInfoInterface *register_info);
145278332Semaste
146314564Sdim  ~RegisterContextPOSIX_powerpc() override;
147278332Semaste
148314564Sdim  void Invalidate();
149278332Semaste
150314564Sdim  void InvalidateAllRegisters() override;
151278332Semaste
152314564Sdim  size_t GetRegisterCount() override;
153278332Semaste
154314564Sdim  virtual size_t GetGPRSize();
155278332Semaste
156314564Sdim  virtual unsigned GetRegisterSize(unsigned reg);
157278332Semaste
158314564Sdim  virtual unsigned GetRegisterOffset(unsigned reg);
159278332Semaste
160314564Sdim  const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
161278332Semaste
162314564Sdim  size_t GetRegisterSetCount() override;
163278332Semaste
164314564Sdim  const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
165278332Semaste
166314564Sdim  const char *GetRegisterName(unsigned reg);
167278332Semaste
168314564Sdim  uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
169314564Sdim                                               uint32_t num) override;
170278332Semaste
171278332Semasteprotected:
172314564Sdim  uint64_t
173314564Sdim      m_gpr_powerpc[k_num_gpr_registers_powerpc]; // general purpose registers.
174314564Sdim  uint64_t
175314564Sdim      m_fpr_powerpc[k_num_fpr_registers_powerpc]; // floating point registers.
176314564Sdim  uint32_t m_vmx_powerpc[k_num_vmx_registers_powerpc][4];
177314564Sdim  std::unique_ptr<lldb_private::RegisterInfoInterface>
178353358Sdim      m_register_info_up; // Register Info Interface (FreeBSD or Linux)
179278332Semaste
180314564Sdim  // Determines if an extended register set is supported on the processor
181314564Sdim  // running the inferior process.
182314564Sdim  virtual bool IsRegisterSetAvailable(size_t set_index);
183278332Semaste
184314564Sdim  virtual const lldb_private::RegisterInfo *GetRegisterInfo();
185278332Semaste
186314564Sdim  bool IsGPR(unsigned reg);
187278332Semaste
188314564Sdim  bool IsFPR(unsigned reg);
189278332Semaste
190314564Sdim  bool IsVMX(unsigned reg);
191288943Sdim
192314564Sdim  lldb::ByteOrder GetByteOrder();
193278332Semaste
194314564Sdim  virtual bool ReadGPR() = 0;
195314564Sdim  virtual bool ReadFPR() = 0;
196314564Sdim  virtual bool ReadVMX() = 0;
197314564Sdim  virtual bool WriteGPR() = 0;
198314564Sdim  virtual bool WriteFPR() = 0;
199314564Sdim  virtual bool WriteVMX() = 0;
200278332Semaste};
201278332Semaste
202296417Sdim#endif // liblldb_RegisterContextPOSIX_powerpc_h_
203