Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_riscv32.cpp
213845 views
//===-- RegisterContextDarwin_riscv32.cpp1//------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#include "lldb/Utility/DataBufferHeap.h"10#include "lldb/Utility/DataExtractor.h"11#include "lldb/Utility/Endian.h"12#include "lldb/Utility/Log.h"13#include "lldb/Utility/RegisterValue.h"14#include "lldb/Utility/Scalar.h"15#include "llvm/ADT/STLExtras.h"16#include "llvm/Support/Compiler.h"1718#include <cstddef>1920#include <memory>2122#include "RegisterContextDarwin_riscv32.h"23#include "Utility/RISCV_DWARF_Registers.h"2425using namespace lldb;26using namespace lldb_private;2728enum {29gpr_x0 = 0,30gpr_x1,31gpr_x2,32gpr_x3,33gpr_x4,34gpr_x5,35gpr_x6,36gpr_x7,37gpr_x8,38gpr_x9,39gpr_x10,40gpr_x11,41gpr_x12,42gpr_x13,43gpr_x14,44gpr_x15,45gpr_x16,46gpr_x17,47gpr_x18,48gpr_x19,49gpr_x20,50gpr_x21,51gpr_x22,52gpr_x23,53gpr_x24,54gpr_x25,55gpr_x26,56gpr_x27,57gpr_x28,58gpr_x29,59gpr_x30,60gpr_x31,61gpr_pc,6263fpr_f0,64fpr_f1,65fpr_f2,66fpr_f3,67fpr_f4,68fpr_f5,69fpr_f6,70fpr_f7,71fpr_f8,72fpr_f9,73fpr_f10,74fpr_f11,75fpr_f12,76fpr_f13,77fpr_f14,78fpr_f15,79fpr_f16,80fpr_f17,81fpr_f18,82fpr_f19,83fpr_f20,84fpr_f21,85fpr_f22,86fpr_f23,87fpr_f24,88fpr_f25,89fpr_f26,90fpr_f27,91fpr_f28,92fpr_f29,93fpr_f30,94fpr_f31,95fpr_fcsr,9697exc_exception,98exc_fsr,99exc_far,100101csr_bank,102103k_num_registers104};105106/* clang-format off */107#define GPR_OFFSET(reg) \108(LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::GPR, reg))109#define FPU_OFFSET(reg) \110(LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::FPU, reg) + \111sizeof(RegisterContextDarwin_riscv32::GPR))112#define EXC_OFFSET(reg) \113(LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::EXC, reg) + \114sizeof(RegisterContextDarwin_riscv32::GPR) + \115sizeof(RegisterContextDarwin_riscv32::FPU))116117// These macros will auto define the register name, alt name, register size,118// register offset, encoding, format and native register. This ensures that the119// register state structures are defined correctly and have the correct sizes120// and offsets.121#define DEFINE_GPR_ABI(reg, canon) \122#reg, #canon, \123sizeof(((RegisterContextDarwin_riscv32::GPR *)nullptr)->canon), \124GPR_OFFSET(canon), eEncodingUint, eFormatHex125#define DEFINE_GPR(reg) \126#reg, nullptr, \127sizeof(((RegisterContextDarwin_riscv32::GPR *)nullptr)->reg), \128GPR_OFFSET(reg), eEncodingUint, eFormatHex129#define DEFINE_FPU_ABI(reg, canon) \130#reg, #canon, \131sizeof(((RegisterContextDarwin_riscv32::FPU *)nullptr)->canon), \132FPU_OFFSET(canon), eEncodingUint, eFormatHex133#define DEFINE_FPU(reg) \134#reg, nullptr, \135sizeof(((RegisterContextDarwin_riscv32::FPU *)nullptr)->reg), \136FPU_OFFSET(reg), eEncodingUint, eFormatHex137#define DEFINE_EXC(reg) \138#reg, nullptr, \139sizeof(((RegisterContextDarwin_riscv32::EXC *)nullptr)->reg), \140EXC_OFFSET(reg), eEncodingUint, eFormatHex141#define REG_CONTEXT_SIZE \142(sizeof(RegisterContextDarwin_riscv32::GPR) + \143sizeof(RegisterContextDarwin_riscv32::FPU) + \144sizeof(RegisterContextDarwin_riscv32::EXC) + \145sizeof(RegisterContextDarwin_riscv32::CSR))146/* clang-format on */147148static RegisterInfo g_register_infos[] = {149{150DEFINE_GPR_ABI(zero, x0),151{riscv_dwarf::dwarf_gpr_x0, riscv_dwarf::dwarf_gpr_x0,152LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x0},153nullptr,154nullptr,155nullptr,156},157{158DEFINE_GPR_ABI(ra, x1),159{riscv_dwarf::dwarf_gpr_x1, riscv_dwarf::dwarf_gpr_x1,160LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM, gpr_x1},161nullptr,162nullptr,163nullptr,164},165{166DEFINE_GPR_ABI(sp, x2),167{riscv_dwarf::dwarf_gpr_x2, riscv_dwarf::dwarf_gpr_x2,168LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM, gpr_x2},169nullptr,170nullptr,171nullptr,172},173{174DEFINE_GPR_ABI(gp, x3),175{riscv_dwarf::dwarf_gpr_x3, riscv_dwarf::dwarf_gpr_x3,176LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x3},177nullptr,178nullptr,179nullptr,180},181{182DEFINE_GPR_ABI(tp, x4),183{riscv_dwarf::dwarf_gpr_x4, riscv_dwarf::dwarf_gpr_x4,184LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x4},185nullptr,186nullptr,187nullptr,188},189{190DEFINE_GPR_ABI(t0, x5),191{riscv_dwarf::dwarf_gpr_x5, riscv_dwarf::dwarf_gpr_x5,192LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x5},193nullptr,194nullptr,195nullptr,196},197{198DEFINE_GPR_ABI(t1, x6),199{riscv_dwarf::dwarf_gpr_x6, riscv_dwarf::dwarf_gpr_x6,200LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x6},201nullptr,202nullptr,203nullptr,204},205{206DEFINE_GPR_ABI(t2, x7),207{riscv_dwarf::dwarf_gpr_x7, riscv_dwarf::dwarf_gpr_x7,208LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x7},209nullptr,210nullptr,211nullptr,212},213{214DEFINE_GPR_ABI(fp, x8),215{riscv_dwarf::dwarf_gpr_x8, riscv_dwarf::dwarf_gpr_x8,216LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM, gpr_x8},217nullptr,218nullptr,219nullptr,220},221{222DEFINE_GPR_ABI(s1, x9),223{riscv_dwarf::dwarf_gpr_x9, riscv_dwarf::dwarf_gpr_x9,224LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x9},225nullptr,226nullptr,227nullptr,228},229{230DEFINE_GPR_ABI(a0, x10),231{riscv_dwarf::dwarf_gpr_x10, riscv_dwarf::dwarf_gpr_x10,232LLDB_REGNUM_GENERIC_ARG1, LLDB_INVALID_REGNUM, gpr_x10},233nullptr,234nullptr,235nullptr,236},237{238DEFINE_GPR_ABI(a1, x11),239{riscv_dwarf::dwarf_gpr_x11, riscv_dwarf::dwarf_gpr_x11,240LLDB_REGNUM_GENERIC_ARG2, LLDB_INVALID_REGNUM, gpr_x11},241nullptr,242nullptr,243nullptr,244},245{246DEFINE_GPR_ABI(a2, x12),247{riscv_dwarf::dwarf_gpr_x12, riscv_dwarf::dwarf_gpr_x12,248LLDB_REGNUM_GENERIC_ARG3, LLDB_INVALID_REGNUM, gpr_x12},249nullptr,250nullptr,251nullptr,252},253{254DEFINE_GPR_ABI(a3, x13),255{riscv_dwarf::dwarf_gpr_x13, riscv_dwarf::dwarf_gpr_x13,256LLDB_REGNUM_GENERIC_ARG4, LLDB_INVALID_REGNUM, gpr_x13},257nullptr,258nullptr,259nullptr,260},261{262DEFINE_GPR_ABI(a4, x14),263{riscv_dwarf::dwarf_gpr_x14, riscv_dwarf::dwarf_gpr_x14,264LLDB_REGNUM_GENERIC_ARG5, LLDB_INVALID_REGNUM, gpr_x14},265nullptr,266nullptr,267nullptr,268},269{270DEFINE_GPR_ABI(a5, x15),271{riscv_dwarf::dwarf_gpr_x15, riscv_dwarf::dwarf_gpr_x15,272LLDB_REGNUM_GENERIC_ARG6, LLDB_INVALID_REGNUM, gpr_x15},273nullptr,274nullptr,275nullptr,276},277{278DEFINE_GPR_ABI(a6, x16),279{riscv_dwarf::dwarf_gpr_x16, riscv_dwarf::dwarf_gpr_x16,280LLDB_REGNUM_GENERIC_ARG7, LLDB_INVALID_REGNUM, gpr_x16},281nullptr,282nullptr,283nullptr,284},285{286DEFINE_GPR_ABI(a7, x17),287{riscv_dwarf::dwarf_gpr_x17, riscv_dwarf::dwarf_gpr_x17,288LLDB_REGNUM_GENERIC_ARG8, LLDB_INVALID_REGNUM, gpr_x17},289nullptr,290nullptr,291nullptr,292},293{294DEFINE_GPR_ABI(s2, x18),295{riscv_dwarf::dwarf_gpr_x18, riscv_dwarf::dwarf_gpr_x18,296LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x18},297nullptr,298nullptr,299nullptr,300},301{302DEFINE_GPR_ABI(s3, x19),303{riscv_dwarf::dwarf_gpr_x19, riscv_dwarf::dwarf_gpr_x19,304LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x19},305nullptr,306nullptr,307nullptr,308},309{310DEFINE_GPR_ABI(s4, x20),311{riscv_dwarf::dwarf_gpr_x20, riscv_dwarf::dwarf_gpr_x20,312LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x20},313nullptr,314nullptr,315nullptr,316},317{318DEFINE_GPR_ABI(s5, x21),319{riscv_dwarf::dwarf_gpr_x21, riscv_dwarf::dwarf_gpr_x21,320LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x21},321nullptr,322nullptr,323nullptr,324},325{326DEFINE_GPR_ABI(s6, x22),327{riscv_dwarf::dwarf_gpr_x22, riscv_dwarf::dwarf_gpr_x22,328LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x22},329nullptr,330nullptr,331nullptr,332},333{334DEFINE_GPR_ABI(s7, x23),335{riscv_dwarf::dwarf_gpr_x23, riscv_dwarf::dwarf_gpr_x23,336LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x23},337nullptr,338nullptr,339nullptr,340},341{342DEFINE_GPR_ABI(s8, x24),343{riscv_dwarf::dwarf_gpr_x24, riscv_dwarf::dwarf_gpr_x24,344LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x24},345nullptr,346nullptr,347nullptr,348},349{350DEFINE_GPR_ABI(s9, x25),351{riscv_dwarf::dwarf_gpr_x25, riscv_dwarf::dwarf_gpr_x25,352LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x25},353nullptr,354nullptr,355nullptr,356},357{358DEFINE_GPR_ABI(s10, x26),359{riscv_dwarf::dwarf_gpr_x26, riscv_dwarf::dwarf_gpr_x26,360LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x26},361nullptr,362nullptr,363nullptr,364},365{366DEFINE_GPR_ABI(s11, x27),367{riscv_dwarf::dwarf_gpr_x27, riscv_dwarf::dwarf_gpr_x27,368LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x27},369nullptr,370nullptr,371nullptr,372},373{374DEFINE_GPR_ABI(t3, x28),375{riscv_dwarf::dwarf_gpr_x28, riscv_dwarf::dwarf_gpr_x28,376LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x28},377nullptr,378nullptr,379nullptr,380},381{382DEFINE_GPR_ABI(t4, x29),383{riscv_dwarf::dwarf_gpr_x29, riscv_dwarf::dwarf_gpr_x29,384LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x29},385nullptr,386nullptr,387nullptr,388},389{390DEFINE_GPR_ABI(t5, x30),391{riscv_dwarf::dwarf_gpr_x30, riscv_dwarf::dwarf_gpr_x30,392LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x30},393nullptr,394nullptr,395nullptr,396},397{398DEFINE_GPR_ABI(t6, x31),399{riscv_dwarf::dwarf_gpr_x31, riscv_dwarf::dwarf_gpr_x31,400LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_x31},401nullptr,402nullptr,403nullptr,404},405{406DEFINE_GPR(pc),407{riscv_dwarf::dwarf_gpr_pc, riscv_dwarf::dwarf_gpr_pc,408LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM, gpr_pc},409nullptr,410nullptr,411nullptr,412},413414{415DEFINE_FPU_ABI(ft0, f0),416{riscv_dwarf::dwarf_fpr_f0, riscv_dwarf::dwarf_fpr_f0,417LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f0},418nullptr,419nullptr,420nullptr,421},422{423DEFINE_FPU_ABI(ft1, f1),424{riscv_dwarf::dwarf_fpr_f1, riscv_dwarf::dwarf_fpr_f1,425LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f1},426nullptr,427nullptr,428nullptr,429},430{431DEFINE_FPU_ABI(ft2, f2),432{riscv_dwarf::dwarf_fpr_f2, riscv_dwarf::dwarf_fpr_f2,433LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f2},434nullptr,435nullptr,436nullptr,437},438{439DEFINE_FPU_ABI(ft3, f3),440{riscv_dwarf::dwarf_fpr_f3, riscv_dwarf::dwarf_fpr_f3,441LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f3},442nullptr,443nullptr,444nullptr,445},446{447DEFINE_FPU_ABI(ft4, f4),448{riscv_dwarf::dwarf_fpr_f4, riscv_dwarf::dwarf_fpr_f4,449LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f4},450nullptr,451nullptr,452nullptr,453},454{455DEFINE_FPU_ABI(ft5, f5),456{riscv_dwarf::dwarf_fpr_f5, riscv_dwarf::dwarf_fpr_f5,457LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f5},458nullptr,459nullptr,460nullptr,461},462{463DEFINE_FPU_ABI(ft6, f6),464{riscv_dwarf::dwarf_fpr_f6, riscv_dwarf::dwarf_fpr_f6,465LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f6},466nullptr,467nullptr,468nullptr,469},470{471DEFINE_FPU_ABI(ft7, f7),472{riscv_dwarf::dwarf_fpr_f7, riscv_dwarf::dwarf_fpr_f7,473LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f7},474nullptr,475nullptr,476nullptr,477},478{479DEFINE_FPU_ABI(fs0, f8),480{riscv_dwarf::dwarf_fpr_f8, riscv_dwarf::dwarf_fpr_f8,481LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f8},482nullptr,483nullptr,484nullptr,485},486{487DEFINE_FPU_ABI(fs1, f9),488{riscv_dwarf::dwarf_fpr_f9, riscv_dwarf::dwarf_fpr_f9,489LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f9},490nullptr,491nullptr,492nullptr,493},494{495DEFINE_FPU_ABI(fa0, f10),496{riscv_dwarf::dwarf_fpr_f10, riscv_dwarf::dwarf_fpr_f10,497LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f10},498nullptr,499nullptr,500nullptr,501},502{503DEFINE_FPU_ABI(fa1, f11),504{riscv_dwarf::dwarf_fpr_f11, riscv_dwarf::dwarf_fpr_f11,505LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f11},506nullptr,507nullptr,508nullptr,509},510{511DEFINE_FPU_ABI(fa2, f12),512{riscv_dwarf::dwarf_fpr_f12, riscv_dwarf::dwarf_fpr_f12,513LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f12},514nullptr,515nullptr,516nullptr,517},518{519DEFINE_FPU_ABI(fa3, f13),520{riscv_dwarf::dwarf_fpr_f13, riscv_dwarf::dwarf_fpr_f13,521LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f13},522nullptr,523nullptr,524nullptr,525},526{527DEFINE_FPU_ABI(fa4, f14),528{riscv_dwarf::dwarf_fpr_f14, riscv_dwarf::dwarf_fpr_f14,529LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f14},530nullptr,531nullptr,532nullptr,533},534{535DEFINE_FPU_ABI(fa5, f15),536{riscv_dwarf::dwarf_fpr_f15, riscv_dwarf::dwarf_fpr_f15,537LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f15},538nullptr,539nullptr,540nullptr,541},542{543DEFINE_FPU_ABI(fa6, f16),544{riscv_dwarf::dwarf_fpr_f16, riscv_dwarf::dwarf_fpr_f16,545LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f16},546nullptr,547nullptr,548nullptr,549},550{551DEFINE_FPU_ABI(fa7, f17),552{riscv_dwarf::dwarf_fpr_f17, riscv_dwarf::dwarf_fpr_f17,553LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f17},554nullptr,555nullptr,556nullptr,557},558{559DEFINE_FPU_ABI(fs2, f18),560{riscv_dwarf::dwarf_fpr_f18, riscv_dwarf::dwarf_fpr_f18,561LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f18},562nullptr,563nullptr,564nullptr,565},566{567DEFINE_FPU_ABI(fs3, f19),568{riscv_dwarf::dwarf_fpr_f19, riscv_dwarf::dwarf_fpr_f19,569LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f19},570nullptr,571nullptr,572nullptr,573},574{575DEFINE_FPU_ABI(fs4, f20),576{riscv_dwarf::dwarf_fpr_f20, riscv_dwarf::dwarf_fpr_f20,577LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f20},578nullptr,579nullptr,580nullptr,581},582{583DEFINE_FPU_ABI(fs5, f21),584{riscv_dwarf::dwarf_fpr_f21, riscv_dwarf::dwarf_fpr_f21,585LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f21},586nullptr,587nullptr,588nullptr,589},590{591DEFINE_FPU_ABI(fs6, f22),592{riscv_dwarf::dwarf_fpr_f22, riscv_dwarf::dwarf_fpr_f22,593LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f22},594nullptr,595nullptr,596nullptr,597},598{599DEFINE_FPU_ABI(fs7, f23),600{riscv_dwarf::dwarf_fpr_f23, riscv_dwarf::dwarf_fpr_f23,601LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f23},602nullptr,603nullptr,604nullptr,605},606{607DEFINE_FPU_ABI(fs8, f24),608{riscv_dwarf::dwarf_fpr_f24, riscv_dwarf::dwarf_fpr_f24,609LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f24},610nullptr,611nullptr,612nullptr,613},614{615DEFINE_FPU_ABI(fs9, f25),616{riscv_dwarf::dwarf_fpr_f25, riscv_dwarf::dwarf_fpr_f25,617LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f25},618nullptr,619nullptr,620nullptr,621},622{623DEFINE_FPU_ABI(fs10, f26),624{riscv_dwarf::dwarf_fpr_f26, riscv_dwarf::dwarf_fpr_f26,625LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f26},626nullptr,627nullptr,628nullptr,629},630{631DEFINE_FPU_ABI(fs11, f27),632{riscv_dwarf::dwarf_fpr_f27, riscv_dwarf::dwarf_fpr_f27,633LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f27},634nullptr,635nullptr,636nullptr,637},638{639DEFINE_FPU_ABI(ft8, f28),640{riscv_dwarf::dwarf_fpr_f28, riscv_dwarf::dwarf_fpr_f28,641LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f28},642nullptr,643nullptr,644nullptr,645},646{647DEFINE_FPU_ABI(ft9, f29),648{riscv_dwarf::dwarf_fpr_f29, riscv_dwarf::dwarf_fpr_f29,649LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f29},650nullptr,651nullptr,652nullptr,653},654{655DEFINE_FPU_ABI(ft10, f30),656{riscv_dwarf::dwarf_fpr_f30, riscv_dwarf::dwarf_fpr_f30,657LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f30},658nullptr,659nullptr,660nullptr,661},662{663DEFINE_FPU_ABI(ft11, f31),664{riscv_dwarf::dwarf_fpr_f31, riscv_dwarf::dwarf_fpr_f31,665LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, fpr_f31},666nullptr,667nullptr,668nullptr,669},670{671DEFINE_FPU(fcsr),672{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,673LLDB_INVALID_REGNUM, fpr_fcsr},674nullptr,675nullptr,676nullptr,677},678679{680DEFINE_EXC(exception),681{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,682LLDB_INVALID_REGNUM, exc_exception},683nullptr,684nullptr,685nullptr,686},687{688DEFINE_EXC(fsr),689{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,690LLDB_INVALID_REGNUM, exc_fsr},691nullptr,692nullptr,693nullptr,694},695{696DEFINE_EXC(far),697{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,698LLDB_INVALID_REGNUM, exc_far},699nullptr,700nullptr,701nullptr,702},703{"csr",704nullptr,7051024 * sizeof(uint32_t),7060,707eEncodingVector,708eFormatVectorOfUInt32,709{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,710LLDB_INVALID_REGNUM, csr_bank},711nullptr,712nullptr,713nullptr}};714715static size_t k_num_register_infos = std::size(g_register_infos);716717RegisterContextDarwin_riscv32::RegisterContextDarwin_riscv32(718Thread &thread, uint32_t concrete_frame_idx)719: RegisterContext(thread, concrete_frame_idx), gpr(), fpr(), exc() {720uint32_t i;721for (i = 0; i < kNumErrors; i++) {722gpr_errs[i] = -1;723fpr_errs[i] = -1;724exc_errs[i] = -1;725csr_errs[i] = -1;726}727}728729RegisterContextDarwin_riscv32::~RegisterContextDarwin_riscv32() = default;730731void RegisterContextDarwin_riscv32::InvalidateAllRegisters() {732InvalidateAllRegisterStates();733}734735size_t RegisterContextDarwin_riscv32::GetRegisterCount() {736assert(k_num_register_infos == k_num_registers);737return k_num_registers;738}739740const RegisterInfo *741RegisterContextDarwin_riscv32::GetRegisterInfoAtIndex(size_t reg) {742assert(k_num_register_infos == k_num_registers);743if (reg < k_num_registers)744return &g_register_infos[reg];745return nullptr;746}747748size_t RegisterContextDarwin_riscv32::GetRegisterInfosCount() {749return k_num_register_infos;750}751752const RegisterInfo *RegisterContextDarwin_riscv32::GetRegisterInfos() {753return g_register_infos;754}755756// General purpose registers757static uint32_t g_gpr_regnums[] = {758gpr_x0, gpr_x1, gpr_x2, gpr_x3, gpr_x4, gpr_x5, gpr_x6,759gpr_x7, gpr_x8, gpr_x9, gpr_x10, gpr_x11, gpr_x12, gpr_x13,760gpr_x14, gpr_x15, gpr_x16, gpr_x17, gpr_x18, gpr_x19, gpr_x20,761gpr_x21, gpr_x22, gpr_x23, gpr_x24, gpr_x25, gpr_x26, gpr_x27,762gpr_x28, gpr_x29, gpr_x30, gpr_x31, gpr_pc};763764// Floating point registers765static uint32_t g_fpr_regnums[] = {766fpr_f0, fpr_f1, fpr_f2, fpr_f3, fpr_f4, fpr_f5, fpr_f6,767fpr_f7, fpr_f8, fpr_f9, fpr_f10, fpr_f11, fpr_f12, fpr_f13,768fpr_f14, fpr_f15, fpr_f16, fpr_f17, fpr_f18, fpr_f19, fpr_f20,769fpr_f21, fpr_f22, fpr_f23, fpr_f24, fpr_f25, fpr_f26, fpr_f27,770fpr_f28, fpr_f29, fpr_f30, fpr_f31, fpr_fcsr};771772// Exception registers773774static uint32_t g_exc_regnums[] = {exc_exception, exc_fsr, exc_far};775776// CSR bank registers777static uint32_t g_csr_regnums[] = {csr_bank};778779// Number of registers in each register set780const size_t k_num_gpr_registers = std::size(g_gpr_regnums);781const size_t k_num_fpr_registers = std::size(g_fpr_regnums);782const size_t k_num_exc_registers = std::size(g_exc_regnums);783const size_t k_num_csr_registers = std::size(g_csr_regnums);784785// Register set definitions. The first definitions at register set index of786// zero is for all registers, followed by other registers sets. The register787// information for the all register set need not be filled in.788static const RegisterSet g_reg_sets[] = {789{790"General Purpose Registers",791"gpr",792k_num_gpr_registers,793g_gpr_regnums,794},795{"Floating Point Registers", "fpr", k_num_fpr_registers, g_fpr_regnums},796{"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums},797{"CSR register bank", "csr", k_num_csr_registers, g_csr_regnums}};798799const size_t k_num_regsets = std::size(g_reg_sets);800801size_t RegisterContextDarwin_riscv32::GetRegisterSetCount() {802return k_num_regsets;803}804805const RegisterSet *806RegisterContextDarwin_riscv32::GetRegisterSet(size_t reg_set) {807if (reg_set < k_num_regsets)808return &g_reg_sets[reg_set];809return nullptr;810}811812// Register information definitions for 32 bit riscv32.813int RegisterContextDarwin_riscv32::GetSetForNativeRegNum(int reg_num) {814if (reg_num < fpr_f0)815return GPRRegSet;816else if (reg_num < exc_exception)817return FPURegSet;818else if (reg_num < csr_bank)819return EXCRegSet;820else if (reg_num < k_num_registers)821return CSRRegSet;822return -1;823}824825void RegisterContextDarwin_riscv32::LogGPR(Log *log, const char *title) {826if (log) {827if (title)828LLDB_LOGF(log, "%s", title);829for (uint32_t i = 0; i < k_num_gpr_registers; i++) {830uint32_t reg = gpr_x0 + i;831LLDB_LOGF(log, "%12s = 0x%4.4x", g_register_infos[reg].name,832(&gpr.x0)[reg]);833}834}835}836837int RegisterContextDarwin_riscv32::ReadGPR(bool force) {838int set = GPRRegSet;839if (force || !RegisterSetIsCached(set)) {840SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));841}842return GetError(set, Read);843}844845int RegisterContextDarwin_riscv32::ReadFPU(bool force) {846int set = FPURegSet;847if (force || !RegisterSetIsCached(set)) {848SetError(set, Read, DoReadFPU(GetThreadID(), set, fpr));849}850return GetError(set, Read);851}852853int RegisterContextDarwin_riscv32::ReadEXC(bool force) {854int set = EXCRegSet;855if (force || !RegisterSetIsCached(set)) {856SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));857}858return GetError(set, Read);859}860861int RegisterContextDarwin_riscv32::ReadCSR(bool force) {862int set = CSRRegSet;863if (force || !RegisterSetIsCached(set)) {864SetError(set, Read, DoReadCSR(GetThreadID(), set, csr));865}866return GetError(set, Read);867}868869int RegisterContextDarwin_riscv32::WriteGPR() {870int set = GPRRegSet;871if (!RegisterSetIsCached(set)) {872SetError(set, Write, -1);873return -1;874}875SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr));876SetError(set, Read, -1);877return GetError(set, Write);878}879880int RegisterContextDarwin_riscv32::WriteFPU() {881int set = FPURegSet;882if (!RegisterSetIsCached(set)) {883SetError(set, Write, -1);884return -1;885}886SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpr));887SetError(set, Read, -1);888return GetError(set, Write);889}890891int RegisterContextDarwin_riscv32::WriteEXC() {892int set = EXCRegSet;893if (!RegisterSetIsCached(set)) {894SetError(set, Write, -1);895return -1;896}897SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc));898SetError(set, Read, -1);899return GetError(set, Write);900}901902int RegisterContextDarwin_riscv32::WriteCSR() {903int set = CSRRegSet;904if (!RegisterSetIsCached(set)) {905SetError(set, Write, -1);906return -1;907}908SetError(set, Write, DoWriteCSR(GetThreadID(), set, csr));909SetError(set, Read, -1);910return GetError(set, Write);911}912913int RegisterContextDarwin_riscv32::ReadRegisterSet(uint32_t set, bool force) {914switch (set) {915case GPRRegSet:916return ReadGPR(force);917case FPURegSet:918return ReadFPU(force);919case EXCRegSet:920return ReadEXC(force);921case CSRRegSet:922return ReadCSR(force);923default:924break;925}926return -1;927}928929int RegisterContextDarwin_riscv32::WriteRegisterSet(uint32_t set) {930// Make sure we have a valid context to set.931if (RegisterSetIsCached(set)) {932switch (set) {933case GPRRegSet:934return WriteGPR();935case FPURegSet:936return WriteFPU();937case EXCRegSet:938return WriteEXC();939case CSRRegSet:940return WriteCSR();941default:942break;943}944}945return -1;946}947948bool RegisterContextDarwin_riscv32::ReadRegister(const RegisterInfo *reg_info,949RegisterValue &value) {950const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];951int set = RegisterContextDarwin_riscv32::GetSetForNativeRegNum(reg);952953if (set == -1)954return false;955956if (ReadRegisterSet(set, false) != 0)957return false;958959switch (reg) {960case gpr_x0:961case gpr_x1:962case gpr_x2:963case gpr_x3:964case gpr_x4:965case gpr_x5:966case gpr_x6:967case gpr_x7:968case gpr_x8:969case gpr_x9:970case gpr_x10:971case gpr_x11:972case gpr_x12:973case gpr_x13:974case gpr_x14:975case gpr_x15:976case gpr_x16:977case gpr_x17:978case gpr_x18:979case gpr_x19:980case gpr_x20:981case gpr_x21:982case gpr_x22:983case gpr_x23:984case gpr_x24:985case gpr_x25:986case gpr_x26:987case gpr_x27:988case gpr_x28:989case gpr_x29:990case gpr_x30:991case gpr_x31:992case gpr_pc:993value = (&gpr.x0)[reg - gpr_x0];994break;995996case fpr_f0:997case fpr_f1:998case fpr_f2:999case fpr_f3:1000case fpr_f4:1001case fpr_f5:1002case fpr_f6:1003case fpr_f7:1004case fpr_f8:1005case fpr_f9:1006case fpr_f10:1007case fpr_f11:1008case fpr_f12:1009case fpr_f13:1010case fpr_f14:1011case fpr_f15:1012case fpr_f16:1013case fpr_f17:1014case fpr_f18:1015case fpr_f19:1016case fpr_f20:1017case fpr_f21:1018case fpr_f22:1019case fpr_f23:1020case fpr_f24:1021case fpr_f25:1022case fpr_f26:1023case fpr_f27:1024case fpr_f28:1025case fpr_f29:1026case fpr_f30:1027case fpr_f31:1028case fpr_fcsr:1029value = (&fpr.f0)[reg - fpr_f0];1030break;10311032case exc_exception:1033value = exc.exception;1034break;10351036case exc_fsr:1037value = exc.fsr;1038break;10391040case exc_far:1041value = exc.far;1042break;10431044case csr_bank:1045// These values don't fit into scalar types,1046// RegisterContext::ReadRegisterBytes() must be used for these registers1047//::memcpy (reg_value.value.vector.uint8, fpu.stmm[reg - fpu_stmm0].bytes,1048// 10);10491050// AArch64 copies NEON registers with1051// value.SetBytes(csr.bytes, reg_info->byte_size,1052// endian::InlHostByteOrder());1053return false;10541055default:1056return false;1057}1058return true;1059}10601061bool RegisterContextDarwin_riscv32::WriteRegister(const RegisterInfo *reg_info,1062const RegisterValue &value) {1063const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];1064int set = GetSetForNativeRegNum(reg);10651066if (set == -1)1067return false;10681069if (ReadRegisterSet(set, false) != 0)1070return false;10711072switch (reg) {1073case gpr_x0:1074case gpr_x1:1075case gpr_x2:1076case gpr_x3:1077case gpr_x4:1078case gpr_x5:1079case gpr_x6:1080case gpr_x7:1081case gpr_x8:1082case gpr_x9:1083case gpr_x10:1084case gpr_x11:1085case gpr_x12:1086case gpr_x13:1087case gpr_x14:1088case gpr_x15:1089case gpr_x16:1090case gpr_x17:1091case gpr_x18:1092case gpr_x19:1093case gpr_x20:1094case gpr_x21:1095case gpr_x22:1096case gpr_x23:1097case gpr_x24:1098case gpr_x25:1099case gpr_x26:1100case gpr_x27:1101case gpr_x28:1102case gpr_x29:1103case gpr_x30:1104case gpr_x31:1105case gpr_pc:1106(&gpr.x0)[reg - gpr_x0] = value.GetAsUInt32();1107break;11081109case fpr_f0:1110case fpr_f1:1111case fpr_f2:1112case fpr_f3:1113case fpr_f4:1114case fpr_f5:1115case fpr_f6:1116case fpr_f7:1117case fpr_f8:1118case fpr_f9:1119case fpr_f10:1120case fpr_f11:1121case fpr_f12:1122case fpr_f13:1123case fpr_f14:1124case fpr_f15:1125case fpr_f16:1126case fpr_f17:1127case fpr_f18:1128case fpr_f19:1129case fpr_f20:1130case fpr_f21:1131case fpr_f22:1132case fpr_f23:1133case fpr_f24:1134case fpr_f25:1135case fpr_f26:1136case fpr_f27:1137case fpr_f28:1138case fpr_f29:1139case fpr_f30:1140case fpr_f31:1141case fpr_fcsr:1142(&fpr.f0)[reg - fpr_f0] = value.GetAsUInt32();1143break;11441145case exc_exception:1146exc.exception = value.GetAsUInt32();1147break;11481149case exc_fsr:1150exc.fsr = value.GetAsUInt32();1151break;11521153case exc_far:1154exc.far = value.GetAsUInt32();1155break;11561157case csr_bank:1158// These values don't fit into scalar types,1159// RegisterContext::ReadRegisterBytes() must be used for these registers1160//::memcpy(csr.bytes, value.GetBytes(),1161// value.GetByteSize());1162return false;11631164default:1165return false;1166}1167return WriteRegisterSet(set) == 0;1168}11691170bool RegisterContextDarwin_riscv32::ReadAllRegisterValues(1171lldb::WritableDataBufferSP &data_sp) {1172data_sp = std::make_shared<DataBufferHeap>(REG_CONTEXT_SIZE, 0);1173if (ReadGPR(false) == 0 && ReadFPU(false) == 0 && ReadEXC(false) == 0 &&1174ReadCSR(false) == 0) {1175uint8_t *dst = data_sp->GetBytes();1176::memcpy(dst, &gpr, sizeof(gpr));1177dst += sizeof(gpr);11781179::memcpy(dst, &fpr, sizeof(fpr));1180dst += sizeof(gpr);11811182::memcpy(dst, &exc, sizeof(exc));1183return true;11841185::memcpy(dst, &csr, sizeof(csr));1186return true;1187}1188return false;1189}11901191bool RegisterContextDarwin_riscv32::WriteAllRegisterValues(1192const lldb::DataBufferSP &data_sp) {1193if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) {1194const uint8_t *src = data_sp->GetBytes();1195::memcpy(&gpr, src, sizeof(gpr));1196src += sizeof(gpr);11971198::memcpy(&fpr, src, sizeof(fpr));1199src += sizeof(fpr);12001201::memcpy(&exc, src, sizeof(exc));1202src += sizeof(exc);12031204::memcpy(&csr, src, sizeof(csr));1205uint32_t success_count = 0;12061207if (WriteGPR() == 0)1208++success_count;1209if (WriteFPU() == 0)1210++success_count;1211if (WriteEXC() == 0)1212++success_count;1213if (WriteCSR() == 0)1214++success_count;1215return success_count == 3;1216}1217return false;1218}12191220uint32_t RegisterContextDarwin_riscv32::ConvertRegisterKindToRegisterNumber(1221lldb::RegisterKind kind, uint32_t reg) {1222if (kind == eRegisterKindGeneric) {1223switch (reg) {1224case LLDB_REGNUM_GENERIC_PC:1225return gpr_pc;1226case LLDB_REGNUM_GENERIC_SP:1227return gpr_x2;1228case LLDB_REGNUM_GENERIC_FP:1229return gpr_x8;1230case LLDB_REGNUM_GENERIC_RA:1231return gpr_x1;1232default:1233break;1234}1235} else if (kind == eRegisterKindEHFrame || kind == eRegisterKindDWARF) {1236switch (reg) {1237case riscv_dwarf::dwarf_gpr_x0:1238case riscv_dwarf::dwarf_gpr_x1:1239case riscv_dwarf::dwarf_gpr_x2:1240case riscv_dwarf::dwarf_gpr_x3:1241case riscv_dwarf::dwarf_gpr_x4:1242case riscv_dwarf::dwarf_gpr_x5:1243case riscv_dwarf::dwarf_gpr_x6:1244case riscv_dwarf::dwarf_gpr_x7:1245case riscv_dwarf::dwarf_gpr_x8:1246case riscv_dwarf::dwarf_gpr_x9:1247case riscv_dwarf::dwarf_gpr_x10:1248case riscv_dwarf::dwarf_gpr_x11:1249case riscv_dwarf::dwarf_gpr_x12:1250case riscv_dwarf::dwarf_gpr_x13:1251case riscv_dwarf::dwarf_gpr_x14:1252case riscv_dwarf::dwarf_gpr_x15:1253case riscv_dwarf::dwarf_gpr_x16:1254case riscv_dwarf::dwarf_gpr_x17:1255case riscv_dwarf::dwarf_gpr_x18:1256case riscv_dwarf::dwarf_gpr_x19:1257case riscv_dwarf::dwarf_gpr_x20:1258case riscv_dwarf::dwarf_gpr_x21:1259case riscv_dwarf::dwarf_gpr_x22:1260case riscv_dwarf::dwarf_gpr_x23:1261case riscv_dwarf::dwarf_gpr_x24:1262case riscv_dwarf::dwarf_gpr_x25:1263case riscv_dwarf::dwarf_gpr_x26:1264case riscv_dwarf::dwarf_gpr_x27:1265case riscv_dwarf::dwarf_gpr_x28:1266case riscv_dwarf::dwarf_gpr_x29:1267case riscv_dwarf::dwarf_gpr_x30:1268case riscv_dwarf::dwarf_gpr_x31:1269return gpr_x0 + (reg - riscv_dwarf::dwarf_gpr_x0);12701271case riscv_dwarf::dwarf_fpr_f0:1272case riscv_dwarf::dwarf_fpr_f1:1273case riscv_dwarf::dwarf_fpr_f2:1274case riscv_dwarf::dwarf_fpr_f3:1275case riscv_dwarf::dwarf_fpr_f4:1276case riscv_dwarf::dwarf_fpr_f5:1277case riscv_dwarf::dwarf_fpr_f6:1278case riscv_dwarf::dwarf_fpr_f7:1279case riscv_dwarf::dwarf_fpr_f8:1280case riscv_dwarf::dwarf_fpr_f9:1281case riscv_dwarf::dwarf_fpr_f10:1282case riscv_dwarf::dwarf_fpr_f11:1283case riscv_dwarf::dwarf_fpr_f12:1284case riscv_dwarf::dwarf_fpr_f13:1285case riscv_dwarf::dwarf_fpr_f14:1286case riscv_dwarf::dwarf_fpr_f15:1287case riscv_dwarf::dwarf_fpr_f16:1288case riscv_dwarf::dwarf_fpr_f17:1289case riscv_dwarf::dwarf_fpr_f18:1290case riscv_dwarf::dwarf_fpr_f19:1291case riscv_dwarf::dwarf_fpr_f20:1292case riscv_dwarf::dwarf_fpr_f21:1293case riscv_dwarf::dwarf_fpr_f22:1294case riscv_dwarf::dwarf_fpr_f23:1295case riscv_dwarf::dwarf_fpr_f24:1296case riscv_dwarf::dwarf_fpr_f25:1297case riscv_dwarf::dwarf_fpr_f26:1298case riscv_dwarf::dwarf_fpr_f27:1299case riscv_dwarf::dwarf_fpr_f28:1300case riscv_dwarf::dwarf_fpr_f29:1301case riscv_dwarf::dwarf_fpr_f30:1302case riscv_dwarf::dwarf_fpr_f31:1303return fpr_f0 + (reg - riscv_dwarf::dwarf_fpr_f0);13041305default:1306break;1307}1308} else if (kind == eRegisterKindLLDB) {1309return reg;1310}1311return LLDB_INVALID_REGNUM;1312}131313141315