diff options
author | Aram H?v?rneanu <aram@mgk.ro> | 2014-07-02 21:04:10 +1000 |
---|---|---|
committer | Aram H?v?rneanu <aram@mgk.ro> | 2014-07-02 21:04:10 +1000 |
commit | 3d9435eece80a6811eac36716fdee006e64e1e39 (patch) | |
tree | b191584807212265c9f7d5d21c4667d9f484f794 /src/liblink | |
parent | b4eb43d41eb0e161b0b77e21e44f8788a6c85207 (diff) | |
download | go-3d9435eece80a6811eac36716fdee006e64e1e39.tar.gz |
liblink, runtime: preliminary support for plan9/amd64
A TLS slot is reserved by _rt0_.*_plan9 as an automatic and
its address (which is static on Plan 9) is saved in the
global _privates symbol. The startup linkage now is exactly
like that from Plan 9 libc, and the way we access g is
exactly as if we'd have used privalloc(2).
Aside from making the code more standard, this change
drastically simplifies it, both for 386 and for amd64, and
makes the Plan 9 code in liblink common for both 386 and
amd64.
The amd64 runtime code was cleared of nxm assumptions, and
now runs on the standard Plan 9 kernel.
Note handling fixes will follow in a separate CL.
LGTM=rsc
R=golang-codereviews, rsc, bradfitz, dave
CC=0intro, ality, golang-codereviews, jas, minux.ma, mischief
https://codereview.appspot.com/101510049
Committer: Dave Cheney <dave@cheney.net>
Diffstat (limited to 'src/liblink')
-rw-r--r-- | src/liblink/asm6.c | 14 | ||||
-rw-r--r-- | src/liblink/asm8.c | 6 | ||||
-rw-r--r-- | src/liblink/obj6.c | 6 | ||||
-rw-r--r-- | src/liblink/obj8.c | 4 | ||||
-rw-r--r-- | src/liblink/sym.c | 2 |
5 files changed, 23 insertions, 9 deletions
diff --git a/src/liblink/asm6.c b/src/liblink/asm6.c index 66afc7a12..751c97215 100644 --- a/src/liblink/asm6.c +++ b/src/liblink/asm6.c @@ -1901,7 +1901,6 @@ prefixof(Link *ctxt, Addr *a) case Hlinux: case Hnetbsd: case Hopenbsd: - case Hplan9: case Hsolaris: return 0x64; // FS case Hdarwin: @@ -3365,6 +3364,19 @@ mfound: default: sysfatal("unknown TLS base location for %s", headstr(ctxt->headtype)); + case Hplan9: + if(ctxt->plan9privates == nil) + ctxt->plan9privates = linklookup(ctxt, "_privates", 0); + memset(&pp.from, 0, sizeof pp.from); + pp.from.type = D_EXTERN; + pp.from.sym = ctxt->plan9privates; + pp.from.offset = 0; + pp.from.index = D_NONE; + ctxt->rexflag |= Pw; + *ctxt->andptr++ = 0x8B; + asmand(ctxt, &pp.from, &p->to); + break; + case Hsolaris: // TODO(rsc): Delete Hsolaris from list. Should not use this code. See progedit in obj6.c. // TLS base is 0(FS). pp.from = p->from; diff --git a/src/liblink/asm8.c b/src/liblink/asm8.c index 3ab527ce8..62ef41e18 100644 --- a/src/liblink/asm8.c +++ b/src/liblink/asm8.c @@ -2707,11 +2707,11 @@ mfound: break; case Hplan9: - if(ctxt->plan9tos == nil) - ctxt->plan9tos = linklookup(ctxt, "_tos", 0); + if(ctxt->plan9privates == nil) + ctxt->plan9privates = linklookup(ctxt, "_privates", 0); memset(&pp.from, 0, sizeof pp.from); pp.from.type = D_EXTERN; - pp.from.sym = ctxt->plan9tos; + pp.from.sym = ctxt->plan9privates; pp.from.offset = 0; pp.from.index = D_NONE; *ctxt->andptr++ = 0x8B; diff --git a/src/liblink/obj6.c b/src/liblink/obj6.c index d83f84785..a8538c9ec 100644 --- a/src/liblink/obj6.c +++ b/src/liblink/obj6.c @@ -103,7 +103,7 @@ static int canuselocaltls(Link *ctxt) { switch(ctxt->headtype) { -// case Hlinux: + case Hplan9: case Hwindows: return 0; } @@ -402,6 +402,10 @@ addstacksplit(Link *ctxt, LSym *cursym) for(i=0; i<nelem(morename); i++) ctxt->symmorestack[i] = linklookup(ctxt, morename[i], 0); } + + if(ctxt->headtype == Hplan9 && ctxt->plan9privates == nil) + ctxt->plan9privates = linklookup(ctxt, "_privates", 0); + ctxt->cursym = cursym; if(cursym->text == nil || cursym->text->link == nil) diff --git a/src/liblink/obj8.c b/src/liblink/obj8.c index 72934c149..6f96ebae9 100644 --- a/src/liblink/obj8.c +++ b/src/liblink/obj8.c @@ -270,8 +270,8 @@ addstacksplit(Link *ctxt, LSym *cursym) ctxt->symmorestack[1] = linklookup(ctxt, "runtime.morestack_noctxt", 0); } - if(ctxt->headtype == Hplan9 && ctxt->plan9tos == nil) - ctxt->plan9tos = linklookup(ctxt, "_tos", 0); + if(ctxt->headtype == Hplan9 && ctxt->plan9privates == nil) + ctxt->plan9privates = linklookup(ctxt, "_privates", 0); ctxt->cursym = cursym; diff --git a/src/liblink/sym.c b/src/liblink/sym.c index 2b029ce4d..c8da39ded 100644 --- a/src/liblink/sym.c +++ b/src/liblink/sym.c @@ -128,8 +128,6 @@ linknew(LinkArch *arch) default: sysfatal("unknown thread-local storage offset for %s", headstr(ctxt->headtype)); case Hplan9: - ctxt->tlsoffset = -2*ctxt->arch->ptrsize; - break; case Hwindows: break; case Hlinux: |