(root)/
strace-6.5/
src/
linux/
x86_64/
arch_kvm.c
       1  /*
       2   * Copyright (c) 2017-2021 The strace developers.
       3   * All rights reserved.
       4   *
       5   * SPDX-License-Identifier: LGPL-2.1-or-later
       6   */
       7  
       8  #ifdef HAVE_STRUCT_KVM_REGS
       9  static void
      10  arch_print_kvm_regs(struct tcb *const tcp,
      11  		    const kernel_ulong_t addr,
      12  		    const struct kvm_regs *const regs)
      13  {
      14  	tprint_struct_begin();
      15  	PRINT_FIELD_X(*regs, rax);
      16  	tprint_struct_next();
      17  	if (abbrev(tcp)) {
      18  		tprint_more_data_follows();
      19  	} else {
      20  		PRINT_FIELD_X(*regs, rbx);
      21  		tprint_struct_next();
      22  		PRINT_FIELD_X(*regs, rcx);
      23  		tprint_struct_next();
      24  		PRINT_FIELD_X(*regs, rdx);
      25  		tprint_struct_next();
      26  		PRINT_FIELD_X(*regs, rsi);
      27  		tprint_struct_next();
      28  		PRINT_FIELD_X(*regs, rdi);
      29  	}
      30  	tprint_struct_next();
      31  	PRINT_FIELD_X(*regs, rsp);
      32  	tprint_struct_next();
      33  	PRINT_FIELD_X(*regs, rbp);
      34  	tprint_struct_next();
      35  	if (abbrev(tcp)) {
      36  		tprint_more_data_follows();
      37  	} else {
      38  		PRINT_FIELD_X(*regs, r8);
      39  		tprint_struct_next();
      40  		PRINT_FIELD_X(*regs, r9);
      41  		tprint_struct_next();
      42  		PRINT_FIELD_X(*regs, r10);
      43  		tprint_struct_next();
      44  		PRINT_FIELD_X(*regs, r11);
      45  		tprint_struct_next();
      46  		PRINT_FIELD_X(*regs, r12);
      47  		tprint_struct_next();
      48  		PRINT_FIELD_X(*regs, r13);
      49  		tprint_struct_next();
      50  		PRINT_FIELD_X(*regs, r14);
      51  		tprint_struct_next();
      52  		PRINT_FIELD_X(*regs, r15);
      53  	}
      54  	tprint_struct_next();
      55  	PRINT_FIELD_X(*regs, rip);
      56  
      57  	/* TODO: we can decode this more */
      58  	tprint_struct_next();
      59  	PRINT_FIELD_X(*regs, rflags);
      60  
      61  	tprint_struct_end();
      62  }
      63  #endif	/* HAVE_STRUCT_KVM_REGS */
      64  
      65  #ifdef HAVE_STRUCT_KVM_SREGS
      66  static void
      67  kvm_ioctl_decode_regs_segment(const struct kvm_segment *const segment)
      68  {
      69  	tprint_struct_begin();
      70  	PRINT_FIELD_X(*segment, base);
      71  	tprint_struct_next();
      72  	PRINT_FIELD_U(*segment, limit);
      73  	tprint_struct_next();
      74  	PRINT_FIELD_U(*segment, selector);
      75  	tprint_struct_next();
      76  	PRINT_FIELD_U(*segment, type);
      77  	tprint_struct_next();
      78  	PRINT_FIELD_U(*segment, present);
      79  	tprint_struct_next();
      80  	PRINT_FIELD_U(*segment, dpl);
      81  	tprint_struct_next();
      82  	PRINT_FIELD_U(*segment, db);
      83  	tprint_struct_next();
      84  	PRINT_FIELD_U(*segment, s);
      85  	tprint_struct_next();
      86  	PRINT_FIELD_U(*segment, l);
      87  	tprint_struct_next();
      88  	PRINT_FIELD_U(*segment, g);
      89  	tprint_struct_next();
      90  	PRINT_FIELD_U(*segment, avl);
      91  	tprint_struct_end();
      92  }
      93  
      94  static void
      95  kvm_ioctl_decode_regs_dtable(const struct kvm_dtable *const dtable)
      96  {
      97  	tprint_struct_begin();
      98  	PRINT_FIELD_X(*dtable, base);
      99  	tprint_struct_next();
     100  	PRINT_FIELD_U(*dtable, limit);
     101  	tprint_struct_end();
     102  }
     103  
     104  # define PRINT_FIELD_KVM_SREGS_STRUCT(where_, field_, type_)	\
     105  	PRINT_FIELD_OBJ_PTR(where_, field_,			\
     106  			    kvm_ioctl_decode_regs_ ## type_)
     107  
     108  static void
     109  arch_print_kvm_sregs(struct tcb *const tcp,
     110  		     const kernel_ulong_t addr,
     111  		     const struct kvm_sregs *const sregs)
     112  {
     113  	tprint_struct_begin();
     114  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, cs, segment);
     115  	if (abbrev(tcp)) {
     116  		tprint_struct_next();
     117  		tprint_more_data_follows();
     118  		tprint_struct_end();
     119  		return;
     120  	}
     121  
     122  	tprint_struct_next();
     123  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ds, segment);
     124  	tprint_struct_next();
     125  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, es, segment);
     126  	tprint_struct_next();
     127  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, fs, segment);
     128  	tprint_struct_next();
     129  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, gs, segment);
     130  	tprint_struct_next();
     131  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ss, segment);
     132  	tprint_struct_next();
     133  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, tr, segment);
     134  	tprint_struct_next();
     135  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ldt, segment);
     136  	tprint_struct_next();
     137  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, gdt, dtable);
     138  	tprint_struct_next();
     139  	PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, idt, dtable);
     140  	tprint_struct_next();
     141  	PRINT_FIELD_U(*sregs, cr0);
     142  	tprint_struct_next();
     143  	PRINT_FIELD_U(*sregs, cr2);
     144  	tprint_struct_next();
     145  	PRINT_FIELD_U(*sregs, cr3);
     146  	tprint_struct_next();
     147  	PRINT_FIELD_U(*sregs, cr4);
     148  	tprint_struct_next();
     149  	PRINT_FIELD_U(*sregs, cr8);
     150  	tprint_struct_next();
     151  	PRINT_FIELD_U(*sregs, efer);
     152  	tprint_struct_next();
     153  	PRINT_FIELD_X(*sregs, apic_base);
     154  	tprint_struct_next();
     155  	PRINT_FIELD_X_ARRAY(*sregs, interrupt_bitmap);
     156  	tprint_struct_end();
     157  }
     158  #endif	/* HAVE_STRUCT_KVM_SREGS */