summaryrefslogtreecommitdiff
path: root/firmware/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/thread.c')
-rw-r--r--firmware/thread.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/firmware/thread.c b/firmware/thread.c
index 4a808fb4b8..2eaa422841 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -985,6 +985,149 @@ static inline void core_sleep(void)
985 : : "z"(&SBYCR-GBR) : "r1"); 985 : : "z"(&SBYCR-GBR) : "r1");
986} 986}
987 987
988#elif CPU_MIPS == 32
989
990/*---------------------------------------------------------------------------
991 * Start the thread running and terminate it if it returns
992 *---------------------------------------------------------------------------
993 */
994void start_thread(void); /* Provide C access to ASM label */
995#if 0
996static void __attribute__((used)) __start_thread(void)
997{
998
999 /* $v0 = context */
1000 asm volatile (
1001 ".set noreorder \n"
1002 "_start_thread: \n" /* Start here - no naked attribute */
1003 "lw $8, (4)$2 \n" /* Fetch thread function pointer ($8 = $t0, $2 = $v0) */
1004 "lw $29, (108)$2 \n" /* Set initial sp(=$29) */
1005 "jalr $8 \n" /* Start the thread ($8 = $t0,)*/
1006 "sw $0, (116)$2 \n" /* Clear start address ($2 = $v0) */
1007 ".set reorder \n"
1008 );
1009 thread_exit();
1010
1011}
1012#else
1013void start_thread(void)
1014{
1015 return;
1016}
1017#endif
1018
1019/* Place context pointer in $v0 slot, function pointer in $v1 slot, and
1020 * start_thread pointer in context_start */
1021#define THREAD_STARTUP_INIT(core, thread, function) \
1022 ({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \
1023 (thread)->context.r[1] = (uint32_t)(function), \
1024 (thread)->context.start = (uint32_t)start_thread; })
1025
1026/*---------------------------------------------------------------------------
1027 * Store non-volatile context.
1028 *---------------------------------------------------------------------------
1029 */
1030static inline void store_context(void* addr)
1031{
1032#if 0
1033 asm volatile (
1034 ".set noreorder \n"
1035 ".set noat \n"
1036 "sw $1, (0)%0 \n"
1037 "sw $2,(4)%0 \n" /* $v0 */
1038 "sw $3,(8)%0 \n" /* $v1 */
1039 "sw $4,(12)%0 \n" /* $a0 */
1040 "sw $5,(16)%0 \n" /* $a1 */
1041 "sw $6,(20)%0 \n" /* $a2 */
1042 "sw $7,(24)%0 \n" /* $a3 */
1043 "sw $8,(28)%0 \n" /* $t0 */
1044 "sw $9,(32)%0 \n" /* $t1 */
1045 "sw $10,(36)%0 \n" /* $t2 */
1046 "sw $11,(40)%0 \n" /* $t3 */
1047 "sw $12,(44)%0 \n" /* $t4 */
1048 "sw $13,(48)%0 \n" /* $t5 */
1049 "sw $14,(52)%0 \n" /* $t6 */
1050 "sw $15,(56)%0 \n" /* $t7 */
1051 "sw $24,(60)%0 \n" /* $t8 */
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 );
1068#endif
1069}
1070
1071/*---------------------------------------------------------------------------
1072 * Load non-volatile context.
1073 *---------------------------------------------------------------------------
1074 */
1075static inline void load_context(const void* addr)
1076{
1077#if 0
1078 asm volatile (
1079 ".set noat \n"
1080 ".set noreorder \n"
1081 "lw $8, 116(%0) \n" /* Get start address ($8 = $t0) */
1082 //"tst r0, r0 \n"
1083 "j .running \n" /* NULL -> already running */
1084 "jr $8 \n" /* $t0 = $8 = context */
1085 ".running: \n"
1086 "lw $1, (0)%0 \n"
1087 "lw $2,(4)%0 \n" /* $v0 */
1088 "lw $3,(8)%0 \n" /* $v1 */
1089 "lw $4,(12)%0 \n" /* $a0 */
1090 "lw $5,(16)%0 \n" /* $a1 */
1091 "lw $6,(20)%0 \n" /* $a2 */
1092 "lw $7,(24)%0 \n" /* $a3 */
1093 "lw $8,(28)%0 \n" /* $t0 */
1094 "lw $9,(32)%0 \n" /* $t1 */
1095 "lw $10,(36)%0 \n" /* $t2 */
1096 "lw $11,(40)%0 \n" /* $t3 */
1097 "lw $12,(44)%0 \n" /* $t4 */
1098 "lw $13,(48)%0 \n" /* $t5 */
1099 "lw $14,(52)%0 \n" /* $t6 */
1100 "lw $15,(56)%0 \n" /* $t7 */
1101 "lw $24,(60)%0 \n" /* $t8 */
1102 "lw $25,(64)%0 \n" /* $t9 */
1103 "lw $16,(68)%0 \n" /* $s0 */
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 );
1118#endif
1119}
1120
1121/*---------------------------------------------------------------------------
1122 * Put core in a power-saving state.
1123 *---------------------------------------------------------------------------
1124 */
1125static inline void core_sleep(void)
1126{
1127 asm volatile("nop\n");
1128}
1129
1130
988#endif /* CONFIG_CPU == */ 1131#endif /* CONFIG_CPU == */
989 1132
990/* 1133/*
@@ -1909,6 +2052,8 @@ static inline void block_thread_on_l(struct thread_entry *thread,
1909 */ 2052 */
1910void switch_thread(void) 2053void switch_thread(void)
1911{ 2054{
2055#ifndef ONDA_VX747
2056
1912 const unsigned int core = CURRENT_CORE; 2057 const unsigned int core = CURRENT_CORE;
1913 struct thread_entry *block = cores[core].block_task; 2058 struct thread_entry *block = cores[core].block_task;
1914 struct thread_entry *thread = cores[core].running; 2059 struct thread_entry *thread = cores[core].running;
@@ -2043,6 +2188,8 @@ void switch_thread(void)
2043#ifdef RB_PROFILE 2188#ifdef RB_PROFILE
2044 profile_thread_started(thread - threads); 2189 profile_thread_started(thread - threads);
2045#endif 2190#endif
2191
2192#endif
2046} 2193}
2047 2194
2048/*--------------------------------------------------------------------------- 2195/*---------------------------------------------------------------------------