diff options
Diffstat (limited to 'src/rt/arch')
| -rw-r--r-- | src/rt/arch/mips/_context.S | 3 | ||||
| -rw-r--r-- | src/rt/arch/mips/ccall.S | 29 | ||||
| -rw-r--r-- | src/rt/arch/mips/context.cpp | 1 |
3 files changed, 22 insertions, 11 deletions
diff --git a/src/rt/arch/mips/_context.S b/src/rt/arch/mips/_context.S index c926a03798d..6d8207d97d0 100644 --- a/src/rt/arch/mips/_context.S +++ b/src/rt/arch/mips/_context.S @@ -51,7 +51,6 @@ swap_registers: lw $2, 2 * 4($5) lw $3, 3 * 4($5) lw $4, 4 * 4($5) - lw $5, 5 * 4($5) lw $6, 6 * 4($5) lw $7, 7 * 4($5) @@ -82,6 +81,8 @@ swap_registers: lw $30, 30 * 4($5) lw $31, 31 * 4($5) + lw $5, 5 * 4($5) + jr $31 nop .end swap_registers diff --git a/src/rt/arch/mips/ccall.S b/src/rt/arch/mips/ccall.S index f41d8e721f6..abbbad164fd 100644 --- a/src/rt/arch/mips/ccall.S +++ b/src/rt/arch/mips/ccall.S @@ -5,30 +5,39 @@ .text +.align 2 .globl __morestack .hidden __morestack -.align 2 +.cfi_sections .eh_frame_entry +.cfi_startproc .set nomips16 .ent __morestack __morestack: .set noreorder .set nomacro - move $7, $29 - move $29, $6 - sw $7, 0($29) - sw $31, -4($29) + addiu $29, $29, -8 + sw $31, 4($29) + sw $30, 0($29) - addiu $29, $29, -24 + .cfi_def_cfa_offset 8 + .cfi_offset 31, -4 + .cfi_offset 30, -8 + + move $30, $29 + .cfi_def_cfa_register 30 + + move $29, $6 move $25, $5 jalr $25 nop - addiu $29, $29, 24 + move $29, $30 - lw $31, -4($29) - lw $7, 0($29) + lw $30, 0($29) + lw $31, 4($29) + addiu $29, $29, 8 - move $29, $7 jr $31 nop .end __morestack +.cfi_endproc diff --git a/src/rt/arch/mips/context.cpp b/src/rt/arch/mips/context.cpp index d8c3c38daa6..7347a92e98b 100644 --- a/src/rt/arch/mips/context.cpp +++ b/src/rt/arch/mips/context.cpp @@ -40,6 +40,7 @@ void context::call(void *f, void *arg, void *stack) regs.data[4] = (uint32_t)arg; regs.data[29] = (uint32_t)sp; + regs.data[25] = (uint32_t)f; regs.data[31] = (uint32_t)f; // Last base pointer on the stack should be 0 |
