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_fpregset(struct tcb *const tcp,
10 const kernel_ulong_t addr,
11 const kernel_ulong_t size)
12 {
13 struct_fpregset 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, cwd);
21 if (fetch_size > offsetof(struct_fpregset, swd)) {
22 tprint_struct_next();
23 PRINT_FIELD_X(regs, swd);
24 }
25 if (fetch_size > offsetof(struct_fpregset, twd)) {
26 tprint_struct_next();
27 PRINT_FIELD_X(regs, twd);
28 }
29 if (fetch_size > offsetof(struct_fpregset, fip)) {
30 tprint_struct_next();
31 PRINT_FIELD_X(regs, fip);
32 }
33 if (fetch_size > offsetof(struct_fpregset, fcs)) {
34 tprint_struct_next();
35 PRINT_FIELD_X(regs, fcs);
36 }
37 if (fetch_size > offsetof(struct_fpregset, foo)) {
38 tprint_struct_next();
39 PRINT_FIELD_X(regs, foo);
40 }
41 if (fetch_size > offsetof(struct_fpregset, fos)) {
42 tprint_struct_next();
43 PRINT_FIELD_X(regs, fos);
44 }
45 if (fetch_size > offsetof(struct_fpregset, st_space)) {
46 const size_t len = fetch_size -
47 offsetof(struct_fpregset, st_space);
48 tprint_struct_next();
49 PRINT_FIELD_ARRAY_UPTO(regs, st_space, len / 4, tcp,
50 print_xint_array_member);
51 }
52 if (size > sizeof(regs)) {
53 tprint_struct_next();
54 tprint_more_data_follows();
55 }
56 tprint_struct_end();
57 }
58 }