diff --git a/client/llb/state.go b/client/llb/state.go index ff50af501..7d35f3be5 100644 --- a/client/llb/state.go +++ b/client/llb/state.go @@ -617,6 +617,7 @@ var ( LinuxArmel = Platform(ocispecs.Platform{OS: "linux", Architecture: "arm", Variant: "v6"}) LinuxArm64 = Platform(ocispecs.Platform{OS: "linux", Architecture: "arm64"}) LinuxS390x = Platform(ocispecs.Platform{OS: "linux", Architecture: "s390x"}) + LinuxPpc64 = Platform(ocispecs.Platform{OS: "linux", Architecture: "ppc64"}) LinuxPpc64le = Platform(ocispecs.Platform{OS: "linux", Architecture: "ppc64le"}) Darwin = Platform(ocispecs.Platform{OS: "darwin", Architecture: "amd64"}) Windows = Platform(ocispecs.Platform{OS: "windows", Architecture: "amd64"}) diff --git a/solver/llbsolver/ops/exec_binfmt.go b/solver/llbsolver/ops/exec_binfmt.go index 829e84205..c2c5504cc 100644 --- a/solver/llbsolver/ops/exec_binfmt.go +++ b/solver/llbsolver/ops/exec_binfmt.go @@ -27,6 +27,7 @@ var qemuArchMap = map[string]string{ "riscv64": "riscv64", "arm": "arm", "s390x": "s390x", + "ppc64": "ppc64", "ppc64le": "ppc64le", "386": "i386", } diff --git a/util/archutil/Dockerfile b/util/archutil/Dockerfile index 9f831b7bf..9f8e59d9d 100644 --- a/util/archutil/Dockerfile +++ b/util/archutil/Dockerfile @@ -36,6 +36,10 @@ FROM base AS exit-s390x COPY fixtures/exit.s390x.s . RUN s390x-linux-gnu-as --noexecstack -o exit.o exit.s390x.s && s390x-linux-gnu-ld -o exit -s exit.o +FROM base AS exit-ppc64 +COPY fixtures/exit.ppc64.s . +RUN powerpc64le-linux-gnu-as -mbig --noexecstack -o exit.o exit.ppc64.s && powerpc64le-linux-gnu-ld -EB -o exit -s exit.o + FROM base AS exit-ppc64le COPY fixtures/exit.ppc64le.s . RUN powerpc64le-linux-gnu-as --noexecstack -o exit.o exit.ppc64le.s && powerpc64le-linux-gnu-ld -o exit -s exit.o @@ -56,12 +60,13 @@ COPY --from=exit-arm64 /src/exit arm64 COPY --from=exit-arm /src/exit arm COPY --from=exit-riscv64 /src/exit riscv64 COPY --from=exit-s390x /src/exit s390x +COPY --from=exit-ppc64 /src/exit ppc64 COPY --from=exit-ppc64le /src/exit ppc64le COPY --from=exit-mips64le /src/exit mips64le COPY --from=exit-mips64 /src/exit mips64 COPY generate.go . -RUN go run generate.go amd64 386 arm64 arm riscv64 s390x ppc64le mips64le mips64 && ls -l +RUN go run generate.go amd64 386 arm64 arm riscv64 s390x ppc64 ppc64le mips64le mips64 && ls -l FROM scratch diff --git a/util/archutil/detect.go b/util/archutil/detect.go index 837b05791..3184f9e54 100644 --- a/util/archutil/detect.go +++ b/util/archutil/detect.go @@ -48,6 +48,11 @@ func SupportedPlatforms(noCache bool) []ocispecs.Platform { arr = append(arr, linux(p)) } } + if p := "ppc64"; def.Architecture != p { + if _, err := ppc64Supported(); err == nil { + arr = append(arr, linux(p)) + } + } if p := "ppc64le"; def.Architecture != p { if _, err := ppc64leSupported(); err == nil { arr = append(arr, linux(p)) @@ -109,6 +114,11 @@ func WarnIfUnsupported(pfs []ocispecs.Platform) { printPlatformWarning(p, err) } } + if p.Architecture == "ppc64" { + if _, err := ppc64Supported(); err != nil { + printPlatformWarning(p, err) + } + } if p.Architecture == "ppc64le" { if _, err := ppc64leSupported(); err != nil { printPlatformWarning(p, err) diff --git a/util/archutil/fixtures/exit.ppc64.s b/util/archutil/fixtures/exit.ppc64.s new file mode 100644 index 000000000..a684306fc --- /dev/null +++ b/util/archutil/fixtures/exit.ppc64.s @@ -0,0 +1,10 @@ + .global _start + .section ".opd","aw" +_start: + .quad .L.start,.TOC.@tocbase,0 + .text + .abiversion 1 +.L.start: + li %r0, 1 + li %r3, 0 + sc diff --git a/util/archutil/ppc64_binary.go b/util/archutil/ppc64_binary.go new file mode 100644 index 000000000..d0c197c20 --- /dev/null +++ b/util/archutil/ppc64_binary.go @@ -0,0 +1,9 @@ +//go:build !ppc64 +// +build !ppc64 + +package archutil + +// This file is generated by running make inside the archutil package. +// Do not edit manually. + +const Binaryppc64 = "\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xd0\xb1\x8a\x13\x51\x14\x06\xe0\xff\x8e\xd9\x45\xd0\x62\x2c\x84\x05\x9b\x3c\x40\x98\x7a\xcb\x14\x6a\x65\xa3\x2f\xa0\x2b\x89\x6c\x23\xca\xee\x14\x76\xfb\xb4\x81\xbc\x45\x24\x93\xc9\x64\x12\x89\xa4\xb0\x92\xef\x83\xdc\x73\x72\x66\x7e\xce\x65\x9e\xde\x7d\x78\x5f\x55\x25\x83\x2a\xaf\x93\x74\x83\xba\x6c\xd6\xfd\x74\xde\x9d\x25\xd3\xee\x9c\xe7\x36\x93\xcc\x73\x95\x49\xff\xee\x55\x46\xea\x93\x9a\x94\xd9\x51\x2d\xc3\x79\xbd\x9b\xef\xf6\xec\xf7\x8d\xf6\xde\x1c\xd5\x92\x2c\xda\xd5\xc7\x43\xee\x62\xf5\xa2\x5d\x7d\x4a\xba\xfb\x5e\xbe\x2f\x29\xb7\xdb\xdf\x97\xe4\xed\xf6\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x27\xea\x94\x69\x57\xab\xa7\xc3\xb0\x79\xbc\x7f\x6c\x1f\xda\xbb\xaf\x69\xda\xe5\xaf\x36\xcd\xf2\xfe\xf3\xb7\x87\xbb\xef\xcb\x34\x3f\x7e\x2e\xfe\xc5\xda\x17\x49\x4a\xdf\x5f\x8f\xef\x91\xa1\xe6\xe5\x49\xe6\xf9\xa8\x7f\x35\xca\x57\x7d\x7e\xd6\xe7\x67\x67\x76\x4e\x46\xfd\x9b\x51\xfe\x59\x97\x2f\x9b\xf5\xee\xef\xbe\xe6\xe6\x2f\xfb\xcb\x3e\xf7\x87\x32\x74\xd3\x73\x4f\x7e\x07\x00\x00\xff\xff\x5e\xe4\x1d\xbd\x60\x01\x01\x00" diff --git a/util/archutil/ppc64_check.go b/util/archutil/ppc64_check.go new file mode 100644 index 000000000..00fe3e16f --- /dev/null +++ b/util/archutil/ppc64_check.go @@ -0,0 +1,8 @@ +//go:build !ppc64 +// +build !ppc64 + +package archutil + +func ppc64Supported() (string, error) { + return check("ppc64", Binaryppc64) +} diff --git a/util/archutil/ppc64_check_ppc64.go b/util/archutil/ppc64_check_ppc64.go new file mode 100644 index 000000000..82e695845 --- /dev/null +++ b/util/archutil/ppc64_check_ppc64.go @@ -0,0 +1,8 @@ +//go:build ppc64 +// +build ppc64 + +package archutil + +func ppc64Supported() (string, error) { + return "", nil +}