(root)/
strace-6.5/
src/
linux/
mips/
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  static void
       9  arch_decode_prstatus_regset(struct tcb *const tcp,
      10  			    const kernel_ulong_t addr,
      11  			    const kernel_ulong_t size)
      12  {
      13  	struct_prstatus_regset regs;
      14  	const size_t fetch_size = MIN(sizeof(regs), size);
      15  
      16  	if (!size || size & (SIZEOF_LONG - 1)) {
      17  		printaddr(addr);
      18  	} else if (!umoven_or_printaddr(tcp, addr, fetch_size, &regs)) {
      19  		tprint_struct_begin();
      20  		if (fetch_size > offsetof(struct_prstatus_regset, regs)) {
      21  			const size_t len = fetch_size -
      22  				offsetof(struct_prstatus_regset, regs);
      23  			PRINT_FIELD_ARRAY_UPTO(regs, regs, len / SIZEOF_LONG,
      24  					       tcp, print_xint_array_member);
      25  		}
      26  		if (fetch_size > offsetof(struct_prstatus_regset, lo)) {
      27  			tprint_struct_next();
      28  			PRINT_FIELD_X(regs, lo);
      29  		}
      30  		if (fetch_size > offsetof(struct_prstatus_regset, hi)) {
      31  			tprint_struct_next();
      32  			PRINT_FIELD_X(regs, hi);
      33  		}
      34  		if (fetch_size > offsetof(struct_prstatus_regset, cp0_epc)) {
      35  			tprint_struct_next();
      36  			PRINT_FIELD_X(regs, cp0_epc);
      37  		}
      38  		if (fetch_size > offsetof(struct_prstatus_regset, cp0_badvaddr)) {
      39  			tprint_struct_next();
      40  			PRINT_FIELD_X(regs, cp0_badvaddr);
      41  		}
      42  		if (fetch_size > offsetof(struct_prstatus_regset, cp0_status)) {
      43  			tprint_struct_next();
      44  			PRINT_FIELD_X(regs, cp0_status);
      45  		}
      46  		if (fetch_size > offsetof(struct_prstatus_regset, cp0_cause)) {
      47  			tprint_struct_next();
      48  			PRINT_FIELD_X(regs, cp0_cause);
      49  		}
      50  		if (size > sizeof(regs)) {
      51  			tprint_struct_next();
      52  			tprint_more_data_follows();
      53  		}
      54  		tprint_struct_end();
      55  	}
      56  }