Skip to content

Commit

Permalink
runtime: add support for freebsd/riscv64
Browse files Browse the repository at this point in the history
Updates golang#53466

Change-Id: I42ca5f1d0f20b5ecfcfba70d298566b6c851fefc
Reviewed-on: https://go-review.googlesource.com/c/go/+/431656
Reviewed-by: Ian Lance Taylor <[email protected]>
Reviewed-by: Meng Zhuo <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Auto-Submit: Ian Lance Taylor <[email protected]>
Reviewed-by: Dmitri Shuralyov <[email protected]>
Run-TryBot: Ian Lance Taylor <[email protected]>
Reviewed-by: Dmitri Goutnik <[email protected]>
  • Loading branch information
MikaelUrankar authored and mengzhuo committed Sep 28, 2022
1 parent 12bf9ff commit 9aa7107
Show file tree
Hide file tree
Showing 7 changed files with 886 additions and 1 deletion.
263 changes: 263 additions & 0 deletions src/runtime/defs_freebsd_riscv64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
// created by cgo -cdefs and then converted to Go
// cgo -cdefs defs_freebsd.go

package runtime

import "unsafe"

const (
_NBBY = 0x8
_CTL_MAXNAME = 0x18
_CPU_LEVEL_WHICH = 0x3
_CPU_WHICH_PID = 0x2
)

const (
_EINTR = 0x4
_EFAULT = 0xe
_EAGAIN = 0x23
_ETIMEDOUT = 0x3c

_O_NONBLOCK = 0x4
_O_CLOEXEC = 0x100000

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

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

_MADV_DONTNEED = 0x4
_MADV_FREE = 0x5

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

_CLOCK_MONOTONIC = 0x4
_CLOCK_REALTIME = 0x0

_UMTX_OP_WAIT_UINT = 0xb
_UMTX_OP_WAIT_UINT_PRIVATE = 0xf
_UMTX_OP_WAKE = 0x3
_UMTX_OP_WAKE_PRIVATE = 0x10

_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 = 0x2
_FPE_INTOVF = 0x1
_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 = 0x40
_EV_ERROR = 0x4000
_EV_EOF = 0x8000
_EVFILT_READ = -0x1
_EVFILT_WRITE = -0x2
)

type rtprio struct {
_type uint16
prio uint16
}

type thrparam struct {
start_func uintptr
arg unsafe.Pointer
stack_base uintptr
stack_size uintptr
tls_base unsafe.Pointer
tls_size uintptr
child_tid unsafe.Pointer // *int64
parent_tid *int64
flags int32
pad_cgo_0 [4]byte
rtp *rtprio
spare [3]uintptr
}

type thread int64 // long

type sigset struct {
__bits [4]uint32
}

type stackt struct {
ss_sp uintptr
ss_size uintptr
ss_flags int32
pad_cgo_0 [4]byte
}

type siginfo struct {
si_signo int32
si_errno int32
si_code int32
si_pid int32
si_uid uint32
si_status int32
si_addr uint64
si_value [8]byte
_reason [40]byte
}

type gpregs struct {
gp_ra uint64
gp_sp uint64
gp_gp uint64
gp_tp uint64
gp_t [7]uint64
gp_s [12]uint64
gp_a [8]uint64
gp_sepc uint64
gp_sstatus uint64
}

type fpregs struct {
fp_x [64]uint64 // actually __uint64_t fp_x[32][2]
fp_fcsr uint64
fp_flags int32
pad int32
}

type mcontext struct {
mc_gpregs gpregs
mc_fpregs fpregs
mc_flags int32
mc_pad int32
mc_spare [8]uint64
}

type ucontext struct {
uc_sigmask sigset
uc_mcontext mcontext
uc_link *ucontext
uc_stack stackt
uc_flags int32
__spare__ [4]int32
pad_cgo_0 [12]byte
}

type timespec struct {
tv_sec int64
tv_nsec int64
}

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

type timeval struct {
tv_sec int64
tv_usec int64
}

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

type itimerval struct {
it_interval timeval
it_value timeval
}

type umtx_time struct {
_timeout timespec
_flags uint32
_clockid uint32
}

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

type bintime struct {
sec int64
frac uint64
}

type vdsoTimehands struct {
algo uint32
gen uint32
scale uint64
offset_count uint32
counter_mask uint32
offset bintime
boottime bintime
physical uint32
res [7]uint32
}

type vdsoTimekeep struct {
ver uint32
enabled uint32
current uint32
pad_cgo_0 [4]byte
}

const (
_VDSO_TK_VER_CURR = 0x1

vdsoTimehandsSize = 0x58
vdsoTimekeepSize = 0x10
)
7 changes: 7 additions & 0 deletions src/runtime/os_freebsd_riscv64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Copyright 2022 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.

