summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2004-10-15 11:32:58 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2004-10-15 11:32:58 +0000
commit82fb2ace7736210fc5ee9e98e29fed586c1f5186 (patch)
tree330c3173d39d27ff884984d7ba3a766db94b9527 /firmware/export
parent688b4ddec66935aa9f4586adf00cebd8fcd535b1 (diff)
downloadrockbox-82fb2ace7736210fc5ee9e98e29fed586c1f5186.zip
rockbox-82fb2ace7736210fc5ee9e98e29fed586c1f5186.tar.gz
rockbox-82fb2ace7736210fc5ee9e98e29fed586c1f5186.tar.bz2
rockbox-82fb2ace7736210fc5ee9e98e29fed586c1f5186.tar.xz
Cleaned up and started porting to Coldfire
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5284 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/system.h52
1 files changed, 16 insertions, 36 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h
index fc0b750..7ac5c1d 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -56,6 +56,7 @@ extern void system_init(void);
#define I_CONSTRAINT "I"
#endif
+#if CONFIG_CPU == SH7034
#define or_b(mask, address) \
asm \
("or.b\t%0,@(r0,gbr)" \
@@ -76,6 +77,7 @@ extern void system_init(void);
: \
: /* %0 */ I_CONSTRAINT((char)(mask)), \
/* %1 */ "z"(address-GBR))
+#endif
#ifndef SIMULATOR
@@ -83,6 +85,7 @@ extern void system_init(void);
* Interrupt level setting
* The level is left shifted 4 bits
****************************************************************************/
+#if CONFIG_CPU == SH7034
#define HIGHEST_IRQ_LEVEL (15<<4)
static inline int set_irq_level(int level)
{
@@ -129,42 +132,6 @@ static inline unsigned long SWAB32(unsigned long value)
return value;
}
-/* Test And Set - UNTESTED */
-static inline int tas (volatile int *pointer)
- {
- int result;
- asm volatile ("tas.b\t@%1;movt\t%0" : "=t"(result) : "r"((char *)pointer) : "memory");
- return result;
- }
-
-/* Compare And Swap */
-static inline int cas (volatile int *pointer,int requested_value,int new_value)
- {
- unsigned int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
- if (*pointer == requested_value)
- {
- *pointer = new_value;
- set_irq_level(oldlevel);
- return 1;
- }
- set_irq_level(oldlevel);
- return 0;
- }
-
-static inline int cas2 (volatile int *pointer1,volatile int *pointer2,int requested_value1,int requested_value2,int new_value1,int new_value2)
- {
- unsigned int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
- if (*pointer1 == requested_value1 && *pointer2 == requested_value2)
- {
- *pointer1 = new_value1;
- *pointer2 = new_value2;
- set_irq_level(oldlevel);
- return 1;
- }
- set_irq_level(oldlevel);
- return 0;
- }
-
/* Utilize the user break controller to catch invalid memory accesses. */
int system_memory_guard(int newmode);
@@ -176,6 +143,19 @@ enum {
MAXMEMGUARD
};
+#elif CONFIG_CPU == MCF5249
+#define HIGHEST_IRQ_LEVEL (7<<8)
+static inline int set_irq_level(int level)
+{
+ int i;
+ /* Read the old level and set the new one */
+ asm volatile ("move.w %%sr,%0\n"
+ "or.l #0x2000,%1\n"
+ "move.w %1,%%sr\n" : "=r" (i) : "r" (level));
+ return i;
+}
+
+#endif
#endif
#endif