1359575Sdim//===-- RegisterContextFreeBSD_mips64.cpp ----------------------*- C++ -*-===//
2359575Sdim//
3359575Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4359575Sdim// See https://llvm.org/LICENSE.txt for license information.
5359575Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6359575Sdim//
7359575Sdim//===---------------------------------------------------------------------===//
8359575Sdim
9359575Sdim#include "RegisterContextFreeBSD_mips64.h"
10359575Sdim#include "RegisterContextPOSIX_mips64.h"
11359575Sdim#include "lldb-mips-freebsd-register-enums.h"
12359575Sdim#include <vector>
13359575Sdim
14359575Sdimusing namespace lldb_private;
15359575Sdimusing namespace lldb;
16359575Sdim
17359575Sdimstatic const uint32_t g_gpr_regnums[] = {
18359575Sdim    gpr_zero_mips64,  gpr_r1_mips64,    gpr_r2_mips64,    gpr_r3_mips64,
19359575Sdim    gpr_r4_mips64,    gpr_r5_mips64,    gpr_r6_mips64,    gpr_r7_mips64,
20359575Sdim    gpr_r8_mips64,    gpr_r9_mips64,    gpr_r10_mips64,   gpr_r11_mips64,
21359575Sdim    gpr_r12_mips64,   gpr_r13_mips64,   gpr_r14_mips64,   gpr_r15_mips64,
22359575Sdim    gpr_r16_mips64,   gpr_r17_mips64,   gpr_r18_mips64,   gpr_r19_mips64,
23359575Sdim    gpr_r20_mips64,   gpr_r21_mips64,   gpr_r22_mips64,   gpr_r23_mips64,
24359575Sdim    gpr_r24_mips64,   gpr_r25_mips64,   gpr_r26_mips64,   gpr_r27_mips64,
25359575Sdim    gpr_gp_mips64,    gpr_sp_mips64,    gpr_r30_mips64,   gpr_ra_mips64,
26359575Sdim    gpr_sr_mips64,    gpr_mullo_mips64, gpr_mulhi_mips64, gpr_badvaddr_mips64,
27359575Sdim    gpr_cause_mips64, gpr_pc_mips64,    gpr_ic_mips64,    gpr_dummy_mips64};
28359575Sdim
29359575Sdim// Number of register sets provided by this context.
30359575Sdimconstexpr size_t k_num_register_sets = 1;
31359575Sdim
32359575Sdimstatic const RegisterSet g_reg_sets_mips64[k_num_register_sets] = {
33359575Sdim    {"General Purpose Registers", "gpr", k_num_gpr_registers_mips64,
34359575Sdim     g_gpr_regnums},
35359575Sdim};
36359575Sdim
37359575Sdim
38359575Sdim// http://svnweb.freebsd.org/base/head/sys/mips/include/regnum.h
39359575Sdimtypedef struct _GPR {
40359575Sdim  uint64_t zero;
41359575Sdim  uint64_t r1;
42359575Sdim  uint64_t r2;
43359575Sdim  uint64_t r3;
44359575Sdim  uint64_t r4;
45359575Sdim  uint64_t r5;
46359575Sdim  uint64_t r6;
47359575Sdim  uint64_t r7;
48359575Sdim  uint64_t r8;
49359575Sdim  uint64_t r9;
50359575Sdim  uint64_t r10;
51359575Sdim  uint64_t r11;
52359575Sdim  uint64_t r12;
53359575Sdim  uint64_t r13;
54359575Sdim  uint64_t r14;
55359575Sdim  uint64_t r15;
56359575Sdim  uint64_t r16;
57359575Sdim  uint64_t r17;
58359575Sdim  uint64_t r18;
59359575Sdim  uint64_t r19;
60359575Sdim  uint64_t r20;
61359575Sdim  uint64_t r21;
62359575Sdim  uint64_t r22;
63359575Sdim  uint64_t r23;
64359575Sdim  uint64_t r24;
65359575Sdim  uint64_t r25;
66359575Sdim  uint64_t r26;
67359575Sdim  uint64_t r27;
68359575Sdim  uint64_t gp;
69359575Sdim  uint64_t sp;
70359575Sdim  uint64_t r30;
71359575Sdim  uint64_t ra;
72359575Sdim  uint64_t sr;
73359575Sdim  uint64_t mullo;
74359575Sdim  uint64_t mulhi;
75359575Sdim  uint64_t badvaddr;
76359575Sdim  uint64_t cause;
77359575Sdim  uint64_t pc;
78359575Sdim  uint64_t ic;
79359575Sdim  uint64_t dummy;
80359575Sdim} GPR_freebsd_mips;
81359575Sdim
82359575Sdim// Include RegisterInfos_mips64 to declare our g_register_infos_mips64
83359575Sdim// structure.
84359575Sdim#define DECLARE_REGISTER_INFOS_MIPS64_STRUCT
85359575Sdim#include "RegisterInfos_mips64.h"
86359575Sdim#undef DECLARE_REGISTER_INFOS_MIPS64_STRUCT
87359575Sdim
88359575SdimRegisterContextFreeBSD_mips64::RegisterContextFreeBSD_mips64(
89359575Sdim    const ArchSpec &target_arch)
90359575Sdim    : RegisterInfoInterface(target_arch) {}
91359575Sdim
92359575Sdimsize_t RegisterContextFreeBSD_mips64::GetGPRSize() const {
93359575Sdim  return sizeof(GPR_freebsd_mips);
94359575Sdim}
95359575Sdim
96359575Sdimconst RegisterSet *
97359575SdimRegisterContextFreeBSD_mips64::GetRegisterSet(size_t set) const {
98359575Sdim   // Check if RegisterSet is available
99359575Sdim   if (set < k_num_register_sets)
100359575Sdim     return &g_reg_sets_mips64[set];
101359575Sdim   return nullptr;
102359575Sdim}
103359575Sdim
104359575Sdimsize_t
105359575SdimRegisterContextFreeBSD_mips64::GetRegisterSetCount() const {
106359575Sdim  return k_num_register_sets;
107359575Sdim}
108359575Sdim
109359575Sdimconst RegisterInfo *RegisterContextFreeBSD_mips64::GetRegisterInfo() const {
110359575Sdim  assert(m_target_arch.GetCore() == ArchSpec::eCore_mips64);
111359575Sdim  return g_register_infos_mips64;
112359575Sdim}
113359575Sdim
114359575Sdimuint32_t RegisterContextFreeBSD_mips64::GetRegisterCount() const {
115359575Sdim  return static_cast<uint32_t>(sizeof(g_register_infos_mips64) /
116359575Sdim                               sizeof(g_register_infos_mips64[0]));
117359575Sdim}
118359575Sdim