summaryrefslogtreecommitdiff
path: root/firmware/target/sh/system-target.h
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2008-03-26 01:50:41 +0000
committerMichael Sevakis <jethead71@rockbox.org>2008-03-26 01:50:41 +0000
commitaf395f4db6ad7b83f9d9afefb1c0ceeedd140a45 (patch)
treeb631289b4a3b28d3c65b10d272d50298f377c69f /firmware/target/sh/system-target.h
parent74d678fdbcbc427c057e7682ba0a0566e49a8b97 (diff)
downloadrockbox-af395f4db6ad7b83f9d9afefb1c0ceeedd140a45.tar.gz
rockbox-af395f4db6ad7b83f9d9afefb1c0ceeedd140a45.zip
Do core interrupt masking in a less general fashion and save some instructions to decrease size and speed things up a little bit. Small fix to a few places where interrupts would get enabled again where they shouldn't have been (context switching calls when disabled).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16811 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/sh/system-target.h')
-rw-r--r--firmware/target/sh/system-target.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/firmware/target/sh/system-target.h b/firmware/target/sh/system-target.h
index 7fb8fecb6b..d641076694 100644
--- a/firmware/target/sh/system-target.h
+++ b/firmware/target/sh/system-target.h
@@ -52,11 +52,29 @@ static inline int set_irq_level(int level)
52{ 52{
53 int i; 53 int i;
54 /* Read the old level and set the new one */ 54 /* Read the old level and set the new one */
55 asm volatile ("stc sr, %0" : "=r" (i)); 55
56 /* Not volatile - will be optimized away if the return value isn't used */
57 asm ("stc sr, %0" : "=r" (i));
56 asm volatile ("ldc %0, sr" : : "r" (level)); 58 asm volatile ("ldc %0, sr" : : "r" (level));
57 return i; 59 return i;
58} 60}
59 61
62static inline void enable_irq(void)
63{
64 int i;
65 asm volatile ("mov %1, %0 \n" /* Save a constant load from RAM */
66 "ldc %0, sr \n" : "=&r"(i) : "i"(0));
67}
68
69#define disable_irq() \
70 ((void)set_irq_level(HIGHEST_IRQ_LEVEL))
71
72#define disable_irq_save() \
73 set_irq_level(HIGHEST_IRQ_LEVEL)
74
75#define restore_irq(i) \
76 ((void)set_irq_level(i))
77
60static inline uint16_t swap16(uint16_t value) 78static inline uint16_t swap16(uint16_t value)
61 /* 79 /*
62 result[15..8] = value[ 7..0]; 80 result[15..8] = value[ 7..0];