-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
runtime: add support for freebsd/riscv64
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
1 parent
12bf9ff
commit 9aa7107
Showing
7 changed files
with
886 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.