Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /* * linux/include/asm-arm/proc-armv/system.h * * Copyright (C) 1996 Russell King */ #ifndef __ASM_PROC_SYSTEM_H #define __ASM_PROC_SYSTEM_H extern const char xchg_str[]; extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size) { extern void arm_invalidptr(const char *, int); switch (size) { case 1: __asm__ __volatile__ ("swpb %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory"); break; case 4: __asm__ __volatile__ ("swp %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory"); break; default: arm_invalidptr(xchg_str, size); } return x; } #define set_cr(x) \ __asm__ __volatile__( \ "mcr p15, 0, %0, c1, c0 @ set CR" \ : : "r" (x)) extern unsigned long cr_no_alignment; /* defined in entry-armv.S */ extern unsigned long cr_alignment; /* defined in entry-armv.S */ /* * A couple of speedups for the ARM */ /* * Save the current interrupt enable state & disable IRQs */ #define __save_flags_cli(x) \ ({ \ unsigned long temp; \ __asm__ __volatile__( \ "mrs %0, cpsr @ save_flags_cli\n" \ " orr %1, %0, #128\n" \ " msr cpsr_c, %1" \ : "=r" (x), "=r" (temp) \ : \ : "memory"); \ }) /* * Enable IRQs */ #define __sti() \ ({ \ unsigned long temp; \ __asm__ __volatile__( \ "mrs %0, cpsr @ sti\n" \ " bic %0, %0, #128\n" \ " msr cpsr_c, %0" \ : "=r" (temp) \ : \ : "memory"); \ }) /* * Disable IRQs */ #define __cli() \ ({ \ unsigned long temp; \ __asm__ __volatile__( \ "mrs %0, cpsr @ cli\n" \ " orr %0, %0, #128\n" \ " msr cpsr_c, %0" \ : "=r" (temp) \ : \ : "memory"); \ }) /* * save current IRQ & FIQ state */ #define __save_flags(x) \ __asm__ __volatile__( \ "mrs %0, cpsr @ save_flags\n" \ : "=r" (x) \ : \ : "memory") /* * restore saved IRQ & FIQ state */ #define __restore_flags(x) \ __asm__ __volatile__( \ "msr cpsr_c, %0 @ restore_flags\n" \ : \ : "r" (x) \ : "memory") /* For spinlocks etc */ #define local_irq_save(x) __save_flags_cli(x) #define local_irq_restore(x) __restore_flags(x) #define local_irq_disable() __cli() #define local_irq_enable() __sti() #ifdef __SMP__ #error SMP not supported #else #define cli() __cli() #define sti() __sti() #define save_flags(x) __save_flags(x) #define restore_flags(x) __restore_flags(x) #define save_flags_cli(x) __save_flags_cli(x) #endif #endif |