1 /*
2 * Copyright (c) 2021-2022 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_ARRAY_UPTO(regs, regs,
21 fetch_size / 8, tcp,
22 print_xint_array_member);
23 if (fetch_size > offsetof(struct_prstatus_regset, orig_a0)) {
24 tprint_struct_next();
25 PRINT_FIELD_X(regs, orig_a0);
26 }
27 if (fetch_size > offsetof(struct_prstatus_regset, csr_era)) {
28 tprint_struct_next();
29 PRINT_FIELD_X(regs, csr_era);
30 }
31 if (fetch_size > offsetof(struct_prstatus_regset, csr_badv)) {
32 tprint_struct_next();
33 PRINT_FIELD_X(regs, csr_badv);
34 }
35 const size_t offset_of_reserved =
36 offsetof(struct_prstatus_regset, reserved);
37 if (fetch_size > offset_of_reserved) {
38 tprint_struct_next();
39 PRINT_FIELD_ARRAY_UPTO(regs, reserved,
40 (fetch_size - offset_of_reserved) / 8,
41 tcp, print_xint_array_member);
42 }
43 if (size > sizeof(regs)) {
44 tprint_struct_next();
45 tprint_more_data_follows();
46 }
47 tprint_struct_end();
48 }
49 }