MOVL 4(SP), SP
RET
+// check that SP is in range [g->stackbase, g->stackguard)
+TEXT stackcheck(SB), 7, $0
+ MOVL g, AX
+ CMPL g_stackbase(AX), SP
+ JHI 2(PC)
+ INT $3
+ CMPL SP, g_stackguard(AX)
+ JHI 2(PC)
+ INT $3
+ RET
+
GLOBL m0(SB), $1024
GLOBL g0(SB), $1024
MOVQ 8(SP), SP
RET
+// check that SP is in range [g->stackbase, g->stackguard)
+TEXT stackcheck(SB), 7, $0
+ CMPQ g_stackbase(g), SP
+ JHI 2(PC)
+ INT $3
+ CMPQ SP, g_stackguard(g)
+ JHI 2(PC)
+ INT $3
+ RET
+
MOVL AX, g
MOVL DX, m
MOVL BX, m_procid(DX) // m->procid = thread port (for debuggers)
+ CALL stackcheck(SB) // smashes AX
CALL CX // fn()
CALL exit1(SB)
RET
#include "386/asm.h"
TEXT sys_umtx_op(SB),7,$-4
- MOVL $454, AX
- INT $0x80
+ MOVL $454, AX
+ INT $0x80
RET
TEXT thr_new(SB),7,$-4
- MOVL $455, AX
- INT $0x80
+ MOVL $455, AX
+ INT $0x80
RET
TEXT thr_start(SB),7,$0
POPL AX
POPL AX
POPAL
- MOVL BX, g
- MOVL AX, m
- CALL mstart(SB)
- MOVL 0, AX // crash (not reached)
+ MOVL BX, g
+ MOVL AX, m
+ CALL stackcheck(SB) // smashes AX
+ CALL mstart(SB)
+ MOVL 0, AX // crash (not reached)
// Exit the entire program (like C exit)
TEXT exit(SB),7,$-4
TEXT thr_start(SB),7,$0
MOVQ DI, m
MOVQ m_g0(m), g
+ CALL stackcheck(SB)
CALL mstart(SB)
MOVQ 0, AX // crash (not reached)
param.start_func = thr_start;
param.arg = m;
- param.stack_base = stk;
- param.stack_size = g->stackbase - g->stackguard + 256;
+ param.stack_base = (int8*)g->stackbase;
+ param.stack_size = (byte*)stk - (byte*)g->stackbase;
param.child_tid = (intptr*)&m->procid;
param.parent_tid = nil;
param.tls_base = (int8*)&m->tls[0];
MOVL DX, g
MOVL BX, m
+ CALL stackcheck(SB) // smashes AX
MOVL 0(DX), DX // paranoia; check they are not nil
MOVL 0(BX), BX
MOVQ SI, SP
MOVQ R8, m
MOVQ R9, g
+ CALL stackcheck(SB)
// Initialize m->procid to Linux tid
MOVL $186, AX // gettid