package runtime

func osArchInit() {}
112 changes: 112 additions & 0 deletions src/runtime/rt0_freebsd_riscv64.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
// Copyright 2022 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 "textflag.h"

// On FreeBSD argc/argv are passed in R0, not X2
TEXT _rt0_riscv64_freebsd(SB),NOSPLIT|NOFRAME,$0
ADD $8, A0, A1 // argv
MOV 0(A0), A0 // argc
JMP main(SB)

// When building with -buildmode=c-shared, this symbol is called when the shared
// library is loaded.
TEXT _rt0_riscv64_freebsd_lib(SB),NOSPLIT,$224
// Preserve callee-save registers, along with X1 (LR).
MOV X1, (8*3)(X2)
MOV X8, (8*4)(X2)
MOV X9, (8*5)(X2)
MOV X18, (8*6)(X2)
MOV X19, (8*7)(X2)
MOV X20, (8*8)(X2)
MOV X21, (8*9)(X2)
MOV X22, (8*10)(X2)
MOV X23, (8*11)(X2)
MOV X24, (8*12)(X2)
MOV X25, (8*13)(X2)
MOV X26, (8*14)(X2)
MOV g, (8*15)(X2)
MOVD F8, (8*16)(X2)
MOVD F9, (8*17)(X2)
MOVD F18, (8*18)(X2)
MOVD F19, (8*19)(X2)
MOVD F20, (8*20)(X2)
MOVD F21, (8*21)(X2)
MOVD F22, (8*22)(X2)
MOVD F23, (8*23)(X2)
MOVD F24, (8*24)(X2)
MOVD F25, (8*25)(X2)
MOVD F26, (8*26)(X2)
MOVD F27, (8*27)(X2)

// Initialize g as nil in case of using g later e.g. sigaction in cgo_sigaction.go
MOV X0, g

MOV A0, _rt0_riscv64_freebsd_lib_argc<>(SB)
MOV A1, _rt0_riscv64_freebsd_lib_argv<>(SB)

// Synchronous initialization.
MOV $runtime·libpreinit(SB), T0
JALR RA, T0

// Create a new thread to do the runtime initialization and return.
MOV _cgo_sys_thread_create(SB), T0
BEQZ T0, nocgo
MOV $_rt0_riscv64_freebsd_lib_go(SB), A0
MOV $0, A1
JALR RA, T0
JMP restore

nocgo:
MOV $0x800000, A0 // stacksize = 8192KB
MOV $_rt0_riscv64_freebsd_lib_go(SB), A1
MOV A0, 8(X2)
MOV A1, 16(X2)
MOV $runtime·newosproc0(SB), T0
JALR RA, T0

restore:
// Restore callee-save registers, along with X1 (LR).
MOV (8*3)(X2), X1
MOV (8*4)(X2), X8
MOV (8*5)(X2), X9
MOV (8*6)(X2), X18
MOV (8*7)(X2), X19
MOV (8*8)(X2), X20
MOV (8*9)(X2), X21
MOV (8*10)(X2), X22
MOV (8*11)(X2), X23
MOV (8*12)(X2), X24
MOV (8*13)(X2), X25
MOV (8*14)(X2), X26
MOV (8*15)(X2), g
MOVD (8*16)(X2), F8
MOVD (8*17)(X2), F9
MOVD (8*18)(X2), F18
MOVD (8*19)(X2), F19
MOVD (8*20)(X2), F20
MOVD (8*21)(X2), F21
MOVD (8*22)(X2), F22
MOVD (8*23)(X2), F23
MOVD (8*24)(X2), F24
MOVD (8*25)(X2), F25
MOVD (8*26)(X2), F26
MOVD (8*27)(X2), F27

RET

TEXT _rt0_riscv64_freebsd_lib_go(SB),NOSPLIT,$0
MOV _rt0_riscv64_freebsd_lib_argc<>(SB), A0
MOV _rt0_riscv64_freebsd_lib_argv<>(SB), A1
MOV $runtime·rt0_go(SB), T0
JALR ZERO, T0

DATA _rt0_riscv64_freebsd_lib_argc<>(SB)/8, $0
GLOBL _rt0_riscv64_freebsd_lib_argc<>(SB),NOPTR, $8
DATA _rt0_riscv64_freebsd_lib_argv<>(SB)/8, $0
GLOBL _rt0_riscv64_freebsd_lib_argv<>(SB),NOPTR, $8

TEXT main(SB),NOSPLIT|NOFRAME,$0
MOV $runtime·rt0_go(SB), T0
JALR ZERO, T0
Loading

0 comments on commit 9aa7107

Please sign in to comment.