[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v3 12/43] arm64: add the basic helpers for arm64
This patch adds the basic helpers in headers for arm64: 1.) mb/rmb/wmb 2.) local_irq_disable/local_irq_enable 3.) local_irq_save/local_irq_restore/local_save_flags 4.) simplify the __ffs 5.) add BUG(). This patch refers to Chen Baozi's patch: "Initial codes for arm64" And this patch also refers to FreeBSD code: sys/arm64/include/atomic.h Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx> --- include/arm/arm64/os.h | 28 +++++++++++++++++++ include/arm/os.h | 75 ++++++++++++++++---------------------------------- 2 files changed, 52 insertions(+), 51 deletions(-) create mode 100644 include/arm/arm64/os.h diff --git a/include/arm/arm64/os.h b/include/arm/arm64/os.h new file mode 100644 index 0000000..3d4aada --- /dev/null +++ b/include/arm/arm64/os.h @@ -0,0 +1,28 @@ +#ifndef _ARM64_OS_H_ +#define _ARM64_OS_H_ + +#define BUG() __asm__ __volatile("wfi" ::: "memory") + +static inline void local_irq_disable(void) +{ + __asm__ __volatile__("msr daifset, #2":::"memory"); +} + +static inline void local_irq_enable(void) +{ + __asm__ __volatile__("msr daifclr, #2":::"memory"); +} + +#define local_irq_save(x) { \ + __asm__ __volatile__("mrs %0, daif; msr daifset, #2":"=r"(x)::"memory"); \ +} + +#define local_irq_restore(x) { \ + __asm__ __volatile__("msr daif, %0"::"r"(x):"memory"); \ +} + +#define local_save_flags(x) { \ + __asm__ __volatile__("mrs %0, daif":"=r"(x)::"memory"); \ +} + +#endif diff --git a/include/arm/os.h b/include/arm/os.h index 6a1cc37..b10557a 100644 --- a/include/arm/os.h +++ b/include/arm/os.h @@ -8,41 +8,42 @@ #include <mini-os/compiler.h> #include <mini-os/kernel.h> #include <xen/xen.h> +#include <arm64/os.h> void arch_fini(void); void timer_handler(evtchn_port_t port, struct pt_regs *regs, void *ign); extern void *device_tree; -#define BUG() while(1){asm volatile (".word 0xe7f000f0\n");} /* Undefined instruction; will call our fault handler. */ - #define smp_processor_id() 0 #define barrier() __asm__ __volatile__("": : :"memory") extern shared_info_t *HYPERVISOR_shared_info; -// disable interrupts -static inline void local_irq_disable(void) { - __asm__ __volatile__("cpsid i":::"memory"); -} - -// enable interrupts -static inline void local_irq_enable(void) { - __asm__ __volatile__("cpsie i":::"memory"); -} - -#define local_irq_save(x) { \ - __asm__ __volatile__("mrs %0, cpsr;cpsid i":"=r"(x)::"memory"); \ -} - -#define local_irq_restore(x) { \ - __asm__ __volatile__("msr cpsr_c, %0"::"r"(x):"memory"); \ -} +#define isb() __asm__ __volatile("isb" ::: "memory") + +/* + * Options for DMB and DSB: + * oshld Outer Shareable, load + * oshst Outer Shareable, store + * osh Outer Shareable, all + * nshld Non-shareable, load + * nshst Non-shareable, store + * nsh Non-shareable, all + * ishld Inner Shareable, load + * ishst Inner Shareable, store + * ish Inner Shareable, all + * ld Full system, load + * st Full system, store + * sy Full system, all + */ +#define dmb(opt) __asm__ __volatile("dmb " #opt ::: "memory") +#define dsb(opt) __asm__ __volatile("dsb " #opt ::: "memory") -#define local_save_flags(x) { \ - __asm__ __volatile__("mrs %0, cpsr":"=r"(x)::"memory"); \ -} +#define mb() dmb(sy) /* Full system memory barrier all */ +#define wmb() dmb(st) /* Full system memory barrier store */ +#define rmb() dmb(ld) /* Full system memory barrier load */ static inline int irqs_disabled(void) { int x; @@ -50,14 +51,8 @@ static inline int irqs_disabled(void) { return x & 0x80; } -/* We probably only need "dmb" here, but we'll start by being paranoid. */ -#define mb() __asm__("dsb":::"memory"); -#define rmb() __asm__("dsb":::"memory"); -#define wmb() __asm__("dsb":::"memory"); - /************************** arm *******************************/ #ifdef __INSIDE_MINIOS__ -#if defined (__arm__) #define xchg(ptr,v) __atomic_exchange_n(ptr, v, __ATOMIC_SEQ_CST) /** @@ -129,31 +124,9 @@ static __inline__ void clear_bit(int nr, volatile unsigned long *addr) */ static __inline__ unsigned long __ffs(unsigned long word) { - int clz; - - /* xxxxx10000 = word - * xxxxx01111 = word - 1 - * 0000011111 = word ^ (word - 1) - * 4 = 31 - clz(word ^ (word - 1)) - */ - - __asm__ ( - "sub r0, %[word], #1\n" - "eor r0, r0, %[word]\n" - "clz %[clz], r0\n": - /* Outputs: */ - [clz] "=r"(clz): - /* Inputs: */ - [word] "r"(word): - /* Clobbers: */ - "r0"); - - return 31 - clz; + return __builtin_ctzl(word); } -#else /* ifdef __arm__ */ -#error "Unsupported architecture" -#endif #endif /* ifdef __INSIDE_MINIOS */ /********************* common arm32 and arm64 ****************************/ -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |