]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
arm: Use asm-defines.h for struct per_cpu members
authorJan Kiszka <jan.kiszka@siemens.com>
Mon, 13 Jun 2016 09:47:22 +0000 (11:47 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Thu, 16 Jun 2016 16:41:13 +0000 (18:41 +0200)
Port the logic over from x86 and also drop CHECK_ASSUMPTION here.

The only slightly ugly detail: the PERCPU_SIZE_SHIFT define is now
duplicated in both asm/percpu.h instances because there is no good
generic header yet to hold it. Can be cleaned up later on.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/arm/asm-defines.c
hypervisor/arch/arm/entry.S
hypervisor/arch/arm/include/asm/percpu.h
hypervisor/arch/arm/setup.c

index 15ff68ddc2e4c6b298b3cae19c3c0cb8d86fefda..c54ebf4fe4d5ecb678dce208f68c9f5b41f66828 100644 (file)
  */
 
 #include <jailhouse/gen-defines.h>
+#include <jailhouse/utils.h>
+#include <asm/percpu.h>
 
 void common(void);
 
 void common(void)
 {
+       OFFSET(PERCPU_LINUX_SP, per_cpu, linux_sp);
+       BLANK();
+
+       /* GCC evaluates constant expressions involving built-ins
+        * at compilation time, so this yields computed value.
+        */
+       DEFINE(PERCPU_STACK_END,
+              __builtin_offsetof(struct per_cpu, stack) + \
+              FIELD_SIZEOF(struct per_cpu, stack));
+       DEFINE(PERCPU_SIZE_SHIFT_ASM, PERCPU_SIZE_SHIFT);
 }
index 6f9178ca9ad31368e3ea00701a2450ec3440ef84..430bb3ed212a9e92f0f3e293512375bddc57d701 100644 (file)
@@ -10,6 +10,7 @@
  * the COPYING file in the top-level directory.
  */
 
+#include <asm/asm-defines.h>
 #include <asm/head.h>
 #include <asm/percpu.h>
 
@@ -22,7 +23,7 @@ arch_entry:
 
        ldr     r1, =__page_pool
        mov     r4, #1
-       lsl     r4, #PERCPU_SIZE_SHIFT
+       lsl     r4, #PERCPU_SIZE_SHIFT_ASM
        /*
         * percpu data = pool + cpuid * shift
         * TODO: handle aff1 and aff2
index 3ab3a6826f3008bcc2dc5f447291e60879bfad2a..e6562da73ff82fd33dce4d8f69aad4113af3c350 100644 (file)
 
 #define NUM_ENTRY_REGS                 13
 
-/* Keep in sync with struct per_cpu! */
-#define PERCPU_SIZE_SHIFT              13
-#define PERCPU_STACK_END               PAGE_SIZE
-#define PERCPU_LINUX_SP                        PERCPU_STACK_END
-
 #ifndef __ASSEMBLY__
 
 #include <jailhouse/cell.h>
 #include <asm/spinlock.h>
 #include <asm/sysregs.h>
 
+/* Round up sizeof(struct per_cpu) to the next power of two. */
+#define PERCPU_SIZE_SHIFT \
+       (BITS_PER_LONG - __builtin_clzl(sizeof(struct per_cpu) - 1))
+
 struct pending_irq;
 
 struct per_cpu {
-       /* Keep these two in sync with defines above! */
        u8 stack[PAGE_SIZE];
        unsigned long linux_sp;
        unsigned long linux_ret;
@@ -93,7 +91,7 @@ static inline struct per_cpu *per_cpu(unsigned int cpu)
 static inline struct registers *guest_regs(struct per_cpu *cpu_data)
 {
        /* Assumes that the trap handler is entered with an empty stack */
-       return (struct registers *)(cpu_data->stack + PERCPU_STACK_END
+       return (struct registers *)(cpu_data->stack + sizeof(cpu_data->stack)
                        - sizeof(struct registers));
 }
 
@@ -103,19 +101,6 @@ static inline unsigned int arm_cpu_phys2virt(unsigned int cpu_id)
 }
 
 unsigned int arm_cpu_virt2phys(struct cell *cell, unsigned int virt_id);
-
-/* Validate defines */
-#define CHECK_ASSUMPTION(assume)       ((void)sizeof(char[1 - 2*!(assume)]))
-
-static inline void __check_assumptions(void)
-{
-       struct per_cpu cpu_data;
-
-       CHECK_ASSUMPTION(sizeof(struct per_cpu) == (1 << PERCPU_SIZE_SHIFT));
-       CHECK_ASSUMPTION(sizeof(cpu_data.stack) == PERCPU_STACK_END);
-       CHECK_ASSUMPTION(__builtin_offsetof(struct per_cpu, linux_sp) ==
-                        PERCPU_LINUX_SP);
-}
 #endif /* !__ASSEMBLY__ */
 
 #endif /* !_JAILHOUSE_ASM_PERCPU_H */
index ef6f9e0ed04f24e4098df879d1bdfb47cca3a6ed..f9f59d876dbeaaf03403de51e514d31cb4941339 100644 (file)
@@ -129,7 +129,7 @@ void __attribute__((noreturn)) arch_cpu_activate_vmm(struct per_cpu *cpu_data)
                 */
                "eret\n\t"
                :
-               : "r" (cpu_data->stack + PERCPU_STACK_END),
+               : "r" (cpu_data->stack + sizeof(cpu_data->stack)),
                  "r" (cpu_data->linux_reg));
 
        __builtin_unreachable();