1 /*
2 * Copyright (c) 2021 The strace developers.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 static void
9 arch_decode_prstatus_regset(struct tcb *const tcp,
10 const kernel_ulong_t addr,
11 const kernel_ulong_t size)
12 {
13 struct_prstatus_regset regs;
14 const size_t fetch_size = MIN(sizeof(regs), size);
15
16 if (!size || size & 7) {
17 printaddr(addr);
18 } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) {
19 tprint_struct_begin();
20 PRINT_FIELD_X(regs, pc);
21 if (fetch_size > offsetof(struct_prstatus_regset, ra)) {
22 tprint_struct_next();
23 PRINT_FIELD_X(regs, ra);
24 }
25 if (fetch_size > offsetof(struct_prstatus_regset, sp)) {
26 tprint_struct_next();
27 PRINT_FIELD_X(regs, sp);
28 }
29 if (fetch_size > offsetof(struct_prstatus_regset, gp)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs, gp);
32 }
33 if (fetch_size > offsetof(struct_prstatus_regset, tp)) {
34 tprint_struct_next();
35 PRINT_FIELD_X(regs, tp);
36 }
37 if (fetch_size > offsetof(struct_prstatus_regset, t0)) {
38 tprint_struct_next();
39 PRINT_FIELD_X(regs, t0);
40 }
41 if (fetch_size > offsetof(struct_prstatus_regset, t1)) {
42 tprint_struct_next();
43 PRINT_FIELD_X(regs, t1);
44 }
45 if (fetch_size > offsetof(struct_prstatus_regset, t2)) {
46 tprint_struct_next();
47 PRINT_FIELD_X(regs, t2);
48 }
49 if (fetch_size > offsetof(struct_prstatus_regset, s0)) {
50 tprint_struct_next();
51 PRINT_FIELD_X(regs, s0);
52 }
53 if (fetch_size > offsetof(struct_prstatus_regset, s1)) {
54 tprint_struct_next();
55 PRINT_FIELD_X(regs, s1);
56 }
57 if (fetch_size > offsetof(struct_prstatus_regset, a0)) {
58 tprint_struct_next();
59 PRINT_FIELD_X(regs, a0);
60 }
61 if (fetch_size > offsetof(struct_prstatus_regset, a1)) {
62 tprint_struct_next();
63 PRINT_FIELD_X(regs, a1);
64 }
65 if (fetch_size > offsetof(struct_prstatus_regset, a2)) {
66 tprint_struct_next();
67 PRINT_FIELD_X(regs, a2);
68 }
69 if (fetch_size > offsetof(struct_prstatus_regset, a3)) {
70 tprint_struct_next();
71 PRINT_FIELD_X(regs, a3);
72 }
73 if (fetch_size > offsetof(struct_prstatus_regset, a4)) {
74 tprint_struct_next();
75 PRINT_FIELD_X(regs, a4);
76 }
77 if (fetch_size > offsetof(struct_prstatus_regset, a5)) {
78 tprint_struct_next();
79 PRINT_FIELD_X(regs, a5);
80 }
81 if (fetch_size > offsetof(struct_prstatus_regset, a6)) {
82 tprint_struct_next();
83 PRINT_FIELD_X(regs, a6);
84 }
85 if (fetch_size > offsetof(struct_prstatus_regset, a7)) {
86 tprint_struct_next();
87 PRINT_FIELD_X(regs, a7);
88 }
89 if (fetch_size > offsetof(struct_prstatus_regset, s2)) {
90 tprint_struct_next();
91 PRINT_FIELD_X(regs, s2);
92 }
93 if (fetch_size > offsetof(struct_prstatus_regset, s3)) {
94 tprint_struct_next();
95 PRINT_FIELD_X(regs, s3);
96 }
97 if (fetch_size > offsetof(struct_prstatus_regset, s4)) {
98 tprint_struct_next();
99 PRINT_FIELD_X(regs, s4);
100 }
101 if (fetch_size > offsetof(struct_prstatus_regset, s5)) {
102 tprint_struct_next();
103 PRINT_FIELD_X(regs, s5);
104 }
105 if (fetch_size > offsetof(struct_prstatus_regset, s6)) {
106 tprint_struct_next();
107 PRINT_FIELD_X(regs, s6);
108 }
109 if (fetch_size > offsetof(struct_prstatus_regset, s7)) {
110 tprint_struct_next();
111 PRINT_FIELD_X(regs, s7);
112 }
113 if (fetch_size > offsetof(struct_prstatus_regset, s8)) {
114 tprint_struct_next();
115 PRINT_FIELD_X(regs, s8);
116 }
117 if (fetch_size > offsetof(struct_prstatus_regset, s9)) {
118 tprint_struct_next();
119 PRINT_FIELD_X(regs, s9);
120 }
121 if (fetch_size > offsetof(struct_prstatus_regset, s10)) {
122 tprint_struct_next();
123 PRINT_FIELD_X(regs, s10);
124 }
125 if (fetch_size > offsetof(struct_prstatus_regset, s11)) {
126 tprint_struct_next();
127 PRINT_FIELD_X(regs, s11);
128 }
129 if (fetch_size > offsetof(struct_prstatus_regset, t3)) {
130 tprint_struct_next();
131 PRINT_FIELD_X(regs, t3);
132 }
133 if (fetch_size > offsetof(struct_prstatus_regset, t4)) {
134 tprint_struct_next();
135 PRINT_FIELD_X(regs, t4);
136 }
137 if (fetch_size > offsetof(struct_prstatus_regset, t5)) {
138 tprint_struct_next();
139 PRINT_FIELD_X(regs, t5);
140 }
141 if (fetch_size > offsetof(struct_prstatus_regset, t6)) {
142 tprint_struct_next();
143 PRINT_FIELD_X(regs, t6);
144 }
145 if (size > sizeof(regs)) {
146 tprint_struct_next();
147 tprint_more_data_follows();
148 }
149 tprint_struct_end();
150 }
151 }