Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

all: add start of netbsd/arm64 support #29398

Closed
wants to merge 8 commits into from
Closed
Diff settings

Always

Just for now

@@ -77,6 +77,8 @@ var contexts = []*build.Context{
{GOOS: "netbsd", GOARCH: "amd64"},
{GOOS: "netbsd", GOARCH: "arm", CgoEnabled: true},
{GOOS: "netbsd", GOARCH: "arm"},
{GOOS: "netbsd", GOARCH: "arm64", CgoEnabled: true},
{GOOS: "netbsd", GOARCH: "arm64"},
{GOOS: "openbsd", GOARCH: "386", CgoEnabled: true},
{GOOS: "openbsd", GOARCH: "386"},
{GOOS: "openbsd", GOARCH: "amd64", CgoEnabled: true},
@@ -1510,6 +1510,7 @@ var cgoEnabled = map[string]bool{
"netbsd/386": true,
"netbsd/amd64": true,
"netbsd/arm": true,
"netbsd/arm64": true,
"openbsd/386": true,
"openbsd/amd64": true,
"openbsd/arm": true,
@@ -359,7 +359,7 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo
return int64(o1)<<32 | int64(o0), true
case objabi.R_ARM64_TLS_LE:
r.Done = false
if ctxt.HeadType != objabi.Hlinux {
if ctxt.HeadType == objabi.Hdarwin {
ld.Errorf(s, "TLS reloc on unsupported OS %v", ctxt.HeadType)
}
// The TCB is two pointers. This is not documented anywhere, but is
@@ -61,7 +61,7 @@ func Init() (*sys.Arch, ld.Arch) {

Freebsddynld: "XXX",
Openbsddynld: "XXX",
Netbsddynld: "XXX",
Netbsddynld: "/libexec/ld.elf_so",
Dragonflydynld: "XXX",
Solarisdynld: "XXX",
}
@@ -84,7 +84,8 @@ func archinit(ctxt *ld.Link) {
*ld.FlagRound = 4096
}

case objabi.Hlinux: /* arm64 elf */
case objabi.Hlinux, /* arm64 elf */
objabi.Hnetbsd:
ld.Elfinit(ctxt)
ld.HEADR = ld.ELFRESERVE
if *ld.FlagTextAddr == -1 {

This file was deleted.

Oops, something went wrong.

This file was deleted.

Oops, something went wrong.
@@ -1,4 +1,3 @@
// freebsd/arm-specific vet whitelist. See readme.txt for details.

runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration
runtime/sys_freebsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration
@@ -1,6 +1,5 @@
// nacl/arm-specific vet whitelist. See readme.txt for details.

runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration
runtime/sys_nacl_arm.s: [arm] nacl_clock_gettime: function nacl_clock_gettime missing Go declaration
runtime/sys_nacl_arm.s: [arm] nacl_sysinfo: function nacl_sysinfo missing Go declaration
runtime/sys_nacl_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration
@@ -1,5 +1,4 @@
// netbsd/arm-specific vet whitelist. See readme.txt for details.

runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration
runtime/sys_netbsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration
syscall/asm_netbsd_arm.s: [arm] Syscall9: unknown variable trap; offset 0 is num+0(FP)
@@ -1,4 +1,3 @@
// openbsd/arm-specific vet whitelist. See readme.txt for details.

runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration
runtime/sys_openbsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration
@@ -1,4 +1,3 @@
// plan9/arm-specific vet whitelist. See readme.txt for details.

runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration
runtime/sys_plan9_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration
@@ -891,9 +891,6 @@ TEXT runtime·usplitR0(SB),NOSPLIT,$0
SUB R1, R3, R1
RET

TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
RET

#ifndef GOOS_nacl
// This is called from .init_array and follows the platform, not Go, ABI.
TEXT runtime·addmoduledata(SB),NOSPLIT,$0-8
@@ -1128,9 +1128,6 @@ TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0
MOVD R0, R0 // NOP
BL runtime·goexit1(SB) // does not return

TEXT runtime·sigreturn(SB),NOSPLIT,$0-0
RET

// This is called from .init_array and follows the platform, not Go, ABI.
TEXT runtime·addmoduledata(SB),NOSPLIT,$0-0
SUB $0x10, RSP
@@ -0,0 +1,78 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include <sys/types.h>
#include <pthread.h>
#include <signal.h>
#include <string.h>
#include "libcgo.h"
#include "libcgo_unix.h"

static void *threadentry(void*);

static void (*setg_gcc)(void*);

void
x_cgo_init(G *g, void (*setg)(void*))
{
pthread_attr_t attr;
size_t size;

setg_gcc = setg;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &size);
g->stacklo = (uintptr)&attr - size + 4096;
pthread_attr_destroy(&attr);
}


void
_cgo_sys_thread_start(ThreadStart *ts)
{
pthread_attr_t attr;
sigset_t ign, oset;
pthread_t p;
size_t size;
int err;

sigfillset(&ign);
pthread_sigmask(SIG_SETMASK, &ign, &oset);

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &size);
// Leave stacklo=0 and set stackhi=size; mstart will do the rest.
ts->g->stackhi = size;
err = _cgo_try_pthread_create(&p, &attr, threadentry, ts);

pthread_sigmask(SIG_SETMASK, &oset, nil);

if (err != 0) {
fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err));
abort();
}
}

