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 & (SIZEOF_LONG - 1)) {
17 printaddr(addr);
18 } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) {
19 tprint_struct_begin();
20 if (fetch_size > offsetof(struct_prstatus_regset, regs)) {
21 const size_t len = fetch_size -
22 offsetof(struct_prstatus_regset, regs);
23 PRINT_FIELD_ARRAY_UPTO(regs, regs, len / SIZEOF_LONG,
24 tcp, print_xint_array_member);
25 }
26 if (fetch_size > offsetof(struct_prstatus_regset, lo)) {
27 tprint_struct_next();
28 PRINT_FIELD_X(regs, lo);
29 }
30 if (fetch_size > offsetof(struct_prstatus_regset, hi)) {
31 tprint_struct_next();
32 PRINT_FIELD_X(regs, hi);
33 }
34 if (fetch_size > offsetof(struct_prstatus_regset, cp0_epc)) {
35 tprint_struct_next();
36 PRINT_FIELD_X(regs, cp0_epc);
37 }
38 if (fetch_size > offsetof(struct_prstatus_regset, cp0_badvaddr)) {
39 tprint_struct_next();
40 PRINT_FIELD_X(regs, cp0_badvaddr);
41 }
42 if (fetch_size > offsetof(struct_prstatus_regset, cp0_status)) {
43 tprint_struct_next();
44 PRINT_FIELD_X(regs, cp0_status);
45 }
46 if (fetch_size > offsetof(struct_prstatus_regset, cp0_cause)) {
47 tprint_struct_next();
48 PRINT_FIELD_X(regs, cp0_cause);
49 }
50 if (size > sizeof(regs)) {
51 tprint_struct_next();
52 tprint_more_data_follows();
53 }
54 tprint_struct_end();
55 }
56 }