(root)/
strace-6.5/
src/
linux/
sparc/
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 & 3) {
      17  		printaddr(addr);
      18  	} else if (!umoven_or_printaddr(tcp, addr, fetch_size, &regs)) {
      19  		tprint_struct_begin();
      20  		PRINT_FIELD_ARRAY_UPTO(regs, g, fetch_size / 4, tcp,
      21  				       print_xint_array_member);
      22  		if (fetch_size > offsetof(struct_prstatus_regset, o)) {
      23  			const size_t len =
      24  				fetch_size - offsetof(struct_prstatus_regset, o);
      25  			tprint_struct_next();
      26  			PRINT_FIELD_ARRAY_UPTO(regs, o, len / 4, tcp,
      27  					       print_xint_array_member);
      28  		}
      29  		if (fetch_size > offsetof(struct_prstatus_regset, l)) {
      30  			const size_t len =
      31  				fetch_size - offsetof(struct_prstatus_regset, l);
      32  			tprint_struct_next();
      33  			PRINT_FIELD_ARRAY_UPTO(regs, l, len / 4, tcp,
      34  					       print_xint_array_member);
      35  		}
      36  		if (fetch_size > offsetof(struct_prstatus_regset, i)) {
      37  			const size_t len =
      38  				fetch_size - offsetof(struct_prstatus_regset, i);
      39  			tprint_struct_next();
      40  			PRINT_FIELD_ARRAY_UPTO(regs, i, len / 4, tcp,
      41  					       print_xint_array_member);
      42  		}
      43  
      44  		if (fetch_size > offsetof(struct_prstatus_regset, psr)) {
      45  			tprint_struct_next();
      46  			PRINT_FIELD_X(regs, psr);
      47  		}
      48  		if (fetch_size > offsetof(struct_prstatus_regset, pc)) {
      49  			tprint_struct_next();
      50  			PRINT_FIELD_X(regs, pc);
      51  		}
      52  		if (fetch_size > offsetof(struct_prstatus_regset, npc)) {
      53  			tprint_struct_next();
      54  			PRINT_FIELD_X(regs, npc);
      55  		}
      56  		if (fetch_size > offsetof(struct_prstatus_regset, y)) {
      57  			tprint_struct_next();
      58  			PRINT_FIELD_X(regs, y);
      59  		}
      60  		if (fetch_size > offsetof(struct_prstatus_regset, wim)) {
      61  			tprint_struct_next();
      62  			PRINT_FIELD_X(regs, wim);
      63  		}
      64  		if (fetch_size > offsetof(struct_prstatus_regset, tbr)) {
      65  			tprint_struct_next();
      66  			PRINT_FIELD_X(regs, tbr);
      67  		}
      68  		if (size > sizeof(regs)) {
      69  			tprint_struct_next();
      70  			tprint_more_data_follows();
      71  		}
      72  		tprint_struct_end();
      73  	}
      74  }