From f686a2890b34996455c7d7aba9a0efba74b613f5 Mon Sep 17 00:00:00 2001
From: "Joshua M. Clulow" <josh.clulow@joyent.com>
Date: Mon, 29 Apr 2019 13:50:49 +0000
Subject: [PATCH] all: add new GOOS=illumos, split out of GOOS=solaris

Like GOOS=android which implies the "linux" build tag, GOOS=illumos
implies the "solaris" build tag. This lets the existing ecosystem of
packages still work on illumos, but still permits packages to start
differentiating between solaris and illumos.

Fixes #20603

Change-Id: I8f4eabf1a66060538dca15d7658c1fbc6c826622
Reviewed-on: https://go-review.googlesource.com/c/go/+/174457
Run-TryBot: Benny Siegert <bsiegert@gmail.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
---
 misc/cgo/test/sigaltstack.go                  |  2 +-
 misc/cgo/testcarchive/carchive_test.go        |  2 +-
 misc/cgo/testcshared/cshared_test.go          |  2 +-
 src/cmd/dist/build.go                         |  6 +++--
 src/cmd/dist/main.go                          |  7 ++++--
 src/cmd/go/go_test.go                         |  2 +-
 src/cmd/go/internal/bug/bug.go                |  4 +++-
 src/cmd/go/internal/imports/build.go          |  1 +
 .../internal/filelock/filelock_test.go        |  9 ++++---
 src/cmd/go/internal/work/buildid.go           |  4 ++--
 src/cmd/go/internal/work/exec.go              |  2 +-
 src/cmd/go/internal/work/init.go              |  2 +-
 src/cmd/internal/objabi/head.go               |  2 +-
 src/cmd/link/internal/ld/dwarf_test.go        | 16 ++++++-------
 .../golang.org/x/sys/unix/sockcmsg_unix.go    |  6 ++---
 src/cmd/vet/all/whitelist/illumos_amd64.txt   |  6 +++++
 src/debug/gosym/pclntab_test.go               |  2 +-
 src/go/build/build.go                         |  3 +++
 src/go/build/doc.go                           |  3 +++
 src/go/build/syslist.go                       |  2 +-
 src/net/error_test.go                         |  2 +-
 src/net/fd_unix.go                            | 12 +++++-----
 src/net/interface_test.go                     |  4 ++--
 src/net/listen_test.go                        | 10 ++++----
 src/net/tcpsock_test.go                       |  2 +-
 src/os/exec/exec_test.go                      |  2 +-
 src/os/os_test.go                             |  4 ++--
 src/os/removeall_test.go                      |  2 +-
 src/os/user/user_test.go                      |  2 +-
 src/runtime/asm_amd64.s                       |  4 ++++
 src/runtime/cgocall.go                        |  2 +-
 src/runtime/crash_unix_test.go                |  2 +-
 src/runtime/internal/sys/gengoos.go           |  3 +++
 src/runtime/internal/sys/zgoos_aix.go         |  1 +
 src/runtime/internal/sys/zgoos_android.go     |  1 +
 src/runtime/internal/sys/zgoos_darwin.go      |  1 +
 src/runtime/internal/sys/zgoos_dragonfly.go   |  1 +
 src/runtime/internal/sys/zgoos_freebsd.go     |  1 +
 src/runtime/internal/sys/zgoos_hurd.go        |  1 +
 src/runtime/internal/sys/zgoos_illumos.go     | 24 +++++++++++++++++++
 src/runtime/internal/sys/zgoos_js.go          |  1 +
 src/runtime/internal/sys/zgoos_linux.go       |  1 +
 src/runtime/internal/sys/zgoos_nacl.go        |  1 +
 src/runtime/internal/sys/zgoos_netbsd.go      |  1 +
 src/runtime/internal/sys/zgoos_openbsd.go     |  1 +
 src/runtime/internal/sys/zgoos_plan9.go       |  1 +
 src/runtime/internal/sys/zgoos_solaris.go     |  2 ++
 src/runtime/internal/sys/zgoos_windows.go     |  1 +
 src/runtime/internal/sys/zgoos_zos.go         |  1 +
 src/runtime/mem_bsd.go                        |  2 +-
 src/runtime/netpoll.go                        |  4 ++--
 src/runtime/pprof/pprof_test.go               |  2 +-
 src/runtime/proc.go                           | 14 +++++------
 src/runtime/rt0_illumos_amd64.s               | 11 +++++++++
 src/syscall/exec_unix.go                      |  4 ++--
 src/syscall/sockcmsg_unix.go                  |  2 +-
 src/syscall/syscall_unix.go                   |  1 +
 57 files changed, 148 insertions(+), 66 deletions(-)
 create mode 100644 src/cmd/vet/all/whitelist/illumos_amd64.txt
 create mode 100644 src/runtime/internal/sys/zgoos_illumos.go
 create mode 100644 src/runtime/rt0_illumos_amd64.s

