Cleaned up and started porting to Coldfire
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5284 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
688b4ddec6
commit
82fb2ace77
1 changed files with 16 additions and 36 deletions
|
@ -56,6 +56,7 @@ extern void system_init(void);
|
||||||
#define I_CONSTRAINT "I"
|
#define I_CONSTRAINT "I"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_CPU == SH7034
|
||||||
#define or_b(mask, address) \
|
#define or_b(mask, address) \
|
||||||
asm \
|
asm \
|
||||||
("or.b\t%0,@(r0,gbr)" \
|
("or.b\t%0,@(r0,gbr)" \
|
||||||
|
@ -76,6 +77,7 @@ extern void system_init(void);
|
||||||
: \
|
: \
|
||||||
: /* %0 */ I_CONSTRAINT((char)(mask)), \
|
: /* %0 */ I_CONSTRAINT((char)(mask)), \
|
||||||
/* %1 */ "z"(address-GBR))
|
/* %1 */ "z"(address-GBR))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
|
|
||||||
|
@ -83,6 +85,7 @@ extern void system_init(void);
|
||||||
* Interrupt level setting
|
* Interrupt level setting
|
||||||
* The level is left shifted 4 bits
|
* The level is left shifted 4 bits
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#if CONFIG_CPU == SH7034
|
||||||
#define HIGHEST_IRQ_LEVEL (15<<4)
|
#define HIGHEST_IRQ_LEVEL (15<<4)
|
||||||
static inline int set_irq_level(int level)
|
static inline int set_irq_level(int level)
|
||||||
{
|
{
|
||||||
|
@ -129,42 +132,6 @@ static inline unsigned long SWAB32(unsigned long value)
|
||||||
return 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. */
|
/* Utilize the user break controller to catch invalid memory accesses. */
|
||||||
int system_memory_guard(int newmode);
|
int system_memory_guard(int newmode);
|
||||||
|
|
||||||
|
@ -176,6 +143,19 @@ enum {
|
||||||
MAXMEMGUARD
|
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
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue