(root)/
strace-6.5/
src/
linux/
s390/
arch_prstatus_regset.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  # define TRACEE_KLONGSIZE 4
      10  #else
      11  # define TRACEE_KLONGSIZE SIZEOF_KERNEL_LONG_T
      12  #endif
      13  
      14  static void
      15  arch_decode_prstatus_regset(struct tcb *const tcp,
      16  			    const kernel_ulong_t addr,
      17  			    const kernel_ulong_t size)
      18  {
      19  	struct_prstatus_regset regs;
      20  	const size_t fetch_size = MIN(sizeof(regs), size);
      21  
      22  	if (!size || size & (TRACEE_KLONGSIZE - 1)) {
      23  		printaddr(addr);
      24  	} else if (!umoven_or_printaddr(tcp, addr, fetch_size, &regs)) {
      25  		tprint_struct_begin();
      26  		tprints_field_name("psw");
      27  		tprint_struct_begin();
      28  		PRINT_FIELD_X(regs.psw, mask);
      29  		if (fetch_size > sizeof(regs.psw.mask)) {
      30  			tprint_struct_next();
      31  			PRINT_FIELD_X(regs.psw, addr);
      32  		}
      33  		tprint_struct_end();
      34  		if (fetch_size > offsetof(struct_prstatus_regset, gprs)) {
      35  			const size_t len =
      36  				fetch_size - offsetof(struct_prstatus_regset, gprs);
      37  			tprint_struct_next();
      38  			PRINT_FIELD_ARRAY_UPTO(regs, gprs,
      39  					       len / sizeof(regs.gprs[0]), tcp,
      40  					       print_xint_array_member);
      41  		}
      42  		if (fetch_size > offsetof(struct_prstatus_regset, acrs)) {
      43  			const size_t len =
      44  				fetch_size - offsetof(struct_prstatus_regset, acrs);
      45  			tprint_struct_next();
      46  			PRINT_FIELD_ARRAY_UPTO(regs, acrs,
      47  					       len / sizeof(regs.acrs[0]), tcp,
      48  					       print_xint_array_member);
      49  		}
      50  
      51  		if (fetch_size > offsetof(struct_prstatus_regset, orig_gpr2)) {
      52  			tprint_struct_next();
      53  			PRINT_FIELD_X(regs, orig_gpr2);
      54  		}
      55  		if (size > sizeof(regs)) {
      56  			tprint_struct_next();
      57  			tprint_more_data_follows();
      58  		}
      59  		tprint_struct_end();
      60  	}
      61  }
      62  
      63  #undef TRACEE_KLONGSIZE