diff --git a/misc/cgo/test/sigaltstack.go b/misc/cgo/test/sigaltstack.go
index 2b7a1ec9ad0..2c9b81ced7a 100644
--- a/misc/cgo/test/sigaltstack.go
+++ b/misc/cgo/test/sigaltstack.go
@@ -55,7 +55,7 @@ import (
 
 func testSigaltstack(t *testing.T) {
 	switch {
-	case runtime.GOOS == "solaris", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
+	case runtime.GOOS == "solaris", runtime.GOOS == "illumos", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
 		t.Skipf("switching signal stack not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 	case runtime.GOOS == "darwin" && runtime.GOARCH == "386":
 		t.Skipf("sigaltstack fails on darwin/386")
diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go
index 5fbe9caafb3..085970f32af 100644
--- a/misc/cgo/testcarchive/carchive_test.go
+++ b/misc/cgo/testcarchive/carchive_test.go
@@ -124,7 +124,7 @@ func testMain(m *testing.M) int {
 			if GOARCH == "arm" || GOARCH == "arm64" {
 				libbase += "_shared"
 			}
-		case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+		case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
 			libbase += "_shared"
 		}
 	}
diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go
index 97f786e6c53..4b3968e4171 100644
--- a/misc/cgo/testcshared/cshared_test.go
+++ b/misc/cgo/testcshared/cshared_test.go
@@ -105,7 +105,7 @@ func testMain(m *testing.M) int {
 		if GOARCH == "arm" || GOARCH == "arm64" {
 			libgodir += "_shared"
 		}
-	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
 		libgodir += "_shared"
 	}
 	cc = append(cc, "-I", filepath.Join("pkg", libgodir))
diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
index 4c5f1c925e8..e47f25dce6c 100644
--- a/src/cmd/dist/build.go
+++ b/src/cmd/dist/build.go
@@ -80,6 +80,7 @@ var okgoarch = []string{
 var okgoos = []string{
 	"darwin",
 	"dragonfly",
+	"illumos",
 	"js",
 	"linux",
 	"android",
@@ -936,7 +937,7 @@ func matchtag(tag string) bool {
 		}
 		return !matchtag(tag[1:])
 	}
-	return tag == "gc" || tag == goos || tag == goarch || tag == "cmd_go_bootstrap" || tag == "go1.1" || (goos == "android" && tag == "linux")
+	return tag == "gc" || tag == goos || tag == goarch || tag == "cmd_go_bootstrap" || tag == "go1.1" || (goos == "android" && tag == "linux") || (goos == "illumos" && tag == "solaris")
 }
 
 // shouldbuild reports whether we should build this file.
@@ -950,7 +951,7 @@ func shouldbuild(file, dir string) bool {
 	name := filepath.Base(file)
 	excluded := func(list []string, ok string) bool {
 		for _, x := range list {
-			if x == ok || ok == "android" && x == "linux" {
+			if x == ok || (ok == "android" && x == "linux") || (ok == "illumos" && x == "solaris") {
 				continue
 			}
 			i := strings.Index(name, x)
@@ -1486,6 +1487,7 @@ var cgoEnabled = map[string]bool{
 	"freebsd/386":     true,
 	"freebsd/amd64":   true,
 	"freebsd/arm":     true,
+	"illumos/amd64":   true,
 	"linux/386":       true,
 	"linux/amd64":     true,
 	"linux/arm":       true,
diff --git a/src/cmd/dist/main.go b/src/cmd/dist/main.go
index 9be2fff37a4..7a7ffe8f0c1 100644
--- a/src/cmd/dist/main.go
+++ b/src/cmd/dist/main.go
@@ -81,8 +81,11 @@ func main() {
 		if gohostarch == "" {
 			fatalf("$objtype is unset")
 		}
-	case "solaris":
-		// Even on 64-bit platform, solaris uname -m prints i86pc.
+	case "solaris", "illumos":
+		// Solaris and illumos systems have multi-arch userlands, and
+		// "uname -m" reports the machine hardware name; e.g.,
+		// "i86pc" on both 32- and 64-bit x86 systems.  Check for the
+		// native (widest) instruction set on the running kernel:
 		out := run("", CheckExit, "isainfo", "-n")
 		if strings.Contains(out, "amd64") {
 			gohostarch = "amd64"
diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go
index 94417be0f2c..3f7164dd501 100644
--- a/src/cmd/go/go_test.go
+++ b/src/cmd/go/go_test.go
@@ -4139,7 +4139,7 @@ func TestCgoConsistentResults(t *testing.T) {
 		t.Skip("skipping because cgo not enabled")
 	}
 	switch runtime.GOOS {
-	case "solaris":
+	case "solaris", "illumos":
 		testenv.SkipFlaky(t, 13247)
 	}
 
diff --git a/src/cmd/go/internal/bug/bug.go b/src/cmd/go/internal/bug/bug.go
index 468605c74ac..77a1677125d 100644
--- a/src/cmd/go/internal/bug/bug.go
+++ b/src/cmd/go/internal/bug/bug.go
@@ -102,7 +102,9 @@ func printOSDetails(w io.Writer) {
 		printGlibcVersion(w)
 	case "openbsd", "netbsd", "freebsd", "dragonfly":
 		printCmdOut(w, "uname -v: ", "uname", "-v")
-	case "solaris":
+	case "illumos", "solaris":
+		// Be sure to use the OS-supplied uname, in "/usr/bin":
+		printCmdOut(w, "uname -srv: ", "/usr/bin/uname", "-srv")
 		out, err := ioutil.ReadFile("/etc/release")
 		if err == nil {
 			fmt.Fprintf(w, "/etc/release: %s\n", out)
diff --git a/src/cmd/go/internal/imports/build.go b/src/cmd/go/internal/imports/build.go
index fd0a300bc87..1e44a83c72a 100644
--- a/src/cmd/go/internal/imports/build.go
+++ b/src/cmd/go/internal/imports/build.go
@@ -202,6 +202,7 @@ var KnownOS = map[string]bool{
 	"dragonfly": true,
 	"freebsd":   true,
 	"hurd":      true,
+	"illumos":   true,
 	"js":        true,
 	"linux":     true,
 	"nacl":      true,
diff --git a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
index aa67093a48a..581a978ef8e 100644
--- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
+++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go
@@ -159,7 +159,9 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
 	f2 := mustOpen(t, f.Name())
 	defer f2.Close()
 
-	if runtime.GOOS == "solaris" || runtime.GOOS == "aix" {
+	doUnlockTF := false
+	switch runtime.GOOS {
+	case "aix", "illumos", "solaris":
 		// When using POSIX locks (as on Solaris), we can't safely read-lock the
 		// same inode through two different descriptors at the same time: when the
 		// first descriptor is closed, the second descriptor would still be open but
@@ -167,8 +169,9 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
 		lockF2 := mustBlock(t, "RLock", f2)
 		unlock(t, f)
 		lockF2(t)
-	} else {
+	default:
 		rLock(t, f2)
+		doUnlockTF = true
 	}
 
 	other := mustOpen(t, f.Name())
@@ -176,7 +179,7 @@ func TestRLockExcludesOnlyLock(t *testing.T) {
 	lockOther := mustBlock(t, "Lock", other)
 
 	unlock(t, f2)
-	if runtime.GOOS != "solaris" && runtime.GOOS != "aix" {
+	if doUnlockTF {
 		unlock(t, f)
 	}
 	lockOther(t)
diff --git a/src/cmd/go/internal/work/buildid.go b/src/cmd/go/internal/work/buildid.go
index 750bc3c6cdb..894c260b29a 100644
--- a/src/cmd/go/internal/work/buildid.go
+++ b/src/cmd/go/internal/work/buildid.go
@@ -326,7 +326,7 @@ func (b *Builder) gccgoBuildIDFile(a *Action) (string, error) {
 	var buf bytes.Buffer
 	if cfg.Goos == "aix" {
 		fmt.Fprintf(&buf, "\t.csect .go.buildid[XO]\n")
-	} else if cfg.Goos != "solaris" || assemblerIsGas() {
+	} else if (cfg.Goos != "solaris" && cfg.Goos != "illumos") || assemblerIsGas() {
 		fmt.Fprintf(&buf, "\t"+`.section .go.buildid,"e"`+"\n")
 	} else if cfg.Goarch == "sparc" || cfg.Goarch == "sparc64" {
 		fmt.Fprintf(&buf, "\t"+`.section ".go.buildid",#exclude`+"\n")
@@ -345,7 +345,7 @@ func (b *Builder) gccgoBuildIDFile(a *Action) (string, error) {
 		fmt.Fprintf(&buf, "%#02x", a.buildID[i])
 	}
 	fmt.Fprintf(&buf, "\n")
-	if cfg.Goos != "solaris" && cfg.Goos != "aix" {
+	if cfg.Goos != "solaris" && cfg.Goos != "illumos" && cfg.Goos != "aix" {
 		secType := "@progbits"
 		if cfg.Goarch == "arm" {
 			secType = "%progbits"
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
index d1a529d1e68..cb380d17025 100644
--- a/src/cmd/go/internal/work/exec.go
+++ b/src/cmd/go/internal/work/exec.go
@@ -713,7 +713,7 @@ func (b *Builder) build(a *Action) (err error) {
 	// This is read by readGccgoArchive in cmd/internal/buildid/buildid.go.
 	if a.buildID != "" && cfg.BuildToolchainName == "gccgo" {
 		switch cfg.Goos {
-		case "aix", "android", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+		case "aix", "android", "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
 			asmfile, err := b.gccgoBuildIDFile(a)
 			if err != nil {
 				return err
diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go
index d60295ce53c..35d3a505cc7 100644
--- a/src/cmd/go/internal/work/init.go
+++ b/src/cmd/go/internal/work/init.go
@@ -95,7 +95,7 @@ func buildModeInit() {
 				codegenArg = "-shared"
 			default:
 				switch cfg.Goos {
-				case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+				case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
 					if platform == "linux/ppc64" {
 						base.Fatalf("-buildmode=c-archive not supported on %s\n", platform)
 					}
diff --git a/src/cmd/internal/objabi/head.go b/src/cmd/internal/objabi/head.go
index db2221d6b14..0a542282284 100644
--- a/src/cmd/internal/objabi/head.go
+++ b/src/cmd/internal/objabi/head.go
@@ -73,7 +73,7 @@ func (h *HeadType) Set(s string) error {
 		*h = Hopenbsd
 	case "plan9":
 		*h = Hplan9
-	case "solaris":
+	case "illumos", "solaris":
 		*h = Hsolaris
 	case "windows":
 		*h = Hwindows
diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go
index 333680511ab..f6ed8d3401a 100644
--- a/src/cmd/link/internal/ld/dwarf_test.go
+++ b/src/cmd/link/internal/ld/dwarf_test.go
@@ -574,8 +574,8 @@ func TestInlinedRoutineRecords(t *testing.T) {
 	if runtime.GOOS == "plan9" {
 		t.Skip("skipping on plan9; no DWARF symbol table in executables")
 	}
-	if runtime.GOOS == "solaris" || runtime.GOOS == "darwin" {
-		t.Skip("skipping on solaris and darwin, pending resolution of issue #23168")
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "darwin" {
+		t.Skip("skipping on solaris, illumos, and darwin, pending resolution of issue #23168")
 	}
 
 	t.Parallel()
@@ -801,8 +801,8 @@ func TestAbstractOriginSanity(t *testing.T) {
 	if runtime.GOOS == "plan9" {
 		t.Skip("skipping on plan9; no DWARF symbol table in executables")
 	}
-	if runtime.GOOS == "solaris" || runtime.GOOS == "darwin" {
-		t.Skip("skipping on solaris and darwin, pending resolution of issue #23168")
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "darwin" {
+		t.Skip("skipping on solaris, illumos, and darwin, pending resolution of issue #23168")
 	}
 
 	if wd, err := os.Getwd(); err == nil {
@@ -819,8 +819,8 @@ func TestAbstractOriginSanityIssue25459(t *testing.T) {
 	if runtime.GOOS == "plan9" {
 		t.Skip("skipping on plan9; no DWARF symbol table in executables")
 	}
-	if runtime.GOOS == "solaris" || runtime.GOOS == "darwin" {
-		t.Skip("skipping on solaris and darwin, pending resolution of issue #23168")
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "darwin" {
+		t.Skip("skipping on solaris, illumos, and darwin, pending resolution of issue #23168")
 	}
 	if runtime.GOARCH != "amd64" && runtime.GOARCH != "x86" {
 		t.Skip("skipping on not-amd64 not-x86; location lists not supported")
@@ -840,8 +840,8 @@ func TestAbstractOriginSanityIssue26237(t *testing.T) {
 	if runtime.GOOS == "plan9" {
 		t.Skip("skipping on plan9; no DWARF symbol table in executables")
 	}
-	if runtime.GOOS == "solaris" || runtime.GOOS == "darwin" {
-		t.Skip("skipping on solaris and darwin, pending resolution of issue #23168")
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "darwin" {
+		t.Skip("skipping on solaris, illumos, and darwin, pending resolution of issue #23168")
 	}
 	if wd, err := os.Getwd(); err == nil {
 		gopathdir := filepath.Join(wd, "testdata", "issue26237")
diff --git a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go
index 723b7f10127..a79565a7ff5 100644
--- a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go
+++ b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go
@@ -21,9 +21,9 @@ func cmsgAlignOf(salen int) int {
 	case "aix":
 		// There is no alignment on AIX.
 		salign = 1
-	case "darwin", "dragonfly", "solaris":
-		// NOTE: It seems like 64-bit Darwin, DragonFly BSD and
-		// Solaris kernels still require 32-bit aligned access to
+	case "darwin", "dragonfly", "solaris", "illumos":
+		// NOTE: It seems like 64-bit Darwin, DragonFly BSD, illumos,
+		// and Solaris kernels still require 32-bit aligned access to
 		// network subsystem.
 		if SizeofPtr == 8 {
 			salign = 4
diff --git a/src/cmd/vet/all/whitelist/illumos_amd64.txt b/src/cmd/vet/all/whitelist/illumos_amd64.txt
new file mode 100644
index 00000000000..4525c03cd79
--- /dev/null
+++ b/src/cmd/vet/all/whitelist/illumos_amd64.txt
@@ -0,0 +1,6 @@
+// illumos/amd64-specific vet whitelist. See readme.txt for details.
+
+runtime/sys_solaris_amd64.s: [amd64] settls: function settls missing Go declaration
+runtime/sys_solaris_amd64.s: [amd64] pipe1: function pipe1 missing Go declaration
+runtime/sys_solaris_amd64.s: [amd64] asmsysvicall6: function asmsysvicall6 missing Go declaration
+runtime/sys_solaris_amd64.s: [amd64] usleep2: function usleep2 missing Go declaration
diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go
index d21f0e24a83..ef644f8454b 100644
--- a/src/debug/gosym/pclntab_test.go
+++ b/src/debug/gosym/pclntab_test.go
@@ -55,7 +55,7 @@ func endtest() {
 // These tests open and examine the test binary, and use elf.Open to do so.
 func skipIfNotELF(t *testing.T) {
 	switch runtime.GOOS {
-	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+	case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
 		// OK.
 	default:
 		t.Skipf("skipping on non-ELF system %s", runtime.GOOS)
diff --git a/src/go/build/build.go b/src/go/build/build.go
index 1ad076089db..a91551bc22c 100644
--- a/src/go/build/build.go
+++ b/src/go/build/build.go
@@ -1685,6 +1685,9 @@ func (ctxt *Context) match(name string, allTags map[string]bool) bool {
 	if ctxt.GOOS == "android" && name == "linux" {
 		return true
 	}
+	if ctxt.GOOS == "illumos" && name == "solaris" {
+		return true
+	}
 
 	// other tags
 	for _, tag := range ctxt.BuildTags {
diff --git a/src/go/build/doc.go b/src/go/build/doc.go
index 7b044bc8381..703825a45d7 100644
--- a/src/go/build/doc.go
+++ b/src/go/build/doc.go
@@ -147,6 +147,9 @@
 // Using GOOS=android matches build tags and files as for GOOS=linux
 // in addition to android tags and files.
 //
+// Using GOOS=illumos matches build tags and files as for GOOS=solaris
+// in addition to illumos tags and files.
+//
 // Binary-Only Packages
 //
 // In Go 1.12 and earlier, it was possible to distribute packages in binary
diff --git a/src/go/build/syslist.go b/src/go/build/syslist.go
index d13fe9c4f99..197c646d5c0 100644
--- a/src/go/build/syslist.go
+++ b/src/go/build/syslist.go
@@ -4,5 +4,5 @@
 
 package build
 
-const goosList = "aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9 solaris windows zos "
+const goosList = "aix android darwin dragonfly freebsd hurd illumos js linux nacl netbsd openbsd plan9 solaris windows zos "
 const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm "
diff --git a/src/net/error_test.go b/src/net/error_test.go
index b0622d7fd5b..c4fee5aa5e5 100644
--- a/src/net/error_test.go
+++ b/src/net/error_test.go
@@ -185,7 +185,7 @@ func TestDialError(t *testing.T) {
 
 func TestProtocolDialError(t *testing.T) {
 	switch runtime.GOOS {
-	case "nacl", "solaris":
+	case "nacl", "solaris", "illumos":
 		t.Skipf("not supported on %s", runtime.GOOS)
 	}
 
diff --git a/src/net/fd_unix.go b/src/net/fd_unix.go
index e7ab9a45fd6..dbe4a511ec8 100644
--- a/src/net/fd_unix.go
+++ b/src/net/fd_unix.go
@@ -81,12 +81,12 @@ func (fd *netFD) connect(ctx context.Context, la, ra syscall.Sockaddr) (rsa sysc
 		runtime.KeepAlive(fd)
 		return nil, nil
 	case syscall.EINVAL:
-		// On Solaris we can see EINVAL if the socket has
-		// already been accepted and closed by the server.
-		// Treat this as a successful connection--writes to
-		// the socket will see EOF.  For details and a test
-		// case in C see https://golang.org/issue/6828.
-		if runtime.GOOS == "solaris" {
+		// On Solaris and illumos we can see EINVAL if the socket has
+		// already been accepted and closed by the server.  Treat this
+		// as a successful connection--writes to the socket will see
+		// EOF.  For details and a test case in C see
+		// https://golang.org/issue/6828.
+		if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" {
 			return nil, nil
 		}
 		fallthrough
diff --git a/src/net/interface_test.go b/src/net/interface_test.go
index c6b514abcec..fb6032fbc06 100644
--- a/src/net/interface_test.go
+++ b/src/net/interface_test.go
@@ -61,7 +61,7 @@ func TestInterfaces(t *testing.T) {
 			t.Fatal(err)
 		}
 		switch runtime.GOOS {
-		case "solaris":
+		case "solaris", "illumos":
 			if ifxi.Index != ifi.Index {
 				t.Errorf("got %v; want %v", ifxi, ifi)
 			}
@@ -278,7 +278,7 @@ func checkUnicastStats(ifStats *ifStats, uniStats *routeStats) error {
 
 func checkMulticastStats(ifStats *ifStats, uniStats, multiStats *routeStats) error {
 	switch runtime.GOOS {
-	case "aix", "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris":
+	case "aix", "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris", "illumos":
 	default:
 		// Test the existence of connected multicast route
 		// clones for IPv4. Unlike IPv6, IPv4 multicast
diff --git a/src/net/listen_test.go b/src/net/listen_test.go
index 6c9b92a9fc5..fef2b6405fa 100644
--- a/src/net/listen_test.go
+++ b/src/net/listen_test.go
@@ -534,8 +534,8 @@ func TestIPv4MulticastListener(t *testing.T) {
 	switch runtime.GOOS {
 	case "android", "nacl", "plan9":
 		t.Skipf("not supported on %s", runtime.GOOS)
-	case "solaris":
-		t.Skipf("not supported on solaris, see golang.org/issue/7399")
+	case "solaris", "illumos":
+		t.Skipf("not supported on solaris or illumos, see golang.org/issue/7399")
 	}
 	if !supportsIPv4() {
 		t.Skip("IPv4 is not supported")
@@ -609,8 +609,8 @@ func TestIPv6MulticastListener(t *testing.T) {
 	switch runtime.GOOS {
 	case "plan9":
 		t.Skipf("not supported on %s", runtime.GOOS)
-	case "solaris":
-		t.Skipf("not supported on solaris, see issue 7399")
+	case "solaris", "illumos":
+		t.Skipf("not supported on solaris or illumos, see issue 7399")
 	}
 	if !supportsIPv6() {
 		t.Skip("IPv6 is not supported")
@@ -674,7 +674,7 @@ func checkMulticastListener(c *UDPConn, ip IP) error {
 
 func multicastRIBContains(ip IP) (bool, error) {
 	switch runtime.GOOS {
-	case "aix", "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "windows":
+	case "aix", "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "illumos", "windows":
 		return true, nil // not implemented yet
 	case "linux":
 		if runtime.GOARCH == "arm" || runtime.GOARCH == "alpha" {
diff --git a/src/net/tcpsock_test.go b/src/net/tcpsock_test.go
index 36d2ccb09a9..f78675b185d 100644
--- a/src/net/tcpsock_test.go
+++ b/src/net/tcpsock_test.go
@@ -651,7 +651,7 @@ func TestTCPSelfConnect(t *testing.T) {
 		n = 1000
 	}
 	switch runtime.GOOS {
-	case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "solaris", "windows":
+	case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "illumos", "solaris", "windows":
 		// Non-Linux systems take a long time to figure
 		// out that there is nothing listening on localhost.
 		n = 100
diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go
index a157810eedf..f9d73060a3d 100644
--- a/src/os/exec/exec_test.go
+++ b/src/os/exec/exec_test.go
@@ -831,7 +831,7 @@ func TestHelperProcess(*testing.T) {
 			// the cloned file descriptors that result from opening
 			// /dev/urandom.
 			// https://golang.org/issue/3955
-		case "solaris":
+		case "illumos", "solaris":
 			// TODO(aram): This fails on Solaris because libc opens
 			// its own files, as it sees fit. Darwin does the same,
 			// see: https://golang.org/issue/2603
diff --git a/src/os/os_test.go b/src/os/os_test.go
index b7e26f47b71..b6bbba287fd 100644
--- a/src/os/os_test.go
+++ b/src/os/os_test.go
@@ -2226,8 +2226,8 @@ func TestPipeThreads(t *testing.T) {
 	switch runtime.GOOS {
 	case "freebsd":
 		t.Skip("skipping on FreeBSD; issue 19093")
-	case "solaris":
-		t.Skip("skipping on Solaris; issue 19111")
+	case "illumos", "solaris":
+		t.Skip("skipping on Solaris and illumos; issue 19111")
 	case "windows":
 		t.Skip("skipping on Windows; issue 19098")
 	case "plan9":
diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go
index 96e0fc5a55e..4d556f977e4 100644
--- a/src/os/removeall_test.go
+++ b/src/os/removeall_test.go
@@ -159,7 +159,7 @@ func TestRemoveAllLarge(t *testing.T) {
 
 func TestRemoveAllLongPath(t *testing.T) {
 	switch runtime.GOOS {
-	case "aix", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+	case "aix", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "illumos", "solaris":
 		break
 	default:
 		t.Skip("skipping for not implemented platforms")
diff --git a/src/os/user/user_test.go b/src/os/user/user_test.go
index eeb24dd0e00..8c4c817c2b6 100644
--- a/src/os/user/user_test.go
+++ b/src/os/user/user_test.go
@@ -132,7 +132,7 @@ func TestGroupIds(t *testing.T) {
 	if runtime.GOOS == "aix" {
 		t.Skip("skipping GroupIds, see golang.org/issue/30563")
 	}
-	if runtime.GOOS == "solaris" {
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" {
 		t.Skip("skipping GroupIds, see golang.org/issue/14709")
 	}
 	user, err := Current()
diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s
index 1cca0c794bf..2807f4c2384 100644
--- a/src/runtime/asm_amd64.s
+++ b/src/runtime/asm_amd64.s
@@ -171,6 +171,10 @@ needtls:
 	// skip TLS setup on Solaris
 	JMP ok
 #endif
+#ifdef GOOS_illumos
+	// skip TLS setup on illumos
+	JMP ok
+#endif
 #ifdef GOOS_darwin
 	// skip TLS setup on Darwin
 	JMP ok
diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go
index 123607247a1..a881ae14898 100644
--- a/src/runtime/cgocall.go
+++ b/src/runtime/cgocall.go
@@ -92,7 +92,7 @@ type cgoCallers [32]uintptr
 // Call from Go to C.
 //go:nosplit
 func cgocall(fn, arg unsafe.Pointer) int32 {
-	if !iscgo && GOOS != "solaris" && GOOS != "windows" {
+	if !iscgo && GOOS != "solaris" && GOOS != "illumos" && GOOS != "windows" {
 		throw("cgocall unavailable")
 	}
 
diff --git a/src/runtime/crash_unix_test.go b/src/runtime/crash_unix_test.go
index 987c7095a03..14f418cf971 100644
--- a/src/runtime/crash_unix_test.go
+++ b/src/runtime/crash_unix_test.go
@@ -35,7 +35,7 @@ func init() {
 
 func TestCrashDumpsAllThreads(t *testing.T) {
 	switch runtime.GOOS {
-	case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+	case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "illumos", "solaris":
 	default:
 		t.Skipf("skipping; not supported on %v", runtime.GOOS)
 	}
diff --git a/src/runtime/internal/sys/gengoos.go b/src/runtime/internal/sys/gengoos.go
index d0789218747..952b13649d6 100644
--- a/src/runtime/internal/sys/gengoos.go
+++ b/src/runtime/internal/sys/gengoos.go
@@ -49,6 +49,9 @@ func main() {
 		if target == "linux" {
 			fmt.Fprintf(&buf, "// +build !android\n") // must explicitly exclude android for linux
 		}
+		if target == "solaris" {
+			fmt.Fprintf(&buf, "// +build !illumos\n") // must explicitly exclude illumos for solaris
+		}
 		fmt.Fprintf(&buf, "// +build %s\n\n", target) // must explicitly include target for bootstrapping purposes
 		fmt.Fprintf(&buf, "package sys\n\n")
 		fmt.Fprintf(&buf, "const GOOS = `%s`\n\n", target)
diff --git a/src/runtime/internal/sys/zgoos_aix.go b/src/runtime/internal/sys/zgoos_aix.go
index 909bfc5e934..d97485c43cb 100644
--- a/src/runtime/internal/sys/zgoos_aix.go
+++ b/src/runtime/internal/sys/zgoos_aix.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_android.go b/src/runtime/internal/sys/zgoos_android.go
index 434ce46712d..eec970b0647 100644
--- a/src/runtime/internal/sys/zgoos_android.go
+++ b/src/runtime/internal/sys/zgoos_android.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_darwin.go b/src/runtime/internal/sys/zgoos_darwin.go
index b645d1cf5fd..c40819ee559 100644
--- a/src/runtime/internal/sys/zgoos_darwin.go
+++ b/src/runtime/internal/sys/zgoos_darwin.go
@@ -12,6 +12,7 @@ const GoosDarwin = 1
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_dragonfly.go b/src/runtime/internal/sys/zgoos_dragonfly.go
index 154cec370fe..3dc4edcc31b 100644
--- a/src/runtime/internal/sys/zgoos_dragonfly.go
+++ b/src/runtime/internal/sys/zgoos_dragonfly.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 1
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_freebsd.go b/src/runtime/internal/sys/zgoos_freebsd.go
index 5f41c034450..6c98b342f9c 100644
--- a/src/runtime/internal/sys/zgoos_freebsd.go
+++ b/src/runtime/internal/sys/zgoos_freebsd.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 1
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_hurd.go b/src/runtime/internal/sys/zgoos_hurd.go
index 53f7fc384bf..d6dcc7bad45 100644
--- a/src/runtime/internal/sys/zgoos_hurd.go
+++ b/src/runtime/internal/sys/zgoos_hurd.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 1
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_illumos.go b/src/runtime/internal/sys/zgoos_illumos.go
new file mode 100644
index 00000000000..17f4ecc34ed
--- /dev/null
+++ b/src/runtime/internal/sys/zgoos_illumos.go
@@ -0,0 +1,24 @@
+// Code generated by gengoos.go using 'go generate'. DO NOT EDIT.
+
+// +build illumos
+
+package sys
+
+const GOOS = `illumos`
+
+const GoosAix = 0
+const GoosAndroid = 0
+const GoosDarwin = 0
+const GoosDragonfly = 0
+const GoosFreebsd = 0
+const GoosHurd = 0
+const GoosIllumos = 1
+const GoosJs = 0
+const GoosLinux = 0
+const GoosNacl = 0
+const GoosNetbsd = 0
+const GoosOpenbsd = 0
+const GoosPlan9 = 0
+const GoosSolaris = 0
+const GoosWindows = 0
+const GoosZos = 0
diff --git a/src/runtime/internal/sys/zgoos_js.go b/src/runtime/internal/sys/zgoos_js.go
index c6cca49bd9b..74c9943d9bf 100644
--- a/src/runtime/internal/sys/zgoos_js.go
+++ b/src/runtime/internal/sys/zgoos_js.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 1
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_linux.go b/src/runtime/internal/sys/zgoos_linux.go
index 088dbc105b0..1d5fcb06856 100644
--- a/src/runtime/internal/sys/zgoos_linux.go
+++ b/src/runtime/internal/sys/zgoos_linux.go
@@ -13,6 +13,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 1
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_nacl.go b/src/runtime/internal/sys/zgoos_nacl.go
index 65bec4af9e8..9e65b6f1855 100644
--- a/src/runtime/internal/sys/zgoos_nacl.go
+++ b/src/runtime/internal/sys/zgoos_nacl.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 1
diff --git a/src/runtime/internal/sys/zgoos_netbsd.go b/src/runtime/internal/sys/zgoos_netbsd.go
index 93d0fa7e113..194fa6e4326 100644
--- a/src/runtime/internal/sys/zgoos_netbsd.go
+++ b/src/runtime/internal/sys/zgoos_netbsd.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_openbsd.go b/src/runtime/internal/sys/zgoos_openbsd.go
index 79193593f5c..21086916799 100644
--- a/src/runtime/internal/sys/zgoos_openbsd.go
+++ b/src/runtime/internal/sys/zgoos_openbsd.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_plan9.go b/src/runtime/internal/sys/zgoos_plan9.go
index 2b95e080801..e632a90b2e0 100644
--- a/src/runtime/internal/sys/zgoos_plan9.go
+++ b/src/runtime/internal/sys/zgoos_plan9.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_solaris.go b/src/runtime/internal/sys/zgoos_solaris.go
index 6e3988aed0c..67b2ffbfcd9 100644
--- a/src/runtime/internal/sys/zgoos_solaris.go
+++ b/src/runtime/internal/sys/zgoos_solaris.go
@@ -1,5 +1,6 @@
 // Code generated by gengoos.go using 'go generate'. DO NOT EDIT.
 
+// +build !illumos
 // +build solaris
 
 package sys
@@ -12,6 +13,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_windows.go b/src/runtime/internal/sys/zgoos_windows.go
index a56e12544a4..cf2d6f4fb08 100644
--- a/src/runtime/internal/sys/zgoos_windows.go
+++ b/src/runtime/internal/sys/zgoos_windows.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/internal/sys/zgoos_zos.go b/src/runtime/internal/sys/zgoos_zos.go
index 0f56e460025..e5d79accb4c 100644
--- a/src/runtime/internal/sys/zgoos_zos.go
+++ b/src/runtime/internal/sys/zgoos_zos.go
@@ -12,6 +12,7 @@ const GoosDarwin = 0
 const GoosDragonfly = 0
 const GoosFreebsd = 0
 const GoosHurd = 0
+const GoosIllumos = 0
 const GoosJs = 0
 const GoosLinux = 0
 const GoosNacl = 0
diff --git a/src/runtime/mem_bsd.go b/src/runtime/mem_bsd.go
index cc70e806ead..3977e4ae9ef 100644
--- a/src/runtime/mem_bsd.go
+++ b/src/runtime/mem_bsd.go
@@ -56,7 +56,7 @@ func sysMap(v unsafe.Pointer, n uintptr, sysStat *uint64) {
 	mSysStatInc(sysStat, n)
 
 	p, err := mmap(v, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE, -1, 0)
-	if err == _ENOMEM || (GOOS == "solaris" && err == _sunosEAGAIN) {
+	if err == _ENOMEM || ((GOOS == "solaris" || GOOS == "illumos") && err == _sunosEAGAIN) {
 		throw("runtime: out of memory")
 	}
 	if p != v || err != 0 {
diff --git a/src/runtime/netpoll.go b/src/runtime/netpoll.go
index 0de67c63e75..73bbc5e3c7b 100644
--- a/src/runtime/netpoll.go
+++ b/src/runtime/netpoll.go
@@ -177,8 +177,8 @@ func poll_runtime_pollWait(pd *pollDesc, mode int) int {
 	if err != 0 {
 		return err
 	}
-	// As for now only Solaris and AIX use level-triggered IO.
-	if GOOS == "solaris" || GOOS == "aix" {
+	// As for now only Solaris, illumos, and AIX use level-triggered IO.
+	if GOOS == "solaris" || GOOS == "illumos" || GOOS == "aix" {
 		netpollarm(pd, mode)
 	}
 	for !netpollblock(pd, int32(mode), false) {
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index 39d171bd182..59dee268678 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -191,7 +191,7 @@ func testCPUProfile(t *testing.T, matches matchFunc, need []string, avoid []stri
 	}
 
 	switch runtime.GOOS {
-	case "darwin", "dragonfly", "netbsd", "solaris":
+	case "darwin", "dragonfly", "netbsd", "illumos", "solaris":
 		t.Skipf("ignoring failure on %s; see golang.org/issue/13841", runtime.GOOS)
 	case "openbsd":
 		if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index b8ee616eaa4..035b71011f7 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -486,7 +486,7 @@ func cpuinit() {
 	var env string
 
 	switch GOOS {
-	case "aix", "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "solaris", "linux":
+	case "aix", "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "illumos", "solaris", "linux":
 		cpu.DebugOptions = true
 
 		// Similar to goenv_unix but extracts the environment value for
@@ -638,7 +638,7 @@ func mcommoninit(mp *m) {
 	unlock(&sched.lock)
 
 	// Allocate memory to hold a cgo traceback if the cgo call crashes.
-	if iscgo || GOOS == "solaris" || GOOS == "windows" {
+	if iscgo || GOOS == "solaris" || GOOS == "illumos" || GOOS == "windows" {
 		mp.cgoCallers = new(cgoCallers)
 	}
 }
@@ -1167,8 +1167,8 @@ func mstart() {
 	mstart1()
 
 	// Exit this thread.
-	if GOOS == "windows" || GOOS == "solaris" || GOOS == "plan9" || GOOS == "darwin" || GOOS == "aix" {
-		// Window, Solaris, Darwin, AIX and Plan 9 always system-allocate
+	if GOOS == "windows" || GOOS == "solaris" || GOOS == "illumos" || GOOS == "plan9" || GOOS == "darwin" || GOOS == "aix" {
+		// Windows, Solaris, illumos, Darwin, AIX and Plan 9 always system-allocate
 		// the stack, but put it in _g_.stack before mstart,
 		// so the logic above hasn't set osStack yet.
 		osStack = true
@@ -1488,9 +1488,9 @@ func allocm(_p_ *p, fn func()) *m {
 	mp.mstartfn = fn
 	mcommoninit(mp)
 
-	// In case of cgo or Solaris or Darwin, pthread_create will make us a stack.
+	// In case of cgo or Solaris or illumos or Darwin, pthread_create will make us a stack.
 	// Windows and Plan 9 will layout sched stack on OS stack.
-	if iscgo || GOOS == "solaris" || GOOS == "windows" || GOOS == "plan9" || GOOS == "darwin" {
+	if iscgo || GOOS == "solaris" || GOOS == "illumos" || GOOS == "windows" || GOOS == "plan9" || GOOS == "darwin" {
 		mp.g0 = malg(-1)
 	} else {
 		mp.g0 = malg(8192 * sys.StackGuardMultiplier)
@@ -3747,7 +3747,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
 		// Normal traceback is impossible or has failed.
 		// See if it falls into several common cases.
 		n = 0
-		if (GOOS == "windows" || GOOS == "solaris" || GOOS == "darwin" || GOOS == "aix") && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 {
+		if (GOOS == "windows" || GOOS == "solaris" || GOOS == "illumos" || GOOS == "darwin" || GOOS == "aix") && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 {
 			// Libcall, i.e. runtime syscall on windows.
 			// Collect Go stack that leads to the call.
 			n = gentraceback(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), 0, &stk[0], len(stk), nil, nil, 0)
diff --git a/src/runtime/rt0_illumos_amd64.s b/src/runtime/rt0_illumos_amd64.s
new file mode 100644
index 00000000000..54d35b77966
--- /dev/null
+++ b/src/runtime/rt0_illumos_amd64.s
@@ -0,0 +1,11 @@
+// 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 "textflag.h"
+
+TEXT _rt0_amd64_illumos(SB),NOSPLIT,$-8
+	JMP	_rt0_amd64(SB)
+
+TEXT _rt0_amd64_illumos_lib(SB),NOSPLIT,$0
+	JMP	_rt0_amd64_lib(SB)
diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go
index 4421c449cff..b3798b6e04e 100644
--- a/src/syscall/exec_unix.go
+++ b/src/syscall/exec_unix.go
@@ -275,8 +275,8 @@ func Exec(argv0 string, argv []string, envv []string) (err error) {
 	runtime_BeforeExec()
 
 	var err1 error
-	if runtime.GOOS == "solaris" || runtime.GOOS == "aix" {
-		// RawSyscall should never be used on Solaris or AIX.
+	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "aix" {
+		// RawSyscall should never be used on Solaris, illumos, or AIX.
 		err1 = execveLibc(
 			uintptr(unsafe.Pointer(argv0p)),
 			uintptr(unsafe.Pointer(&argvp[0])),
diff --git a/src/syscall/sockcmsg_unix.go b/src/syscall/sockcmsg_unix.go
index fd5bfaf5494..71efd464707 100644
--- a/src/syscall/sockcmsg_unix.go
+++ b/src/syscall/sockcmsg_unix.go
@@ -21,7 +21,7 @@ func cmsgAlignOf(salen int) int {
 	case "aix":
 		// There is no alignment on AIX.
 		salign = 1
-	case "darwin", "dragonfly", "solaris":
+	case "darwin", "dragonfly", "illumos", "solaris":
 		// NOTE: It seems like 64-bit Darwin, DragonFly BSD and
 		// Solaris kernels still require 32-bit aligned access to
 		// network subsystem.
diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go
index f73f55462af..faaa4321360 100644
--- a/src/syscall/syscall_unix.go
+++ b/src/syscall/syscall_unix.go
@@ -25,6 +25,7 @@ const (
 	dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8
 	netbsd32Bit    = runtime.GOOS == "netbsd" && sizeofPtr == 4
 	solaris64Bit   = runtime.GOOS == "solaris" && sizeofPtr == 8
+	illumos64Bit   = runtime.GOOS == "illumos" && sizeofPtr == 8
 )
 
 func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
-- 
GitLab