LLDB mainline
RegisterContextDarwin_riscv32.cpp
Go to the documentation of this file.
1//===-- RegisterContextDarwin_riscv32.cpp
2//------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
12#include "lldb/Utility/Endian.h"
13#include "lldb/Utility/Log.h"
15#include "lldb/Utility/Scalar.h"
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/Support/Compiler.h"
18
19#include <cstddef>
20
21#include <memory>
22
25
26using namespace lldb;
27using namespace lldb_private;
28
29enum {
30 gpr_x0 = 0,
63
97
101
103
105};
106
107/* clang-format off */
108#define GPR_OFFSET(reg) \
109 (LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::GPR, reg))
110#define FPU_OFFSET(reg) \
111 (LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::FPU, reg) + \
112 sizeof(RegisterContextDarwin_riscv32::GPR))
113#define EXC_OFFSET(reg) \
114 (LLVM_EXTENSION offsetof(RegisterContextDarwin_riscv32::EXC, reg) + \
115 sizeof(RegisterContextDarwin_riscv32::GPR) + \
116 sizeof(RegisterContextDarwin_riscv32::FPU))
117
118// These macros will auto define the register name, alt name, register size,
119// register offset, encoding, format and native register. This ensures that the
120// register state structures are defined correctly and have the correct sizes
121// and offsets.
122#define DEFINE_GPR_ABI(reg, canon) \
123 #reg, #canon, \
124 sizeof(((RegisterContextDarwin_riscv32::GPR *)nullptr)->canon), \
125 GPR_OFFSET(canon), eEncodingUint, eFormatHex
126#define DEFINE_GPR(reg) \
127 #reg, nullptr, \
128 sizeof(((RegisterContextDarwin_riscv32::GPR *)nullptr)->reg), \
129 GPR_OFFSET(reg), eEncodingUint, eFormatHex
130#define DEFINE_FPU_ABI(reg, canon) \
131 #reg, #canon, \
132 sizeof(((RegisterContextDarwin_riscv32::FPU *)nullptr)->canon), \
133 FPU_OFFSET(canon), eEncodingUint, eFormatHex
134#define DEFINE_FPU(reg) \
135 #reg, nullptr, \
136 sizeof(((RegisterContextDarwin_riscv32::FPU *)nullptr)->reg), \
137 FPU_OFFSET(reg), eEncodingUint, eFormatHex
138#define DEFINE_EXC(reg) \
139 #reg, nullptr, \
140 sizeof(((RegisterContextDarwin_riscv32::EXC *)nullptr)->reg), \
141 EXC_OFFSET(reg), eEncodingUint, eFormatHex
142#define REG_CONTEXT_SIZE \
143 (sizeof(RegisterContextDarwin_riscv32::GPR) + \
144 sizeof(RegisterContextDarwin_riscv32::FPU) + \
145 sizeof(RegisterContextDarwin_riscv32::EXC) + \
146 sizeof(RegisterContextDarwin_riscv32::CSR))
147/* clang-format on */
148
150 {
151 DEFINE_GPR_ABI(zero, x0),
154 nullptr,
155 nullptr,
156 nullptr,
157 },
158 {
159 DEFINE_GPR_ABI(ra, x1),
162 nullptr,
163 nullptr,
164 nullptr,
165 },
166 {
167 DEFINE_GPR_ABI(sp, x2),
170 nullptr,
171 nullptr,
172 nullptr,
173 },
174 {
175 DEFINE_GPR_ABI(gp, x3),
178 nullptr,
179 nullptr,
180 nullptr,
181 },
182 {
183 DEFINE_GPR_ABI(tp, x4),
186 nullptr,
187 nullptr,
188 nullptr,
189 },
190 {
191 DEFINE_GPR_ABI(t0, x5),
194 nullptr,
195 nullptr,
196 nullptr,
197 },
198 {
199 DEFINE_GPR_ABI(t1, x6),
202 nullptr,
203 nullptr,
204 nullptr,
205 },
206 {
207 DEFINE_GPR_ABI(t2, x7),
210 nullptr,
211 nullptr,
212 nullptr,
213 },
214 {
215 DEFINE_GPR_ABI(fp, x8),
218 nullptr,
219 nullptr,
220 nullptr,
221 },
222 {
223 DEFINE_GPR_ABI(s1, x9),
226 nullptr,
227 nullptr,
228 nullptr,
229 },
230 {
231 DEFINE_GPR_ABI(a0, x10),
234 nullptr,
235 nullptr,
236 nullptr,
237 },
238 {
239 DEFINE_GPR_ABI(a1, x11),
242 nullptr,
243 nullptr,
244 nullptr,
245 },
246 {
247 DEFINE_GPR_ABI(a2, x12),
250 nullptr,
251 nullptr,
252 nullptr,
253 },
254 {
255 DEFINE_GPR_ABI(a3, x13),
258 nullptr,
259 nullptr,
260 nullptr,
261 },
262 {
263 DEFINE_GPR_ABI(a4, x14),
266 nullptr,
267 nullptr,
268 nullptr,
269 },
270 {
271 DEFINE_GPR_ABI(a5, x15),
274 nullptr,
275 nullptr,
276 nullptr,
277 },
278 {
279 DEFINE_GPR_ABI(a6, x16),
282 nullptr,
283 nullptr,
284 nullptr,
285 },
286 {
287 DEFINE_GPR_ABI(a7, x17),
290 nullptr,
291 nullptr,
292 nullptr,
293 },
294 {
295 DEFINE_GPR_ABI(s2, x18),
298 nullptr,
299 nullptr,
300 nullptr,
301 },
302 {
303 DEFINE_GPR_ABI(s3, x19),
306 nullptr,
307 nullptr,
308 nullptr,
309 },
310 {
311 DEFINE_GPR_ABI(s4, x20),
314 nullptr,
315 nullptr,
316 nullptr,
317 },
318 {
319 DEFINE_GPR_ABI(s5, x21),
322 nullptr,
323 nullptr,
324 nullptr,
325 },
326 {
327 DEFINE_GPR_ABI(s6, x22),
330 nullptr,
331 nullptr,
332 nullptr,
333 },
334 {
335 DEFINE_GPR_ABI(s7, x23),
338 nullptr,
339 nullptr,
340 nullptr,
341 },
342 {
343 DEFINE_GPR_ABI(s8, x24),
346 nullptr,
347 nullptr,
348 nullptr,
349 },
350 {
351 DEFINE_GPR_ABI(s9, x25),
354 nullptr,
355 nullptr,
356 nullptr,
357 },
358 {
359 DEFINE_GPR_ABI(s10, x26),
362 nullptr,
363 nullptr,
364 nullptr,
365 },
366 {
367 DEFINE_GPR_ABI(s11, x27),
370 nullptr,
371 nullptr,
372 nullptr,
373 },
374 {
375 DEFINE_GPR_ABI(t3, x28),
378 nullptr,
379 nullptr,
380 nullptr,
381 },
382 {
383 DEFINE_GPR_ABI(t4, x29),
386 nullptr,
387 nullptr,
388 nullptr,
389 },
390 {
391 DEFINE_GPR_ABI(t5, x30),
394 nullptr,
395 nullptr,
396 nullptr,
397 },
398 {
399 DEFINE_GPR_ABI(t6, x31),
402 nullptr,
403 nullptr,
404 nullptr,
405 },
406 {
407 DEFINE_GPR(pc),
410 nullptr,
411 nullptr,
412 nullptr,
413 },
414
415 {
416 DEFINE_FPU_ABI(ft0, f0),
419 nullptr,
420 nullptr,
421 nullptr,
422 },
423 {
424 DEFINE_FPU_ABI(ft1, f1),
427 nullptr,
428 nullptr,
429 nullptr,
430 },
431 {
432 DEFINE_FPU_ABI(ft2, f2),
435 nullptr,
436 nullptr,
437 nullptr,
438 },
439 {
440 DEFINE_FPU_ABI(ft3, f3),
443 nullptr,
444 nullptr,
445 nullptr,
446 },
447 {
448 DEFINE_FPU_ABI(ft4, f4),
451 nullptr,
452 nullptr,
453 nullptr,
454 },
455 {
456 DEFINE_FPU_ABI(ft5, f5),
459 nullptr,
460 nullptr,
461 nullptr,
462 },
463 {
464 DEFINE_FPU_ABI(ft6, f6),
467 nullptr,
468 nullptr,
469 nullptr,
470 },
471 {
472 DEFINE_FPU_ABI(ft7, f7),
475 nullptr,
476 nullptr,
477 nullptr,
478 },
479 {
480 DEFINE_FPU_ABI(fs0, f8),
483 nullptr,
484 nullptr,
485 nullptr,
486 },
487 {
488 DEFINE_FPU_ABI(fs1, f9),
491 nullptr,
492 nullptr,
493 nullptr,
494 },
495 {
496 DEFINE_FPU_ABI(fa0, f10),
499 nullptr,
500 nullptr,
501 nullptr,
502 },
503 {
504 DEFINE_FPU_ABI(fa1, f11),
507 nullptr,
508 nullptr,
509 nullptr,
510 },
511 {
512 DEFINE_FPU_ABI(fa2, f12),
515 nullptr,
516 nullptr,
517 nullptr,
518 },
519 {
520 DEFINE_FPU_ABI(fa3, f13),
523 nullptr,
524 nullptr,
525 nullptr,
526 },
527 {
528 DEFINE_FPU_ABI(fa4, f14),
531 nullptr,
532 nullptr,
533 nullptr,
534 },
535 {
536 DEFINE_FPU_ABI(fa5, f15),
539 nullptr,
540 nullptr,
541 nullptr,
542 },
543 {
544 DEFINE_FPU_ABI(fa6, f16),
547 nullptr,
548 nullptr,
549 nullptr,
550 },
551 {
552 DEFINE_FPU_ABI(fa7, f17),
555 nullptr,
556 nullptr,
557 nullptr,
558 },
559 {
560 DEFINE_FPU_ABI(fs2, f18),
563 nullptr,
564 nullptr,
565 nullptr,
566 },
567 {
568 DEFINE_FPU_ABI(fs3, f19),
571 nullptr,
572 nullptr,
573 nullptr,
574 },
575 {
576 DEFINE_FPU_ABI(fs4, f20),
579 nullptr,
580 nullptr,
581 nullptr,
582 },
583 {
584 DEFINE_FPU_ABI(fs5, f21),
587 nullptr,
588 nullptr,
589 nullptr,
590 },
591 {
592 DEFINE_FPU_ABI(fs6, f22),
595 nullptr,
596 nullptr,
597 nullptr,
598 },
599 {
600 DEFINE_FPU_ABI(fs7, f23),
603 nullptr,
604 nullptr,
605 nullptr,
606 },
607 {
608 DEFINE_FPU_ABI(fs8, f24),
611 nullptr,
612 nullptr,
613 nullptr,
614 },
615 {
616 DEFINE_FPU_ABI(fs9, f25),
619 nullptr,
620 nullptr,
621 nullptr,
622 },
623 {
624 DEFINE_FPU_ABI(fs10, f26),
627 nullptr,
628 nullptr,
629 nullptr,
630 },
631 {
632 DEFINE_FPU_ABI(fs11, f27),
635 nullptr,
636 nullptr,
637 nullptr,
638 },
639 {
640 DEFINE_FPU_ABI(ft8, f28),
643 nullptr,
644 nullptr,
645 nullptr,
646 },
647 {
648 DEFINE_FPU_ABI(ft9, f29),
651 nullptr,
652 nullptr,
653 nullptr,
654 },
655 {
656 DEFINE_FPU_ABI(ft10, f30),
659 nullptr,
660 nullptr,
661 nullptr,
662 },
663 {
664 DEFINE_FPU_ABI(ft11, f31),
667 nullptr,
668 nullptr,
669 nullptr,
670 },
671 {
672 DEFINE_FPU(fcsr),
675 nullptr,
676 nullptr,
677 nullptr,
678 },
679
680 {
681 DEFINE_EXC(exception),
684 nullptr,
685 nullptr,
686 nullptr,
687 },
688 {
689 DEFINE_EXC(fsr),
692 nullptr,
693 nullptr,
694 nullptr,
695 },
696 {
697 DEFINE_EXC(far),
700 nullptr,
701 nullptr,
702 nullptr,
703 },
704 {"csr",
705 nullptr,
706 1024 * sizeof(uint32_t),
707 0,
712 nullptr,
713 nullptr,
714 nullptr}};
715
716static size_t k_num_register_infos = std::size(g_register_infos);
717
719 Thread &thread, uint32_t concrete_frame_idx)
720 : RegisterContext(thread, concrete_frame_idx), gpr(), fpr(), exc() {
721 uint32_t i;
722 for (i = 0; i < kNumErrors; i++) {
723 gpr_errs[i] = -1;
724 fpr_errs[i] = -1;
725 exc_errs[i] = -1;
726 csr_errs[i] = -1;
727 }
728}
729
731
735
740
741const RegisterInfo *
744 if (reg < k_num_registers)
745 return &g_register_infos[reg];
746 return nullptr;
747}
748
752
756
757// General purpose registers
764
765// Floating point registers
772
773// Exception registers
774
776
777// CSR bank registers
778static uint32_t g_csr_regnums[] = {csr_bank};
779
780// Number of registers in each register set
781const size_t k_num_gpr_registers = std::size(g_gpr_regnums);
782const size_t k_num_fpr_registers = std::size(g_fpr_regnums);
783const size_t k_num_exc_registers = std::size(g_exc_regnums);
784const size_t k_num_csr_registers = std::size(g_csr_regnums);
785
786// Register set definitions. The first definitions at register set index of
787// zero is for all registers, followed by other registers sets. The register
788// information for the all register set need not be filled in.
789static const RegisterSet g_reg_sets[] = {
790 {
791 "General Purpose Registers",
792 "gpr",
795 },
796 {"Floating Point Registers", "fpr", k_num_fpr_registers, g_fpr_regnums},
797 {"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums},
798 {"CSR register bank", "csr", k_num_csr_registers, g_csr_regnums}};
799
800const size_t k_num_regsets = std::size(g_reg_sets);
801
805
806const RegisterSet *
808 if (reg_set < k_num_regsets)
809 return &g_reg_sets[reg_set];
810 return nullptr;
811}
812
813// Register information definitions for 32 bit riscv32.
815 if (reg_num < fpr_f0)
816 return GPRRegSet;
817 else if (reg_num < exc_exception)
818 return FPURegSet;
819 else if (reg_num < csr_bank)
820 return EXCRegSet;
821 else if (reg_num < k_num_registers)
822 return CSRRegSet;
823 return -1;
824}
825
826void RegisterContextDarwin_riscv32::LogGPR(Log *log, const char *title) {
827 if (log) {
828 if (title)
829 LLDB_LOGF(log, "%s", title);
830 for (uint32_t i = 0; i < k_num_gpr_registers; i++) {
831 uint32_t reg = gpr_x0 + i;
832 LLDB_LOGF(log, "%12s = 0x%4.4x", g_register_infos[reg].name,
833 (&gpr.x0)[reg]);
834 }
835 }
836}
837
839 int set = GPRRegSet;
840 if (force || !RegisterSetIsCached(set)) {
841 SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));
842 }
843 return GetError(set, Read);
844}
845
847 int set = FPURegSet;
848 if (force || !RegisterSetIsCached(set)) {
849 SetError(set, Read, DoReadFPU(GetThreadID(), set, fpr));
850 }
851 return GetError(set, Read);
852}
853
855 int set = EXCRegSet;
856 if (force || !RegisterSetIsCached(set)) {
857 SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));
858 }
859 return GetError(set, Read);
860}
861
863 int set = CSRRegSet;
864 if (force || !RegisterSetIsCached(set)) {
865 SetError(set, Read, DoReadCSR(GetThreadID(), set, csr));
866 }
867 return GetError(set, Read);
868}
869
871 int set = GPRRegSet;
872 if (!RegisterSetIsCached(set)) {
873 SetError(set, Write, -1);
874 return -1;
875 }
876 SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr));
877 SetError(set, Read, -1);
878 return GetError(set, Write);
879}
880
882 int set = FPURegSet;
883 if (!RegisterSetIsCached(set)) {
884 SetError(set, Write, -1);
885 return -1;
886 }
887 SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpr));
888 SetError(set, Read, -1);
889 return GetError(set, Write);
890}
891
893 int set = EXCRegSet;
894 if (!RegisterSetIsCached(set)) {
895 SetError(set, Write, -1);
896 return -1;
897 }
898 SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc));
899 SetError(set, Read, -1);
900 return GetError(set, Write);
901}
902
904 int set = CSRRegSet;
905 if (!RegisterSetIsCached(set)) {
906 SetError(set, Write, -1);
907 return -1;
908 }
909 SetError(set, Write, DoWriteCSR(GetThreadID(), set, csr));
910 SetError(set, Read, -1);
911 return GetError(set, Write);
912}
913
915 switch (set) {
916 case GPRRegSet:
917 return ReadGPR(force);
918 case FPURegSet:
919 return ReadFPU(force);
920 case EXCRegSet:
921 return ReadEXC(force);
922 case CSRRegSet:
923 return ReadCSR(force);
924 default:
925 break;
926 }
927 return -1;
928}
929
931 // Make sure we have a valid context to set.
932 if (RegisterSetIsCached(set)) {
933 switch (set) {
934 case GPRRegSet:
935 return WriteGPR();
936 case FPURegSet:
937 return WriteFPU();
938 case EXCRegSet:
939 return WriteEXC();
940 case CSRRegSet:
941 return WriteCSR();
942 default:
943 break;
944 }
945 }
946 return -1;
947}
948
950 RegisterValue &value) {
951 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
953
954 if (set == -1)
955 return false;
956
957 if (ReadRegisterSet(set, false) != 0)
958 return false;
959
960 switch (reg) {
961 case gpr_x0:
962 case gpr_x1:
963 case gpr_x2:
964 case gpr_x3:
965 case gpr_x4:
966 case gpr_x5:
967 case gpr_x6:
968 case gpr_x7:
969 case gpr_x8:
970 case gpr_x9:
971 case gpr_x10:
972 case gpr_x11:
973 case gpr_x12:
974 case gpr_x13:
975 case gpr_x14:
976 case gpr_x15:
977 case gpr_x16:
978 case gpr_x17:
979 case gpr_x18:
980 case gpr_x19:
981 case gpr_x20:
982 case gpr_x21:
983 case gpr_x22:
984 case gpr_x23:
985 case gpr_x24:
986 case gpr_x25:
987 case gpr_x26:
988 case gpr_x27:
989 case gpr_x28:
990 case gpr_x29:
991 case gpr_x30:
992 case gpr_x31:
993 case gpr_pc:
994 value = (&gpr.x0)[reg - gpr_x0];
995 break;
996
997 case fpr_f0:
998 case fpr_f1:
999 case fpr_f2:
1000 case fpr_f3:
1001 case fpr_f4:
1002 case fpr_f5:
1003 case fpr_f6:
1004 case fpr_f7:
1005 case fpr_f8:
1006 case fpr_f9:
1007 case fpr_f10:
1008 case fpr_f11:
1009 case fpr_f12:
1010 case fpr_f13:
1011 case fpr_f14:
1012 case fpr_f15:
1013 case fpr_f16:
1014 case fpr_f17:
1015 case fpr_f18:
1016 case fpr_f19:
1017 case fpr_f20:
1018 case fpr_f21:
1019 case fpr_f22:
1020 case fpr_f23:
1021 case fpr_f24:
1022 case fpr_f25:
1023 case fpr_f26:
1024 case fpr_f27:
1025 case fpr_f28:
1026 case fpr_f29:
1027 case fpr_f30:
1028 case fpr_f31:
1029 case fpr_fcsr:
1030 value = (&fpr.f0)[reg - fpr_f0];
1031 break;
1032
1033 case exc_exception:
1034 value = exc.exception;
1035 break;
1036
1037 case exc_fsr:
1038 value = exc.fsr;
1039 break;
1040
1041 case exc_far:
1042 value = exc.far;
1043 break;
1044
1045 case csr_bank:
1046 // These values don't fit into scalar types,
1047 // RegisterContext::ReadRegisterBytes() must be used for these registers
1048 //::memcpy (reg_value.value.vector.uint8, fpu.stmm[reg - fpu_stmm0].bytes,
1049 // 10);
1050
1051 // AArch64 copies NEON registers with
1052 // value.SetBytes(csr.bytes, reg_info->byte_size,
1053 // endian::InlHostByteOrder());
1054 return false;
1055
1056 default:
1057 return false;
1058 }
1059 return true;
1060}
1061
1063 const RegisterValue &value) {
1064 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
1065 int set = GetSetForNativeRegNum(reg);
1066
1067 if (set == -1)
1068 return false;
1069
1070 if (ReadRegisterSet(set, false) != 0)
1071 return false;
1072
1073 switch (reg) {
1074 case gpr_x0:
1075 case gpr_x1:
1076 case gpr_x2:
1077 case gpr_x3:
1078 case gpr_x4:
1079 case gpr_x5:
1080 case gpr_x6:
1081 case gpr_x7:
1082 case gpr_x8:
1083 case gpr_x9:
1084 case gpr_x10:
1085 case gpr_x11:
1086 case gpr_x12:
1087 case gpr_x13:
1088 case gpr_x14:
1089 case gpr_x15:
1090 case gpr_x16:
1091 case gpr_x17:
1092 case gpr_x18:
1093 case gpr_x19:
1094 case gpr_x20:
1095 case gpr_x21:
1096 case gpr_x22:
1097 case gpr_x23:
1098 case gpr_x24:
1099 case gpr_x25:
1100 case gpr_x26:
1101 case gpr_x27:
1102 case gpr_x28:
1103 case gpr_x29:
1104 case gpr_x30:
1105 case gpr_x31:
1106 case gpr_pc:
1107 (&gpr.x0)[reg - gpr_x0] = value.GetAsUInt32();
1108 break;
1109
1110 case fpr_f0:
1111 case fpr_f1:
1112 case fpr_f2:
1113 case fpr_f3:
1114 case fpr_f4:
1115 case fpr_f5:
1116 case fpr_f6:
1117 case fpr_f7:
1118 case fpr_f8:
1119 case fpr_f9:
1120 case fpr_f10:
1121 case fpr_f11:
1122 case fpr_f12:
1123 case fpr_f13:
1124 case fpr_f14:
1125 case fpr_f15:
1126 case fpr_f16:
1127 case fpr_f17:
1128 case fpr_f18:
1129 case fpr_f19:
1130 case fpr_f20:
1131 case fpr_f21:
1132 case fpr_f22:
1133 case fpr_f23:
1134 case fpr_f24:
1135 case fpr_f25:
1136 case fpr_f26:
1137 case fpr_f27:
1138 case fpr_f28:
1139 case fpr_f29:
1140 case fpr_f30:
1141 case fpr_f31:
1142 case fpr_fcsr:
1143 (&fpr.f0)[reg - fpr_f0] = value.GetAsUInt32();
1144 break;
1145
1146 case exc_exception:
1147 exc.exception = value.GetAsUInt32();
1148 break;
1149
1150 case exc_fsr:
1151 exc.fsr = value.GetAsUInt32();
1152 break;
1153
1154 case exc_far:
1155 exc.far = value.GetAsUInt32();
1156 break;
1157
1158 case csr_bank:
1159 // These values don't fit into scalar types,
1160 // RegisterContext::ReadRegisterBytes() must be used for these registers
1161 //::memcpy(csr.bytes, value.GetBytes(),
1162 // value.GetByteSize());
1163 return false;
1164
1165 default:
1166 return false;
1167 }
1168 return WriteRegisterSet(set) == 0;
1169}
1170
1172 lldb::WritableDataBufferSP &data_sp) {
1173 data_sp = std::make_shared<DataBufferHeap>(REG_CONTEXT_SIZE, 0);
1174 if (ReadGPR(false) == 0 && ReadFPU(false) == 0 && ReadEXC(false) == 0 &&
1175 ReadCSR(false) == 0) {
1176 uint8_t *dst = data_sp->GetBytes();
1177 ::memcpy(dst, &gpr, sizeof(gpr));
1178 dst += sizeof(gpr);
1179
1180 ::memcpy(dst, &fpr, sizeof(fpr));
1181 dst += sizeof(gpr);
1182
1183 ::memcpy(dst, &exc, sizeof(exc));
1184 return true;
1185
1186 ::memcpy(dst, &csr, sizeof(csr));
1187 return true;
1188 }
1189 return false;
1190}
1191
1193 const lldb::DataBufferSP &data_sp) {
1194 if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) {
1195 const uint8_t *src = data_sp->GetBytes();
1196 ::memcpy(&gpr, src, sizeof(gpr));
1197 src += sizeof(gpr);
1198
1199 ::memcpy(&fpr, src, sizeof(fpr));
1200 src += sizeof(fpr);
1201
1202 ::memcpy(&exc, src, sizeof(exc));
1203 src += sizeof(exc);
1204
1205 ::memcpy(&csr, src, sizeof(csr));
1206 uint32_t success_count = 0;
1207
1208 if (WriteGPR() == 0)
1209 ++success_count;
1210 if (WriteFPU() == 0)
1211 ++success_count;
1212 if (WriteEXC() == 0)
1213 ++success_count;
1214 if (WriteCSR() == 0)
1215 ++success_count;
1216 return success_count == 3;
1217 }
1218 return false;
1219}
1220
1222 lldb::RegisterKind kind, uint32_t reg) {
1223 if (kind == eRegisterKindGeneric) {
1224 switch (reg) {
1226 return gpr_pc;
1228 return gpr_x2;
1230 return gpr_x8;
1232 return gpr_x1;
1233 default:
1234 break;
1235 }
1236 } else if (kind == eRegisterKindEHFrame || kind == eRegisterKindDWARF) {
1237 switch (reg) {
1270 return gpr_x0 + (reg - riscv_dwarf::dwarf_gpr_x0);
1271
1304 return fpr_f0 + (reg - riscv_dwarf::dwarf_fpr_f0);
1305
1306 default:
1307 break;
1308 }
1309 } else if (kind == eRegisterKindLLDB) {
1310 return reg;
1311 }
1312 return LLDB_INVALID_REGNUM;
1313}
static const uint32_t k_num_register_infos
static const RegisterInfo g_register_infos[]
#define LLDB_LOGF(log,...)
Definition Log.h:376
const size_t k_num_regsets
static uint32_t g_exc_regnums[]
const size_t k_num_gpr_registers
#define REG_CONTEXT_SIZE
const size_t k_num_exc_registers
#define DEFINE_GPR_ABI(reg, canon)
#define DEFINE_FPU_ABI(reg, canon)
const size_t k_num_csr_registers
static uint32_t g_fpr_regnums[]
const size_t k_num_fpr_registers
#define DEFINE_GPR(reg)
static uint32_t g_csr_regnums[]
#define DEFINE_EXC(reg)
#define DEFINE_FPU(reg)
const uint32_t g_gpr_regnums[]
static RegisterSet g_reg_sets[]
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
~RegisterContextDarwin_riscv32() override
const lldb_private::RegisterSet * GetRegisterSet(size_t set) override
int ReadRegisterSet(uint32_t set, bool force)
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
static const lldb_private::RegisterInfo * GetRegisterInfos()
virtual int DoWriteCSR(lldb::tid_t tid, int flavor, const CSR &exc)=0
void LogGPR(lldb_private::Log *log, const char *title)
virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc)=0
RegisterContextDarwin_riscv32(lldb_private::Thread &thread, uint32_t concrete_frame_idx)
virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpr)=0
virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpr)=0
const lldb_private::RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
int GetError(int flavor, uint32_t err_idx) const
bool SetError(int flavor, uint32_t err_idx, int err)
virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc)=0
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr)=0
virtual int DoReadCSR(lldb::tid_t tid, int flavor, CSR &exc)=0
virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr)=0
virtual lldb::tid_t GetThreadID() const
RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
uint32_t GetAsUInt32(uint32_t fail_value=UINT32_MAX, bool *success_ptr=nullptr) const
#define LLDB_REGNUM_GENERIC_RA
#define LLDB_REGNUM_GENERIC_ARG8
#define LLDB_REGNUM_GENERIC_ARG6
#define LLDB_REGNUM_GENERIC_SP
#define LLDB_REGNUM_GENERIC_ARG4
#define LLDB_REGNUM_GENERIC_ARG3
#define LLDB_REGNUM_GENERIC_ARG1
#define LLDB_REGNUM_GENERIC_ARG7
#define LLDB_INVALID_REGNUM
#define LLDB_REGNUM_GENERIC_ARG2
#define LLDB_REGNUM_GENERIC_PC
#define LLDB_REGNUM_GENERIC_FP
#define LLDB_REGNUM_GENERIC_ARG5
A class that represents a running process on the host machine.
@ eFormatVectorOfUInt32
@ eEncodingVector
vector registers
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
RegisterKind
Register numbering types.
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindDWARF
the register numbers seen DWARF
@ eRegisterKindEHFrame
the register numbers seen in eh_frame
Every register is described in detail including its name, alternate name (optional),...
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
Registers are grouped into register sets.