diff options
author | Asias He <asias.hejun@gmail.com> | 2010-05-28 15:48:16 +0800 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2015-06-01 16:39:39 +0100 |
commit | 0ed849e624b8dd726c475dd9d9be151d1b3ca1ec (patch) | |
tree | 4a8514d5cd9baf7b550fa3e340939cc511f38f84 /kvm.c | |
parent | 9687927d6877711102197dc9508dc23a67769b29 (diff) | |
download | kvmtool-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.c | 77 |
1 files changed, 4 insertions, 73 deletions
@@ -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"); } |