mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-24 10:17:28 +00:00
HV:treewide:C99-friendly per_cpu implementation change the per_cpu method
The current implementation of per_cpu relies on several non-c99 features, and in additional involves arbitrary pointer arithmetic which is not MIS- RA C friendly. This patch introduces struct per_cpu_region which holds all the per_cpu variables. Allocation of per_cpu data regions and access to per_cpu vari- ables are greatly simplified, at the cost of making all per_cpu varaibl- es accessible in files. Signed-off-by: Huihuang Shi <huihuang.shi@intel.com>
This commit is contained in:
@@ -18,7 +18,7 @@ spinlock_t up_count_spinlock = {
|
||||
.tail = 0
|
||||
};
|
||||
|
||||
void *per_cpu_data_base_ptr;
|
||||
struct per_cpu_region *per_cpu_data_base_ptr;
|
||||
int phy_cpu_num = 0;
|
||||
unsigned long pcpu_sync = 0;
|
||||
uint32_t up_count = 0;
|
||||
@@ -26,11 +26,6 @@ uint32_t up_count = 0;
|
||||
/* physical cpu active bitmap, support up to 64 cpus */
|
||||
uint64_t pcpu_active_bitmap = 0;
|
||||
|
||||
DEFINE_CPU_DATA(uint8_t[STACK_SIZE], stack) __aligned(16);
|
||||
DEFINE_CPU_DATA(uint8_t, lapic_id);
|
||||
DEFINE_CPU_DATA(void *, vcpu);
|
||||
DEFINE_CPU_DATA(int, state);
|
||||
|
||||
/* TODO: add more capability per requirement */
|
||||
/*APICv features*/
|
||||
#define VAPIC_FEATURE_VIRT_ACCESS (1 << 0)
|
||||
@@ -228,7 +223,7 @@ static void alloc_phy_cpu_data(int pcpu_num)
|
||||
{
|
||||
phy_cpu_num = pcpu_num;
|
||||
|
||||
per_cpu_data_base_ptr = calloc(1, PER_CPU_DATA_SIZE * pcpu_num);
|
||||
per_cpu_data_base_ptr = calloc(pcpu_num, sizeof(struct per_cpu_region));
|
||||
ASSERT(per_cpu_data_base_ptr != NULL, "");
|
||||
}
|
||||
|
||||
@@ -294,14 +289,6 @@ static void cpu_set_current_state(uint32_t logical_id, int state)
|
||||
}
|
||||
|
||||
#ifdef STACK_PROTECTOR
|
||||
struct stack_canary {
|
||||
/* Gcc generates extra code, using [fs:40] to access canary */
|
||||
uint8_t reserved[40];
|
||||
uint64_t canary;
|
||||
};
|
||||
|
||||
static DEFINE_CPU_DATA(struct stack_canary, stack_canary);
|
||||
|
||||
static uint64_t get_random_value(void)
|
||||
{
|
||||
uint64_t random = 0;
|
||||
|
@@ -6,12 +6,6 @@
|
||||
|
||||
#include <hypervisor.h>
|
||||
|
||||
DEFINE_CPU_DATA(struct tss_64, tss);
|
||||
DEFINE_CPU_DATA(struct host_gdt, gdt);
|
||||
DEFINE_CPU_DATA(uint8_t[STACK_SIZE], mc_stack) __aligned(16);
|
||||
DEFINE_CPU_DATA(uint8_t[STACK_SIZE], df_stack) __aligned(16);
|
||||
DEFINE_CPU_DATA(uint8_t[STACK_SIZE], sf_stack) __aligned(16);
|
||||
|
||||
static void set_tss_desc(union tss_64_descriptor *desc,
|
||||
void *tss, int tss_limit, int type)
|
||||
{
|
||||
|
@@ -9,14 +9,6 @@
|
||||
#include "instr_emul_wrapper.h"
|
||||
#include "instr_emul.h"
|
||||
|
||||
struct emul_cnx {
|
||||
struct vie vie;
|
||||
struct vm_guest_paging paging;
|
||||
struct vcpu *vcpu;
|
||||
};
|
||||
|
||||
static DEFINE_CPU_DATA(struct emul_cnx, g_inst_ctxt);
|
||||
|
||||
static int
|
||||
encode_vmcs_seg_desc(int seg, uint32_t *base, uint32_t *lim, uint32_t *acc);
|
||||
|
||||
|
@@ -133,6 +133,12 @@ struct vm_guest_paging {
|
||||
enum vm_paging_mode paging_mode;
|
||||
};
|
||||
|
||||
struct emul_cnx {
|
||||
struct vie vie;
|
||||
struct vm_guest_paging paging;
|
||||
struct vcpu *vcpu;
|
||||
};
|
||||
|
||||
/*
|
||||
* Identifiers for architecturally defined registers.
|
||||
*/
|
||||
|
@@ -37,9 +37,6 @@ struct irq_desc {
|
||||
static struct irq_desc *irq_desc_base;
|
||||
static int vector_to_irq[NR_MAX_VECTOR + 1];
|
||||
|
||||
static DEFINE_CPU_DATA(uint64_t[NR_MAX_IRQS], irq_count);
|
||||
static DEFINE_CPU_DATA(uint64_t, spurious);
|
||||
|
||||
spurious_handler_t spurious_handler;
|
||||
|
||||
static void init_irq_desc(void)
|
||||
|
@@ -6,8 +6,6 @@
|
||||
|
||||
#include <hypervisor.h>
|
||||
|
||||
static DEFINE_CPU_DATA(uint64_t, softirq_pending);
|
||||
|
||||
void disable_softirq(int cpu_id)
|
||||
{
|
||||
bitmap_clear(SOFTIRQ_ATOMIC, &per_cpu(softirq_pending, cpu_id));
|
||||
|
@@ -13,14 +13,6 @@
|
||||
|
||||
uint64_t tsc_hz = 1000000000;
|
||||
|
||||
struct per_cpu_timers {
|
||||
struct list_head timer_list; /* it's for runtime active timer list */
|
||||
};
|
||||
|
||||
static DEFINE_CPU_DATA(struct per_cpu_timers, cpu_timers);
|
||||
static DEFINE_CPU_DATA(struct dev_handler_node *, timer_node);
|
||||
|
||||
|
||||
static void run_timer(struct timer *timer)
|
||||
{
|
||||
/* deadline = 0 means stop timer, we should skip */
|
||||
|
Reference in New Issue
Block a user