diff -r ad4f2cbb85ef src/cmd/8l/obj.c --- a/src/cmd/8l/obj.c Thu Jan 13 20:05:08 2011 -0800 +++ b/src/cmd/8l/obj.c Fri Jan 14 19:04:02 2011 +0200 @@ -185,6 +185,7 @@ INITRND = 0; break; case 2: /* plan 9 */ + tlsoffset = -8; HEADR = 32L; if(INITTEXT == -1) INITTEXT = 4096+32; diff -r ad4f2cbb85ef src/cmd/8l/pass.c --- a/src/cmd/8l/pass.c Thu Jan 13 20:05:08 2011 -0800 +++ b/src/cmd/8l/pass.c Fri Jan 14 19:04:02 2011 +0200 @@ -243,6 +243,7 @@ Prog *p, *q; Sym *s; int32 vexit; + Sym *plan9_tos; if(debug['v']) Bprint(&bso, "%5.2f mkfwd\n", cputime()); @@ -253,6 +254,10 @@ Bflush(&bso); s = lookup("exit", 0); vexit = s->value; + + if(HEADTYPE == 2) + plan9_tos = lookup("_tos", 0); + for(cursym = textp; cursym != nil; cursym = cursym->next) { for(p = cursym->text; p != P; p = p->link) { if(HEADTYPE == 10) { // Windows @@ -296,9 +301,15 @@ if(HEADTYPE == 2) { // Plan 9 if(p->from.type == D_INDIR+D_GS && p->to.type >= D_AX && p->to.type <= D_DI) { + q = appendp(p); + q->from = p->from; + q->from.type = D_INDIR + p->to.type; + q->to = p->to; + q->as = p->as; p->as = AMOVL; - p->from.type = D_ADDR+D_STATIC; - p->from.offset += 0xdfffefc0; + p->from.type = D_EXTERN; + p->from.sym = plan9_tos; + p->from.offset = 0; } } if(p->as == ACALL || (p->as == AJMP && p->to.type != D_BRANCH)) { @@ -382,6 +393,7 @@ int a; Prog *pmorestack; Sym *symmorestack; + Sym *plan9_tos; pmorestack = P; symmorestack = lookup("runtime.morestack", 0); @@ -392,6 +404,9 @@ pmorestack = symmorestack->text; symmorestack->text->from.scale |= NOSPLIT; } + + if(HEADTYPE == 2) + plan9_tos = lookup("_tos", 0); for(cursym = textp; cursym != nil; cursym = cursym->next) { if(cursym->text == nil || cursym->text->link == nil) @@ -436,9 +451,15 @@ case 2: // Plan 9 p->as = AMOVL; - p->from.type = D_ADDR+D_STATIC; - p->from.offset = 0xdfffefc0; + p->from.type = D_EXTERN; + p->from.sym = plan9_tos; p->to.type = D_CX; + + p = appendp(p); + p->as = AMOVL; + p->from.type = D_INDIR+D_CX; + p->from.offset = tlsoffset + 0; + p->to.type = D_CX; break; default: diff -r ad4f2cbb85ef src/pkg/runtime/mkasmh.sh --- a/src/pkg/runtime/mkasmh.sh Thu Jan 13 20:05:08 2011 -0800 +++ b/src/pkg/runtime/mkasmh.sh Fri Jan 14 19:04:02 2011 +0200 @@ -25,9 +25,9 @@ echo '#define m(r) 4(r)' ;; plan9) - echo '#define get_tls(r)' - echo '#define g(r) 0xdfffefc0' - echo '#define m(r) 0xdfffefc4' + echo '#define get_tls(r) MOVL _tos(SB), r ' + echo '#define g(r) -8(r)' + echo '#define m(r) -4(r)' ;; linux) # On Linux systems, what we call 0(GS) and 4(GS) for g and m diff -r ad4f2cbb85ef src/pkg/runtime/plan9/386/defs.h --- a/src/pkg/runtime/plan9/386/defs.h Thu Jan 13 20:05:08 2011 -0800 +++ b/src/pkg/runtime/plan9/386/defs.h Fri Jan 14 19:04:02 2011 +0200 @@ -1,1 +1,2 @@ // nothing to see here +#define tos_pid 48 diff -r ad4f2cbb85ef src/pkg/runtime/plan9/386/sys.s --- a/src/pkg/runtime/plan9/386/sys.s Thu Jan 13 20:05:08 2011 -0800 +++ b/src/pkg/runtime/plan9/386/sys.s Fri Jan 14 19:04:02 2011 +0200 @@ -58,18 +58,19 @@ MOVL BX, m(AX) // Initialize AX from _tos->pid - MOVL 0xdfffeff8, AX + MOVL _tos(SB), AX + MOVL tos_pid(AX), AX MOVL AX, m_procid(BX) // save pid as m->procid - + CALL runtime·stackcheck(SB) // smashes AX, CX MOVL 0(DX), DX // paranoia; check they are not nil MOVL 0(BX), BX // more paranoia; check that stack splitting code works - PUSHAL - CALL runtime·emptyfunc(SB) - POPAL +// PUSHAL +// CALL runtime·emptyfunc(SB) +// POPAL CALL SI // fn() CALL runtime·exit(SB)