Skip to content

Commit 881eaa6

Browse files
binbinwu1lijinxia
authored andcommitted
hv: create gdt for guest to start from protected mode
In current implementation, on sbl platform, vm0 bsp starts from 64bit mode. And hv need to prepare init page table for it. In this patch series, on sbl platform, vm0 bsp starts from non-paging protected mode. This patch prepares an init gdt for vm0 bsp on sbl platform. Signed-off-by: Binbin Wu <binbin.wu@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com> Reviewed-by: Eddie Dong <eddie.dong@intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Acked-by: Xu, Anthony <anthony.xu@intel.com>
1 parent 9e7179c commit 881eaa6

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

hypervisor/arch/x86/guest/guest.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,3 +680,36 @@ uint64_t create_guest_initial_paging(struct vm *vm)
680680

681681
return GUEST_INIT_PAGE_TABLE_START;
682682
}
683+
684+
/*******************************************************************
685+
* GUEST initial GDT table
686+
*
687+
* If guest starts with protected mode, HV needs to prepare Guest GDT.
688+
******************************************************************/
689+
690+
#define GUEST_INIT_GDT_SKIP_SIZE 0x8000UL
691+
#define GUEST_INIT_GDT_START (CONFIG_LOW_RAM_START + \
692+
GUEST_INIT_GDT_SKIP_SIZE)
693+
694+
/* The GDT defined below compatible with linux kernel */
695+
#define GUEST_INIT_GDT_DESC_0 (0x0)
696+
#define GUEST_INIT_GDT_DESC_1 (0x0)
697+
#define GUEST_INIT_GDT_DESC_2 (0x00CF9B000000FFFFULL) /* Linear Code */
698+
#define GUEST_INIT_GDT_DESC_3 (0x00CF93000000FFFFULL) /* Linear Data */
699+
700+
static const uint64_t guest_init_gdt[] = {
701+
GUEST_INIT_GDT_DESC_0,
702+
GUEST_INIT_GDT_DESC_1,
703+
GUEST_INIT_GDT_DESC_2,
704+
GUEST_INIT_GDT_DESC_3,
705+
};
706+
707+
uint32_t create_guest_init_gdt(struct vm *vm, uint32_t *limit)
708+
{
709+
void *gtd_addr = GPA2HVA(vm, GUEST_INIT_GDT_START);
710+
711+
*limit = sizeof(guest_init_gdt) - 1;
712+
memcpy_s(gtd_addr, 64, guest_init_gdt, sizeof(guest_init_gdt));
713+
714+
return GUEST_INIT_GDT_START;
715+
};

hypervisor/include/arch/x86/guest/guest.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ extern vm_sw_loader_t vm_sw_loader;
123123

124124
int copy_from_vm(struct vm *vm, void *h_ptr, uint64_t gpa, uint32_t size);
125125
int copy_to_vm(struct vm *vm, void *h_ptr, uint64_t gpa, uint32_t size);
126+
127+
uint32_t create_guest_init_gdt(struct vm *vm, uint32_t *limit);
126128
#endif /* !ASSEMBLER */
127129

128130
#endif /* GUEST_H*/

0 commit comments

Comments
 (0)