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 "../i386/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_X(regs, r15);
25 if (fetch_size > offsetof(struct_prstatus_regset, r14)) {
26 tprint_struct_next();
27 PRINT_FIELD_X(regs, r14);
28 }
29 if (fetch_size > offsetof(struct_prstatus_regset, r13)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs, r13);
32 }
33 if (fetch_size > offsetof(struct_prstatus_regset, r12)) {
34 tprint_struct_next();
35 PRINT_FIELD_X(regs, r12);
36 }
37 if (fetch_size > offsetof(struct_prstatus_regset, rbp)) {
38 tprint_struct_next();
39 PRINT_FIELD_X(regs, rbp);
40 }
41 if (fetch_size > offsetof(struct_prstatus_regset, rbx)) {
42 tprint_struct_next();
43 PRINT_FIELD_X(regs, rbx);
44 }
45 if (fetch_size > offsetof(struct_prstatus_regset, r11)) {
46 tprint_struct_next();
47 PRINT_FIELD_X(regs, r11);
48 }
49 if (fetch_size > offsetof(struct_prstatus_regset, r10)) {
50 tprint_struct_next();
51 PRINT_FIELD_X(regs, r10);
52 }
53 if (fetch_size > offsetof(struct_prstatus_regset, r9)) {
54 tprint_struct_next();
55 PRINT_FIELD_X(regs, r9);
56 }
57 if (fetch_size > offsetof(struct_prstatus_regset, r8)) {
58 tprint_struct_next();
59 PRINT_FIELD_X(regs, r8);
60 }
61 if (fetch_size > offsetof(struct_prstatus_regset, rax)) {
62 tprint_struct_next();
63 PRINT_FIELD_X(regs, rax);
64 }
65 if (fetch_size > offsetof(struct_prstatus_regset, rcx)) {
66 tprint_struct_next();
67 PRINT_FIELD_X(regs, rcx);
68 }
69 if (fetch_size > offsetof(struct_prstatus_regset, rdx)) {
70 tprint_struct_next();
71 PRINT_FIELD_X(regs, rdx);
72 }
73 if (fetch_size > offsetof(struct_prstatus_regset, rsi)) {
74 tprint_struct_next();
75 PRINT_FIELD_X(regs, rsi);
76 }
77 if (fetch_size > offsetof(struct_prstatus_regset, rdi)) {
78 tprint_struct_next();
79 PRINT_FIELD_X(regs, rdi);
80 }
81 if (fetch_size > offsetof(struct_prstatus_regset, orig_rax)) {
82 tprint_struct_next();
83 PRINT_FIELD_X(regs, orig_rax);
84 }
85 if (fetch_size > offsetof(struct_prstatus_regset, rip)) {
86 tprint_struct_next();
87 PRINT_FIELD_X(regs, rip);
88 }
89 if (fetch_size > offsetof(struct_prstatus_regset, cs)) {
90 tprint_struct_next();
91 PRINT_FIELD_X(regs, cs);
92 }
93 if (fetch_size > offsetof(struct_prstatus_regset, eflags)) {
94 tprint_struct_next();
95 PRINT_FIELD_X(regs, eflags);
96 }
97 if (fetch_size > offsetof(struct_prstatus_regset, rsp)) {
98 tprint_struct_next();
99 PRINT_FIELD_X(regs, rsp);
100 }
101 if (fetch_size > offsetof(struct_prstatus_regset, ss)) {
102 tprint_struct_next();
103 PRINT_FIELD_X(regs, ss);
104 }
105 if (fetch_size > offsetof(struct_prstatus_regset, fs_base)) {
106 tprint_struct_next();
107 PRINT_FIELD_X(regs, fs_base);
108 }
109 if (fetch_size > offsetof(struct_prstatus_regset, gs_base)) {
110 tprint_struct_next();
111 PRINT_FIELD_X(regs, gs_base);
112 }
113 if (fetch_size > offsetof(struct_prstatus_regset, ds)) {
114 tprint_struct_next();
115 PRINT_FIELD_X(regs, ds);
116 }
117 if (fetch_size > offsetof(struct_prstatus_regset, es)) {
118 tprint_struct_next();
119 PRINT_FIELD_X(regs, es);
120 }
121 if (fetch_size > offsetof(struct_prstatus_regset, fs)) {
122 tprint_struct_next();
123 PRINT_FIELD_X(regs, fs);
124 }
125 if (fetch_size > offsetof(struct_prstatus_regset, gs)) {
126 tprint_struct_next();
127 PRINT_FIELD_X(regs, gs);
128 }
129 if (size > sizeof(regs)) {
130 tprint_struct_next();
131 tprint_more_data_follows();
132 }
133 tprint_struct_end();
134 }
135 }
136
137 #endif /* !MPERS_IS_m32 */