Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * tools/testing/selftests/kvm/lib/kvm_util_internal.h
4 *
5 * Copyright (C) 2018, Google LLC.
6 */
7
8#ifndef SELFTEST_KVM_UTIL_INTERNAL_H
9#define SELFTEST_KVM_UTIL_INTERNAL_H
10
11#include "linux/hashtable.h"
12#include "linux/rbtree.h"
13
14#include "sparsebit.h"
15
16struct userspace_mem_region {
17 struct kvm_userspace_memory_region region;
18 struct sparsebit *unused_phy_pages;
19 int fd;
20 off_t offset;
21 void *host_mem;
22 void *host_alias;
23 void *mmap_start;
24 void *mmap_alias;
25 size_t mmap_size;
26 struct rb_node gpa_node;
27 struct rb_node hva_node;
28 struct hlist_node slot_node;
29};
30
31struct vcpu {
32 struct list_head list;
33 uint32_t id;
34 int fd;
35 struct kvm_run *state;
36 struct kvm_dirty_gfn *dirty_gfns;
37 uint32_t fetch_index;
38 uint32_t dirty_gfns_count;
39};
40
41struct userspace_mem_regions {
42 struct rb_root gpa_tree;
43 struct rb_root hva_tree;
44 DECLARE_HASHTABLE(slot_hash, 9);
45};
46
47struct kvm_vm {
48 int mode;
49 unsigned long type;
50 int kvm_fd;
51 int fd;
52 unsigned int pgtable_levels;
53 unsigned int page_size;
54 unsigned int page_shift;
55 unsigned int pa_bits;
56 unsigned int va_bits;
57 uint64_t max_gfn;
58 struct list_head vcpus;
59 struct userspace_mem_regions regions;
60 struct sparsebit *vpages_valid;
61 struct sparsebit *vpages_mapped;
62 bool has_irqchip;
63 bool pgd_created;
64 vm_paddr_t pgd;
65 vm_vaddr_t gdt;
66 vm_vaddr_t tss;
67 vm_vaddr_t idt;
68 vm_vaddr_t handlers;
69 uint32_t dirty_ring_size;
70};
71
72struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid);
73
74/*
75 * Virtual Translation Tables Dump
76 *
77 * Input Args:
78 * stream - Output FILE stream
79 * vm - Virtual Machine
80 * indent - Left margin indent amount
81 *
82 * Output Args: None
83 *
84 * Return: None
85 *
86 * Dumps to the FILE stream given by @stream, the contents of all the
87 * virtual translation tables for the VM given by @vm.
88 */
89void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
90
91/*
92 * Register Dump
93 *
94 * Input Args:
95 * stream - Output FILE stream
96 * regs - Registers
97 * indent - Left margin indent amount
98 *
99 * Output Args: None
100 *
101 * Return: None
102 *
103 * Dumps the state of the registers given by @regs, to the FILE stream
104 * given by @stream.
105 */
106void regs_dump(FILE *stream, struct kvm_regs *regs, uint8_t indent);
107
108/*
109 * System Register Dump
110 *
111 * Input Args:
112 * stream - Output FILE stream
113 * sregs - System registers
114 * indent - Left margin indent amount
115 *
116 * Output Args: None
117 *
118 * Return: None
119 *
120 * Dumps the state of the system registers given by @sregs, to the FILE stream
121 * given by @stream.
122 */
123void sregs_dump(FILE *stream, struct kvm_sregs *sregs, uint8_t indent);
124
125struct userspace_mem_region *
126memslot2region(struct kvm_vm *vm, uint32_t memslot);
127
128#endif /* SELFTEST_KVM_UTIL_INTERNAL_H */