(root)/
strace-6.5/
src/
linux/
i386/
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_X(regs, ebx);
      21  		if (fetch_size > offsetof(struct_prstatus_regset, ecx)) {
      22  			tprint_struct_next();
      23  			PRINT_FIELD_X(regs, ecx);
      24  		}
      25  		if (fetch_size > offsetof(struct_prstatus_regset, edx)) {
      26  			tprint_struct_next();
      27  			PRINT_FIELD_X(regs, edx);
      28  		}
      29  		if (fetch_size > offsetof(struct_prstatus_regset, esi)) {
      30  			tprint_struct_next();
      31  			PRINT_FIELD_X(regs, esi);
      32  		}
      33  		if (fetch_size > offsetof(struct_prstatus_regset, edi)) {
      34  			tprint_struct_next();
      35  			PRINT_FIELD_X(regs, edi);
      36  		}
      37  		if (fetch_size > offsetof(struct_prstatus_regset, ebp)) {
      38  			tprint_struct_next();
      39  			PRINT_FIELD_X(regs, ebp);
      40  		}
      41  		if (fetch_size > offsetof(struct_prstatus_regset, eax)) {
      42  			tprint_struct_next();
      43  			PRINT_FIELD_X(regs, eax);
      44  		}
      45  		if (fetch_size > offsetof(struct_prstatus_regset, xds)) {
      46  			tprint_struct_next();
      47  			PRINT_FIELD_X(regs, xds);
      48  		}
      49  		if (fetch_size > offsetof(struct_prstatus_regset, xes)) {
      50  			tprint_struct_next();
      51  			PRINT_FIELD_X(regs, xes);
      52  		}
      53  		if (fetch_size > offsetof(struct_prstatus_regset, xfs)) {
      54  			tprint_struct_next();
      55  			PRINT_FIELD_X(regs, xfs);
      56  		}
      57  		if (fetch_size > offsetof(struct_prstatus_regset, xgs)) {
      58  			tprint_struct_next();
      59  			PRINT_FIELD_X(regs, xgs);
      60  		}
      61  		if (fetch_size > offsetof(struct_prstatus_regset, orig_eax)) {
      62  			tprint_struct_next();
      63  			PRINT_FIELD_X(regs, orig_eax);
      64  		}
      65  		if (fetch_size > offsetof(struct_prstatus_regset, eip)) {
      66  			tprint_struct_next();
      67  			PRINT_FIELD_X(regs, eip);
      68  		}
      69  		if (fetch_size > offsetof(struct_prstatus_regset, xcs)) {
      70  			tprint_struct_next();
      71  			PRINT_FIELD_X(regs, xcs);
      72  		}
      73  		if (fetch_size > offsetof(struct_prstatus_regset, eflags)) {
      74  			tprint_struct_next();
      75  			PRINT_FIELD_X(regs, eflags);
      76  		}
      77  		if (fetch_size > offsetof(struct_prstatus_regset, esp)) {
      78  			tprint_struct_next();
      79  			PRINT_FIELD_X(regs, esp);
      80  		}
      81  		if (fetch_size > offsetof(struct_prstatus_regset, xss)) {
      82  			tprint_struct_next();
      83  			PRINT_FIELD_X(regs, xss);
      84  		}
      85  		if (size > sizeof(regs)) {
      86  			tprint_struct_next();
      87  			tprint_more_data_follows();
      88  		}
      89  		tprint_struct_end();
      90  	}
      91  }