diff options
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/crt0.S | 76 | ||||
-rw-r--r-- | firmware/thread.c | 75 |
2 files changed, 50 insertions, 101 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/crt0.S b/firmware/target/mips/ingenic_jz47xx/crt0.S index 6ac40c2f52..af82ad5d12 100644 --- a/firmware/target/mips/ingenic_jz47xx/crt0.S +++ b/firmware/target/mips/ingenic_jz47xx/crt0.S @@ -216,10 +216,10 @@ _init_stack_loop: .section .vectors, "ax", %progbits real_exception_handler: addiu sp, -0x80 - sw ra, 0(sp) - sw fp, 4(sp) - sw gp, 8(sp) - sw t9, 0xC(sp) + sw ra, 0(sp) + sw fp, 4(sp) + sw gp, 8(sp) + sw t9, 0xC(sp) sw t8, 0x10(sp) sw s7, 0x14(sp) sw s6, 0x18(sp) @@ -274,60 +274,10 @@ real_exception_handler: _int: jal intr_handler nop - lw ra, 0(sp) - lw fp, 4(sp) - sw gp, 8(sp) - lw t9, 0xC(sp) - lw t8, 0x10(sp) - lw s7, 0x14(sp) - lw s6, 0x18(sp) - lw s5, 0x1C(sp) - lw s4, 0x20(sp) - lw s3, 0x24(sp) - lw s2, 0x28(sp) - lw s1, 0x2C(sp) - lw s0, 0x30(sp) - lw t7, 0x34(sp) - lw t6, 0x38(sp) - lw t5, 0x3C(sp) - lw t4, 0x40(sp) - lw t3, 0x44(sp) - lw t2, 0x48(sp) - lw t1, 0x4C(sp) - lw t0, 0x50(sp) - lw a3, 0x54(sp) - lw a2, 0x58(sp) - lw a1, 0x5C(sp) - lw a0, 0x60(sp) - lw v1, 0x64(sp) - lw v0, 0x68(sp) - lw $1, 0x6C(sp) - lw k0, 0x70(sp) - mtlo k0 - nop - lw k0, 0x74(sp) - mthi k0 - nop - lw k0, 0x78(sp) - nop - mtc0 k0, C0_STATUS # Status register - sll zero, 1 - sll zero, 1 - sll zero, 1 - sll zero, 1 - lw k0, 0x7C(sp) - nop - mtc0 k0, C0_EPC # Exception Program Counter - sll zero, 1 - sll zero, 1 - sll zero, 1 - sll zero, 1 - addiu sp, 0x80 - eret # Exception Return - nop + j _exception_return _exception: - add a0, sp, $0 + move a0, sp mfc0 a1, C0_CAUSE # C0_CAUSE of last exception sll zero, 1 sll zero, 1 @@ -340,10 +290,12 @@ _exception: sll zero, 1 jal exception_handler nop - lw ra, 0(sp) - lw fp, 4(sp) - sw gp, 8(sp) - lw t9, 0xC(sp) + +_exception_return: + lw ra, 0(sp) + lw fp, 4(sp) + lw gp, 8(sp) + lw t9, 0xC(sp) lw t8, 0x10(sp) lw s7, 0x14(sp) lw s6, 0x18(sp) @@ -375,15 +327,15 @@ _exception: mthi k0 nop lw k0, 0x78(sp) - nop mtc0 k0, C0_STATUS # Status register + nop sll zero, 1 sll zero, 1 sll zero, 1 sll zero, 1 lw k0, 0x7C(sp) - nop mtc0 k0, C0_EPC # Exception Program Counter + nop sll zero, 1 sll zero, 1 sll zero, 1 diff --git a/firmware/thread.c b/firmware/thread.c index 453fbf510a..6efe8252e7 100644 --- a/firmware/thread.c +++ b/firmware/thread.c @@ -937,23 +937,23 @@ static inline void core_sleep(void) void start_thread(void); /* Provide C access to ASM label */ static void __attribute__((used)) _start_thread(void) { - /* $t1 = context */ + /* t1 = context */ asm volatile ( "start_thread: \n" ".set noreorder \n" ".set noat \n" - "lw $8, 4($9) \n" /* Fetch thread function pointer ($8 = $t0, $9 = $t1) */ + "lw $8, 4($9) \n" /* Fetch thread function pointer ($8 = t0, $9 = t1) */ "lw $29, 40($9) \n" /* Set initial sp(=$29) */ + "jalr $8 \n" /* Start the thread */ "sw $0, 48($9) \n" /* Clear start address */ - "jr $8 \n" /* Start the thread */ - "nop \n" ".set at \n" ".set reorder \n" + ::: "t0" ); thread_exit(); } -/* Place context pointer in $s0 slot, function pointer in $s1 slot, and +/* Place context pointer in s0 slot, function pointer in s1 slot, and * start_thread pointer in context_start */ #define THREAD_STARTUP_INIT(core, thread, function) \ ({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \ @@ -969,22 +969,21 @@ static inline void store_context(void* addr) asm volatile ( ".set noreorder \n" ".set noat \n" - "move $8, %0 \n" - "sw $16, 0($8) \n" /* $s0 */ - "sw $17, 4($8) \n" /* $s1 */ - "sw $18, 8($8) \n" /* $s2 */ - "sw $19, 12($8) \n" /* $s3 */ - "sw $20, 16($8) \n" /* $s4 */ - "sw $21, 20($8) \n" /* $s5 */ - "sw $22, 24($8) \n" /* $s6 */ - "sw $23, 28($8) \n" /* $s7 */ - "sw $28, 32($8) \n" /* gp */ - "sw $30, 36($8) \n" /* fp */ - "sw $29, 40($8) \n" /* sp */ - "sw $31, 44($8) \n" /* ra */ + "sw $16, 0(%0) \n" /* s0 */ + "sw $17, 4(%0) \n" /* s1 */ + "sw $18, 8(%0) \n" /* s2 */ + "sw $19, 12(%0) \n" /* s3 */ + "sw $20, 16(%0) \n" /* s4 */ + "sw $21, 20(%0) \n" /* s5 */ + "sw $22, 24(%0) \n" /* s6 */ + "sw $23, 28(%0) \n" /* s7 */ + "sw $28, 32(%0) \n" /* gp */ + "sw $30, 36(%0) \n" /* fp */ + "sw $29, 40(%0) \n" /* sp */ + "sw $31, 44(%0) \n" /* ra */ ".set at \n" ".set reorder \n" - : : "r" (addr) : "t0" + : : "r" (addr) ); } @@ -997,29 +996,27 @@ static inline void load_context(const void* addr) asm volatile ( ".set noat \n" ".set noreorder \n" - "lw $8, 48(%0) \n" /* Get start address ($8 = $t0) */ + "lw $8, 48(%0) \n" /* Get start address ($8 = t0) */ "beqz $8, running \n" /* NULL -> already running */ "nop \n" - "move $9, %0 \n" /* $t1 = context */ "jr $8 \n" - "nop \n" + "move $9, %0 \n" /* t1 = context */ "running: \n" - "move $8, %0 \n" - "lw $16, 0($8) \n" /* $s0 */ - "lw $17, 4($8) \n" /* $s1 */ - "lw $18, 8($8) \n" /* $s2 */ - "lw $19, 12($8) \n" /* $s3 */ - "lw $20, 16($8) \n" /* $s4 */ - "lw $21, 20($8) \n" /* $s5 */ - "lw $22, 24($8) \n" /* $s6 */ - "lw $23, 28($8) \n" /* $s7 */ - "lw $28, 32($8) \n" /* gp */ - "lw $30, 36($8) \n" /* fp */ - "lw $29, 40($8) \n" /* sp */ - "lw $31, 44($8) \n" /* ra */ + "lw $16, 0(%0) \n" /* s0 */ + "lw $17, 4(%0) \n" /* s1 */ + "lw $18, 8(%0) \n" /* s2 */ + "lw $19, 12(%0) \n" /* s3 */ + "lw $20, 16(%0) \n" /* s4 */ + "lw $21, 20(%0) \n" /* s5 */ + "lw $22, 24(%0) \n" /* s6 */ + "lw $23, 28(%0) \n" /* s7 */ + "lw $28, 32(%0) \n" /* gp */ + "lw $30, 36(%0) \n" /* fp */ + "lw $29, 40(%0) \n" /* sp */ + "lw $31, 44(%0) \n" /* ra */ ".set at \n" ".set reorder \n" - : : "r" (addr) : "t0" /* only! */ + : : "r" (addr) : "t0", "t1" ); } @@ -1033,9 +1030,9 @@ static inline void core_sleep(void) __cpm_idle_mode(); #endif asm volatile(".set mips32r2 \n" - "mfc0 $8, $12 \n" /* mfc $t0, $12 */ - "move $9, $8 \n" /* move $t1, $t0 */ - "la $10, 0x8000000 \n" /* la $t2, 0x8000000 */ + "mfc0 $8, $12 \n" /* mfc t0, $12 */ + "move $9, $8 \n" /* move t1, t0 */ + "la $10, 0x8000000 \n" /* la t2, 0x8000000 */ "or $8, $8, $10 \n" /* Enable reduced power mode */ "mtc0 $8, $12 \n" "wait \n" |