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_fpregset.c"
10 #else
11
12 static void
13 arch_decode_fpregset(struct tcb *const tcp,
14 const kernel_ulong_t addr,
15 const kernel_ulong_t size)
16 {
17 struct_fpregset 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, cwd);
25 if (fetch_size > offsetof(struct_fpregset, swd)) {
26 tprint_struct_next();
27 PRINT_FIELD_X(regs, swd);
28 }
29 if (fetch_size > offsetof(struct_fpregset, ftw)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs, ftw);
32 }
33 if (fetch_size > offsetof(struct_fpregset, fop)) {
34 tprint_struct_next();
35 PRINT_FIELD_X(regs, fop);
36 }
37 if (fetch_size > offsetof(struct_fpregset, rip)) {
38 tprint_struct_next();
39 PRINT_FIELD_X(regs, rip);
40 }
41 if (fetch_size > offsetof(struct_fpregset, rdp)) {
42 tprint_struct_next();
43 PRINT_FIELD_X(regs, rdp);
44 }
45 if (fetch_size > offsetof(struct_fpregset, mxcsr)) {
46 tprint_struct_next();
47 PRINT_FIELD_X(regs, mxcsr);
48 }
49 if (fetch_size > offsetof(struct_fpregset, mxcr_mask)) {
50 tprint_struct_next();
51 PRINT_FIELD_X(regs, mxcr_mask);
52 }
53 if (fetch_size > offsetof(struct_fpregset, st_space)) {
54 const size_t len = fetch_size -
55 offsetof(struct_fpregset, st_space);
56 tprint_struct_next();
57 PRINT_FIELD_ARRAY_UPTO(regs, st_space, len / 4, tcp,
58 print_xint_array_member);
59 }
60 if (fetch_size > offsetof(struct_fpregset, xmm_space)) {
61 const size_t len = fetch_size -
62 offsetof(struct_fpregset, xmm_space);
63 tprint_struct_next();
64 PRINT_FIELD_ARRAY_UPTO(regs, xmm_space, len / 4, tcp,
65 print_xint_array_member);
66 }
67 if (fetch_size > offsetof(struct_fpregset, padding)) {
68 const size_t len = fetch_size -
69 offsetof(struct_fpregset, padding);
70 tprint_struct_next();
71 PRINT_FIELD_ARRAY_UPTO(regs, padding, len / 4, tcp,
72 print_xint_array_member);
73 }
74 if (size > sizeof(regs)) {
75 tprint_struct_next();
76 tprint_more_data_follows();
77 }
78 tprint_struct_end();
79 }
80 }
81
82 #endif /* !MPERS_IS_m32 */