@@ -172,7 +172,7 @@ typedef struct {
u8 base_high;
} gdt_entry_t;
-struct segment_desc64 {
+struct system_desc64 {
uint16_t limit1;
uint16_t base1;
uint8_t base2;
@@ -183,7 +183,7 @@ struct segment_desc64 {
uint16_t s:1;
uint16_t dpl:2;
uint16_t p:1;
- uint16_t limit:4;
+ uint16_t limit2:4;
uint16_t avl:1;
uint16_t l:1;
uint16_t db:1;
@@ -1876,22 +1876,22 @@ static bool reg_corruption_check(struct svm_test *test)
static void get_tss_entry(void *data)
{
struct descriptor_table_ptr gdt;
- struct segment_desc64 *gdt_table;
- struct segment_desc64 *tss_entry;
+ gdt_entry_t *gdt_table;
+ struct system_desc64 *tss_entry;
u16 tr = 0;
sgdt(&gdt);
tr = str();
- gdt_table = (struct segment_desc64 *) gdt.base;
- tss_entry = &gdt_table[tr / sizeof(struct segment_desc64)];
- *((struct segment_desc64 **)data) = tss_entry;
+ gdt_table = (gdt_entry_t *) gdt.base;
+ tss_entry = (struct system_desc64 *) &gdt_table[tr / 8];
+ *((struct system_desc64 **)data) = tss_entry;
}
static int orig_cpu_count;
static void init_startup_prepare(struct svm_test *test)
{
- struct segment_desc64 *tss_entry;
+ struct system_desc64 *tss_entry;
int i;
on_cpu(1, get_tss_entry, &tss_entry);
@@ -133,8 +133,8 @@ struct fault_test vmware_backdoor_tests[] = {
static void set_tss_ioperm(void)
{
struct descriptor_table_ptr gdt;
- struct segment_desc64 *gdt_table;
- struct segment_desc64 *tss_entry;
+ gdt_entry_t *gdt_table;
+ struct system_desc64 *tss_entry;
u16 tr = 0;
tss64_t *tss;
unsigned char *ioperm_bitmap;
@@ -142,8 +142,8 @@ static void set_tss_ioperm(void)
sgdt(&gdt);
tr = str();
- gdt_table = (struct segment_desc64 *) gdt.base;
- tss_entry = &gdt_table[tr / sizeof(struct segment_desc64)];
+ gdt_table = (gdt_entry_t *) gdt.base;
+ tss_entry = (struct system_desc64 *) &gdt_table[tr / 8];
tss_base = ((uint64_t) tss_entry->base1 |
((uint64_t) tss_entry->base2 << 16) |
((uint64_t) tss_entry->base3 << 24) |
Look them up using a gdt_entry_t pointer, so that the address of the descriptor is correct even for "odd" selectors (e.g. 0x98). Rename the struct from segment_desc64 to system_desc64, highlighting that it is only used in the case of S=0 (system descriptor). Rename the "limit" bitfield to "limit2", matching the convention used for the various parts of the base field. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- lib/x86/desc.h | 4 ++-- x86/svm_tests.c | 12 ++++++------ x86/vmware_backdoors.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-)