summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDevon H. O'Dell <devon.odell@gmail.com>2009-11-18 16:51:59 -0800
committerDevon H. O'Dell <devon.odell@gmail.com>2009-11-18 16:51:59 -0800
commit3419c5d5da2456a276014cd49bbd3a997d8e800d (patch)
treeb352e4a4b26f78361493fada2a289b6b2d12045c /src
parentad87c7b9f4fffa6c7985c204b39792f64f756eae (diff)
downloadgolang-3419c5d5da2456a276014cd49bbd3a997d8e800d.tar.gz
More FreeBSD-touchups. Thundercats are GOOOOO!
R=rsc CC=golang-dev http://codereview.appspot.com/157074 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/6l/obj.c5
-rw-r--r--src/cmd/8l/obj.c10
-rw-r--r--src/libcgo/freebsd_386.c18
-rw-r--r--src/libcgo/freebsd_amd64.c3
-rw-r--r--src/pkg/runtime/freebsd/386/sys.s14
-rw-r--r--src/pkg/runtime/proc.c2
6 files changed, 28 insertions, 24 deletions
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index 63e2f9526..9ecdf6ee8 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -150,10 +150,9 @@ main(int argc, char *argv[])
if(strcmp(goos, "darwin") == 0)
HEADTYPE = 6;
else
- if(strcmp(goos, "freebsd") == 0) {
- debug['d'] = 1; /* no dynamic syms for now */
+ if(strcmp(goos, "freebsd") == 0)
HEADTYPE = 9;
- } else
+ else
print("goos is not known: %s\n", goos);
}
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c
index 1bfeff5bc..dc66e6ee3 100644
--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -158,10 +158,9 @@ main(int argc, char *argv[])
if(strcmp(goos, "nacl") == 0)
HEADTYPE = 8;
else
- if(strcmp(goos, "freebsd") == 0) {
- debug['d'] = 1; /* no dynamic syms for now */
+ if(strcmp(goos, "freebsd") == 0)
HEADTYPE = 9;
- } else
+ else
print("goos is not known: %sn", goos);
}
@@ -241,10 +240,7 @@ main(int argc, char *argv[])
* Also known to ../../pkg/runtime/linux/386/sys.s
* and ../../libcgo/linux_386.c.
*/
- if (HEADTYPE == 7)
- tlsoffset = -8;
- else
- tlsoffset = 0;
+ tlsoffset = -8;
elfinit();
HEADR = ELFRESERVE;
if(INITTEXT == -1)
diff --git a/src/libcgo/freebsd_386.c b/src/libcgo/freebsd_386.c
index 1f596f861..b445b940a 100644
--- a/src/libcgo/freebsd_386.c
+++ b/src/libcgo/freebsd_386.c
@@ -6,15 +6,13 @@
#include "libcgo.h"
static void* threadentry(void*);
-static pthread_key_t k1, k2;
-/* gccism: arrange for inittls to be called at dynamic load time */
-static void inittls(void) __attribute__((constructor));
+char *environ[] = { 0 };
+char *__progname;
static void
inittls(void)
{
- /* unimplemented for now */
}
void
@@ -51,8 +49,16 @@ threadentry(void *v)
*/
ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096;
- pthread_setspecific(k1, (void*)ts.g);
- pthread_setspecific(k2, (void*)ts.m);
+ /*
+ * Set specific keys. On FreeBSD/ELF, the thread local storage
+ * is just before %gs:0. Our dynamic 8.out's reserve 8 bytes
+ * for the two words g and m at %gs:-8 and %gs:-4.
+ */
+ asm volatile (
+ "movl %0, %%gs:-8\n" // MOVL g, -8(GS)
+ "movl %1, %%gs:-4\n" // MOVL m, -4(GS)
+ :: "r"(ts.g), "r"(ts.m)
+ );
crosscall_386(ts.fn);
return nil;
diff --git a/src/libcgo/freebsd_amd64.c b/src/libcgo/freebsd_amd64.c
index 14a409f5e..4eb0e1ee5 100644
--- a/src/libcgo/freebsd_amd64.c
+++ b/src/libcgo/freebsd_amd64.c
@@ -7,6 +7,9 @@
static void* threadentry(void*);
+char *environ[] = { 0 };
+char *__progname;
+
void
initcgo(void)
{
diff --git a/src/pkg/runtime/freebsd/386/sys.s b/src/pkg/runtime/freebsd/386/sys.s
index 1048fea14..1c0eaead5 100644
--- a/src/pkg/runtime/freebsd/386/sys.s
+++ b/src/pkg/runtime/freebsd/386/sys.s
@@ -19,8 +19,8 @@ TEXT thr_new(SB),7,$-4
RET
TEXT thr_start(SB),7,$0
- MOVL mm+0(FP), AX
- MOVL m_g0(AX), BX
+ MOVL mm+0(FP), AX
+ MOVL m_g0(AX), BX
LEAL m_tls(AX), BP
MOVL 0(BP), DI
ADDL $7, DI
@@ -132,7 +132,8 @@ int i386_set_ldt(int, const union ldt_entry *, int);
// setldt(int entry, int address, int limit)
TEXT setldt(SB),7,$32
MOVL address+4(FP), BX // aka base
- MOVL limit+8(FP), CX
+ // see comment in linux/386/sys.s; freebsd is similar
+ ADDL $0x8, BX
// set up data_desc
LEAL 16(SP), AX // struct data_desc
@@ -145,11 +146,8 @@ TEXT setldt(SB),7,$32
SHRL $8, BX
MOVB BX, 7(AX)
- MOVW CX, 0(AX)
- SHRL $16, CX
- ANDL $0x0F, CX
- ORL $0x40, CX // 32-bit operand size
- MOVB CX, 6(AX)
+ MOVW $0xffff, 0(AX)
+ MOVB $0xCF, 6(AX) // 32-bit operand, 4k limit unit, 4 more bits of limit
MOVB $0xF2, 5(AX) // r/w data descriptor, dpl=3, present
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index e6e811c5c..2f36868f5 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -385,6 +385,8 @@ starttheworld(void)
void
mstart(void)
{
+ if(g != m->g0)
+ throw("bad mstart");
if(m->mcache == nil)
m->mcache = allocmcache();
minit();