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 #ifdef MPERS_IS_m32
9 # define TRACEE_KLONGSIZE 4
10 #else
11 # define TRACEE_KLONGSIZE SIZEOF_KERNEL_LONG_T
12 #endif
13
14 static void
15 arch_decode_prstatus_regset(struct tcb *const tcp,
16 const kernel_ulong_t addr,
17 const kernel_ulong_t size)
18 {
19 struct_prstatus_regset regs;
20 const size_t fetch_size = MIN(sizeof(regs), size);
21
22 if (!size || size & (TRACEE_KLONGSIZE - 1)) {
23 printaddr(addr);
24 } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) {
25 tprint_struct_begin();
26 tprints_field_name("psw");
27 tprint_struct_begin();
28 PRINT_FIELD_X(regs.psw, mask);
29 if (fetch_size > sizeof(regs.psw.mask)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs.psw, addr);
32 }
33 tprint_struct_end();
34 if (fetch_size > offsetof(struct_prstatus_regset, gprs)) {
35 const size_t len =
36 fetch_size - offsetof(struct_prstatus_regset, gprs);
37 tprint_struct_next();
38 PRINT_FIELD_ARRAY_UPTO(regs, gprs,
39 len / sizeof(regs.gprs[0]), tcp,
40 print_xint_array_member);
41 }
42 if (fetch_size > offsetof(struct_prstatus_regset, acrs)) {
43 const size_t len =
44 fetch_size - offsetof(struct_prstatus_regset, acrs);
45 tprint_struct_next();
46 PRINT_FIELD_ARRAY_UPTO(regs, acrs,
47 len / sizeof(regs.acrs[0]), tcp,
48 print_xint_array_member);
49 }
50
51 if (fetch_size > offsetof(struct_prstatus_regset, orig_gpr2)) {
52 tprint_struct_next();
53 PRINT_FIELD_X(regs, orig_gpr2);
54 }
55 if (size > sizeof(regs)) {
56 tprint_struct_next();
57 tprint_more_data_follows();
58 }
59 tprint_struct_end();
60 }
61 }
62
63 #undef TRACEE_KLONGSIZE