unix: extend z/OS support - #282
Conversation
- Adds a ptrace implementation that provides a linux-compatible api as closely as possible - Core ptrace operations are implemented using z/OS's BPX4PTR syscall. Memory operations use PT_READ_BLOCK/PT_WRITE_BLOCK. Register operations use PT_READ_GPR/PT_WRITE_GPR for 64-bit values. - z/OS lacks native single-step support so it is emulated using temporary breakpoints. - Unsupported operations return ENOSYS
Move z/OS LE interaction functions from unix package to runtime package in order to reduce code duplication.
- Changes bpxcall to use R15 instead of R9, reducing register pressure.
|
This PR (HEAD: 63d45cb) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/sys/+/796660. Important tips:
|
|
Message from Gopher Robot: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Gopher Robot: Patch Set 1: Congratulations on opening your first change. Thank you for your contribution! Next steps: Most changes in the Go project go through a few rounds of revision. This can be During May-July and Nov-Jan the Go project is in a code freeze, during which Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 1: Code-Review+1 Commit-Queue+1 (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 1: Dry run: CV is trying the patch. Bot data: {"action":"start","triggered_at":"2026-07-27T16:54:35Z","revision":"4898aa9641dcabb3e92783dc271deb3303703226"} Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 1: -Commit-Queue (Performed by <GERRIT_ACCOUNT_60063> on behalf of <GERRIT_ACCOUNT_11191>) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 1: This CL has passed the run Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 1: LUCI-TryBot-Result+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Joon Lee: Patch Set 2: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 2: Code-Review+1 Commit-Queue+1 (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: Dry run: CV is trying the patch. Bot data: {"action":"start","triggered_at":"2026-08-19T17:21:55Z","revision":"1a660b08175e0e7de1146d7bc1a3eeb8dfda32e1"} Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 2: -Commit-Queue (Performed by <GERRIT_ACCOUNT_60063> on behalf of <GERRIT_ACCOUNT_11191>) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: This CL has failed the run. Reason: Tryjob golang/try/x_sys-go1.27-linux-amd64 has failed with summary (view all results): Error: Additional links for debugging: Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: LUCI-TryBot-Result-1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 2: Commit-Queue+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: Dry run: CV is trying the patch. Bot data: {"action":"start","triggered_at":"2026-08-19T17:30:57Z","revision":"1a660b08175e0e7de1146d7bc1a3eeb8dfda32e1"} Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 2: -Commit-Queue (Performed by <GERRIT_ACCOUNT_60063> on behalf of <GERRIT_ACCOUNT_11191>) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: This CL has passed the run Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 2: LUCI-TryBot-Result+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Joon Lee: Patch Set 2: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Ian Lance Taylor: Patch Set 2: (3 comments) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
ptrace(request, pid, addr, data uintptr) was passing data to ptracePtr as unsafe.Pointer(data). data carries integer values (signal numbers, register indices, byte counts, target-process addresses) — not Go-managed pointers. Converting an arbitrary uintptr to unsafe.Pointer exposes a synthetic pointer to the garbage collector, which can cause it to crash. Bpx4ptr builds a parms array where parms[3] = &data (pointer to the local copy of the data argument), and BPX4PTR dereferences parms[3] to read the value. The original code stored unsafe.Pointer(data_int) into that local, so BPX4PTR correctly received data_int — but the GC could scan the parms array and mistake data_int for a live heap pointer. Fix by inlining the parms array construction and placing &data at parms[3] directly. BPX4PTR still dereferences parms[3] and obtains the original data integer, but the GC now only sees a valid stack pointer. Also ran `gofmt -w` on all z/OS source files (ptrace_zos.go, ptrace_zos_singlestep.go, syscall_zos_test.go, ztypes_zos_s390x.go) which were not properly formatted. Additionally, copyright year for ptrace_zos.go is now up to date.
|
This PR (HEAD: 2723aca) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/sys/+/796660. Important tips:
|
|
Message from Joon Lee: Patch Set 3: (3 comments) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Ian Lance Taylor: Patch Set 3: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
ptrace(), ptracePtr(), and ptracePtrWithBuffer() all passed integer values (signal numbers, register indices, byte counts, target-process addresses) to Bpx4ptr as unsafe.Pointer(integer_value). Converting an arbitrary uintptr to unsafe.Pointer is not valid Go: the garbage collector may treat the integer as a heap pointer, attempt to follow it, and crash or corrupt GC state. The fix is the same in all three functions: inline the parms array that Bpx4ptr would construct internally and place &local at the relevant slot. BPX4PTR dereferences parms[N] to read the value, so it receives the integer unchanged, while the GC only ever sees valid stack pointers. ptrace: &data at parms[3] (data uintptr — signal, etc.) ptracePtr: &addr at parms[2] (addr uintptr — target addr) ptracePtrWithBuffer: &addr at parms[2] (same) Addresses reviewer comments df9098da_8b5b0754 (PS2, line 59) and 588f8ca2_e78c1e4e (PS3, line 92) on CL 796660.
|
This PR (HEAD: 3f3ff24) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/sys/+/796660. Important tips:
|
|
Message from Bill O'Farrell: Patch Set 4: Commit-Queue+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 4: Dry run: CV is trying the patch. Bot data: {"action":"start","triggered_at":"2026-08-25T19:16:04Z","revision":"da5283d9412e18c759551655d358879cd1d26004"} Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Bill O'Farrell: Patch Set 4: -Commit-Queue (Performed by <GERRIT_ACCOUNT_60063> on behalf of <GERRIT_ACCOUNT_11191>) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 4: This CL has passed the run Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from golang-scoped@luci-project-accounts.iam.gserviceaccount.com: Patch Set 4: LUCI-TryBot-Result+1 Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Joon Lee: Patch Set 4: (2 comments) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Ian Lance Taylor: Patch Set 4: Code-Review+1 (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
|
Message from Ian Lance Taylor: Patch Set 4: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/796660. |
This commit adds the z/OS implementation of ptrace as
well as other minor changes: