mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-22 01:07:57 +00:00
hv:move down structures run_context and ext_context
Now the structures(run_context & ext_context) are defined in vcpu.h,and they are used in the lower-layer modules(wakeup.S), this patch move down the structures from vcpu.h to cpu.h to avoid reversed dependency. Tracked-On: #1842 Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
committed by
ACRN System Integration
parent
4f98cb03a7
commit
60adef33d3
@@ -38,6 +38,7 @@
|
||||
#ifndef CPU_H
|
||||
#define CPU_H
|
||||
#include <types.h>
|
||||
#include <acrn_common.h>
|
||||
|
||||
/* Define CPU stack alignment */
|
||||
#define CPU_STACK_ALIGN 16UL
|
||||
@@ -147,6 +148,41 @@
|
||||
/* Boot CPU ID */
|
||||
#define BOOT_CPU_ID 0U
|
||||
|
||||
/* Number of GPRs saved / restored for guest in VCPU structure */
|
||||
#define NUM_GPRS 16U
|
||||
#define GUEST_STATE_AREA_SIZE 512
|
||||
|
||||
#define CPU_CONTEXT_OFFSET_RAX 0U
|
||||
#define CPU_CONTEXT_OFFSET_RCX 8U
|
||||
#define CPU_CONTEXT_OFFSET_RDX 16U
|
||||
#define CPU_CONTEXT_OFFSET_RBX 24U
|
||||
#define CPU_CONTEXT_OFFSET_RSP 32U
|
||||
#define CPU_CONTEXT_OFFSET_RBP 40U
|
||||
#define CPU_CONTEXT_OFFSET_RSI 48U
|
||||
#define CPU_CONTEXT_OFFSET_RDI 56U
|
||||
#define CPU_CONTEXT_OFFSET_R8 64U
|
||||
#define CPU_CONTEXT_OFFSET_R9 72U
|
||||
#define CPU_CONTEXT_OFFSET_R10 80U
|
||||
#define CPU_CONTEXT_OFFSET_R11 88U
|
||||
#define CPU_CONTEXT_OFFSET_R12 96U
|
||||
#define CPU_CONTEXT_OFFSET_R13 104U
|
||||
#define CPU_CONTEXT_OFFSET_R14 112U
|
||||
#define CPU_CONTEXT_OFFSET_R15 120U
|
||||
#define CPU_CONTEXT_OFFSET_CR0 128U
|
||||
#define CPU_CONTEXT_OFFSET_CR2 136U
|
||||
#define CPU_CONTEXT_OFFSET_CR4 144U
|
||||
#define CPU_CONTEXT_OFFSET_RIP 152U
|
||||
#define CPU_CONTEXT_OFFSET_RFLAGS 160U
|
||||
#define CPU_CONTEXT_OFFSET_IA32_SPEC_CTRL 168U
|
||||
#define CPU_CONTEXT_OFFSET_IA32_EFER 176U
|
||||
#define CPU_CONTEXT_OFFSET_EXTCTX_START 184U
|
||||
#define CPU_CONTEXT_OFFSET_CR3 184U
|
||||
#define CPU_CONTEXT_OFFSET_IDTR 192U
|
||||
#define CPU_CONTEXT_OFFSET_LDTR 216U
|
||||
|
||||
/*sizes of various registers within the VCPU data structure */
|
||||
#define VMX_CPU_S_FXSAVE_GUEST_AREA_SIZE GUEST_STATE_AREA_SIZE
|
||||
|
||||
#ifndef ASSEMBLER
|
||||
|
||||
#define AP_MASK (((1UL << get_pcpu_nums()) - 1UL) & ~(1UL << 0U))
|
||||
@@ -269,6 +305,89 @@ enum pcpu_boot_state {
|
||||
void make_pcpu_offline(uint16_t pcpu_id);
|
||||
bool need_offline(uint16_t pcpu_id);
|
||||
|
||||
struct segment_sel {
|
||||
uint16_t selector;
|
||||
uint64_t base;
|
||||
uint32_t limit;
|
||||
uint32_t attr;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief registers info saved for vcpu running context
|
||||
*/
|
||||
struct run_context {
|
||||
/* Contains the guest register set.
|
||||
* NOTE: This must be the first element in the structure, so that the offsets
|
||||
* in vmx_asm.S match
|
||||
*/
|
||||
union cpu_regs_t {
|
||||
struct acrn_gp_regs regs;
|
||||
uint64_t longs[NUM_GPRS];
|
||||
} cpu_regs;
|
||||
|
||||
/** The guests CR registers 0, 2, 3 and 4. */
|
||||
uint64_t cr0;
|
||||
|
||||
/* CPU_CONTEXT_OFFSET_CR2 =
|
||||
* offsetof(struct run_context, cr2) = 136
|
||||
*/
|
||||
uint64_t cr2;
|
||||
uint64_t cr4;
|
||||
|
||||
uint64_t rip;
|
||||
uint64_t rflags;
|
||||
|
||||
/* CPU_CONTEXT_OFFSET_IA32_SPEC_CTRL =
|
||||
* offsetof(struct run_context, ia32_spec_ctrl) = 168
|
||||
*/
|
||||
uint64_t ia32_spec_ctrl;
|
||||
uint64_t ia32_efer;
|
||||
};
|
||||
|
||||
/*
|
||||
* extended context does not save/restore during vm exit/entry, it's mainly
|
||||
* used in trusty world switch
|
||||
*/
|
||||
struct ext_context {
|
||||
uint64_t cr3;
|
||||
|
||||
/* segment registers */
|
||||
struct segment_sel idtr;
|
||||
struct segment_sel ldtr;
|
||||
struct segment_sel gdtr;
|
||||
struct segment_sel tr;
|
||||
struct segment_sel cs;
|
||||
struct segment_sel ss;
|
||||
struct segment_sel ds;
|
||||
struct segment_sel es;
|
||||
struct segment_sel fs;
|
||||
struct segment_sel gs;
|
||||
|
||||
uint64_t ia32_star;
|
||||
uint64_t ia32_lstar;
|
||||
uint64_t ia32_fmask;
|
||||
uint64_t ia32_kernel_gs_base;
|
||||
|
||||
uint64_t ia32_pat;
|
||||
uint32_t ia32_sysenter_cs;
|
||||
uint64_t ia32_sysenter_esp;
|
||||
uint64_t ia32_sysenter_eip;
|
||||
uint64_t ia32_debugctl;
|
||||
|
||||
uint64_t dr7;
|
||||
uint64_t tsc_offset;
|
||||
|
||||
/* The 512 bytes area to save the FPU/MMX/SSE states for the guest */
|
||||
uint64_t
|
||||
fxstore_guest_area[VMX_CPU_S_FXSAVE_GUEST_AREA_SIZE / sizeof(uint64_t)]
|
||||
__aligned(16);
|
||||
};
|
||||
|
||||
struct cpu_context {
|
||||
struct run_context run_ctx;
|
||||
struct ext_context ext_ctx;
|
||||
};
|
||||
|
||||
/* Function prototypes */
|
||||
void cpu_do_idle(void);
|
||||
void cpu_dead(void);
|
||||
|
@@ -13,40 +13,6 @@
|
||||
#ifndef VCPU_H
|
||||
#define VCPU_H
|
||||
|
||||
/* Number of GPRs saved / restored for guest in VCPU structure */
|
||||
#define NUM_GPRS 16U
|
||||
#define GUEST_STATE_AREA_SIZE 512
|
||||
|
||||
#define CPU_CONTEXT_OFFSET_RAX 0U
|
||||
#define CPU_CONTEXT_OFFSET_RCX 8U
|
||||
#define CPU_CONTEXT_OFFSET_RDX 16U
|
||||
#define CPU_CONTEXT_OFFSET_RBX 24U
|
||||
#define CPU_CONTEXT_OFFSET_RSP 32U
|
||||
#define CPU_CONTEXT_OFFSET_RBP 40U
|
||||
#define CPU_CONTEXT_OFFSET_RSI 48U
|
||||
#define CPU_CONTEXT_OFFSET_RDI 56U
|
||||
#define CPU_CONTEXT_OFFSET_R8 64U
|
||||
#define CPU_CONTEXT_OFFSET_R9 72U
|
||||
#define CPU_CONTEXT_OFFSET_R10 80U
|
||||
#define CPU_CONTEXT_OFFSET_R11 88U
|
||||
#define CPU_CONTEXT_OFFSET_R12 96U
|
||||
#define CPU_CONTEXT_OFFSET_R13 104U
|
||||
#define CPU_CONTEXT_OFFSET_R14 112U
|
||||
#define CPU_CONTEXT_OFFSET_R15 120U
|
||||
#define CPU_CONTEXT_OFFSET_CR0 128U
|
||||
#define CPU_CONTEXT_OFFSET_CR2 136U
|
||||
#define CPU_CONTEXT_OFFSET_CR4 144U
|
||||
#define CPU_CONTEXT_OFFSET_RIP 152U
|
||||
#define CPU_CONTEXT_OFFSET_RFLAGS 160U
|
||||
#define CPU_CONTEXT_OFFSET_IA32_SPEC_CTRL 168U
|
||||
#define CPU_CONTEXT_OFFSET_IA32_EFER 176U
|
||||
#define CPU_CONTEXT_OFFSET_EXTCTX_START 184U
|
||||
#define CPU_CONTEXT_OFFSET_CR3 184U
|
||||
#define CPU_CONTEXT_OFFSET_IDTR 192U
|
||||
#define CPU_CONTEXT_OFFSET_LDTR 216U
|
||||
|
||||
/*sizes of various registers within the VCPU data structure */
|
||||
#define VMX_CPU_S_FXSAVE_GUEST_AREA_SIZE GUEST_STATE_AREA_SIZE
|
||||
|
||||
#ifndef ASSEMBLER
|
||||
|
||||
@@ -175,83 +141,6 @@ enum vm_cpu_mode {
|
||||
CPU_MODE_64BIT, /* IA-32E mode (CS.L = 1) */
|
||||
};
|
||||
|
||||
struct segment_sel {
|
||||
uint16_t selector;
|
||||
uint64_t base;
|
||||
uint32_t limit;
|
||||
uint32_t attr;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief registers info saved for vcpu running context
|
||||
*/
|
||||
struct run_context {
|
||||
/* Contains the guest register set.
|
||||
* NOTE: This must be the first element in the structure, so that the offsets
|
||||
* in vmx_asm.S match
|
||||
*/
|
||||
union guest_cpu_regs_t {
|
||||
struct acrn_gp_regs regs;
|
||||
uint64_t longs[NUM_GPRS];
|
||||
} guest_cpu_regs;
|
||||
|
||||
/** The guests CR registers 0, 2, 3 and 4. */
|
||||
uint64_t cr0;
|
||||
|
||||
/* CPU_CONTEXT_OFFSET_CR2 =
|
||||
* offsetof(struct run_context, cr2) = 136
|
||||
*/
|
||||
uint64_t cr2;
|
||||
uint64_t cr4;
|
||||
|
||||
uint64_t rip;
|
||||
uint64_t rflags;
|
||||
|
||||
/* CPU_CONTEXT_OFFSET_IA32_SPEC_CTRL =
|
||||
* offsetof(struct run_context, ia32_spec_ctrl) = 168
|
||||
*/
|
||||
uint64_t ia32_spec_ctrl;
|
||||
uint64_t ia32_efer;
|
||||
};
|
||||
|
||||
/*
|
||||
* extended context does not save/restore during vm exit/entry, it's mainly
|
||||
* used in trusty world switch
|
||||
*/
|
||||
struct ext_context {
|
||||
uint64_t cr3;
|
||||
|
||||
/* segment registers */
|
||||
struct segment_sel idtr;
|
||||
struct segment_sel ldtr;
|
||||
struct segment_sel gdtr;
|
||||
struct segment_sel tr;
|
||||
struct segment_sel cs;
|
||||
struct segment_sel ss;
|
||||
struct segment_sel ds;
|
||||
struct segment_sel es;
|
||||
struct segment_sel fs;
|
||||
struct segment_sel gs;
|
||||
|
||||
uint64_t ia32_star;
|
||||
uint64_t ia32_lstar;
|
||||
uint64_t ia32_fmask;
|
||||
uint64_t ia32_kernel_gs_base;
|
||||
|
||||
uint64_t ia32_pat;
|
||||
uint32_t ia32_sysenter_cs;
|
||||
uint64_t ia32_sysenter_esp;
|
||||
uint64_t ia32_sysenter_eip;
|
||||
uint64_t ia32_debugctl;
|
||||
|
||||
uint64_t dr7;
|
||||
uint64_t tsc_offset;
|
||||
|
||||
/* The 512 bytes area to save the FPU/MMX/SSE states for the guest */
|
||||
uint64_t
|
||||
fxstore_guest_area[VMX_CPU_S_FXSAVE_GUEST_AREA_SIZE / sizeof(uint64_t)]
|
||||
__aligned(16);
|
||||
};
|
||||
|
||||
/* 2 worlds: 0 for Normal World, 1 for Secure World */
|
||||
#define NR_WORLD 2
|
||||
@@ -264,7 +153,7 @@ struct ext_context {
|
||||
|
||||
#define EOI_EXIT_BITMAP_SIZE 256U
|
||||
|
||||
struct cpu_context {
|
||||
struct guest_cpu_context {
|
||||
struct run_context run_ctx;
|
||||
struct ext_context ext_ctx;
|
||||
|
||||
@@ -304,7 +193,7 @@ struct acrn_vcpu_arch {
|
||||
struct acrn_vmtrr vmtrr;
|
||||
|
||||
int32_t cur_context;
|
||||
struct cpu_context contexts[NR_WORLD];
|
||||
struct guest_cpu_context contexts[NR_WORLD];
|
||||
|
||||
/* common MSRs, world_msrs[] is a subset of it */
|
||||
uint64_t guest_msrs[NUM_GUEST_MSRS];
|
||||
|
@@ -135,7 +135,7 @@ struct acrn_vm {
|
||||
* so the snapshot only stores the vcpu0's run_context
|
||||
* of secure world.
|
||||
*/
|
||||
struct cpu_context sworld_snapshot;
|
||||
struct guest_cpu_context sworld_snapshot;
|
||||
|
||||
uint32_t vcpuid_entry_nr, vcpuid_level, vcpuid_xlevel;
|
||||
struct vcpuid_entry vcpuid_entries[MAX_VM_VCPUID_ENTRIES];
|
||||
|
Reference in New Issue
Block a user