2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2013
7 * Jan Kiszka <jan.kiszka@siemens.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
13 #ifndef _JAILHOUSE_ASM_PERCPU_H
14 #define _JAILHOUSE_ASM_PERCPU_H
16 #include <jailhouse/types.h>
17 #include <asm/paging.h>
19 #define NUM_ENTRY_REGS 6
21 /* Keep in sync with struct per_cpu! */
22 #define PERCPU_SIZE_SHIFT 13
23 #define PERCPU_STACK_END PAGE_SIZE
24 #define PERCPU_LINUX_SP PERCPU_STACK_END
31 /* Keep these two in sync with defines above! */
33 unsigned long linux_sp;
35 struct per_cpu *cpu_data;
40 u32 stats[JAILHOUSE_NUM_CPU_STATS];
42 unsigned long linux_reg[NUM_ENTRY_REGS];
43 // unsigned long linux_ip;
46 volatile bool stop_cpu;
47 volatile bool wait_for_sipi;
48 volatile bool cpu_stopped;
55 } __attribute__((aligned(PAGE_SIZE)));
57 #define DECLARE_PER_CPU_ACCESSOR(field) \
58 static inline typeof(((struct per_cpu *)0)->field) this_##field(void) \
60 typeof(((struct per_cpu *)0)->field) tmp = 0; \
65 DECLARE_PER_CPU_ACCESSOR(cpu_data)
66 DECLARE_PER_CPU_ACCESSOR(cpu_id)
67 DECLARE_PER_CPU_ACCESSOR(cell)
69 static inline struct per_cpu *per_cpu(unsigned int cpu)
71 extern u8 __page_pool[];
73 return (struct per_cpu *)(__page_pool + (cpu << PERCPU_SIZE_SHIFT));
76 /* Validate defines */
77 #define CHECK_ASSUMPTION(assume) ((void)sizeof(char[1 - 2*!(assume)]))
79 static inline void __check_assumptions(void)
81 struct per_cpu cpu_data;
83 CHECK_ASSUMPTION(sizeof(struct per_cpu) == (1 << PERCPU_SIZE_SHIFT));
84 CHECK_ASSUMPTION(sizeof(cpu_data.stack) == PERCPU_STACK_END);
85 CHECK_ASSUMPTION(__builtin_offsetof(struct per_cpu, linux_sp) ==
88 #endif /* !__ASSEMBLY__ */
90 #endif /* !_JAILHOUSE_ASM_PERCPU_H */