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_X(regs, ebx);
21 if (fetch_size > offsetof(struct_prstatus_regset, ecx)) {
22 tprint_struct_next();
23 PRINT_FIELD_X(regs, ecx);
24 }
25 if (fetch_size > offsetof(struct_prstatus_regset, edx)) {
26 tprint_struct_next();
27 PRINT_FIELD_X(regs, edx);
28 }
29 if (fetch_size > offsetof(struct_prstatus_regset, esi)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs, esi);
32 }
33 if (fetch_size > offsetof(struct_prstatus_regset, edi)) {
34 tprint_struct_next();
35 PRINT_FIELD_X(regs, edi);
36 }
37 if (fetch_size > offsetof(struct_prstatus_regset, ebp)) {
38 tprint_struct_next();
39 PRINT_FIELD_X(regs, ebp);
40 }
41 if (fetch_size > offsetof(struct_prstatus_regset, eax)) {
42 tprint_struct_next();
43 PRINT_FIELD_X(regs, eax);
44 }
45 if (fetch_size > offsetof(struct_prstatus_regset, xds)) {
46 tprint_struct_next();
47 PRINT_FIELD_X(regs, xds);
48 }
49 if (fetch_size > offsetof(struct_prstatus_regset, xes)) {
50 tprint_struct_next();
51 PRINT_FIELD_X(regs, xes);
52 }
53 if (fetch_size > offsetof(struct_prstatus_regset, xfs)) {
54 tprint_struct_next();
55 PRINT_FIELD_X(regs, xfs);
56 }
57 if (fetch_size > offsetof(struct_prstatus_regset, xgs)) {
58 tprint_struct_next();
59 PRINT_FIELD_X(regs, xgs);
60 }
61 if (fetch_size > offsetof(struct_prstatus_regset, orig_eax)) {
62 tprint_struct_next();
63 PRINT_FIELD_X(regs, orig_eax);
64 }
65 if (fetch_size > offsetof(struct_prstatus_regset, eip)) {
66 tprint_struct_next();
67 PRINT_FIELD_X(regs, eip);
68 }
69 if (fetch_size > offsetof(struct_prstatus_regset, xcs)) {
70 tprint_struct_next();
71 PRINT_FIELD_X(regs, xcs);
72 }
73 if (fetch_size > offsetof(struct_prstatus_regset, eflags)) {
74 tprint_struct_next();
75 PRINT_FIELD_X(regs, eflags);
76 }
77 if (fetch_size > offsetof(struct_prstatus_regset, esp)) {
78 tprint_struct_next();
79 PRINT_FIELD_X(regs, esp);
80 }
81 if (fetch_size > offsetof(struct_prstatus_regset, xss)) {
82 tprint_struct_next();
83 PRINT_FIELD_X(regs, xss);
84 }
85 if (size > sizeof(regs)) {
86 tprint_struct_next();
87 tprint_more_data_follows();
88 }
89 tprint_struct_end();
90 }
91 }