acrn-hypervisor/hypervisor/include/arch/x86/per_cpu.h
Yin Fegnwei 08139c34f7 hv: add vmx_off and update exec_vmxon_instr
To handle cpu down/up dynamically, arcn needs to support vmx off/on
dynamically. Following changes is introduced:
  vmx_off will be used when down AP. It does:
    - vmclear the mapped vcpu
    - off vmx.

  exec_vmxon_instr is updated to handle start and up AP both. It does
    - if vmx was on on AP, load the vmxon_region saved. Otherwise,
      allocate vmxon_region.
    - if there is mapped vcpu, vmptrld mapped vcpu.

Signed-off-by: Zheng Gen <gen.zheng@intel.com>
Signed-off-by: Yin Fegnwei <fengwei.yin@intel.com>
Acked-by: Eddie Dong <Eddie.dong@intel.com>
2018-06-07 15:36:46 +08:00

55 lines
1.4 KiB
C

#ifndef PER_CPU_H
#define PER_CPU_H
#include <hypervisor.h>
#include <bsp_extern.h>
#include <schedule.h>
#include <version.h>
#include <irq.h>
#include <sbuf.h>
#include <gdt.h>
#include <timer.h>
#include <logmsg.h>
#include "arch/x86/guest/instr_emul_wrapper.h"
struct per_cpu_region {
uint64_t *sbuf[ACRN_SBUF_ID_MAX];
uint64_t irq_count[NR_MAX_IRQS];
uint64_t vmexit_cnt[64];
uint64_t vmexit_time[64];
uint64_t softirq_pending;
uint64_t spurious;
uint64_t vmxon_region_pa;
struct dev_handler_node *timer_node;
struct shared_buf *earlylog_sbuf;
void *vcpu;
void *ever_run_vcpu;
#ifdef STACK_PROTECTOR
struct stack_canary stack_canary;
#endif
struct per_cpu_timers cpu_timers;
struct sched_context sched_ctx;
struct emul_cnx g_inst_ctxt;
struct host_gdt gdt;
struct tss_64 tss;
int state;
uint8_t mc_stack[STACK_SIZE] __aligned(16);
uint8_t df_stack[STACK_SIZE] __aligned(16);
uint8_t sf_stack[STACK_SIZE] __aligned(16);
uint8_t stack[STACK_SIZE] __aligned(16);
char logbuf[LOG_MESSAGE_MAX_SIZE];
uint8_t lapic_id;
} __aligned(CPU_PAGE_SIZE); //per_cpu_region size aligned with CPU_PAGE_SIZE
extern struct per_cpu_region *per_cpu_data_base_ptr;
extern int phy_cpu_num;
extern uint64_t pcpu_active_bitmap;
/*
* get percpu data for pcpu_id.
*/
#define per_cpu(name, pcpu_id) \
(per_cpu_data_base_ptr[pcpu_id].name)
/* get percpu data for current pcpu */
#define get_cpu_var(name) per_cpu(name, get_cpu_id())
#endif