From b2f1eba3248897615f9d7c296b6531021f6c58ae Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 5 Oct 2011 13:16:43 -0400 Subject: [PATCH] runtime: set runtime ncpu on openbsd Set the runtime ncpu based on the hw.ncpu sysctl. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5191043 --- src/pkg/runtime/openbsd/386/sys.s | 18 ++++++++++++++++ src/pkg/runtime/openbsd/amd64/sys.s | 16 ++++++++++++++ src/pkg/runtime/openbsd/os.h | 1 + src/pkg/runtime/openbsd/thread.c | 33 +++++++++++++++++++++++++---- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/pkg/runtime/openbsd/386/sys.s b/src/pkg/runtime/openbsd/386/sys.s index 3e7c01f8de..c399c91050 100644 --- a/src/pkg/runtime/openbsd/386/sys.s +++ b/src/pkg/runtime/openbsd/386/sys.s @@ -269,4 +269,22 @@ TEXT runtime·osyield(SB),7,$-4 INT $0x80 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 diff --git a/src/pkg/runtime/openbsd/amd64/sys.s b/src/pkg/runtime/openbsd/amd64/sys.s index f1442efcf4..b64868f314 100644 --- a/src/pkg/runtime/openbsd/amd64/sys.s +++ b/src/pkg/runtime/openbsd/amd64/sys.s @@ -235,3 +235,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 + diff --git a/src/pkg/runtime/openbsd/os.h b/src/pkg/runtime/openbsd/os.h index eba53b7cc2..4a8a14fb4d 100644 --- a/src/pkg/runtime/openbsd/os.h +++ b/src/pkg/runtime/openbsd/os.h @@ -8,5 +8,6 @@ void runtime·sigaltstack(Sigaltstack*, Sigaltstack*); void runtime·sigaction(int32, struct sigaction*, struct sigaction*); void runtime·setitimerval(int32, Itimerval*, Itimerval*); void runtime·setitimer(int32, Itimerval*, Itimerval*); +int32 runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr); void runtime·raisesigpipe(void); diff --git a/src/pkg/runtime/openbsd/thread.c b/src/pkg/runtime/openbsd/thread.c index 909db8cdc9..2972a3cd41 100644 --- a/src/pkg/runtime/openbsd/thread.c +++ b/src/pkg/runtime/openbsd/thread.c @@ -15,6 +15,30 @@ enum ENOTSUP = 91, }; +// From OpenBSD's +#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; +} + // Basic spinlocks using CAS. We can improve on these later. static void lock(Lock *l) @@ -80,10 +104,10 @@ runtime·notewakeup(Note *n) } // From OpenBSD's sys/param.h -#define RFPROC (1<<4) /* change child (else changes curproc) */ -#define RFMEM (1<<5) /* share `address space' */ -#define RFNOWAIT (1<<6) /* parent need not wait() on child */ -#define RFTHREAD (1<<13) /* create a thread, not a process */ +#define RFPROC (1<<4) /* change child (else changes curproc) */ +#define RFMEM (1<<5) /* share `address space' */ +#define RFNOWAIT (1<<6) /* parent need not wait() on child */ +#define RFTHREAD (1<<13) /* create a thread, not a process */ void runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void)) @@ -112,6 +136,7 @@ runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void)) void runtime·osinit(void) { + runtime·ncpu = getncpu(); } void -- 2.50.0