aboutsummaryrefslogtreecommitdiffstats
path: root/kvm.c
diff options
context:
space:
mode:
authorAsias He <asias.hejun@gmail.com>2010-05-28 15:48:16 +0800
committerWill Deacon <will.deacon@arm.com>2015-06-01 16:39:39 +0100
commit0ed849e624b8dd726c475dd9d9be151d1b3ca1ec (patch)
tree4a8514d5cd9baf7b550fa3e340939cc511f38f84 /kvm.c
parent9687927d6877711102197dc9508dc23a67769b29 (diff)
downloadkvmtool-0ed849e624b8dd726c475dd9d9be151d1b3ca1ec.tar.gz
kvm: reimplement kvm__setup_sregs
It's better to get sregs which was initialized by kernel and change what we need precisely. Actually vmx_vcpu_reset does the cpu initialization before us. This solves the problem of failing to run on x86-32 host kernel. Signed-off-by: Asias He <asias.hejun@gmail.com> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
Diffstat (limited to 'kvm.c')
-rw-r--r--kvm.c77
1 files changed, 4 insertions, 73 deletions
diff --git a/kvm.c b/kvm.c
index 3aac4d49..cf18be7a 100644
--- a/kvm.c
+++ b/kvm.c
@@ -491,80 +491,11 @@ static void kvm__setup_regs(struct kvm *self)
static void kvm__setup_sregs(struct kvm *self)
{
- self->sregs = (struct kvm_sregs) {
- .cr0 = 0x60000010ULL,
- .cs = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x0bU,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .ss = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x03U,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .ds = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x03U,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .es = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x03U,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .fs = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x03U,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .gs = (struct kvm_segment) {
- .selector = self->boot_selector,
- .base = selector_to_base(self->boot_selector),
- .limit = 0xffffU,
- .type = 0x03U,
- .present = 1,
- .dpl = 0x03,
- .s = 1,
- },
- .tr = (struct kvm_segment) {
- .limit = 0xffffU,
- .present = 1,
- .type = 0x03U,
- },
- .ldt = (struct kvm_segment) {
- .limit = 0xffffU,
- .present = 1,
- .type = 0x02U,
- },
- .gdt = (struct kvm_dtable) {
- .limit = 0xffffU,
- },
- .idt = (struct kvm_dtable) {
- .limit = 0xffffU,
- },
- };
+ if (ioctl(self->vcpu_fd, KVM_GET_SREGS, &self->sregs) < 0)
+ die_perror("KVM_GET_SREGS failed");
+ self->sregs.cs.selector = self->boot_selector;
+ self->sregs.cs.base = selector_to_base(self->boot_selector);
if (ioctl(self->vcpu_fd, KVM_SET_SREGS, &self->sregs) < 0)
die_perror("KVM_SET_SREGS failed");
}