diff options
author | Chris Zankel <chris@zankel.net> | 2008-02-12 16:17:07 -0500 |
---|---|---|
committer | Chris Zankel <chris@zankel.net> | 2008-02-13 20:41:43 -0500 |
commit | c658eac628aa8df040dfe614556d95e6da3a9ffb (patch) | |
tree | e2211e1d5c894c29e92d4c744f504b38410efe41 /include/asm-xtensa/system.h | |
parent | 71d28e6c285548106f551fde13ca6d589433d843 (diff) |
[XTENSA] Add support for configurable registers and coprocessors
The Xtensa architecture allows to define custom instructions and
registers. Registers that are bound to a coprocessor are only
accessible if the corresponding enable bit is set, which allows
to implement a 'lazy' context switch mechanism. Other registers
needs to be saved and restore at the time of the context switch
or during interrupt handling.
This patch adds support for these additional states:
- save and restore registers that are used by the compiler upon
interrupt entry and exit.
- context switch additional registers unbound to any coprocessor
- 'lazy' context switch of registers bound to a coprocessor
- ptrace interface to provide access to additional registers
- update configuration files in include/asm-xtensa/variant-fsf
Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'include/asm-xtensa/system.h')
-rw-r--r-- | include/asm-xtensa/system.h | 39 |
1 files changed, 1 insertions, 38 deletions
diff --git a/include/asm-xtensa/system.h b/include/asm-xtensa/system.h index e0cb9116d8ab..62b1e8f3c13c 100644 --- a/include/asm-xtensa/system.h +++ b/include/asm-xtensa/system.h | |||
@@ -46,42 +46,6 @@ static inline int irqs_disabled(void) | |||
46 | return flags & 0xf; | 46 | return flags & 0xf; |
47 | } | 47 | } |
48 | 48 | ||
49 | #define RSR_CPENABLE(x) do { \ | ||
50 | __asm__ __volatile__("rsr %0," __stringify(CPENABLE) : "=a" (x)); \ | ||
51 | } while(0); | ||
52 | #define WSR_CPENABLE(x) do { \ | ||
53 | __asm__ __volatile__("wsr %0," __stringify(CPENABLE)";rsync" \ | ||
54 | :: "a" (x));} while(0); | ||
55 | |||
56 | #define clear_cpenable() __clear_cpenable() | ||
57 | |||
58 | static inline void __clear_cpenable(void) | ||
59 | { | ||
60 | #if XCHAL_HAVE_CP | ||
61 | unsigned long i = 0; | ||
62 | WSR_CPENABLE(i); | ||
63 | #endif | ||
64 | } | ||
65 | |||
66 | static inline void enable_coprocessor(int i) | ||
67 | { | ||
68 | #if XCHAL_HAVE_CP | ||
69 | int cp; | ||
70 | RSR_CPENABLE(cp); | ||
71 | cp |= 1 << i; | ||
72 | WSR_CPENABLE(cp); | ||
73 | #endif | ||
74 | } | ||
75 | |||
76 | static inline void disable_coprocessor(int i) | ||
77 | { | ||
78 | #if XCHAL_HAVE_CP | ||
79 | int cp; | ||
80 | RSR_CPENABLE(cp); | ||
81 | cp &= ~(1 << i); | ||
82 | WSR_CPENABLE(cp); | ||
83 | #endif | ||
84 | } | ||
85 | 49 | ||
86 | #define smp_read_barrier_depends() do { } while(0) | 50 | #define smp_read_barrier_depends() do { } while(0) |
87 | #define read_barrier_depends() do { } while(0) | 51 | #define read_barrier_depends() do { } while(0) |
@@ -111,7 +75,6 @@ extern void *_switch_to(void *last, void *next); | |||
111 | 75 | ||
112 | #define switch_to(prev,next,last) \ | 76 | #define switch_to(prev,next,last) \ |
113 | do { \ | 77 | do { \ |
114 | clear_cpenable(); \ | ||
115 | (last) = _switch_to(prev, next); \ | 78 | (last) = _switch_to(prev, next); \ |
116 | } while(0) | 79 | } while(0) |
117 | 80 | ||
@@ -244,7 +207,7 @@ static inline void spill_registers(void) | |||
244 | "wsr a13," __stringify(SAR) "\n\t" | 207 | "wsr a13," __stringify(SAR) "\n\t" |
245 | "wsr a14," __stringify(PS) "\n\t" | 208 | "wsr a14," __stringify(PS) "\n\t" |
246 | :: "a" (&a0), "a" (&ps) | 209 | :: "a" (&a0), "a" (&ps) |
247 | : "a2", "a3", "a12", "a13", "a14", "a15", "memory"); | 210 | : "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15", "memory"); |
248 | } | 211 | } |
249 | 212 | ||
250 | #define arch_align_stack(x) (x) | 213 | #define arch_align_stack(x) (x) |