1/* 2 * linux/include/asm-arm/proc-armo/system.h 3 * 4 * Copyright (C) 1995, 1996 Russell King 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10#ifndef __ASM_PROC_SYSTEM_H 11#define __ASM_PROC_SYSTEM_H 12 13#include <asm/proc-fns.h> 14 15#define vectors_base() (0) 16 17static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size) 18{ 19 extern void __bad_xchg(volatile void *, int); 20 21 switch (size) { 22 case 1: return cpu_xchg_1(x, ptr); 23 case 4: return cpu_xchg_4(x, ptr); 24 default: __bad_xchg(ptr, size); 25 } 26 return 0; 27} 28 29/* 30 * We need to turn the caches off before calling the reset vector - RiscOS 31 * messes up if we don't 32 */ 33#define proc_hard_reset() cpu_proc_fin() 34 35/* 36 * A couple of speedups for the ARM 37 */ 38 39/* 40 * Save the current interrupt enable state & disable IRQs 41 */ 42#define __save_flags_cli(x) \ 43 do { \ 44 unsigned long temp; \ 45 __asm__ __volatile__( \ 46" mov %0, pc @ save_flags_cli\n" \ 47" orr %1, %0, #0x08000000\n" \ 48" and %0, %0, #0x0c000000\n" \ 49" teqp %1, #0\n" \ 50 : "=r" (x), "=r" (temp) \ 51 : \ 52 : "memory"); \ 53 } while (0) 54 55/* 56 * Enable IRQs 57 */ 58#define __sti() \ 59 do { \ 60 unsigned long temp; \ 61 __asm__ __volatile__( \ 62" mov %0, pc @ sti\n" \ 63" bic %0, %0, #0x08000000\n" \ 64" teqp %0, #0\n" \ 65 : "=r" (temp) \ 66 : \ 67 : "memory"); \ 68 } while(0) 69 70/* 71 * Disable IRQs 72 */ 73#define __cli() \ 74 do { \ 75 unsigned long temp; \ 76 __asm__ __volatile__( \ 77" mov %0, pc @ cli\n" \ 78" orr %0, %0, #0x08000000\n" \ 79" teqp %0, #0\n" \ 80 : "=r" (temp) \ 81 : \ 82 : "memory"); \ 83 } while(0) 84 85#define __clf() do { \ 86 unsigned long temp; \ 87 __asm__ __volatile__( \ 88" mov %0, pc @ clf\n" \ 89" orr %0, %0, #0x04000000\n" \ 90" teqp %0, #0\n" \ 91 : "=r" (temp)); \ 92 } while(0) 93 94#define __stf() do { \ 95 unsigned long temp; \ 96 __asm__ __volatile__( \ 97" mov %0, pc @ stf\n" \ 98" bic %0, %0, #0x04000000\n" \ 99" teqp %0, #0\n" \ 100 : "=r" (temp)); \ 101 } while(0) 102 103/* 104 * save current IRQ & FIQ state 105 */ 106#define __save_flags(x) \ 107 do { \ 108 __asm__ __volatile__( \ 109" mov %0, pc @ save_flags\n" \ 110" and %0, %0, #0x0c000000\n" \ 111 : "=r" (x)); \ 112 } while (0) 113 114/* 115 * restore saved IRQ & FIQ state 116 */ 117#define __restore_flags(x) \ 118 do { \ 119 unsigned long temp; \ 120 __asm__ __volatile__( \ 121" mov %0, pc @ restore_flags\n" \ 122" bic %0, %0, #0x0c000000\n" \ 123" orr %0, %0, %1\n" \ 124" teqp %0, #0\n" \ 125 : "=&r" (temp) \ 126 : "r" (x) \ 127 : "memory"); \ 128 } while (0) 129 130#endif 131