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 & 3) {
17 printaddr(addr);
18 } else if (!umoven_or_printaddr(tcp, addr, fetch_size, ®s)) {
19 tprint_struct_begin();
20 PRINT_FIELD_ARRAY_UPTO(regs, g, fetch_size / 4, tcp,
21 print_xint_array_member);
22 if (fetch_size > offsetof(struct_prstatus_regset, o)) {
23 const size_t len =
24 fetch_size - offsetof(struct_prstatus_regset, o);
25 tprint_struct_next();
26 PRINT_FIELD_ARRAY_UPTO(regs, o, len / 4, tcp,
27 print_xint_array_member);
28 }
29 if (fetch_size > offsetof(struct_prstatus_regset, l)) {
30 const size_t len =
31 fetch_size - offsetof(struct_prstatus_regset, l);
32 tprint_struct_next();
33 PRINT_FIELD_ARRAY_UPTO(regs, l, len / 4, tcp,
34 print_xint_array_member);
35 }
36 if (fetch_size > offsetof(struct_prstatus_regset, i)) {
37 const size_t len =
38 fetch_size - offsetof(struct_prstatus_regset, i);
39 tprint_struct_next();
40 PRINT_FIELD_ARRAY_UPTO(regs, i, len / 4, tcp,
41 print_xint_array_member);
42 }
43
44 if (fetch_size > offsetof(struct_prstatus_regset, psr)) {
45 tprint_struct_next();
46 PRINT_FIELD_X(regs, psr);
47 }
48 if (fetch_size > offsetof(struct_prstatus_regset, pc)) {
49 tprint_struct_next();
50 PRINT_FIELD_X(regs, pc);
51 }
52 if (fetch_size > offsetof(struct_prstatus_regset, npc)) {
53 tprint_struct_next();
54 PRINT_FIELD_X(regs, npc);
55 }
56 if (fetch_size > offsetof(struct_prstatus_regset, y)) {
57 tprint_struct_next();
58 PRINT_FIELD_X(regs, y);
59 }
60 if (fetch_size > offsetof(struct_prstatus_regset, wim)) {
61 tprint_struct_next();
62 PRINT_FIELD_X(regs, wim);
63 }
64 if (fetch_size > offsetof(struct_prstatus_regset, tbr)) {
65 tprint_struct_next();
66 PRINT_FIELD_X(regs, tbr);
67 }
68 if (size > sizeof(regs)) {
69 tprint_struct_next();
70 tprint_more_data_follows();
71 }
72 tprint_struct_end();
73 }
74 }