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 # include "../sparc/arch_prstatus_regset.c"
10 #else
11
12 static void
13 arch_decode_prstatus_regset(struct tcb *const tcp,
14 const kernel_ulong_t addr,
15 const kernel_ulong_t size)
16 {
17 struct_prstatus_regset regs;
18 const size_t fetch_size = MIN(sizeof(regs), size);
19
20 if (!size || size & 7) {
21 printaddr(addr);
22 } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) {
23 tprint_struct_begin();
24 PRINT_FIELD_ARRAY_UPTO(regs, g, fetch_size / 8, tcp,
25 print_xint_array_member);
26 if (fetch_size > offsetof(struct_prstatus_regset, o)) {
27 const size_t len =
28 fetch_size - offsetof(struct_prstatus_regset, o);
29 tprint_struct_next();
30 PRINT_FIELD_ARRAY_UPTO(regs, o, len / 8, tcp,
31 print_xint_array_member);
32 }
33 if (fetch_size > offsetof(struct_prstatus_regset, l)) {
34 const size_t len =
35 fetch_size - offsetof(struct_prstatus_regset, l);
36 tprint_struct_next();
37 PRINT_FIELD_ARRAY_UPTO(regs, l, len / 8, tcp,
38 print_xint_array_member);
39 }
40 if (fetch_size > offsetof(struct_prstatus_regset, i)) {
41 const size_t len =
42 fetch_size - offsetof(struct_prstatus_regset, i);
43 tprint_struct_next();
44 PRINT_FIELD_ARRAY_UPTO(regs, i, len / 8, tcp,
45 print_xint_array_member);
46 }
47
48 if (fetch_size > offsetof(struct_prstatus_regset, tstate)) {
49 tprint_struct_next();
50 PRINT_FIELD_X(regs, tstate);
51 }
52 if (fetch_size > offsetof(struct_prstatus_regset, tpc)) {
53 tprint_struct_next();
54 PRINT_FIELD_X(regs, tpc);
55 }
56 if (fetch_size > offsetof(struct_prstatus_regset, tnpc)) {
57 tprint_struct_next();
58 PRINT_FIELD_X(regs, tnpc);
59 }
60 if (fetch_size > offsetof(struct_prstatus_regset, y)) {
61 tprint_struct_next();
62 PRINT_FIELD_X(regs, y);
63 }
64 if (size > sizeof(regs)) {
65 tprint_struct_next();
66 tprint_more_data_follows();
67 }
68 tprint_struct_end();
69 }
70 }
71
72 #endif /* !MPERS_IS_m32 */