|
@@ -18,7 +18,6 @@
|
|
|
#include "kvm.h"
|
|
|
#include "x86.h"
|
|
|
#include "x86_emulate.h"
|
|
|
-#include "segment_descriptor.h"
|
|
|
#include "irq.h"
|
|
|
|
|
|
#include <linux/kvm.h>
|
|
@@ -104,50 +103,9 @@ static struct dentry *debugfs_dir;
|
|
|
#define CR8_RESERVED_BITS (~(unsigned long)X86_CR8_TPR)
|
|
|
#define EFER_RESERVED_BITS 0xfffffffffffff2fe
|
|
|
|
|
|
-#ifdef CONFIG_X86_64
|
|
|
-/* LDT or TSS descriptor in the GDT. 16 bytes. */
|
|
|
-struct segment_descriptor_64 {
|
|
|
- struct segment_descriptor s;
|
|
|
- u32 base_higher;
|
|
|
- u32 pad_zero;
|
|
|
-};
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl,
|
|
|
unsigned long arg);
|
|
|
|
|
|
-unsigned long segment_base(u16 selector)
|
|
|
-{
|
|
|
- struct descriptor_table gdt;
|
|
|
- struct segment_descriptor *d;
|
|
|
- unsigned long table_base;
|
|
|
- unsigned long v;
|
|
|
-
|
|
|
- if (selector == 0)
|
|
|
- return 0;
|
|
|
-
|
|
|
- asm("sgdt %0" : "=m"(gdt));
|
|
|
- table_base = gdt.base;
|
|
|
-
|
|
|
- if (selector & 4) { /* from ldt */
|
|
|
- u16 ldt_selector;
|
|
|
-
|
|
|
- asm("sldt %0" : "=g"(ldt_selector));
|
|
|
- table_base = segment_base(ldt_selector);
|
|
|
- }
|
|
|
- d = (struct segment_descriptor *)(table_base + (selector & ~7));
|
|
|
- v = d->base_low | ((unsigned long)d->base_mid << 16) |
|
|
|
- ((unsigned long)d->base_high << 24);
|
|
|
-#ifdef CONFIG_X86_64
|
|
|
- if (d->system == 0 && (d->type == 2 || d->type == 9 || d->type == 11))
|
|
|
- v |= ((unsigned long) \
|
|
|
- ((struct segment_descriptor_64 *)d)->base_higher) << 32;
|
|
|
-#endif
|
|
|
- return v;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(segment_base);
|
|
|
-
|
|
|
static inline int valid_vcpu(int n)
|
|
|
{
|
|
|
return likely(n >= 0 && n < KVM_MAX_VCPUS);
|