]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: enable runtime.ncpu on FreeBSD
authorDevon H. O'Dell <devon.odell@gmail.com>
Tue, 10 Jan 2012 06:39:17 +0000 (17:39 +1100)
committerAndrew Gerrand <adg@golang.org>
Tue, 10 Jan 2012 06:39:17 +0000 (17:39 +1100)
R=adg, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/5528062

src/pkg/runtime/os_freebsd.h
src/pkg/runtime/sys_freebsd_386.s
src/pkg/runtime/sys_freebsd_amd64.s
src/pkg/runtime/thread_freebsd.c

index 007856c6bcd773109dc3eba264eb962a703c760b..8ef4c39877ab08ce5c7547914e12a31667e71bd9 100644 (file)
@@ -1,12 +1,13 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
 
-int32 runtime·thr_new(ThrParam*, int32);
-void runtime·sigpanic(void);
-void runtime·sigaltstack(Sigaltstack*, Sigaltstack*);
-struct sigaction;
-void runtime·sigaction(int32, struct sigaction*, struct sigaction*);
+int32  runtime·thr_new(ThrParam*, int32);
+void   runtime·sigpanic(void);
+void   runtime·sigaltstack(Sigaltstack*, Sigaltstack*);
+struct sigaction;
+void   runtime·sigaction(int32, struct sigaction*, struct sigaction*);
 void   runtiem·setitimerval(int32, Itimerval*, Itimerval*);
 void   runtime·setitimer(int32, Itimerval*, Itimerval*);
+int32  runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr);
 
 void   runtime·raisesigpipe(void);
index cec7a3e8e7a15440a14becd2474a364e648be5f9..25c28d3f8093a4d2050ed66dcbd690bd34550cee 100644 (file)
@@ -265,4 +265,23 @@ TEXT runtime·i386_set_ldt(SB),7,$16
        INT     $3
        RET
 
+TEXT runtime·sysctl(SB),7,$28
+       LEAL    arg0+0(FP), SI
+       LEAL    4(SP), DI
+       CLD
+       MOVSL                           // arg 1 - name
+       MOVSL                           // arg 2 - namelen
+       MOVSL                           // arg 3 - oldp
+       MOVSL                           // arg 4 - oldlenp
+       MOVSL                           // arg 5 - newp
+       MOVSL                           // arg 6 - newlen
+       MOVL    $202, AX                // sys___sysctl
+       INT     $0x80
+       JCC     3(PC)
+       NEGL    AX
+       RET
+       MOVL    $0, AX
+       RET
+
+
 GLOBL runtime·tlsoffset(SB),$4
index c96b2f4d6bbc36391b50f01ea64c0c290785047a..d5bb5f0c16a44bced63a66853510431132f3b0ff 100644 (file)
@@ -199,3 +199,19 @@ TEXT runtime·settls(SB),7,$8
        JCC     2(PC)
        CALL    runtime·notok(SB)
        RET
+
+TEXT runtime·sysctl(SB),7,$0
+       MOVQ    8(SP), DI               // arg 1 - name
+       MOVL    16(SP), SI              // arg 2 - namelen
+       MOVQ    24(SP), DX              // arg 3 - oldp
+       MOVQ    32(SP), R10             // arg 4 - oldlenp
+       MOVQ    40(SP), R8              // arg 5 - newp
+       MOVQ    48(SP), R9              // arg 6 - newlen
+       MOVQ    $202, AX                // sys___sysctl
+       SYSCALL
+       JCC 3(PC)
+       NEGL    AX
+       RET
+       MOVL    $0, AX
+       RET
+
index 779782ac9690488c446eaf22891abe29d8ade4eb..53c1b1bbfac9b35f517cb4438361b6b8f285d3f2 100644 (file)
@@ -9,6 +9,30 @@
 extern SigTab runtime·sigtab[];
 extern int32 runtime·sys_umtx_op(uint32*, int32, uint32, void*, void*);
 
+// From FreeBSD's <sys/sysctl.h>
+#define        CTL_HW  6
+#define        HW_NCPU 3
+
+static int32
+getncpu(void)
+{
+       uint32 mib[2];
+       uint32 out;
+       int32 ret;
+       uintptr nout;
+
+       // Fetch hw.ncpu via sysctl.
+       mib[0] = CTL_HW;
+       mib[1] = HW_NCPU;
+       nout = sizeof out;
+       out = 0;
+       ret = runtime·sysctl(mib, 2, (byte*)&out, &nout, nil, 0);
+       if(ret >= 0)
+               return out;
+       else
+               return 1;
+}
+
 // FreeBSD's umtx_op syscall is effectively the same as Linux's futex, and
 // thus the code is largely similar. See linux/thread.c and lock_futex.c for comments.
 
@@ -81,6 +105,7 @@ runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
 void
 runtime·osinit(void)
 {
+       runtime·ncpu = getncpu();
 }
 
 void