summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-04-14 11:15:43 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-04-14 11:15:43 +0000
commit036168cbf96d455eea927bcf1701627e81e68a3a (patch)
tree8bf88a49aacccc8807241837a62ea4d1ebf56ffe /firmware/target/arm
parent0b7bb31453762f354af30210d1981f5dec3cdc19 (diff)
downloadrockbox-036168cbf96d455eea927bcf1701627e81e68a3a.tar.gz
rockbox-036168cbf96d455eea927bcf1701627e81e68a3a.zip
PP5020/PP5024: Add ASM optimized inline current_core.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13155 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/system-target.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/firmware/target/arm/system-target.h b/firmware/target/arm/system-target.h
index 2b72e9293e..0dd02a8704 100644
--- a/firmware/target/arm/system-target.h
+++ b/firmware/target/arm/system-target.h
@@ -36,7 +36,27 @@ static inline void udelay(unsigned usecs)
36 while (TIME_BEFORE(USEC_TIMER, stop)); 36 while (TIME_BEFORE(USEC_TIMER, stop));
37} 37}
38 38
39#if CONFIG_CPU == PP5020 || CONFIG_CPU == PP5024
40static inline unsigned int current_core(void)
41{
42 /*
43 * PROCESSOR_ID seems to be 32-bits:
44 * CPU = 0x55555555 = |01010101|01010101|01010101|01010101|
45 * COP = 0xaaaaaaaa = |10101010|10101010|10101010|10101010|
46 * ^
47 */
48 unsigned int core;
49 asm volatile (
50 "ldr %0, =0x60000000 \r\n" /* PROCESSOR_ID */
51 "ldrb %0, [%0] \r\n" /* Just load the LSB */
52 "mov %0, %0, lsr #7 \r\n" /* Bit 7 => index */
53 : "=&r"(core) /* CPU=0, COP=1 */
54 );
55 return core;
56}
57#else
39unsigned int current_core(void); 58unsigned int current_core(void);
59#endif
40 60
41#if CONFIG_CPU != PP5002 61#if CONFIG_CPU != PP5002
42 62