(root)/
strace-6.5/
src/
linux/
x86_64/
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  #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, &regs)) {
      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 */