(root)/
strace-6.5/
src/
linux/
i386/
arch_fpregset.c
       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, &regs)) {
      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  }