mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
The GDT and the TSS base were left to zero, and this has interesting effects when the TSS descriptor is later read to set up a VMCS's TR_BASE. Basically it worked by chance, and this patch fixes it by setting up all the protected mode data structures properly. Because the GDT and TSS addresses are virtual, the page tables now always exist at the time of vcpu setup. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
/*
|
|
* tools/testing/selftests/kvm/lib/kvm_util.c
|
|
*
|
|
* Copyright (C) 2018, Google LLC.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2.
|
|
*/
|
|
|
|
#ifndef KVM_UTIL_INTERNAL_H
|
|
#define KVM_UTIL_INTERNAL_H 1
|
|
|
|
#include "sparsebit.h"
|
|
|
|
#ifndef BITS_PER_BYTE
|
|
#define BITS_PER_BYTE 8
|
|
#endif
|
|
|
|
#ifndef BITS_PER_LONG
|
|
#define BITS_PER_LONG (BITS_PER_BYTE * sizeof(long))
|
|
#endif
|
|
|
|
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
|
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_LONG)
|
|
|
|
/* Concrete definition of struct kvm_vm. */
|
|
struct userspace_mem_region {
|
|
struct userspace_mem_region *next, *prev;
|
|
struct kvm_userspace_memory_region region;
|
|
struct sparsebit *unused_phy_pages;
|
|
int fd;
|
|
off_t offset;
|
|
void *host_mem;
|
|
void *mmap_start;
|
|
size_t mmap_size;
|
|
};
|
|
|
|
struct vcpu {
|
|
struct vcpu *next, *prev;
|
|
uint32_t id;
|
|
int fd;
|
|
struct kvm_run *state;
|
|
};
|
|
|
|
struct kvm_vm {
|
|
int mode;
|
|
int fd;
|
|
unsigned int page_size;
|
|
unsigned int page_shift;
|
|
uint64_t max_gfn;
|
|
struct vcpu *vcpu_head;
|
|
struct userspace_mem_region *userspace_mem_region_head;
|
|
struct sparsebit *vpages_valid;
|
|
struct sparsebit *vpages_mapped;
|
|
|
|
bool pgd_created;
|
|
vm_paddr_t pgd;
|
|
vm_vaddr_t gdt;
|
|
vm_vaddr_t tss;
|
|
};
|
|
|
|
struct vcpu *vcpu_find(struct kvm_vm *vm,
|
|
uint32_t vcpuid);
|
|
void vcpu_setup(struct kvm_vm *vm, int vcpuid, int pgd_memslot, int gdt_memslot);
|
|
void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
|
|
void regs_dump(FILE *stream, struct kvm_regs *regs,
|
|
uint8_t indent);
|
|
void sregs_dump(FILE *stream, struct kvm_sregs *sregs,
|
|
uint8_t indent);
|
|
|
|
#endif
|