| From 98cb859f3a31f10d35a3c0071186ddff5816c327 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 12 Oct 2020 12:47:13 -0700 |
| Subject: selftests: kvm: Fix the segment descriptor layout to match the actual |
| layout |
| |
| From: Aaron Lewis <aaronlewis@google.com> |
| |
| [ Upstream commit df11f7dd5834146defa448acba097e8d7703cc42 ] |
| |
| Fix the layout of 'struct desc64' to match the layout described in the |
| SDM Vol 3, Chapter 3 "Protected-Mode Memory Management", section 3.4.5 |
| "Segment Descriptors", Figure 3-8 "Segment Descriptor". The test added |
| later in this series relies on this and crashes if this layout is not |
| correct. |
| |
| Signed-off-by: Aaron Lewis <aaronlewis@google.com> |
| Reviewed-by: Alexander Graf <graf@amazon.com> |
| Message-Id: <20201012194716.3950330-2-aaronlewis@google.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/kvm/include/x86.h | 2 +- |
| tools/testing/selftests/kvm/lib/x86.c | 3 ++- |
| 2 files changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/tools/testing/selftests/kvm/include/x86.h b/tools/testing/selftests/kvm/include/x86.h |
| index 42c3596815b83..a7667a613bbc7 100644 |
| --- a/tools/testing/selftests/kvm/include/x86.h |
| +++ b/tools/testing/selftests/kvm/include/x86.h |
| @@ -59,7 +59,7 @@ enum x86_register { |
| struct desc64 { |
| uint16_t limit0; |
| uint16_t base0; |
| - unsigned base1:8, s:1, type:4, dpl:2, p:1; |
| + unsigned base1:8, type:4, s:1, dpl:2, p:1; |
| unsigned limit1:4, avl:1, l:1, db:1, g:1, base2:8; |
| uint32_t base3; |
| uint32_t zero1; |
| diff --git a/tools/testing/selftests/kvm/lib/x86.c b/tools/testing/selftests/kvm/lib/x86.c |
| index 4d35eba73dc97..800fe36064f9a 100644 |
| --- a/tools/testing/selftests/kvm/lib/x86.c |
| +++ b/tools/testing/selftests/kvm/lib/x86.c |
| @@ -449,11 +449,12 @@ static void kvm_seg_fill_gdt_64bit(struct kvm_vm *vm, struct kvm_segment *segp) |
| desc->limit0 = segp->limit & 0xFFFF; |
| desc->base0 = segp->base & 0xFFFF; |
| desc->base1 = segp->base >> 16; |
| - desc->s = segp->s; |
| desc->type = segp->type; |
| + desc->s = segp->s; |
| desc->dpl = segp->dpl; |
| desc->p = segp->present; |
| desc->limit1 = segp->limit >> 16; |
| + desc->avl = segp->avl; |
| desc->l = segp->l; |
| desc->db = segp->db; |
| desc->g = segp->g; |
| -- |
| 2.27.0 |
| |