summaryrefslogtreecommitdiff
path: root/firmware/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/thread.c')
-rw-r--r--firmware/thread.c180
1 files changed, 72 insertions, 108 deletions
diff --git a/firmware/thread.c b/firmware/thread.c
index f70eb5af7f..58d1b39d74 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -991,34 +991,31 @@ static inline void core_sleep(void)
991 * Start the thread running and terminate it if it returns 991 * Start the thread running and terminate it if it returns
992 *--------------------------------------------------------------------------- 992 *---------------------------------------------------------------------------
993 */ 993 */
994
994void start_thread(void); /* Provide C access to ASM label */ 995void start_thread(void); /* Provide C access to ASM label */
995#if 0 996static void __attribute__((used)) _start_thread(void)
996static void __attribute__((used)) __start_thread(void)
997{ 997{
998 998
999 /* $v0 = context */ 999 /* $t1 = context */
1000 asm volatile ( 1000 asm volatile (
1001 ".set noreorder \n" 1001 "start_thread: \n"
1002 "_start_thread: \n" /* Start here - no naked attribute */ 1002 ".set noreorder \n"
1003 "lw $8, (4)$2 \n" /* Fetch thread function pointer ($8 = $t0, $2 = $v0) */ 1003 ".set noat \n"
1004 "lw $29, (108)$2 \n" /* Set initial sp(=$29) */ 1004 "lw $8, 4($9) \n" /* Fetch thread function pointer ($8 = $t0, $9 = $t1) */
1005 "jalr $8 \n" /* Start the thread ($8 = $t0,)*/ 1005 "lw $29, 40($9) \n" /* Set initial sp(=$29) */
1006 "sw $0, (116)$2 \n" /* Clear start address ($2 = $v0) */ 1006 "sw $0, 48($9) \n" /* Clear start address */
1007 ".set reorder \n" 1007 "jalr $8 \n" /* Start the thread */
1008 "nop \n"
1009 ".set at \n"
1010 ".set reorder \n"
1008 ); 1011 );
1009 thread_exit(); 1012 thread_exit();
1010 1013
1011} 1014}
1012#else
1013void start_thread(void)
1014{
1015 return;
1016}
1017#endif
1018 1015
1019/* Place context pointer in $v0 slot, function pointer in $v1 slot, and 1016/* Place context pointer in $s0 slot, function pointer in $s1 slot, and
1020 * start_thread pointer in context_start */ 1017 * start_thread pointer in context_start */
1021#define THREAD_STARTUP_INIT(core, thread, function) \ 1018#define THREAD_STARTUP_INIT(core, thread, function) \
1022 ({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \ 1019 ({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \
1023 (thread)->context.r[1] = (uint32_t)(function), \ 1020 (thread)->context.r[1] = (uint32_t)(function), \
1024 (thread)->context.start = (uint32_t)start_thread; }) 1021 (thread)->context.start = (uint32_t)start_thread; })
@@ -1029,43 +1026,26 @@ void start_thread(void)
1029 */ 1026 */
1030static inline void store_context(void* addr) 1027static inline void store_context(void* addr)
1031{ 1028{
1032#if 0
1033 asm volatile ( 1029 asm volatile (
1034 ".set noreorder \n" 1030 ".set noreorder \n"
1035 ".set noat \n" 1031 ".set noat \n"
1036 "sw $1, (0)%0 \n" 1032 "move $8, %0 \n"
1037 "sw $2,(4)%0 \n" /* $v0 */ 1033 "sw $16, 0($8) \n" /* $s0 */
1038 "sw $3,(8)%0 \n" /* $v1 */ 1034 "sw $17, 4($8) \n" /* $s1 */
1039 "sw $4,(12)%0 \n" /* $a0 */ 1035 "sw $18, 8($8) \n" /* $s2 */
1040 "sw $5,(16)%0 \n" /* $a1 */ 1036 "sw $19, 12($8) \n" /* $s3 */
1041 "sw $6,(20)%0 \n" /* $a2 */ 1037 "sw $20, 16($8) \n" /* $s4 */
1042 "sw $7,(24)%0 \n" /* $a3 */ 1038 "sw $21, 20($8) \n" /* $s5 */
1043 "sw $8,(28)%0 \n" /* $t0 */ 1039 "sw $22, 24($8) \n" /* $s6 */
1044 "sw $9,(32)%0 \n" /* $t1 */ 1040 "sw $23, 28($8) \n" /* $s7 */
1045 "sw $10,(36)%0 \n" /* $t2 */ 1041 "sw $28, 32($8) \n" /* gp */
1046 "sw $11,(40)%0 \n" /* $t3 */ 1042 "sw $30, 36($8) \n" /* fp */
1047 "sw $12,(44)%0 \n" /* $t4 */ 1043 "sw $29, 40($8) \n" /* sp */
1048 "sw $13,(48)%0 \n" /* $t5 */ 1044 "sw $31, 44($8) \n" /* ra */
1049 "sw $14,(52)%0 \n" /* $t6 */ 1045 ".set at \n"
1050 "sw $15,(56)%0 \n" /* $t7 */ 1046 ".set reorder \n"
1051 "sw $24,(60)%0 \n" /* $t8 */ 1047 : : "r" (addr) : "t0"
1052 "sw $25,(64)%0 \n" /* $t9 */
1053 "sw $16,(68)%0 \n" /* $s0 */
1054 "sw $17,(72)%0 \n" /* $s1 */
1055 "sw $18,(76)%0 \n" /* $s2 */
1056 "sw $19,(80)%0 \n" /* $s3 */
1057 "sw $20,(84)%0 \n" /* $s4 */
1058 "sw $21,(88)%0 \n" /* $s5 */
1059 "sw $22,(92)%0 \n" /* $s6 */
1060 "sw $23,(96)%0 \n" /* $s7 */
1061 "sw $28,(100)%0 \n" /* gp */
1062 "sw $30,(104)%0 \n" /* fp */
1063 "sw $29,(108)%0 \n" /* sp */
1064 "sw $31,(112)%0 \n" /* ra */
1065 ".set reorder \n"
1066 : : "r" (addr)
1067 ); 1048 );
1068#endif
1069} 1049}
1070 1050
1071/*--------------------------------------------------------------------------- 1051/*---------------------------------------------------------------------------
@@ -1074,48 +1054,33 @@ static inline void store_context(void* addr)
1074 */ 1054 */
1075static inline void load_context(const void* addr) 1055static inline void load_context(const void* addr)
1076{ 1056{
1077#if 0
1078 asm volatile ( 1057 asm volatile (
1079 ".set noat \n" 1058 ".set noat \n"
1080 ".set noreorder \n" 1059 ".set noreorder \n"
1081 "lw $8, 116(%0) \n" /* Get start address ($8 = $t0) */ 1060 "lw $8, 48(%0) \n" /* Get start address ($8 = $t0) */
1082 //"tst r0, r0 \n" 1061 "beqz $8, running \n" /* NULL -> already running */
1083 "j .running \n" /* NULL -> already running */ 1062 "nop \n"
1084 "jr $8 \n" /* $t0 = $8 = context */ 1063 "move $9, %0 \n" /* $t1 = context */
1085 ".running: \n" 1064 "jr $8 \n"
1086 "lw $1, (0)%0 \n" 1065 "nop \n"
1087 "lw $2,(4)%0 \n" /* $v0 */ 1066 "running: \n"
1088 "lw $3,(8)%0 \n" /* $v1 */ 1067 "move $8, %0 \n"
1089 "lw $4,(12)%0 \n" /* $a0 */ 1068 "lw $16, 0($8) \n" /* $s0 */
1090 "lw $5,(16)%0 \n" /* $a1 */ 1069 "lw $17, 4($8) \n" /* $s1 */
1091 "lw $6,(20)%0 \n" /* $a2 */ 1070 "lw $18, 8($8) \n" /* $s2 */
1092 "lw $7,(24)%0 \n" /* $a3 */ 1071 "lw $19, 12($8) \n" /* $s3 */
1093 "lw $8,(28)%0 \n" /* $t0 */ 1072 "lw $20, 16($8) \n" /* $s4 */
1094 "lw $9,(32)%0 \n" /* $t1 */ 1073 "lw $21, 20($8) \n" /* $s5 */
1095 "lw $10,(36)%0 \n" /* $t2 */ 1074 "lw $22, 24($8) \n" /* $s6 */
1096 "lw $11,(40)%0 \n" /* $t3 */ 1075 "lw $23, 28($8) \n" /* $s7 */
1097 "lw $12,(44)%0 \n" /* $t4 */ 1076 "lw $28, 32($8) \n" /* gp */
1098 "lw $13,(48)%0 \n" /* $t5 */ 1077 "lw $30, 36($8) \n" /* fp */
1099 "lw $14,(52)%0 \n" /* $t6 */ 1078 "lw $29, 40($8) \n" /* sp */
1100 "lw $15,(56)%0 \n" /* $t7 */ 1079 "lw $31, 44($8) \n" /* ra */
1101 "lw $24,(60)%0 \n" /* $t8 */ 1080 ".set at \n"
1102 "lw $25,(64)%0 \n" /* $t9 */ 1081 ".set reorder \n"
1103 "lw $16,(68)%0 \n" /* $s0 */ 1082 : : "r" (addr) : "t0" /* only! */
1104 "lw $17,(72)%0 \n" /* $s1 */
1105 "lw $18,(76)%0 \n" /* $s2 */
1106 "lw $19,(80)%0 \n" /* $s3 */
1107 "lw $20,(84)%0 \n" /* $s4 */
1108 "lw $21,(88)%0 \n" /* $s5 */
1109 "lw $22,(92)%0 \n" /* $s6 */
1110 "lw $23,(96)%0 \n" /* $s7 */
1111 "lw $28,(100)%0 \n" /* gp */
1112 "lw $30,(104)%0 \n" /* fp */
1113 "lw $29,(108)%0 \n" /* sp */
1114 "lw $31,(112)%0 \n" /* ra */
1115 ".set reorder \n"
1116 : : "r" (addr) : "v0" /* only! */
1117 ); 1083 );
1118#endif
1119} 1084}
1120 1085
1121/*--------------------------------------------------------------------------- 1086/*---------------------------------------------------------------------------
@@ -1124,26 +1089,27 @@ static inline void load_context(const void* addr)
1124 */ 1089 */
1125static inline void core_sleep(void) 1090static inline void core_sleep(void)
1126{ 1091{
1127 /* 1092#if 0
1093#if CONFIG_CPU == JZ4732
1128 REG_CPM_LCR &= ~CPM_LCR_LPM_MASK; 1094 REG_CPM_LCR &= ~CPM_LCR_LPM_MASK;
1129 REG_CPM_LCR |= CPM_LCR_LPM_SLEEP; 1095 REG_CPM_LCR |= CPM_LCR_LPM_SLEEP;
1130 */ 1096#endif
1131 #if 0 1097 asm volatile(".set mips32r2 \n"
1132 asm volatile(".set mips32 \n" 1098 "mfc0 $8, $12 \n" /* mfc $t0, $12 */
1133 "mfc0 t0, 12 \n" 1099 "move $9, $8 \n" /* move $t1, $t0 */
1134 "move t1, t0 \n" 1100 "la $10, 0x8000000 \n" /* la $t2, 0x8000000 */
1135 "ori t0, t0, 0x8000000 \n" /* Enable reduced power mode */ 1101 "or $8, $8, $10 \n" /* Enable reduced power mode */
1136 "mtc0 t0, 12 \n" 1102 "mtc0 $8, $12 \n"
1137 "wait \n" 1103 "wait \n"
1138 "mtc0 t1, 12 \n" 1104 "mtc0 $9, $12 \n"
1139 ".set mips0 \n" 1105 ".set mips0 \n"
1140 ::: "t0", "t1" 1106 ::: "t0", "t1", "t2"
1141 ); 1107 );
1142 #endif 1108#if CONFIG_CPU == JZ4732
1143 /*
1144 REG_CPM_LCR &= ~CPM_LCR_LPM_MASK; 1109 REG_CPM_LCR &= ~CPM_LCR_LPM_MASK;
1145 REG_CPM_LCR |= CPM_LCR_LPM_IDLE; 1110 REG_CPM_LCR |= CPM_LCR_LPM_IDLE;
1146 */ 1111#endif
1112#endif
1147} 1113}
1148 1114
1149 1115
@@ -2071,7 +2037,6 @@ static inline void block_thread_on_l(struct thread_entry *thread,
2071 */ 2037 */
2072void switch_thread(void) 2038void switch_thread(void)
2073{ 2039{
2074#ifndef ONDA_VX747
2075 2040
2076 const unsigned int core = CURRENT_CORE; 2041 const unsigned int core = CURRENT_CORE;
2077 struct thread_entry *block = cores[core].block_task; 2042 struct thread_entry *block = cores[core].block_task;
@@ -2208,7 +2173,6 @@ void switch_thread(void)
2208 profile_thread_started(thread - threads); 2173 profile_thread_started(thread - threads);
2209#endif 2174#endif
2210 2175
2211#endif
2212} 2176}
2213 2177
2214/*--------------------------------------------------------------------------- 2178/*---------------------------------------------------------------------------