all: pretend to be linux/arm in baremetal targets
So far, we've pretended to be js/wasm in baremetal targets to make the stdlib happy. Unfortunately, this has various problems because syscall/js (a dependency of many stdlib packages) thinks it can do JS calls, and emulating them gets quite hard with all changes to the syscall/js packages in Go 1.12. This commit does a few things: * It lets baremetal targets pretend to be linux/arm instead of js/wasm. * It lets the loader only select particular packages from the src overlay, instead of inserting them just before GOROOT. This makes it possible to pick which packages to overlay for a given target. * It adds a baremetal-only syscall package that stubs out almost all syscalls.
Этот коммит содержится в:
родитель
792274e86f
коммит
a2d0f79be3
17 изменённых файлов: 724 добавлений и 58 удалений
|
@ -162,11 +162,11 @@ func (c *Compiler) selectGC() string {
|
|||
func (c *Compiler) Compile(mainPath string) error {
|
||||
// Prefix the GOPATH with the system GOROOT, as GOROOT is already set to
|
||||
// the TinyGo root.
|
||||
gopath := c.GOPATH
|
||||
if gopath == "" {
|
||||
gopath = runtime.GOROOT()
|
||||
overlayGopath := c.GOPATH
|
||||
if overlayGopath == "" {
|
||||
overlayGopath = runtime.GOROOT()
|
||||
} else {
|
||||
gopath = runtime.GOROOT() + string(filepath.ListSeparator) + gopath
|
||||
overlayGopath = runtime.GOROOT() + string(filepath.ListSeparator) + overlayGopath
|
||||
}
|
||||
|
||||
wd, err := os.Getwd()
|
||||
|
@ -177,13 +177,40 @@ func (c *Compiler) Compile(mainPath string) error {
|
|||
Build: &build.Context{
|
||||
GOARCH: c.GOARCH,
|
||||
GOOS: c.GOOS,
|
||||
GOROOT: c.RootDir,
|
||||
GOPATH: gopath,
|
||||
GOROOT: runtime.GOROOT(),
|
||||
GOPATH: c.GOPATH,
|
||||
CgoEnabled: true,
|
||||
UseAllFiles: false,
|
||||
Compiler: "gc", // must be one of the recognized compilers
|
||||
BuildTags: append([]string{"tinygo", "gc." + c.selectGC()}, c.BuildTags...),
|
||||
},
|
||||
OverlayBuild: &build.Context{
|
||||
GOARCH: c.GOARCH,
|
||||
GOOS: c.GOOS,
|
||||
GOROOT: c.RootDir,
|
||||
GOPATH: overlayGopath,
|
||||
CgoEnabled: true,
|
||||
UseAllFiles: false,
|
||||
Compiler: "gc", // must be one of the recognized compilers
|
||||
BuildTags: append([]string{"tinygo", "gc." + c.selectGC()}, c.BuildTags...),
|
||||
},
|
||||
ShouldOverlay: func(path string) bool {
|
||||
switch path {
|
||||
case "machine", "os", "reflect", "runtime", "sync":
|
||||
return true
|
||||
default:
|
||||
if strings.HasPrefix(path, "device/") || strings.HasPrefix(path, "examples/") {
|
||||
return true
|
||||
} else if path == "syscall" {
|
||||
for _, tag := range c.BuildTags {
|
||||
if tag == "avr" || tag == "cortexm" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
},
|
||||
TypeChecker: types.Config{
|
||||
Sizes: &StdSizes{
|
||||
IntSize: int64(c.targetData.TypeAllocSize(c.intType)),
|
||||
|
|
|
@ -14,13 +14,15 @@ import (
|
|||
|
||||
// Program holds all packages and some metadata about the program as a whole.
|
||||
type Program struct {
|
||||
Build *build.Context
|
||||
Packages map[string]*Package
|
||||
sorted []*Package
|
||||
fset *token.FileSet
|
||||
TypeChecker types.Config
|
||||
Dir string // current working directory (for error reporting)
|
||||
CFlags []string
|
||||
Build *build.Context
|
||||
OverlayBuild *build.Context
|
||||
ShouldOverlay func(path string) bool
|
||||
Packages map[string]*Package
|
||||
sorted []*Package
|
||||
fset *token.FileSet
|
||||
TypeChecker types.Config
|
||||
Dir string // current working directory (for error reporting)
|
||||
CFlags []string
|
||||
}
|
||||
|
||||
// Package holds a loaded package, its imports, and its parsed files.
|
||||
|
@ -42,7 +44,11 @@ func (p *Program) Import(path, srcDir string) (*Package, error) {
|
|||
}
|
||||
|
||||
// Load this package.
|
||||
buildPkg, err := p.Build.Import(path, srcDir, build.ImportComment)
|
||||
ctx := p.Build
|
||||
if p.ShouldOverlay(path) {
|
||||
ctx = p.OverlayBuild
|
||||
}
|
||||
buildPkg, err := ctx.Import(path, srcDir, build.ImportComment)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// +build wasm
|
||||
// +build avr cortexm wasm
|
||||
|
||||
package os
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
// +build darwin linux
|
||||
// +build darwin linux,!avr,!cortexm
|
||||
|
||||
package os
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// +build arm,!avr,!cortexm
|
||||
|
||||
package runtime
|
||||
|
||||
const GOARCH = "arm"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// +build tinygo.arm
|
||||
// +build cortexm
|
||||
|
||||
package runtime
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
// +build wasm,!tinygo.arm,!avr
|
||||
// +build wasm
|
||||
|
||||
package runtime
|
||||
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
// +build js,tinygo.arm avr
|
||||
|
||||
package runtime
|
||||
|
||||
// This file stubs out some external functions declared by the syscall/js
|
||||
// package. They cannot be used on microcontrollers.
|
||||
|
||||
type js_ref uint64
|
||||
|
||||
//go:linkname js_valueGet syscall/js.valueGet
|
||||
func js_valueGet(v js_ref, p string) js_ref {
|
||||
return 0
|
||||
}
|
||||
|
||||
//go:linkname js_valueNew syscall/js.valueNew
|
||||
func js_valueNew(v js_ref, args []js_ref) (js_ref, bool) {
|
||||
return 0, true
|
||||
}
|
||||
|
||||
//go:linkname js_valueCall syscall/js.valueCall
|
||||
func js_valueCall(v js_ref, m string, args []js_ref) (js_ref, bool) {
|
||||
return 0, true
|
||||
}
|
||||
|
||||
//go:linkname js_stringVal syscall/js.stringVal
|
||||
func js_stringVal(x string) js_ref {
|
||||
return 0
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
// +build tinygo.arm
|
||||
// +build cortexm
|
||||
|
||||
package runtime
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
// +build darwin linux
|
||||
// +build darwin linux,!avr,!cortexm
|
||||
|
||||
package runtime
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// +build wasm,!tinygo.arm,!avr
|
||||
// +build wasm
|
||||
|
||||
package runtime
|
||||
|
||||
|
|
24
src/syscall/str.go
Обычный файл
24
src/syscall/str.go
Обычный файл
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2009 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 syscall
|
||||
|
||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
|
||||
if val < 0 {
|
||||
return "-" + uitoa(uint(-val))
|
||||
}
|
||||
return uitoa(uint(val))
|
||||
}
|
||||
|
||||
func uitoa(val uint) string {
|
||||
var buf [32]byte // big enough for int64
|
||||
i := len(buf) - 1
|
||||
for val >= 10 {
|
||||
buf[i] = byte(val%10 + '0')
|
||||
i--
|
||||
val /= 10
|
||||
}
|
||||
buf[i] = byte(val + '0')
|
||||
return string(buf[i:])
|
||||
}
|
148
src/syscall/syscall_baremetal.go
Обычный файл
148
src/syscall/syscall_baremetal.go
Обычный файл
|
@ -0,0 +1,148 @@
|
|||
package syscall
|
||||
|
||||
// Most code here has been copied from the Go sources:
|
||||
// https://github.com/golang/go/blob/go1.12/src/syscall/syscall_js.go
|
||||
// It has the following copyright note:
|
||||
//
|
||||
// Copyright 2018 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.
|
||||
|
||||
// An Errno is an unsigned number describing an error condition.
|
||||
// It implements the error interface. The zero Errno is by convention
|
||||
// a non-error, so code to convert from Errno to error should use:
|
||||
// err = nil
|
||||
// if errno != 0 {
|
||||
// err = errno
|
||||
// }
|
||||
type Errno uintptr
|
||||
|
||||
func (e Errno) Error() string {
|
||||
if 0 <= int(e) && int(e) < len(errorstr) {
|
||||
s := errorstr[e]
|
||||
if s != "" {
|
||||
return s
|
||||
}
|
||||
}
|
||||
return "errno " + itoa(int(e))
|
||||
}
|
||||
|
||||
func (e Errno) Temporary() bool {
|
||||
return e == EINTR || e == EMFILE || e.Timeout()
|
||||
}
|
||||
|
||||
func (e Errno) Timeout() bool {
|
||||
return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT
|
||||
}
|
||||
|
||||
// A Signal is a number describing a process signal.
|
||||
// It implements the os.Signal interface.
|
||||
type Signal int
|
||||
|
||||
const (
|
||||
_ Signal = iota
|
||||
SIGCHLD
|
||||
SIGINT
|
||||
SIGKILL
|
||||
SIGTRAP
|
||||
SIGQUIT
|
||||
SIGTERM
|
||||
)
|
||||
|
||||
// File system
|
||||
|
||||
const (
|
||||
Stdin = 0
|
||||
Stdout = 1
|
||||
Stderr = 2
|
||||
)
|
||||
|
||||
const (
|
||||
O_RDONLY = 0
|
||||
O_WRONLY = 1
|
||||
O_RDWR = 2
|
||||
|
||||
O_CREAT = 0100
|
||||
O_CREATE = O_CREAT
|
||||
O_TRUNC = 01000
|
||||
O_APPEND = 02000
|
||||
O_EXCL = 0200
|
||||
O_SYNC = 010000
|
||||
|
||||
O_CLOEXEC = 0
|
||||
)
|
||||
|
||||
func Getenv(key string) (value string, found bool) {
|
||||
return "", false // stub
|
||||
}
|
||||
|
||||
func Open(path string, mode int, perm uint32) (fd int, err error) {
|
||||
return 0, ENOSYS
|
||||
}
|
||||
|
||||
func Read(fd int, p []byte) (n int, err error) {
|
||||
return 0, ENOSYS
|
||||
}
|
||||
|
||||
func Seek(fd int, offset int64, whence int) (off int64, err error) {
|
||||
return 0, ENOSYS
|
||||
}
|
||||
|
||||
func Close(fd int) (err error) {
|
||||
return ENOSYS
|
||||
}
|
||||
|
||||
// Processes
|
||||
|
||||
type WaitStatus uint32
|
||||
|
||||
func (w WaitStatus) Exited() bool { return false }
|
||||
func (w WaitStatus) ExitStatus() int { return 0 }
|
||||
func (w WaitStatus) Signaled() bool { return false }
|
||||
func (w WaitStatus) Signal() Signal { return 0 }
|
||||
func (w WaitStatus) CoreDump() bool { return false }
|
||||
func (w WaitStatus) Stopped() bool { return false }
|
||||
func (w WaitStatus) Continued() bool { return false }
|
||||
func (w WaitStatus) StopSignal() Signal { return 0 }
|
||||
func (w WaitStatus) TrapCause() int { return 0 }
|
||||
|
||||
// XXX made up
|
||||
type Rusage struct {
|
||||
Utime Timeval
|
||||
Stime Timeval
|
||||
}
|
||||
|
||||
// XXX made up
|
||||
type ProcAttr struct {
|
||||
Dir string
|
||||
Env []string
|
||||
Files []uintptr
|
||||
Sys *SysProcAttr
|
||||
}
|
||||
|
||||
type SysProcAttr struct {
|
||||
}
|
||||
|
||||
func Getegid() int { return 1 }
|
||||
func Geteuid() int { return 1 }
|
||||
func Getgid() int { return 1 }
|
||||
func Getgroups() ([]int, error) { return []int{1}, nil }
|
||||
func Getppid() int { return 2 }
|
||||
func Getpid() int { return 3 }
|
||||
func Gettimeofday(tv *Timeval) error { return ENOSYS }
|
||||
func Getuid() int { return 1 }
|
||||
func Kill(pid int, signum Signal) error { return ENOSYS }
|
||||
func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
|
||||
return 0, ENOSYS
|
||||
}
|
||||
func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
|
||||
return 0, 0, ENOSYS
|
||||
}
|
||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
|
||||
return 0, ENOSYS
|
||||
}
|
||||
|
||||
type Timeval struct {
|
||||
Sec int64
|
||||
Usec int64
|
||||
}
|
490
src/syscall/tables_baremetal.go
Обычный файл
490
src/syscall/tables_baremetal.go
Обычный файл
|
@ -0,0 +1,490 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
// +build avr cortexm
|
||||
|
||||
package syscall
|
||||
|
||||
import "runtime"
|
||||
|
||||
// TODO: generate with runtime/mknacl.sh, allow override with IRT.
|
||||
const (
|
||||
sys_null = 1
|
||||
sys_nameservice = 2
|
||||
sys_dup = 8
|
||||
sys_dup2 = 9
|
||||
sys_open = 10
|
||||
sys_close = 11
|
||||
sys_read = 12
|
||||
sys_write = 13
|
||||
sys_lseek = 14
|
||||
sys_stat = 16
|
||||
sys_fstat = 17
|
||||
sys_chmod = 18
|
||||
sys_isatty = 19
|
||||
sys_brk = 20
|
||||
sys_mmap = 21
|
||||
sys_munmap = 22
|
||||
sys_getdents = 23
|
||||
sys_mprotect = 24
|
||||
sys_list_mappings = 25
|
||||
sys_exit = 30
|
||||
sys_getpid = 31
|
||||
sys_sched_yield = 32
|
||||
sys_sysconf = 33
|
||||
sys_gettimeofday = 40
|
||||
sys_clock = 41
|
||||
sys_nanosleep = 42
|
||||
sys_clock_getres = 43
|
||||
sys_clock_gettime = 44
|
||||
sys_mkdir = 45
|
||||
sys_rmdir = 46
|
||||
sys_chdir = 47
|
||||
sys_getcwd = 48
|
||||
sys_unlink = 49
|
||||
sys_imc_makeboundsock = 60
|
||||
sys_imc_accept = 61
|
||||
sys_imc_connect = 62
|
||||
sys_imc_sendmsg = 63
|
||||
sys_imc_recvmsg = 64
|
||||
sys_imc_mem_obj_create = 65
|
||||
sys_imc_socketpair = 66
|
||||
sys_mutex_create = 70
|
||||
sys_mutex_lock = 71
|
||||
sys_mutex_trylock = 72
|
||||
sys_mutex_unlock = 73
|
||||
sys_cond_create = 74
|
||||
sys_cond_wait = 75
|
||||
sys_cond_signal = 76
|
||||
sys_cond_broadcast = 77
|
||||
sys_cond_timed_wait_abs = 79
|
||||
sys_thread_create = 80
|
||||
sys_thread_exit = 81
|
||||
sys_tls_init = 82
|
||||
sys_thread_nice = 83
|
||||
sys_tls_get = 84
|
||||
sys_second_tls_set = 85
|
||||
sys_second_tls_get = 86
|
||||
sys_exception_handler = 87
|
||||
sys_exception_stack = 88
|
||||
sys_exception_clear_flag = 89
|
||||
sys_sem_create = 100
|
||||
sys_sem_wait = 101
|
||||
sys_sem_post = 102
|
||||
sys_sem_get_value = 103
|
||||
sys_dyncode_create = 104
|
||||
sys_dyncode_modify = 105
|
||||
sys_dyncode_delete = 106
|
||||
sys_test_infoleak = 109
|
||||
sys_test_crash = 110
|
||||
sys_test_syscall_1 = 111
|
||||
sys_test_syscall_2 = 112
|
||||
sys_futex_wait_abs = 120
|
||||
sys_futex_wake = 121
|
||||
sys_pread = 130
|
||||
sys_pwrite = 131
|
||||
sys_truncate = 140
|
||||
sys_lstat = 141
|
||||
sys_link = 142
|
||||
sys_rename = 143
|
||||
sys_symlink = 144
|
||||
sys_access = 145
|
||||
sys_readlink = 146
|
||||
sys_utimes = 147
|
||||
sys_get_random_bytes = 150
|
||||
)
|
||||
|
||||
// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
|
||||
const (
|
||||
// native_client/src/trusted/service_runtime/include/sys/errno.h
|
||||
// The errors are mainly copied from Linux.
|
||||
EPERM Errno = 1 /* Operation not permitted */
|
||||
ENOENT Errno = 2 /* No such file or directory */
|
||||
ESRCH Errno = 3 /* No such process */
|
||||
EINTR Errno = 4 /* Interrupted system call */
|
||||
EIO Errno = 5 /* I/O error */
|
||||
ENXIO Errno = 6 /* No such device or address */
|
||||
E2BIG Errno = 7 /* Argument list too long */
|
||||
ENOEXEC Errno = 8 /* Exec format error */
|
||||
EBADF Errno = 9 /* Bad file number */
|
||||
ECHILD Errno = 10 /* No child processes */
|
||||
EAGAIN Errno = 11 /* Try again */
|
||||
ENOMEM Errno = 12 /* Out of memory */
|
||||
EACCES Errno = 13 /* Permission denied */
|
||||
EFAULT Errno = 14 /* Bad address */
|
||||
EBUSY Errno = 16 /* Device or resource busy */
|
||||
EEXIST Errno = 17 /* File exists */
|
||||
EXDEV Errno = 18 /* Cross-device link */
|
||||
ENODEV Errno = 19 /* No such device */
|
||||
ENOTDIR Errno = 20 /* Not a directory */
|
||||
EISDIR Errno = 21 /* Is a directory */
|
||||
EINVAL Errno = 22 /* Invalid argument */
|
||||
ENFILE Errno = 23 /* File table overflow */
|
||||
EMFILE Errno = 24 /* Too many open files */
|
||||
ENOTTY Errno = 25 /* Not a typewriter */
|
||||
EFBIG Errno = 27 /* File too large */
|
||||
ENOSPC Errno = 28 /* No space left on device */
|
||||
ESPIPE Errno = 29 /* Illegal seek */
|
||||
EROFS Errno = 30 /* Read-only file system */
|
||||
EMLINK Errno = 31 /* Too many links */
|
||||
EPIPE Errno = 32 /* Broken pipe */
|
||||
ENAMETOOLONG Errno = 36 /* File name too long */
|
||||
ENOSYS Errno = 38 /* Function not implemented */
|
||||
EDQUOT Errno = 122 /* Quota exceeded */
|
||||
EDOM Errno = 33 /* Math arg out of domain of func */
|
||||
ERANGE Errno = 34 /* Math result not representable */
|
||||
EDEADLK Errno = 35 /* Deadlock condition */
|
||||
ENOLCK Errno = 37 /* No record locks available */
|
||||
ENOTEMPTY Errno = 39 /* Directory not empty */
|
||||
ELOOP Errno = 40 /* Too many symbolic links */
|
||||
ENOMSG Errno = 42 /* No message of desired type */
|
||||
EIDRM Errno = 43 /* Identifier removed */
|
||||
ECHRNG Errno = 44 /* Channel number out of range */
|
||||
EL2NSYNC Errno = 45 /* Level 2 not synchronized */
|
||||
EL3HLT Errno = 46 /* Level 3 halted */
|
||||
EL3RST Errno = 47 /* Level 3 reset */
|
||||
ELNRNG Errno = 48 /* Link number out of range */
|
||||
EUNATCH Errno = 49 /* Protocol driver not attached */
|
||||
ENOCSI Errno = 50 /* No CSI structure available */
|
||||
EL2HLT Errno = 51 /* Level 2 halted */
|
||||
EBADE Errno = 52 /* Invalid exchange */
|
||||
EBADR Errno = 53 /* Invalid request descriptor */
|
||||
EXFULL Errno = 54 /* Exchange full */
|
||||
ENOANO Errno = 55 /* No anode */
|
||||
EBADRQC Errno = 56 /* Invalid request code */
|
||||
EBADSLT Errno = 57 /* Invalid slot */
|
||||
EDEADLOCK Errno = EDEADLK /* File locking deadlock error */
|
||||
EBFONT Errno = 59 /* Bad font file fmt */
|
||||
ENOSTR Errno = 60 /* Device not a stream */
|
||||
ENODATA Errno = 61 /* No data (for no delay io) */
|
||||
ETIME Errno = 62 /* Timer expired */
|
||||
ENOSR Errno = 63 /* Out of streams resources */
|
||||
ENONET Errno = 64 /* Machine is not on the network */
|
||||
ENOPKG Errno = 65 /* Package not installed */
|
||||
EREMOTE Errno = 66 /* The object is remote */
|
||||
ENOLINK Errno = 67 /* The link has been severed */
|
||||
EADV Errno = 68 /* Advertise error */
|
||||
ESRMNT Errno = 69 /* Srmount error */
|
||||
ECOMM Errno = 70 /* Communication error on send */
|
||||
EPROTO Errno = 71 /* Protocol error */
|
||||
EMULTIHOP Errno = 72 /* Multihop attempted */
|
||||
EDOTDOT Errno = 73 /* Cross mount point (not really error) */
|
||||
EBADMSG Errno = 74 /* Trying to read unreadable message */
|
||||
EOVERFLOW Errno = 75 /* Value too large for defined data type */
|
||||
ENOTUNIQ Errno = 76 /* Given log. name not unique */
|
||||
EBADFD Errno = 77 /* f.d. invalid for this operation */
|
||||
EREMCHG Errno = 78 /* Remote address changed */
|
||||
ELIBACC Errno = 79 /* Can't access a needed shared lib */
|
||||
ELIBBAD Errno = 80 /* Accessing a corrupted shared lib */
|
||||
ELIBSCN Errno = 81 /* .lib section in a.out corrupted */
|
||||
ELIBMAX Errno = 82 /* Attempting to link in too many libs */
|
||||
ELIBEXEC Errno = 83 /* Attempting to exec a shared library */
|
||||
EILSEQ Errno = 84
|
||||
EUSERS Errno = 87
|
||||
ENOTSOCK Errno = 88 /* Socket operation on non-socket */
|
||||
EDESTADDRREQ Errno = 89 /* Destination address required */
|
||||
EMSGSIZE Errno = 90 /* Message too long */
|
||||
EPROTOTYPE Errno = 91 /* Protocol wrong type for socket */
|
||||
ENOPROTOOPT Errno = 92 /* Protocol not available */
|
||||
EPROTONOSUPPORT Errno = 93 /* Unknown protocol */
|
||||
ESOCKTNOSUPPORT Errno = 94 /* Socket type not supported */
|
||||
EOPNOTSUPP Errno = 95 /* Operation not supported on transport endpoint */
|
||||
EPFNOSUPPORT Errno = 96 /* Protocol family not supported */
|
||||
EAFNOSUPPORT Errno = 97 /* Address family not supported by protocol family */
|
||||
EADDRINUSE Errno = 98 /* Address already in use */
|
||||
EADDRNOTAVAIL Errno = 99 /* Address not available */
|
||||
ENETDOWN Errno = 100 /* Network interface is not configured */
|
||||
ENETUNREACH Errno = 101 /* Network is unreachable */
|
||||
ENETRESET Errno = 102
|
||||
ECONNABORTED Errno = 103 /* Connection aborted */
|
||||
ECONNRESET Errno = 104 /* Connection reset by peer */
|
||||
ENOBUFS Errno = 105 /* No buffer space available */
|
||||
EISCONN Errno = 106 /* Socket is already connected */
|
||||
ENOTCONN Errno = 107 /* Socket is not connected */
|
||||
ESHUTDOWN Errno = 108 /* Can't send after socket shutdown */
|
||||
ETOOMANYREFS Errno = 109
|
||||
ETIMEDOUT Errno = 110 /* Connection timed out */
|
||||
ECONNREFUSED Errno = 111 /* Connection refused */
|
||||
EHOSTDOWN Errno = 112 /* Host is down */
|
||||
EHOSTUNREACH Errno = 113 /* Host is unreachable */
|
||||
EALREADY Errno = 114 /* Socket already connected */
|
||||
EINPROGRESS Errno = 115 /* Connection already in progress */
|
||||
ESTALE Errno = 116
|
||||
ENOTSUP Errno = EOPNOTSUPP /* Not supported */
|
||||
ENOMEDIUM Errno = 123 /* No medium (in tape drive) */
|
||||
ECANCELED Errno = 125 /* Operation canceled. */
|
||||
ELBIN Errno = 2048 /* Inode is remote (not really error) */
|
||||
EFTYPE Errno = 2049 /* Inappropriate file type or format */
|
||||
ENMFILE Errno = 2050 /* No more files */
|
||||
EPROCLIM Errno = 2051
|
||||
ENOSHARE Errno = 2052 /* No such host or network path */
|
||||
ECASECLASH Errno = 2053 /* Filename exists with different case */
|
||||
EWOULDBLOCK Errno = EAGAIN /* Operation would block */
|
||||
)
|
||||
|
||||
// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
|
||||
var errorstr = [...]string{
|
||||
EPERM: "Operation not permitted",
|
||||
ENOENT: "No such file or directory",
|
||||
ESRCH: "No such process",
|
||||
EINTR: "Interrupted system call",
|
||||
EIO: "I/O error",
|
||||
ENXIO: "No such device or address",
|
||||
E2BIG: "Argument list too long",
|
||||
ENOEXEC: "Exec format error",
|
||||
EBADF: "Bad file number",
|
||||
ECHILD: "No child processes",
|
||||
EAGAIN: "Try again",
|
||||
ENOMEM: "Out of memory",
|
||||
EACCES: "Permission denied",
|
||||
EFAULT: "Bad address",
|
||||
EBUSY: "Device or resource busy",
|
||||
EEXIST: "File exists",
|
||||
EXDEV: "Cross-device link",
|
||||
ENODEV: "No such device",
|
||||
ENOTDIR: "Not a directory",
|
||||
EISDIR: "Is a directory",
|
||||
EINVAL: "Invalid argument",
|
||||
ENFILE: "File table overflow",
|
||||
EMFILE: "Too many open files",
|
||||
ENOTTY: "Not a typewriter",
|
||||
EFBIG: "File too large",
|
||||
ENOSPC: "No space left on device",
|
||||
ESPIPE: "Illegal seek",
|
||||
EROFS: "Read-only file system",
|
||||
EMLINK: "Too many links",
|
||||
EPIPE: "Broken pipe",
|
||||
ENAMETOOLONG: "File name too long",
|
||||
ENOSYS: "not implemented on " + runtime.GOOS,
|
||||
EDQUOT: "Quota exceeded",
|
||||
EDOM: "Math arg out of domain of func",
|
||||
ERANGE: "Math result not representable",
|
||||
EDEADLK: "Deadlock condition",
|
||||
ENOLCK: "No record locks available",
|
||||
ENOTEMPTY: "Directory not empty",
|
||||
ELOOP: "Too many symbolic links",
|
||||
ENOMSG: "No message of desired type",
|
||||
EIDRM: "Identifier removed",
|
||||
ECHRNG: "Channel number out of range",
|
||||
EL2NSYNC: "Level 2 not synchronized",
|
||||
EL3HLT: "Level 3 halted",
|
||||
EL3RST: "Level 3 reset",
|
||||
ELNRNG: "Link number out of range",
|
||||
EUNATCH: "Protocol driver not attached",
|
||||
ENOCSI: "No CSI structure available",
|
||||
EL2HLT: "Level 2 halted",
|
||||
EBADE: "Invalid exchange",
|
||||
EBADR: "Invalid request descriptor",
|
||||
EXFULL: "Exchange full",
|
||||
ENOANO: "No anode",
|
||||
EBADRQC: "Invalid request code",
|
||||
EBADSLT: "Invalid slot",
|
||||
EBFONT: "Bad font file fmt",
|
||||
ENOSTR: "Device not a stream",
|
||||
ENODATA: "No data (for no delay io)",
|
||||
ETIME: "Timer expired",
|
||||
ENOSR: "Out of streams resources",
|
||||
ENONET: "Machine is not on the network",
|
||||
ENOPKG: "Package not installed",
|
||||
EREMOTE: "The object is remote",
|
||||
ENOLINK: "The link has been severed",
|
||||
EADV: "Advertise error",
|
||||
ESRMNT: "Srmount error",
|
||||
ECOMM: "Communication error on send",
|
||||
EPROTO: "Protocol error",
|
||||
EMULTIHOP: "Multihop attempted",
|
||||
EDOTDOT: "Cross mount point (not really error)",
|
||||
EBADMSG: "Trying to read unreadable message",
|
||||
EOVERFLOW: "Value too large for defined data type",
|
||||
ENOTUNIQ: "Given log. name not unique",
|
||||
EBADFD: "f.d. invalid for this operation",
|
||||
EREMCHG: "Remote address changed",
|
||||
ELIBACC: "Can't access a needed shared lib",
|
||||
ELIBBAD: "Accessing a corrupted shared lib",
|
||||
ELIBSCN: ".lib section in a.out corrupted",
|
||||
ELIBMAX: "Attempting to link in too many libs",
|
||||
ELIBEXEC: "Attempting to exec a shared library",
|
||||
ENOTSOCK: "Socket operation on non-socket",
|
||||
EDESTADDRREQ: "Destination address required",
|
||||
EMSGSIZE: "Message too long",
|
||||
EPROTOTYPE: "Protocol wrong type for socket",
|
||||
ENOPROTOOPT: "Protocol not available",
|
||||
EPROTONOSUPPORT: "Unknown protocol",
|
||||
ESOCKTNOSUPPORT: "Socket type not supported",
|
||||
EOPNOTSUPP: "Operation not supported on transport endpoint",
|
||||
EPFNOSUPPORT: "Protocol family not supported",
|
||||
EAFNOSUPPORT: "Address family not supported by protocol family",
|
||||
EADDRINUSE: "Address already in use",
|
||||
EADDRNOTAVAIL: "Address not available",
|
||||
ENETDOWN: "Network interface is not configured",
|
||||
ENETUNREACH: "Network is unreachable",
|
||||
ECONNABORTED: "Connection aborted",
|
||||
ECONNRESET: "Connection reset by peer",
|
||||
ENOBUFS: "No buffer space available",
|
||||
EISCONN: "Socket is already connected",
|
||||
ENOTCONN: "Socket is not connected",
|
||||
ESHUTDOWN: "Can't send after socket shutdown",
|
||||
ETIMEDOUT: "Connection timed out",
|
||||
ECONNREFUSED: "Connection refused",
|
||||
EHOSTDOWN: "Host is down",
|
||||
EHOSTUNREACH: "Host is unreachable",
|
||||
EALREADY: "Socket already connected",
|
||||
EINPROGRESS: "Connection already in progress",
|
||||
ENOMEDIUM: "No medium (in tape drive)",
|
||||
ECANCELED: "Operation canceled.",
|
||||
ELBIN: "Inode is remote (not really error)",
|
||||
EFTYPE: "Inappropriate file type or format",
|
||||
ENMFILE: "No more files",
|
||||
ENOSHARE: "No such host or network path",
|
||||
ECASECLASH: "Filename exists with different case",
|
||||
}
|
||||
|
||||
// Do the interface allocations only once for common
|
||||
// Errno values.
|
||||
var (
|
||||
errEAGAIN error = EAGAIN
|
||||
errEINVAL error = EINVAL
|
||||
errENOENT error = ENOENT
|
||||
)
|
||||
|
||||
// errnoErr returns common boxed Errno values, to prevent
|
||||
// allocations at runtime.
|
||||
func errnoErr(e Errno) error {
|
||||
switch e {
|
||||
case 0:
|
||||
return nil
|
||||
case EAGAIN:
|
||||
return errEAGAIN
|
||||
case EINVAL:
|
||||
return errEINVAL
|
||||
case ENOENT:
|
||||
return errENOENT
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
var errnoByCode = map[string]Errno{
|
||||
"EPERM": EPERM,
|
||||
"ENOENT": ENOENT,
|
||||
"ESRCH": ESRCH,
|
||||
"EINTR": EINTR,
|
||||
"EIO": EIO,
|
||||
"ENXIO": ENXIO,
|
||||
"E2BIG": E2BIG,
|
||||
"ENOEXEC": ENOEXEC,
|
||||
"EBADF": EBADF,
|
||||
"ECHILD": ECHILD,
|
||||
"EAGAIN": EAGAIN,
|
||||
"ENOMEM": ENOMEM,
|
||||
"EACCES": EACCES,
|
||||
"EFAULT": EFAULT,
|
||||
"EBUSY": EBUSY,
|
||||
"EEXIST": EEXIST,
|
||||
"EXDEV": EXDEV,
|
||||
"ENODEV": ENODEV,
|
||||
"ENOTDIR": ENOTDIR,
|
||||
"EISDIR": EISDIR,
|
||||
"EINVAL": EINVAL,
|
||||
"ENFILE": ENFILE,
|
||||
"EMFILE": EMFILE,
|
||||
"ENOTTY": ENOTTY,
|
||||
"EFBIG": EFBIG,
|
||||
"ENOSPC": ENOSPC,
|
||||
"ESPIPE": ESPIPE,
|
||||
"EROFS": EROFS,
|
||||
"EMLINK": EMLINK,
|
||||
"EPIPE": EPIPE,
|
||||
"ENAMETOOLONG": ENAMETOOLONG,
|
||||
"ENOSYS": ENOSYS,
|
||||
"EDQUOT": EDQUOT,
|
||||
"EDOM": EDOM,
|
||||
"ERANGE": ERANGE,
|
||||
"EDEADLK": EDEADLK,
|
||||
"ENOLCK": ENOLCK,
|
||||
"ENOTEMPTY": ENOTEMPTY,
|
||||
"ELOOP": ELOOP,
|
||||
"ENOMSG": ENOMSG,
|
||||
"EIDRM": EIDRM,
|
||||
"ECHRNG": ECHRNG,
|
||||
"EL2NSYNC": EL2NSYNC,
|
||||
"EL3HLT": EL3HLT,
|
||||
"EL3RST": EL3RST,
|
||||
"ELNRNG": ELNRNG,
|
||||
"EUNATCH": EUNATCH,
|
||||
"ENOCSI": ENOCSI,
|
||||
"EL2HLT": EL2HLT,
|
||||
"EBADE": EBADE,
|
||||
"EBADR": EBADR,
|
||||
"EXFULL": EXFULL,
|
||||
"ENOANO": ENOANO,
|
||||
"EBADRQC": EBADRQC,
|
||||
"EBADSLT": EBADSLT,
|
||||
"EDEADLOCK": EDEADLOCK,
|
||||
"EBFONT": EBFONT,
|
||||
"ENOSTR": ENOSTR,
|
||||
"ENODATA": ENODATA,
|
||||
"ETIME": ETIME,
|
||||
"ENOSR": ENOSR,
|
||||
"ENONET": ENONET,
|
||||
"ENOPKG": ENOPKG,
|
||||
"EREMOTE": EREMOTE,
|
||||
"ENOLINK": ENOLINK,
|
||||
"EADV": EADV,
|
||||
"ESRMNT": ESRMNT,
|
||||
"ECOMM": ECOMM,
|
||||
"EPROTO": EPROTO,
|
||||
"EMULTIHOP": EMULTIHOP,
|
||||
"EDOTDOT": EDOTDOT,
|
||||
"EBADMSG": EBADMSG,
|
||||
"EOVERFLOW": EOVERFLOW,
|
||||
"ENOTUNIQ": ENOTUNIQ,
|
||||
"EBADFD": EBADFD,
|
||||
"EREMCHG": EREMCHG,
|
||||
"ELIBACC": ELIBACC,
|
||||
"ELIBBAD": ELIBBAD,
|
||||
"ELIBSCN": ELIBSCN,
|
||||
"ELIBMAX": ELIBMAX,
|
||||
"ELIBEXEC": ELIBEXEC,
|
||||
"EILSEQ": EILSEQ,
|
||||
"EUSERS": EUSERS,
|
||||
"ENOTSOCK": ENOTSOCK,
|
||||
"EDESTADDRREQ": EDESTADDRREQ,
|
||||
"EMSGSIZE": EMSGSIZE,
|
||||
"EPROTOTYPE": EPROTOTYPE,
|
||||
"ENOPROTOOPT": ENOPROTOOPT,
|
||||
"EPROTONOSUPPORT": EPROTONOSUPPORT,
|
||||
"ESOCKTNOSUPPORT": ESOCKTNOSUPPORT,
|
||||
"EOPNOTSUPP": EOPNOTSUPP,
|
||||
"EPFNOSUPPORT": EPFNOSUPPORT,
|
||||
"EAFNOSUPPORT": EAFNOSUPPORT,
|
||||
"EADDRINUSE": EADDRINUSE,
|
||||
"EADDRNOTAVAIL": EADDRNOTAVAIL,
|
||||
"ENETDOWN": ENETDOWN,
|
||||
"ENETUNREACH": ENETUNREACH,
|
||||
"ENETRESET": ENETRESET,
|
||||
"ECONNABORTED": ECONNABORTED,
|
||||
"ECONNRESET": ECONNRESET,
|
||||
"ENOBUFS": ENOBUFS,
|
||||
"EISCONN": EISCONN,
|
||||
"ENOTCONN": ENOTCONN,
|
||||
"ESHUTDOWN": ESHUTDOWN,
|
||||
"ETOOMANYREFS": ETOOMANYREFS,
|
||||
"ETIMEDOUT": ETIMEDOUT,
|
||||
"ECONNREFUSED": ECONNREFUSED,
|
||||
"EHOSTDOWN": EHOSTDOWN,
|
||||
"EHOSTUNREACH": EHOSTUNREACH,
|
||||
"EALREADY": EALREADY,
|
||||
"EINPROGRESS": EINPROGRESS,
|
||||
"ESTALE": ESTALE,
|
||||
"ENOTSUP": ENOTSUP,
|
||||
"ENOMEDIUM": ENOMEDIUM,
|
||||
"ECANCELED": ECANCELED,
|
||||
"ELBIN": ELBIN,
|
||||
"EFTYPE": EFTYPE,
|
||||
"ENMFILE": ENMFILE,
|
||||
"EPROCLIM": EPROCLIM,
|
||||
"ENOSHARE": ENOSHARE,
|
||||
"ECASECLASH": ECASECLASH,
|
||||
"EWOULDBLOCK": EWOULDBLOCK,
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package unsafe
|
||||
|
||||
// dummy
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"build-tags": ["avr", "js", "wasm"],
|
||||
"goos": "js",
|
||||
"goarch": "wasm",
|
||||
"build-tags": ["avr", "linux", "arm"],
|
||||
"goos": "linux",
|
||||
"goarch": "arm",
|
||||
"compiler": "avr-gcc",
|
||||
"linker": "avr-gcc",
|
||||
"ldflags": [
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"build-tags": ["tinygo.arm", "js", "wasm"],
|
||||
"goos": "js",
|
||||
"goarch": "wasm",
|
||||
"build-tags": ["cortexm", "linux", "arm"],
|
||||
"goos": "linux",
|
||||
"goarch": "arm",
|
||||
"compiler": "clang-8",
|
||||
"gc": "marksweep",
|
||||
"linker": "arm-none-eabi-ld",
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче