diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go
index b27d3aac4de032fc4f7154e8d93592e4dfcaf6d2..49f4a5e6a7d6a8d31dc4bb9cf2dfc6c96c98f78c 100644
--- a/src/cmd/dist/build.go
+++ b/src/cmd/dist/build.go
@@ -87,6 +87,7 @@ var okgoos = []string{
 	"openbsd",
 	"plan9",
 	"windows",
+	"aix",
 }
 
 // find reports the first index of p in l[0:n], or else -1.
@@ -1388,6 +1389,7 @@ func checkNotStale(goBinary string, targets ...string) {
 // single point of truth for supported platforms. This list is used
 // by 'go tool dist list'.
 var cgoEnabled = map[string]bool{
+	"aix/ppc64":       false,
 	"darwin/386":      true,
 	"darwin/amd64":    true,
 	"darwin/arm":      true,
diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go
index acf2230cb4927d4c379171e76550b4f7b50c255d..10d1552c944d27bdf53473e2925c6f9574b74b95 100644
--- a/src/cmd/dist/buildruntime.go
+++ b/src/cmd/dist/buildruntime.go
@@ -87,6 +87,10 @@ func mkzbootstrap(file string) {
 // stack guard size. Larger multipliers are used for non-optimized
 // builds that have larger stack frames.
 func stackGuardMultiplier() int {
+	// On AIX, a larger stack is needed for syscalls
+	if goos == "aix" {
+		return 2
+	}
 	for _, s := range strings.Split(os.Getenv("GO_GCFLAGS"), " ") {
 		if s == "-N" {
 			return 2
diff --git a/src/cmd/dist/main.go b/src/cmd/dist/main.go
index 37e37e2733566a44433df976954a1f1366c8b9a1..bf08869afb7f2565bfa0c72f08ba2d10f3e49f79 100644
--- a/src/cmd/dist/main.go
+++ b/src/cmd/dist/main.go
@@ -81,6 +81,9 @@ func main() {
 		}
 	case "windows":
 		exe = ".exe"
+	case "aix":
+		// uname -m doesn't work under AIX
+		gohostarch = "ppc64"
 	}
 
 	sysinit()
diff --git a/src/cmd/internal/objabi/head.go b/src/cmd/internal/objabi/head.go
index 23c7b62daf62062584eb5dd1393b39b1a98288db..db2221d6b145e1cddb162bb4f495899739802177 100644
--- a/src/cmd/internal/objabi/head.go
+++ b/src/cmd/internal/objabi/head.go
@@ -48,10 +48,13 @@ const (
 	Hplan9
 	Hsolaris
 	Hwindows
+	Haix
 )
 
 func (h *HeadType) Set(s string) error {
 	switch s {
+	case "aix":
+		*h = Haix
 	case "darwin":
 		*h = Hdarwin
 	case "dragonfly":
@@ -82,6 +85,8 @@ func (h *HeadType) Set(s string) error {
 
 func (h *HeadType) String() string {
 	switch *h {
+	case Haix:
+		return "aix"
 	case Hdarwin:
 		return "darwin"
 	case Hdragonfly:
diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go
index 24dfafd7bf67a1af7b19bc8babaf7ab6b1d0e7a8..7e4a68101f045786501776336325b17d6b01a39f 100644
--- a/src/cmd/vet/all/main.go
+++ b/src/cmd/vet/all/main.go
@@ -204,6 +204,12 @@ func (p platform) vet() {
 		return
 	}
 
+	if p.os == "aix" && p.arch == "ppc64" {
+		// TODO(aix): enable as soon as the aix/ppc64 port has fully landed
+		fmt.Println("skipping aix/ppc64")
+		return
+	}
+
 	var buf bytes.Buffer
 	fmt.Fprintf(&buf, "go run main.go -p %s\n", p)