static void*
threadentry(void *v)
{
ThreadStart ts;
stack_t ss;

ts = *(ThreadStart*)v;
free(v);

// On NetBSD, a new thread inherits the signal stack of the
// creating thread. That confuses minit, so we remove that
// signal stack here before calling the regular mstart. It's
// a bit baroque to remove a signal stack here only to add one
// in minit, but it's a simple change that keeps NetBSD
// working like other OS's. At this point all signals are
// blocked, so there is no race.
memset(&ss, 0, sizeof ss);
ss.ss_flags = SS_DISABLE;
sigaltstack(&ss, nil);

crosscall1(ts.fn, setg_gcc, (void*)ts.g);
return nil;
}
@@ -0,0 +1,195 @@
// created by cgo -cdefs and then converted to Go
// cgo -cdefs defs_netbsd.go defs_netbsd_arm.go

package runtime

const (
_EINTR = 0x4
_EFAULT = 0xe

_PROT_NONE = 0x0
_PROT_READ = 0x1
_PROT_WRITE = 0x2
_PROT_EXEC = 0x4

_MAP_ANON = 0x1000
_MAP_PRIVATE = 0x2
_MAP_FIXED = 0x10

_MADV_FREE = 0x6

_SA_SIGINFO = 0x40
_SA_RESTART = 0x2
_SA_ONSTACK = 0x1

_SIGHUP = 0x1
_SIGINT = 0x2
_SIGQUIT = 0x3
_SIGILL = 0x4
_SIGTRAP = 0x5
_SIGABRT = 0x6
_SIGEMT = 0x7
_SIGFPE = 0x8
_SIGKILL = 0x9
_SIGBUS = 0xa
_SIGSEGV = 0xb
_SIGSYS = 0xc
_SIGPIPE = 0xd
_SIGALRM = 0xe
_SIGTERM = 0xf
_SIGURG = 0x10
_SIGSTOP = 0x11
_SIGTSTP = 0x12
_SIGCONT = 0x13
_SIGCHLD = 0x14
_SIGTTIN = 0x15
_SIGTTOU = 0x16
_SIGIO = 0x17
_SIGXCPU = 0x18
_SIGXFSZ = 0x19
_SIGVTALRM = 0x1a
_SIGPROF = 0x1b
_SIGWINCH = 0x1c
_SIGINFO = 0x1d
_SIGUSR1 = 0x1e
_SIGUSR2 = 0x1f

_FPE_INTDIV = 0x1
_FPE_INTOVF = 0x2
_FPE_FLTDIV = 0x3
_FPE_FLTOVF = 0x4
_FPE_FLTUND = 0x5
_FPE_FLTRES = 0x6
_FPE_FLTINV = 0x7
_FPE_FLTSUB = 0x8

_BUS_ADRALN = 0x1
_BUS_ADRERR = 0x2
_BUS_OBJERR = 0x3

_SEGV_MAPERR = 0x1
_SEGV_ACCERR = 0x2

_ITIMER_REAL = 0x0
_ITIMER_VIRTUAL = 0x1
_ITIMER_PROF = 0x2

_EV_ADD = 0x1
_EV_DELETE = 0x2
_EV_CLEAR = 0x20
_EV_RECEIPT = 0
_EV_ERROR = 0x4000
_EV_EOF = 0x8000
_EVFILT_READ = 0x0
_EVFILT_WRITE = 0x1
)

type sigset struct {
__bits [4]uint32
}

type siginfo struct {
_signo int32
_code int32
_errno int32
_reason uintptr
_reasonx [16]byte
}

type stackt struct {
ss_sp uintptr
ss_size uintptr
ss_flags int32
}

type timespec struct {
tv_sec int64
tv_nsec int64
}

func (ts *timespec) setNsec(ns int64) {
ts.tv_sec = ns / 1e9
ts.tv_nsec = ns % 1e9
}

type timeval struct {
tv_sec int64
tv_usec int32
_ [4]byte // EABI
}

func (tv *timeval) set_usec(x int32) {
tv.tv_usec = x
}

type itimerval struct {
it_interval timeval
it_value timeval
}

type mcontextt struct {
__gregs [35]uint64
__fregs [4160]byte // _NFREG * 128 + 32 + 32
_ [8]uint64 // future use
}

type ucontextt struct {
uc_flags uint32
uc_link *ucontextt
uc_sigmask sigset
uc_stack stackt
_ [4]byte // EABI
uc_mcontext mcontextt
__uc_pad [2]int32
}

type keventt struct {
ident uint64
filter uint32
flags uint32
fflags uint32
pad_cgo_0 [4]byte
data int64
udata *byte
}

// created by cgo -cdefs and then converted to Go
// cgo -cdefs defs_netbsd.go defs_netbsd_arm.go

const (
_REG_X0 = 0
_REG_X1 = 1
_REG_X2 = 2
_REG_X3 = 3
_REG_X4 = 4
_REG_X5 = 5
_REG_X6 = 6
_REG_X7 = 7
_REG_X8 = 8
_REG_X9 = 9
_REG_X10 = 10
_REG_X11 = 11
_REG_X12 = 12
_REG_X13 = 13
_REG_X14 = 14
_REG_X15 = 15
_REG_X16 = 16
_REG_X17 = 17
_REG_X18 = 18
_REG_X19 = 19
_REG_X20 = 20
_REG_X21 = 21
_REG_X22 = 22
_REG_X23 = 23
_REG_X24 = 24
_REG_X25 = 25
_REG_X26 = 26
_REG_X27 = 27
_REG_X28 = 28
_REG_X29 = 29
_REG_X30 = 30
_REG_X31 = 31
_REG_ELR = 32
_REG_SPSR = 33
_REG_TPIDR = 34
)
Oops, something went wrong.
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.