[runtime] Re-land vdso traceback support with arm64 fixes

This reverts commit d659dafb9e9155ce062a8597bc2194cdcce17f2b, which
reverted 570718fb20e426ee5091b3f512966a5913feac87.

The original change was crashing because it assumed that R21 was not
modified. Syscalls marked as blocking called into
runtime.enter/exitsyscall, which trash R21. This caused the finalizer
code to store 0 in m.vdsoSP to fail (writing to some random place).

This change brings back the original code from
570718fb20e426ee5091b3f512966a5913feac87, adding a fix to grab the M
again after returning from runtime.exitsyscall to store 0 in m.vdsoSP.

Test: Was able to verify Go code crashing often on qemu arm64 in
570718fb20e426ee5091b3f512966a5913feac87, and no longer crashing with
this approach.

Change-Id: Ia44b78d52ef2cfa6d860914cd9a49adcaf1e7b40
diff --git a/src/runtime/mkfuchsiavdso.go b/src/runtime/mkfuchsiavdso.go
index fb0c55b..a695256 100644
--- a/src/runtime/mkfuchsiavdso.go
+++ b/src/runtime/mkfuchsiavdso.go
@@ -150,6 +150,8 @@
 // Zircon system calls for the Fuchsia OS.
 // Generated by mkfuchsia.go, do not edit.
 
+#include "go_asm.h"
+#include "go_tls.h"
 #include "textflag.h"
 #include "funcdata.h"
 
@@ -219,11 +221,12 @@
 		retReg = "AX"
 		suffix8 = "Q"
 		suffix4 = "L"
+		frameSize = 8
 		switch len(def.Args) {
 		case 7:
-			frameSize = 16 + 8
+			frameSize += 16 + 8
 		case 8:
-			frameSize = 16 + 2*8
+			frameSize += 16 + 2*8
 		}
 	case "arm64":
 		regArgs = arm64RegArgs
@@ -239,6 +242,25 @@
 	fmt.Fprint(buf, "\tGO_ARGS\n")
 	fmt.Fprint(buf, "\tNO_LOCAL_POINTERS\n")
 
+	// Set vdso{PC,SP} so that pprof tracebacks work for VDSO calls.
+	switch *arch {
+	case "amd64":
+		fmt.Fprint(buf, "\tget_tls(CX)\n")
+		fmt.Fprint(buf, "\tMOVQ g(CX), AX\n")
+		fmt.Fprint(buf, "\tMOVQ g_m(AX), R14\n")
+		fmt.Fprint(buf, "\tPUSHQ R14\n")
+		fmt.Fprintf(buf, "\tMOVQ %d(SP), DX\n", frameSize+16)
+		fmt.Fprint(buf, "\tMOVQ DX, m_vdsoPC(R14)\n")
+		fmt.Fprintf(buf, "\tLEAQ %d(SP), DX\n", frameSize+16)
+		fmt.Fprint(buf, "\tMOVQ DX, m_vdsoSP(R14)\n")
+	case "arm64":
+		fmt.Fprint(buf, "\tMOVD g_m(g), R21\n")
+		fmt.Fprint(buf, "\tMOVD LR, m_vdsoPC(R21)\n")
+		fmt.Fprint(buf, "\tMOVD RSP, R20\n")
+		fmt.Fprint(buf, "\tMOVD R20, m_vdsoSP(R21)\n")
+		fmt.Fprint(buf, "\tMOVD R21, 8(RSP)\n")
+	}
+
 	if _, ok := blockingSyscalls[def.Name]; ok {
 		fmt.Fprintf(buf, "\tCALL runtime·entersyscall(SB)\n")
 	}
@@ -293,5 +315,14 @@
 	if _, ok := blockingSyscalls[def.Name]; ok {
 		fmt.Fprintf(buf, "\t%s runtime·exitsyscall(SB)\n", callIns)
 	}
+	// Clear vdsoSP. sigprof only checks vdsoSP for generating tracebacks, so we can leave vdsoPC alone.
+	switch *arch {
+	case "amd64":
+		fmt.Fprintf(buf, "\tPOPQ R14\n")
+		fmt.Fprintf(buf, "\tMOVQ $0, m_vdsoSP(R14)\n")
+	case "arm64":
+		fmt.Fprint(buf, "\tMOVD g_m(g), R21\n")
+		fmt.Fprintf(buf, "\tMOVD $0, m_vdsoSP(R21)\n")
+	}
 	fmt.Fprintf(buf, "\tRET\n")
 }
diff --git a/src/runtime/vdsocalls_fuchsia_amd64.s b/src/runtime/vdsocalls_fuchsia_amd64.s
index 3faaa57..70460d7 100644
--- a/src/runtime/vdsocalls_fuchsia_amd64.s
+++ b/src/runtime/vdsocalls_fuchsia_amd64.s
@@ -5,199 +5,389 @@
 // Zircon system calls for the Fuchsia OS.
 // Generated by mkfuchsia.go, do not edit.
 
+#include "go_asm.h"
+#include "go_tls.h"
 #include "textflag.h"
 #include "funcdata.h"
 
 // func vdsoCall_zx_clock_get(clock_id uint32) int64
-TEXT runtime·vdsoCall_zx_clock_get(SB),NOSPLIT,$0-16
+TEXT runtime·vdsoCall_zx_clock_get(SB),NOSPLIT,$8-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL clock_id+0(FP), DI
 	MOVQ vdso_zx_clock_get(SB), AX
 	CALL AX
 	MOVQ AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_clock_get_new(clock_id uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_clock_get_new(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_clock_get_new(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL clock_id+0(FP), DI
 	MOVQ out+8(FP), SI
 	MOVQ vdso_zx_clock_get_new(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_clock_get_monotonic() int64
-TEXT runtime·vdsoCall_zx_clock_get_monotonic(SB),NOSPLIT,$0-8
+TEXT runtime·vdsoCall_zx_clock_get_monotonic(SB),NOSPLIT,$8-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_clock_get_monotonic(SB), AX
 	CALL AX
 	MOVQ AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_nanosleep(deadline int64) int32
-TEXT runtime·vdsoCall_zx_nanosleep(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_nanosleep(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ deadline+0(FP), DI
 	MOVQ vdso_zx_nanosleep(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ticks_get() uint64
-TEXT runtime·vdsoCall_zx_ticks_get(SB),NOSPLIT,$0-8
+TEXT runtime·vdsoCall_zx_ticks_get(SB),NOSPLIT,$8-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_ticks_get(SB), AX
 	CALL AX
 	MOVQ AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ticks_per_second() uint64
-TEXT runtime·vdsoCall_zx_ticks_per_second(SB),NOSPLIT,$0-8
+TEXT runtime·vdsoCall_zx_ticks_per_second(SB),NOSPLIT,$8-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_ticks_per_second(SB), AX
 	CALL AX
 	MOVQ AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_deadline_after(nanoseconds int64) int64
-TEXT runtime·vdsoCall_zx_deadline_after(SB),NOSPLIT,$0-16
+TEXT runtime·vdsoCall_zx_deadline_after(SB),NOSPLIT,$8-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ nanoseconds+0(FP), DI
 	MOVQ vdso_zx_deadline_after(SB), AX
 	CALL AX
 	MOVQ AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_clock_adjust(handle uint32, clock_id uint32, offset int64) int32
-TEXT runtime·vdsoCall_zx_clock_adjust(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_clock_adjust(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL clock_id+4(FP), SI
 	MOVQ offset+8(FP), DX
 	MOVQ vdso_zx_clock_adjust(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_get_dcache_line_size() uint32
-TEXT runtime·vdsoCall_zx_system_get_dcache_line_size(SB),NOSPLIT,$0-4
+TEXT runtime·vdsoCall_zx_system_get_dcache_line_size(SB),NOSPLIT,$8-4
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_system_get_dcache_line_size(SB), AX
 	CALL AX
 	MOVL AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_get_num_cpus() uint32
-TEXT runtime·vdsoCall_zx_system_get_num_cpus(SB),NOSPLIT,$0-4
+TEXT runtime·vdsoCall_zx_system_get_num_cpus(SB),NOSPLIT,$8-4
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_system_get_num_cpus(SB), AX
 	CALL AX
 	MOVL AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_get_version(version unsafe.Pointer, version_size uint) int32
-TEXT runtime·vdsoCall_zx_system_get_version(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_system_get_version(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ version+0(FP), DI
 	MOVQ version_size+8(FP), SI
 	MOVQ vdso_zx_system_get_version(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_get_physmem() uint64
-TEXT runtime·vdsoCall_zx_system_get_physmem(SB),NOSPLIT,$0-8
+TEXT runtime·vdsoCall_zx_system_get_physmem(SB),NOSPLIT,$8-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_system_get_physmem(SB), AX
 	CALL AX
 	MOVQ AX, ret+0(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_get_features(kind uint32, features unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_system_get_features(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_system_get_features(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL kind+0(FP), DI
 	MOVQ features+8(FP), SI
 	MOVQ vdso_zx_system_get_features(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_cache_flush(addr unsafe.Pointer, size uint, options uint32) int32
-TEXT runtime·vdsoCall_zx_cache_flush(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_cache_flush(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ addr+0(FP), DI
 	MOVQ size+8(FP), SI
 	MOVL options+16(FP), DX
 	MOVQ vdso_zx_cache_flush(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_handle_close(handle uint32) int32
-TEXT runtime·vdsoCall_zx_handle_close(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_handle_close(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_handle_close(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_handle_close_many(handles unsafe.Pointer, num_handles uint) int32
-TEXT runtime·vdsoCall_zx_handle_close_many(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_handle_close_many(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ handles+0(FP), DI
 	MOVQ num_handles+8(FP), SI
 	MOVQ vdso_zx_handle_close_many(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_handle_duplicate(handle uint32, rights uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_handle_duplicate(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_handle_duplicate(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL rights+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_handle_duplicate(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_handle_replace(handle uint32, rights uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_handle_replace(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_handle_replace(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL rights+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_handle_replace(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_wait_one(handle uint32, signals uint32, deadline int64, observed unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_object_wait_one(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_object_wait_one(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	CALL runtime·entersyscall(SB)
 	MOVL handle+0(FP), DI
 	MOVL signals+4(FP), SI
@@ -207,12 +397,22 @@
 	CALL AX
 	MOVL AX, ret+24(FP)
 	CALL runtime·exitsyscall(SB)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_wait_many(items unsafe.Pointer, count uint, deadline int64) int32
-TEXT runtime·vdsoCall_zx_object_wait_many(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_object_wait_many(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	CALL runtime·entersyscall(SB)
 	MOVQ items+0(FP), DI
 	MOVQ count+8(FP), SI
@@ -221,12 +421,22 @@
 	CALL AX
 	MOVL AX, ret+24(FP)
 	CALL runtime·exitsyscall(SB)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_wait_async(handle uint32, port uint32, key uint64, signals uint32, options uint32) int32
-TEXT runtime·vdsoCall_zx_object_wait_async(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_object_wait_async(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL port+4(FP), SI
 	MOVQ key+8(FP), DX
@@ -235,36 +445,66 @@
 	MOVQ vdso_zx_object_wait_async(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_signal(handle uint32, clear_mask uint32, set_mask uint32) int32
-TEXT runtime·vdsoCall_zx_object_signal(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_object_signal(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL clear_mask+4(FP), SI
 	MOVL set_mask+8(FP), DX
 	MOVQ vdso_zx_object_signal(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_signal_peer(handle uint32, clear_mask uint32, set_mask uint32) int32
-TEXT runtime·vdsoCall_zx_object_signal_peer(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_object_signal_peer(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL clear_mask+4(FP), SI
 	MOVL set_mask+8(FP), DX
 	MOVQ vdso_zx_object_signal_peer(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_get_property(handle uint32, property uint32, value unsafe.Pointer, value_size uint) int32
-TEXT runtime·vdsoCall_zx_object_get_property(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_object_get_property(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL property+4(FP), SI
 	MOVQ value+8(FP), DX
@@ -272,12 +512,22 @@
 	MOVQ vdso_zx_object_get_property(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_set_property(handle uint32, property uint32, value unsafe.Pointer, value_size uint) int32
-TEXT runtime·vdsoCall_zx_object_set_property(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_object_set_property(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL property+4(FP), SI
 	MOVQ value+8(FP), DX
@@ -285,36 +535,66 @@
 	MOVQ vdso_zx_object_set_property(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_set_cookie(handle uint32, scope uint32, cookie uint64) int32
-TEXT runtime·vdsoCall_zx_object_set_cookie(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_object_set_cookie(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL scope+4(FP), SI
 	MOVQ cookie+8(FP), DX
 	MOVQ vdso_zx_object_set_cookie(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_get_cookie(handle uint32, scope uint32, cookie unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_object_get_cookie(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_object_get_cookie(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL scope+4(FP), SI
 	MOVQ cookie+8(FP), DX
 	MOVQ vdso_zx_object_get_cookie(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_get_info(handle uint32, topic uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer, avail unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_object_get_info(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_object_get_info(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL topic+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -324,12 +604,22 @@
 	MOVQ vdso_zx_object_get_info(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_get_child(handle uint32, koid uint64, rights uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_object_get_child(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_object_get_child(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ koid+8(FP), SI
 	MOVL rights+16(FP), DX
@@ -337,36 +627,66 @@
 	MOVQ vdso_zx_object_get_child(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_object_set_profile(handle uint32, profile uint32, options uint32) int32
-TEXT runtime·vdsoCall_zx_object_set_profile(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_object_set_profile(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL profile+4(FP), SI
 	MOVL options+8(FP), DX
 	MOVQ vdso_zx_object_set_profile(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_channel_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out0+8(FP), SI
 	MOVQ out1+16(FP), DX
 	MOVQ vdso_zx_channel_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_read(handle uint32, options uint32, bytes unsafe.Pointer, handles unsafe.Pointer, num_bytes uint32, num_handles uint32, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_read(SB),NOSPLIT,$32-52
+TEXT runtime·vdsoCall_zx_channel_read(SB),NOSPLIT,$40-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 56(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 56(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ bytes+8(FP), DX
@@ -385,12 +705,22 @@
 	POPQ R13
 	MOVQ BP, SP
 	MOVL AX, ret+48(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_read_etc(handle uint32, options uint32, bytes unsafe.Pointer, handles unsafe.Pointer, num_bytes uint32, num_handles uint32, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_read_etc(SB),NOSPLIT,$32-52
+TEXT runtime·vdsoCall_zx_channel_read_etc(SB),NOSPLIT,$40-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 56(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 56(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ bytes+8(FP), DX
@@ -409,12 +739,22 @@
 	POPQ R13
 	MOVQ BP, SP
 	MOVL AX, ret+48(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_write(handle uint32, options uint32, bytes unsafe.Pointer, num_bytes uint32, handles unsafe.Pointer, num_handles uint32) int32
-TEXT runtime·vdsoCall_zx_channel_write(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_channel_write(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ bytes+8(FP), DX
@@ -424,12 +764,22 @@
 	MOVQ vdso_zx_channel_write(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_call_noretry(handle uint32, options uint32, deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_call_noretry(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_channel_call_noretry(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ deadline+8(FP), DX
@@ -439,12 +789,22 @@
 	MOVQ vdso_zx_channel_call_noretry(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_call_finish(deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_call_finish(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_channel_call_finish(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ deadline+0(FP), DI
 	MOVQ args+8(FP), SI
 	MOVQ actual_bytes+16(FP), DX
@@ -452,12 +812,22 @@
 	MOVQ vdso_zx_channel_call_finish(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_channel_call(handle uint32, options uint32, deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_channel_call(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_channel_call(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ deadline+8(FP), DX
@@ -467,24 +837,44 @@
 	MOVQ vdso_zx_channel_call(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_socket_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_socket_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out0+8(FP), SI
 	MOVQ out1+16(FP), DX
 	MOVQ vdso_zx_socket_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_write(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_socket_write(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_socket_write(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -493,12 +883,22 @@
 	MOVQ vdso_zx_socket_write(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_read(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_socket_read(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_socket_read(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -507,53 +907,103 @@
 	MOVQ vdso_zx_socket_read(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_share(handle uint32, socket_to_share uint32) int32
-TEXT runtime·vdsoCall_zx_socket_share(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_socket_share(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL socket_to_share+4(FP), SI
 	MOVQ vdso_zx_socket_share(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_accept(handle uint32, out_socket unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_socket_accept(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_socket_accept(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ out_socket+8(FP), SI
 	MOVQ vdso_zx_socket_accept(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_socket_shutdown(handle uint32, options uint32) int32
-TEXT runtime·vdsoCall_zx_socket_shutdown(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_socket_shutdown(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ vdso_zx_socket_shutdown(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_exit()
-TEXT runtime·vdsoCall_zx_thread_exit(SB),NOSPLIT,$0-0
+TEXT runtime·vdsoCall_zx_thread_exit(SB),NOSPLIT,$8-0
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ vdso_zx_thread_exit(SB), AX
 	CALL AX
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_create(process uint32, name unsafe.Pointer, name_size uint, options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_thread_create(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_thread_create(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL process+0(FP), DI
 	MOVQ name+8(FP), SI
 	MOVQ name_size+16(FP), DX
@@ -562,12 +1012,22 @@
 	MOVQ vdso_zx_thread_create(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_start(handle uint32, thread_entry uintptr, stack uintptr, arg1 uintptr, arg2 uintptr) int32
-TEXT runtime·vdsoCall_zx_thread_start(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_thread_start(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ thread_entry+8(FP), SI
 	MOVQ stack+16(FP), DX
@@ -576,12 +1036,22 @@
 	MOVQ vdso_zx_thread_start(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_read_state(handle uint32, kind uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_thread_read_state(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_thread_read_state(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL kind+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -589,12 +1059,22 @@
 	MOVQ vdso_zx_thread_read_state(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_write_state(handle uint32, kind uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_thread_write_state(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_thread_write_state(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL kind+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -602,31 +1082,61 @@
 	MOVQ vdso_zx_thread_write_state(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_thread_set_priority(prio int32) int32
-TEXT runtime·vdsoCall_zx_thread_set_priority(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_thread_set_priority(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL prio+0(FP), DI
 	MOVQ vdso_zx_thread_set_priority(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_process_exit(retcode int64)
-TEXT runtime·vdsoCall_zx_process_exit(SB),NOSPLIT,$0-8
+TEXT runtime·vdsoCall_zx_process_exit(SB),NOSPLIT,$8-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ retcode+0(FP), DI
 	MOVQ vdso_zx_process_exit(SB), AX
 	CALL AX
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_process_create(job uint32, name unsafe.Pointer, name_size uint, options uint32, proc_handle unsafe.Pointer, vmar_handle unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_process_create(SB),NOSPLIT,$0-52
+TEXT runtime·vdsoCall_zx_process_create(SB),NOSPLIT,$8-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL job+0(FP), DI
 	MOVQ name+8(FP), SI
 	MOVQ name_size+16(FP), DX
@@ -636,12 +1146,22 @@
 	MOVQ vdso_zx_process_create(SB), AX
 	CALL AX
 	MOVL AX, ret+48(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_process_start(handle uint32, thread uint32, entry uintptr, stack uintptr, arg1 uint32, arg2 uintptr) int32
-TEXT runtime·vdsoCall_zx_process_start(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_process_start(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL thread+4(FP), SI
 	MOVQ entry+8(FP), DX
@@ -651,12 +1171,22 @@
 	MOVQ vdso_zx_process_start(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_process_read_memory(handle uint32, vaddr uintptr, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_process_read_memory(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_process_read_memory(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vaddr+8(FP), SI
 	MOVQ buffer+16(FP), DX
@@ -665,12 +1195,22 @@
 	MOVQ vdso_zx_process_read_memory(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_process_write_memory(handle uint32, vaddr uintptr, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_process_write_memory(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_process_write_memory(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vaddr+8(FP), SI
 	MOVQ buffer+16(FP), DX
@@ -679,24 +1219,44 @@
 	MOVQ vdso_zx_process_write_memory(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_job_create(parent_job uint32, options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_job_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_job_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL parent_job+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_job_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_job_set_policy(handle uint32, options uint32, topic uint32, policy unsafe.Pointer, count uint32) int32
-TEXT runtime·vdsoCall_zx_job_set_policy(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_job_set_policy(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVL topic+8(FP), DX
@@ -705,12 +1265,22 @@
 	MOVQ vdso_zx_job_set_policy(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_task_bind_exception_port(handle uint32, port uint32, key uint64, options uint32) int32
-TEXT runtime·vdsoCall_zx_task_bind_exception_port(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_task_bind_exception_port(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL port+4(FP), SI
 	MOVQ key+8(FP), DX
@@ -718,79 +1288,149 @@
 	MOVQ vdso_zx_task_bind_exception_port(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_task_suspend(handle uint32, token unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_task_suspend(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_task_suspend(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ token+8(FP), SI
 	MOVQ vdso_zx_task_suspend(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_task_suspend_token(handle uint32, token unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_task_suspend_token(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_task_suspend_token(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ token+8(FP), SI
 	MOVQ vdso_zx_task_suspend_token(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_task_resume_from_exception(handle uint32, port uint32, options uint32) int32
-TEXT runtime·vdsoCall_zx_task_resume_from_exception(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_task_resume_from_exception(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL port+4(FP), SI
 	MOVL options+8(FP), DX
 	MOVQ vdso_zx_task_resume_from_exception(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_task_kill(handle uint32) int32
-TEXT runtime·vdsoCall_zx_task_kill(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_task_kill(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_task_kill(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_event_create(options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_event_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_event_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out+8(FP), SI
 	MOVQ vdso_zx_event_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_eventpair_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_eventpair_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_eventpair_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out0+8(FP), SI
 	MOVQ out1+16(FP), DX
 	MOVQ vdso_zx_eventpair_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_wait(value_ptr unsafe.Pointer, current_value int32, new_futex_owner uint32, deadline int64) int32
-TEXT runtime·vdsoCall_zx_futex_wait(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_futex_wait(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVL current_value+8(FP), SI
 	MOVL new_futex_owner+12(FP), DX
@@ -798,23 +1438,43 @@
 	MOVQ vdso_zx_futex_wait(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_wake(value_ptr unsafe.Pointer, wake_count uint32) int32
-TEXT runtime·vdsoCall_zx_futex_wake(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_futex_wake(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVL wake_count+8(FP), SI
 	MOVQ vdso_zx_futex_wake(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_requeue(value_ptr unsafe.Pointer, wake_count uint32, current_value int32, requeue_ptr unsafe.Pointer, requeue_count uint32, new_requeue_owner uint32) int32
-TEXT runtime·vdsoCall_zx_futex_requeue(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_futex_requeue(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVL wake_count+8(FP), SI
 	MOVL current_value+12(FP), DX
@@ -824,22 +1484,42 @@
 	MOVQ vdso_zx_futex_requeue(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_wake_single_owner(value_ptr unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_futex_wake_single_owner(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_futex_wake_single_owner(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVQ vdso_zx_futex_wake_single_owner(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_requeue_single_owner(value_ptr unsafe.Pointer, current_value int32, requeue_ptr unsafe.Pointer, requeue_count uint32, new_requeue_owner uint32) int32
-TEXT runtime·vdsoCall_zx_futex_requeue_single_owner(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_futex_requeue_single_owner(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVL current_value+8(FP), SI
 	MOVQ requeue_ptr+16(FP), DX
@@ -848,45 +1528,85 @@
 	MOVQ vdso_zx_futex_requeue_single_owner(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_get_owner(value_ptr unsafe.Pointer, koid unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_futex_get_owner(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_futex_get_owner(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVQ koid+8(FP), SI
 	MOVQ vdso_zx_futex_get_owner(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_port_create(options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_port_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_port_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out+8(FP), SI
 	MOVQ vdso_zx_port_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_port_queue(handle uint32, packet unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_port_queue(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_port_queue(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ packet+8(FP), SI
 	MOVQ vdso_zx_port_queue(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_port_wait(handle uint32, deadline int64, packet unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_port_wait(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_port_wait(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	CALL runtime·entersyscall(SB)
 	MOVL handle+0(FP), DI
 	MOVQ deadline+8(FP), SI
@@ -895,70 +1615,130 @@
 	CALL AX
 	MOVL AX, ret+24(FP)
 	CALL runtime·exitsyscall(SB)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_port_cancel(handle uint32, source uint32, key uint64) int32
-TEXT runtime·vdsoCall_zx_port_cancel(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_port_cancel(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL source+4(FP), SI
 	MOVQ key+8(FP), DX
 	MOVQ vdso_zx_port_cancel(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_timer_create(options uint32, clock_id uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_timer_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_timer_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVL clock_id+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_timer_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_timer_set(handle uint32, deadline int64, slack int64) int32
-TEXT runtime·vdsoCall_zx_timer_set(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_timer_set(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ deadline+8(FP), SI
 	MOVQ slack+16(FP), DX
 	MOVQ vdso_zx_timer_set(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_timer_cancel(handle uint32) int32
-TEXT runtime·vdsoCall_zx_timer_cancel(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_timer_cancel(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_timer_cancel(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_create(size uint64, options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_vmo_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ size+0(FP), DI
 	MOVL options+8(FP), SI
 	MOVQ out+16(FP), DX
 	MOVQ vdso_zx_vmo_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_read(handle uint32, buffer unsafe.Pointer, offset uint64, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_vmo_read(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmo_read(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ buffer+8(FP), SI
 	MOVQ offset+16(FP), DX
@@ -966,12 +1746,22 @@
 	MOVQ vdso_zx_vmo_read(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_write(handle uint32, buffer unsafe.Pointer, offset uint64, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_vmo_write(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmo_write(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ buffer+8(FP), SI
 	MOVQ offset+16(FP), DX
@@ -979,34 +1769,64 @@
 	MOVQ vdso_zx_vmo_write(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_get_size(handle uint32, size unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_get_size(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_vmo_get_size(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ size+8(FP), SI
 	MOVQ vdso_zx_vmo_get_size(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_set_size(handle uint32, size uint64) int32
-TEXT runtime·vdsoCall_zx_vmo_set_size(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_vmo_set_size(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ size+8(FP), SI
 	MOVQ vdso_zx_vmo_set_size(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_op_range(handle uint32, op uint32, offset uint64, size uint64, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_vmo_op_range(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_vmo_op_range(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL op+4(FP), SI
 	MOVQ offset+8(FP), DX
@@ -1016,12 +1836,22 @@
 	MOVQ vdso_zx_vmo_op_range(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_clone(handle uint32, options uint32, offset uint64, size uint64, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_clone(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmo_clone(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ offset+8(FP), DX
@@ -1030,35 +1860,65 @@
 	MOVQ vdso_zx_vmo_clone(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_set_cache_policy(handle uint32, cache_policy uint32) int32
-TEXT runtime·vdsoCall_zx_vmo_set_cache_policy(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_vmo_set_cache_policy(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL cache_policy+4(FP), SI
 	MOVQ vdso_zx_vmo_set_cache_policy(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_replace_as_executable(handle uint32, vmex uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_replace_as_executable(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_vmo_replace_as_executable(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL vmex+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_vmo_replace_as_executable(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_allocate(parent_vmar uint32, options uint32, offset uint64, size uint64, child_vmar unsafe.Pointer, child_addr unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmar_allocate(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_vmar_allocate(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL parent_vmar+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ offset+8(FP), DX
@@ -1068,22 +1928,42 @@
 	MOVQ vdso_zx_vmar_allocate(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_destroy(handle uint32) int32
-TEXT runtime·vdsoCall_zx_vmar_destroy(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_vmar_destroy(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_vmar_destroy(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_map(handle uint32, options uint32, vmar_offset uint64, vmo uint32, vmo_offset uint64, len uint64, mapped_addr unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmar_map(SB),NOSPLIT,$24-52
+TEXT runtime·vdsoCall_zx_vmar_map(SB),NOSPLIT,$32-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 48(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 48(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ vmar_offset+8(FP), DX
@@ -1099,24 +1979,44 @@
 	POPQ R12
 	MOVQ BP, SP
 	MOVL AX, ret+48(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_unmap(handle uint32, addr uintptr, len uint64) int32
-TEXT runtime·vdsoCall_zx_vmar_unmap(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_vmar_unmap(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ addr+8(FP), SI
 	MOVQ len+16(FP), DX
 	MOVQ vdso_zx_vmar_unmap(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_protect(handle uint32, options uint32, addr uintptr, len uint64) int32
-TEXT runtime·vdsoCall_zx_vmar_protect(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_vmar_protect(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ addr+8(FP), DX
@@ -1124,44 +2024,84 @@
 	MOVQ vdso_zx_vmar_protect(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_cprng_draw_once(buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_cprng_draw_once(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_cprng_draw_once(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ buffer+0(FP), DI
 	MOVQ buffer_size+8(FP), SI
 	MOVQ vdso_zx_cprng_draw_once(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_cprng_draw(buffer unsafe.Pointer, buffer_size uint)
-TEXT runtime·vdsoCall_zx_cprng_draw(SB),NOSPLIT,$0-16
+TEXT runtime·vdsoCall_zx_cprng_draw(SB),NOSPLIT,$8-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ buffer+0(FP), DI
 	MOVQ buffer_size+8(FP), SI
 	MOVQ vdso_zx_cprng_draw(SB), AX
 	CALL AX
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_cprng_add_entropy(buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_cprng_add_entropy(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_cprng_add_entropy(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ buffer+0(FP), DI
 	MOVQ buffer_size+8(FP), SI
 	MOVQ vdso_zx_cprng_add_entropy(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_fifo_create(elem_count uint, elem_size uint, options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_fifo_create(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_fifo_create(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ elem_count+0(FP), DI
 	MOVQ elem_size+8(FP), SI
 	MOVL options+16(FP), DX
@@ -1170,12 +2110,22 @@
 	MOVQ vdso_zx_fifo_create(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_fifo_read(handle uint32, elem_size uint, data unsafe.Pointer, count uint, actual_count unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_fifo_read(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_fifo_read(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ elem_size+8(FP), SI
 	MOVQ data+16(FP), DX
@@ -1184,12 +2134,22 @@
 	MOVQ vdso_zx_fifo_read(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_fifo_write(handle uint32, elem_size uint, data unsafe.Pointer, count uint, actual_count unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_fifo_write(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_fifo_write(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ elem_size+8(FP), SI
 	MOVQ data+16(FP), DX
@@ -1198,24 +2158,44 @@
 	MOVQ vdso_zx_fifo_write(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_profile_create(root_job uint32, profile unsafe.Pointer, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_profile_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_profile_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL root_job+0(FP), DI
 	MOVQ profile+8(FP), SI
 	MOVQ out+16(FP), DX
 	MOVQ vdso_zx_profile_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmar_unmap_handle_close_thread_exit(vmar_handle uint32, addr uintptr, size uint, close_handle uint32) int32
-TEXT runtime·vdsoCall_zx_vmar_unmap_handle_close_thread_exit(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmar_unmap_handle_close_thread_exit(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL vmar_handle+0(FP), DI
 	MOVQ addr+8(FP), SI
 	MOVQ size+16(FP), DX
@@ -1223,36 +2203,66 @@
 	MOVQ vdso_zx_vmar_unmap_handle_close_thread_exit(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_futex_wake_handle_close_thread_exit(value_ptr unsafe.Pointer, wake_count uint32, new_value int32, close_handle uint32)
-TEXT runtime·vdsoCall_zx_futex_wake_handle_close_thread_exit(SB),NOSPLIT,$0-24
+TEXT runtime·vdsoCall_zx_futex_wake_handle_close_thread_exit(SB),NOSPLIT,$8-24
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ value_ptr+0(FP), DI
 	MOVL wake_count+8(FP), SI
 	MOVL new_value+12(FP), DX
 	MOVL close_handle+16(FP), CX
 	MOVQ vdso_zx_futex_wake_handle_close_thread_exit(SB), AX
 	CALL AX
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debuglog_create(resource uint32, options uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_debuglog_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_debuglog_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ out+8(FP), DX
 	MOVQ vdso_zx_debuglog_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debuglog_write(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_debuglog_write(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_debuglog_write(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -1260,12 +2270,22 @@
 	MOVQ vdso_zx_debuglog_write(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debuglog_read(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_debuglog_read(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_debuglog_read(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ buffer+8(FP), DX
@@ -1273,12 +2293,22 @@
 	MOVQ vdso_zx_debuglog_read(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ktrace_read(handle uint32, data unsafe.Pointer, offset uint32, data_size uint, actual unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_ktrace_read(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_ktrace_read(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ data+8(FP), SI
 	MOVL offset+16(FP), DX
@@ -1287,12 +2317,22 @@
 	MOVQ vdso_zx_ktrace_read(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ktrace_control(handle uint32, action uint32, options uint32, ptr unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_ktrace_control(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_ktrace_control(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL action+4(FP), SI
 	MOVL options+8(FP), DX
@@ -1300,12 +2340,22 @@
 	MOVQ vdso_zx_ktrace_control(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ktrace_write(handle uint32, id uint32, arg0 uint32, arg1 uint32) int32
-TEXT runtime·vdsoCall_zx_ktrace_write(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_ktrace_write(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL id+4(FP), SI
 	MOVL arg0+8(FP), DX
@@ -1313,12 +2363,22 @@
 	MOVQ vdso_zx_ktrace_write(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_mtrace_control(handle uint32, kind uint32, action uint32, options uint32, ptr unsafe.Pointer, ptr_size uint) int32
-TEXT runtime·vdsoCall_zx_mtrace_control(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_mtrace_control(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL kind+4(FP), SI
 	MOVL action+8(FP), DX
@@ -1328,47 +2388,87 @@
 	MOVQ vdso_zx_mtrace_control(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debug_read(handle uint32, buffer unsafe.Pointer, buffer_size unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_debug_read(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_debug_read(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ buffer+8(FP), SI
 	MOVQ buffer_size+16(FP), DX
 	MOVQ vdso_zx_debug_read(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debug_write(buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_debug_write(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_debug_write(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVQ buffer+0(FP), DI
 	MOVQ buffer_size+8(FP), SI
 	MOVQ vdso_zx_debug_write(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_debug_send_command(resource uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_debug_send_command(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_debug_send_command(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVQ buffer+8(FP), SI
 	MOVQ buffer_size+16(FP), DX
 	MOVQ vdso_zx_debug_send_command(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_create(src_obj uint32, src_num uint32, options uint32, out_handle unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_interrupt_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_interrupt_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL src_obj+0(FP), DI
 	MOVL src_num+4(FP), SI
 	MOVL options+8(FP), DX
@@ -1376,12 +2476,22 @@
 	MOVQ vdso_zx_interrupt_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_bind(handle uint32, port_handle uint32, key uint64, options uint32) int32
-TEXT runtime·vdsoCall_zx_interrupt_bind(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_interrupt_bind(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL port_handle+4(FP), SI
 	MOVQ key+8(FP), DX
@@ -1389,79 +2499,149 @@
 	MOVQ vdso_zx_interrupt_bind(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_wait(handle uint32, out_timestamp unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_interrupt_wait(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_interrupt_wait(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ out_timestamp+8(FP), SI
 	MOVQ vdso_zx_interrupt_wait(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_destroy(handle uint32) int32
-TEXT runtime·vdsoCall_zx_interrupt_destroy(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_interrupt_destroy(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_interrupt_destroy(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_ack(handle uint32) int32
-TEXT runtime·vdsoCall_zx_interrupt_ack(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_interrupt_ack(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_interrupt_ack(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_trigger(handle uint32, options uint32, timestamp int64) int32
-TEXT runtime·vdsoCall_zx_interrupt_trigger(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_interrupt_trigger(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ timestamp+8(FP), DX
 	MOVQ vdso_zx_interrupt_trigger(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_interrupt_bind_vcpu(handle uint32, vcpu uint32, options uint32) int32
-TEXT runtime·vdsoCall_zx_interrupt_bind_vcpu(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_interrupt_bind_vcpu(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL vcpu+4(FP), SI
 	MOVL options+8(FP), DX
 	MOVQ vdso_zx_interrupt_bind_vcpu(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_ioports_request(resource uint32, io_addr uint16, len uint32) int32
-TEXT runtime·vdsoCall_zx_ioports_request(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_ioports_request(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVQ io_addr+4(FP), SI
 	MOVL len+8(FP), DX
 	MOVQ vdso_zx_ioports_request(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_create_contiguous(bti uint32, size uint, alignment_log2 uint32, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_create_contiguous(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmo_create_contiguous(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL bti+0(FP), DI
 	MOVQ size+8(FP), SI
 	MOVL alignment_log2+16(FP), DX
@@ -1469,12 +2649,22 @@
 	MOVQ vdso_zx_vmo_create_contiguous(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_vmo_create_physical(resource uint32, paddr uintptr, size uint, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_vmo_create_physical(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_vmo_create_physical(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVQ paddr+8(FP), SI
 	MOVQ size+16(FP), DX
@@ -1482,12 +2672,22 @@
 	MOVQ vdso_zx_vmo_create_physical(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_iommu_create(resource uint32, typ uint32, desc unsafe.Pointer, desc_size uint, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_iommu_create(SB),NOSPLIT,$0-36
+TEXT runtime·vdsoCall_zx_iommu_create(SB),NOSPLIT,$8-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVL typ+4(FP), SI
 	MOVQ desc+8(FP), DX
@@ -1496,12 +2696,22 @@
 	MOVQ vdso_zx_iommu_create(SB), AX
 	CALL AX
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_bti_create(iommu uint32, options uint32, bti_id uint64, out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_bti_create(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_bti_create(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL iommu+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ bti_id+8(FP), DX
@@ -1509,12 +2719,22 @@
 	MOVQ vdso_zx_bti_create(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_bti_pin(handle uint32, options uint32, vmo uint32, offset uint64, size uint64, addrs unsafe.Pointer, addrs_count uint, pmt unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_bti_pin(SB),NOSPLIT,$32-60
+TEXT runtime·vdsoCall_zx_bti_pin(SB),NOSPLIT,$40-60
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 56(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 56(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVL vmo+8(FP), DX
@@ -1533,32 +2753,62 @@
 	POPQ R13
 	MOVQ BP, SP
 	MOVL AX, ret+56(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_bti_release_quarantine(handle uint32) int32
-TEXT runtime·vdsoCall_zx_bti_release_quarantine(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_bti_release_quarantine(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_bti_release_quarantine(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_pmt_unpin(handle uint32) int32
-TEXT runtime·vdsoCall_zx_pmt_unpin(SB),NOSPLIT,$0-12
+TEXT runtime·vdsoCall_zx_pmt_unpin(SB),NOSPLIT,$8-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ vdso_zx_pmt_unpin(SB), AX
 	CALL AX
 	MOVL AX, ret+8(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_framebuffer_get_info(resource uint32, format unsafe.Pointer, width unsafe.Pointer, height unsafe.Pointer, stride unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_framebuffer_get_info(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_framebuffer_get_info(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVQ format+8(FP), SI
 	MOVQ width+16(FP), DX
@@ -1567,12 +2817,22 @@
 	MOVQ vdso_zx_framebuffer_get_info(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_framebuffer_set_range(resource uint32, vmo uint32, len uint32, format uint32, width uint32, height uint32, stride uint32) int32
-TEXT runtime·vdsoCall_zx_framebuffer_set_range(SB),NOSPLIT,$24-36
+TEXT runtime·vdsoCall_zx_framebuffer_set_range(SB),NOSPLIT,$32-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 48(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 48(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVL vmo+4(FP), SI
 	MOVL len+8(FP), DX
@@ -1588,36 +2848,66 @@
 	POPQ R12
 	MOVQ BP, SP
 	MOVL AX, ret+32(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_pc_firmware_tables(handle uint32, acpi_rsdp unsafe.Pointer, smbios unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_pc_firmware_tables(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_pc_firmware_tables(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ acpi_rsdp+8(FP), SI
 	MOVQ smbios+16(FP), DX
 	MOVQ vdso_zx_pc_firmware_tables(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_smc_call(handle uint32, parameters unsafe.Pointer, out_smc_result unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_smc_call(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_smc_call(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL handle+0(FP), DI
 	MOVQ parameters+8(FP), SI
 	MOVQ out_smc_result+16(FP), DX
 	MOVQ vdso_zx_smc_call(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_resource_create(parent_rsrc uint32, options uint32, base uint64, size uint, name unsafe.Pointer, name_size uint, resource_out unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_resource_create(SB),NOSPLIT,$24-52
+TEXT runtime·vdsoCall_zx_resource_create(SB),NOSPLIT,$32-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 48(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 48(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL parent_rsrc+0(FP), DI
 	MOVL options+4(FP), SI
 	MOVQ base+8(FP), DX
@@ -1633,59 +2923,109 @@
 	POPQ R12
 	MOVQ BP, SP
 	MOVL AX, ret+48(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_mexec(resource uint32, kernel_vmo uint32, bootimage_vmo uint32) int32
-TEXT runtime·vdsoCall_zx_system_mexec(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_system_mexec(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVL kernel_vmo+4(FP), SI
 	MOVL bootimage_vmo+8(FP), DX
 	MOVQ vdso_zx_system_mexec(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_mexec_payload_get(resource uint32, buffer unsafe.Pointer, buffer_size uint) int32
-TEXT runtime·vdsoCall_zx_system_mexec_payload_get(SB),NOSPLIT,$0-28
+TEXT runtime·vdsoCall_zx_system_mexec_payload_get(SB),NOSPLIT,$8-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVQ buffer+8(FP), SI
 	MOVQ buffer_size+16(FP), DX
 	MOVQ vdso_zx_system_mexec_payload_get(SB), AX
 	CALL AX
 	MOVL AX, ret+24(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_system_powerctl(resource uint32, cmd uint32, arg unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_system_powerctl(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_system_powerctl(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL resource+0(FP), DI
 	MOVL cmd+4(FP), SI
 	MOVQ arg+8(FP), DX
 	MOVQ vdso_zx_system_powerctl(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_pager_create(options uint32, out_pager unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_pager_create(SB),NOSPLIT,$0-20
+TEXT runtime·vdsoCall_zx_pager_create(SB),NOSPLIT,$8-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL options+0(FP), DI
 	MOVQ out_pager+8(FP), SI
 	MOVQ vdso_zx_pager_create(SB), AX
 	CALL AX
 	MOVL AX, ret+16(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
 // func vdsoCall_zx_pager_create_vmo(pager uint32, port uint32, key uint64, size uint64, options uint32, out_pager_vmo unsafe.Pointer) int32
-TEXT runtime·vdsoCall_zx_pager_create_vmo(SB),NOSPLIT,$0-44
+TEXT runtime·vdsoCall_zx_pager_create_vmo(SB),NOSPLIT,$8-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	get_tls(CX)
+	MOVQ g(CX), AX
+	MOVQ g_m(AX), R14
+	PUSHQ R14
+	MOVQ 24(SP), DX
+	MOVQ DX, m_vdsoPC(R14)
+	LEAQ 24(SP), DX
+	MOVQ DX, m_vdsoSP(R14)
 	MOVL pager+0(FP), DI
 	MOVL port+4(FP), SI
 	MOVQ key+8(FP), DX
@@ -1695,5 +3035,7 @@
 	MOVQ vdso_zx_pager_create_vmo(SB), AX
 	CALL AX
 	MOVL AX, ret+40(FP)
+	POPQ R14
+	MOVQ $0, m_vdsoSP(R14)
 	RET
 
diff --git a/src/runtime/vdsocalls_fuchsia_arm64.s b/src/runtime/vdsocalls_fuchsia_arm64.s
index 537ce5f..b35b049 100644
--- a/src/runtime/vdsocalls_fuchsia_arm64.s
+++ b/src/runtime/vdsocalls_fuchsia_arm64.s
@@ -5,6 +5,8 @@
 // Zircon system calls for the Fuchsia OS.
 // Generated by mkfuchsia.go, do not edit.
 
+#include "go_asm.h"
+#include "go_tls.h"
 #include "textflag.h"
 #include "funcdata.h"
 
@@ -12,174 +14,305 @@
 TEXT runtime·vdsoCall_zx_clock_get(SB),NOSPLIT,$0-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW clock_id+0(FP), R0
 	BL vdso_zx_clock_get(SB)
 	MOVD R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_clock_get_new(clock_id uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_clock_get_new(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW clock_id+0(FP), R0
 	MOVD out+8(FP), R1
 	BL vdso_zx_clock_get_new(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_clock_get_monotonic() int64
 TEXT runtime·vdsoCall_zx_clock_get_monotonic(SB),NOSPLIT,$0-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_clock_get_monotonic(SB)
 	MOVD R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_nanosleep(deadline int64) int32
 TEXT runtime·vdsoCall_zx_nanosleep(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD deadline+0(FP), R0
 	BL vdso_zx_nanosleep(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ticks_get() uint64
 TEXT runtime·vdsoCall_zx_ticks_get(SB),NOSPLIT,$0-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_ticks_get(SB)
 	MOVD R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ticks_per_second() uint64
 TEXT runtime·vdsoCall_zx_ticks_per_second(SB),NOSPLIT,$0-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_ticks_per_second(SB)
 	MOVD R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_deadline_after(nanoseconds int64) int64
 TEXT runtime·vdsoCall_zx_deadline_after(SB),NOSPLIT,$0-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD nanoseconds+0(FP), R0
 	BL vdso_zx_deadline_after(SB)
 	MOVD R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_clock_adjust(handle uint32, clock_id uint32, offset int64) int32
 TEXT runtime·vdsoCall_zx_clock_adjust(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW clock_id+4(FP), R1
 	MOVD offset+8(FP), R2
 	BL vdso_zx_clock_adjust(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_get_dcache_line_size() uint32
 TEXT runtime·vdsoCall_zx_system_get_dcache_line_size(SB),NOSPLIT,$0-4
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_system_get_dcache_line_size(SB)
 	MOVW R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_get_num_cpus() uint32
 TEXT runtime·vdsoCall_zx_system_get_num_cpus(SB),NOSPLIT,$0-4
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_system_get_num_cpus(SB)
 	MOVW R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_get_version(version unsafe.Pointer, version_size uint) int32
 TEXT runtime·vdsoCall_zx_system_get_version(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD version+0(FP), R0
 	MOVD version_size+8(FP), R1
 	BL vdso_zx_system_get_version(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_get_physmem() uint64
 TEXT runtime·vdsoCall_zx_system_get_physmem(SB),NOSPLIT,$0-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_system_get_physmem(SB)
 	MOVD R0, ret+0(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_get_features(kind uint32, features unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_system_get_features(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW kind+0(FP), R0
 	MOVD features+8(FP), R1
 	BL vdso_zx_system_get_features(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_cache_flush(addr unsafe.Pointer, size uint, options uint32) int32
 TEXT runtime·vdsoCall_zx_cache_flush(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD addr+0(FP), R0
 	MOVD size+8(FP), R1
 	MOVW options+16(FP), R2
 	BL vdso_zx_cache_flush(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_handle_close(handle uint32) int32
 TEXT runtime·vdsoCall_zx_handle_close(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_handle_close(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_handle_close_many(handles unsafe.Pointer, num_handles uint) int32
 TEXT runtime·vdsoCall_zx_handle_close_many(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD handles+0(FP), R0
 	MOVD num_handles+8(FP), R1
 	BL vdso_zx_handle_close_many(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_handle_duplicate(handle uint32, rights uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_handle_duplicate(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW rights+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_handle_duplicate(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_handle_replace(handle uint32, rights uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_handle_replace(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW rights+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_handle_replace(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_wait_one(handle uint32, signals uint32, deadline int64, observed unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_object_wait_one(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	CALL runtime·entersyscall(SB)
 	MOVW handle+0(FP), R0
 	MOVW signals+4(FP), R1
@@ -188,12 +321,19 @@
 	BL vdso_zx_object_wait_one(SB)
 	MOVW R0, ret+24(FP)
 	BL runtime·exitsyscall(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_wait_many(items unsafe.Pointer, count uint, deadline int64) int32
 TEXT runtime·vdsoCall_zx_object_wait_many(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	CALL runtime·entersyscall(SB)
 	MOVD items+0(FP), R0
 	MOVD count+8(FP), R1
@@ -201,12 +341,19 @@
 	BL vdso_zx_object_wait_many(SB)
 	MOVW R0, ret+24(FP)
 	BL runtime·exitsyscall(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_wait_async(handle uint32, port uint32, key uint64, signals uint32, options uint32) int32
 TEXT runtime·vdsoCall_zx_object_wait_async(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW port+4(FP), R1
 	MOVD key+8(FP), R2
@@ -214,80 +361,129 @@
 	MOVW options+20(FP), R4
 	BL vdso_zx_object_wait_async(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_signal(handle uint32, clear_mask uint32, set_mask uint32) int32
 TEXT runtime·vdsoCall_zx_object_signal(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW clear_mask+4(FP), R1
 	MOVW set_mask+8(FP), R2
 	BL vdso_zx_object_signal(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_signal_peer(handle uint32, clear_mask uint32, set_mask uint32) int32
 TEXT runtime·vdsoCall_zx_object_signal_peer(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW clear_mask+4(FP), R1
 	MOVW set_mask+8(FP), R2
 	BL vdso_zx_object_signal_peer(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_get_property(handle uint32, property uint32, value unsafe.Pointer, value_size uint) int32
 TEXT runtime·vdsoCall_zx_object_get_property(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW property+4(FP), R1
 	MOVD value+8(FP), R2
 	MOVD value_size+16(FP), R3
 	BL vdso_zx_object_get_property(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_set_property(handle uint32, property uint32, value unsafe.Pointer, value_size uint) int32
 TEXT runtime·vdsoCall_zx_object_set_property(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW property+4(FP), R1
 	MOVD value+8(FP), R2
 	MOVD value_size+16(FP), R3
 	BL vdso_zx_object_set_property(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_set_cookie(handle uint32, scope uint32, cookie uint64) int32
 TEXT runtime·vdsoCall_zx_object_set_cookie(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW scope+4(FP), R1
 	MOVD cookie+8(FP), R2
 	BL vdso_zx_object_set_cookie(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_get_cookie(handle uint32, scope uint32, cookie unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_object_get_cookie(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW scope+4(FP), R1
 	MOVD cookie+8(FP), R2
 	BL vdso_zx_object_get_cookie(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_get_info(handle uint32, topic uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer, avail unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_object_get_info(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW topic+4(FP), R1
 	MOVD buffer+8(FP), R2
@@ -296,46 +492,74 @@
 	MOVD avail+32(FP), R5
 	BL vdso_zx_object_get_info(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_get_child(handle uint32, koid uint64, rights uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_object_get_child(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD koid+8(FP), R1
 	MOVW rights+16(FP), R2
 	MOVD out+24(FP), R3
 	BL vdso_zx_object_get_child(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_object_set_profile(handle uint32, profile uint32, options uint32) int32
 TEXT runtime·vdsoCall_zx_object_set_profile(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW profile+4(FP), R1
 	MOVW options+8(FP), R2
 	BL vdso_zx_object_set_profile(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out0+8(FP), R1
 	MOVD out1+16(FP), R2
 	BL vdso_zx_channel_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_read(handle uint32, options uint32, bytes unsafe.Pointer, handles unsafe.Pointer, num_bytes uint32, num_handles uint32, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_read(SB),NOSPLIT,$0-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD bytes+8(FP), R2
@@ -346,12 +570,19 @@
 	MOVD actual_handles+40(FP), R7
 	BL vdso_zx_channel_read(SB)
 	MOVW R0, ret+48(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_read_etc(handle uint32, options uint32, bytes unsafe.Pointer, handles unsafe.Pointer, num_bytes uint32, num_handles uint32, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_read_etc(SB),NOSPLIT,$0-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD bytes+8(FP), R2
@@ -362,12 +593,19 @@
 	MOVD actual_handles+40(FP), R7
 	BL vdso_zx_channel_read_etc(SB)
 	MOVW R0, ret+48(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_write(handle uint32, options uint32, bytes unsafe.Pointer, num_bytes uint32, handles unsafe.Pointer, num_handles uint32) int32
 TEXT runtime·vdsoCall_zx_channel_write(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD bytes+8(FP), R2
@@ -376,12 +614,19 @@
 	MOVW num_handles+32(FP), R5
 	BL vdso_zx_channel_write(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_call_noretry(handle uint32, options uint32, deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_call_noretry(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD deadline+8(FP), R2
@@ -390,24 +635,38 @@
 	MOVD actual_handles+32(FP), R5
 	BL vdso_zx_channel_call_noretry(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_call_finish(deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_call_finish(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD deadline+0(FP), R0
 	MOVD args+8(FP), R1
 	MOVD actual_bytes+16(FP), R2
 	MOVD actual_handles+24(FP), R3
 	BL vdso_zx_channel_call_finish(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_channel_call(handle uint32, options uint32, deadline int64, args unsafe.Pointer, actual_bytes unsafe.Pointer, actual_handles unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_channel_call(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD deadline+8(FP), R2
@@ -416,23 +675,37 @@
 	MOVD actual_handles+32(FP), R5
 	BL vdso_zx_channel_call(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_socket_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out0+8(FP), R1
 	MOVD out1+16(FP), R2
 	BL vdso_zx_socket_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_write(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_socket_write(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD buffer+8(FP), R2
@@ -440,12 +713,19 @@
 	MOVD actual+24(FP), R4
 	BL vdso_zx_socket_write(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_read(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_socket_read(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD buffer+8(FP), R2
@@ -453,49 +733,84 @@
 	MOVD actual+24(FP), R4
 	BL vdso_zx_socket_read(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_share(handle uint32, socket_to_share uint32) int32
 TEXT runtime·vdsoCall_zx_socket_share(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW socket_to_share+4(FP), R1
 	BL vdso_zx_socket_share(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_accept(handle uint32, out_socket unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_socket_accept(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD out_socket+8(FP), R1
 	BL vdso_zx_socket_accept(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_socket_shutdown(handle uint32, options uint32) int32
 TEXT runtime·vdsoCall_zx_socket_shutdown(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	BL vdso_zx_socket_shutdown(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_exit()
 TEXT runtime·vdsoCall_zx_thread_exit(SB),NOSPLIT,$0-0
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	BL vdso_zx_thread_exit(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_create(process uint32, name unsafe.Pointer, name_size uint, options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_thread_create(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW process+0(FP), R0
 	MOVD name+8(FP), R1
 	MOVD name_size+16(FP), R2
@@ -503,12 +818,19 @@
 	MOVD out+32(FP), R4
 	BL vdso_zx_thread_create(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_start(handle uint32, thread_entry uintptr, stack uintptr, arg1 uintptr, arg2 uintptr) int32
 TEXT runtime·vdsoCall_zx_thread_start(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD thread_entry+8(FP), R1
 	MOVD stack+16(FP), R2
@@ -516,53 +838,88 @@
 	MOVD arg2+32(FP), R4
 	BL vdso_zx_thread_start(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_read_state(handle uint32, kind uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_thread_read_state(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW kind+4(FP), R1
 	MOVD buffer+8(FP), R2
 	MOVD buffer_size+16(FP), R3
 	BL vdso_zx_thread_read_state(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_write_state(handle uint32, kind uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_thread_write_state(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW kind+4(FP), R1
 	MOVD buffer+8(FP), R2
 	MOVD buffer_size+16(FP), R3
 	BL vdso_zx_thread_write_state(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_thread_set_priority(prio int32) int32
 TEXT runtime·vdsoCall_zx_thread_set_priority(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW prio+0(FP), R0
 	BL vdso_zx_thread_set_priority(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_process_exit(retcode int64)
 TEXT runtime·vdsoCall_zx_process_exit(SB),NOSPLIT,$0-8
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD retcode+0(FP), R0
 	BL vdso_zx_process_exit(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_process_create(job uint32, name unsafe.Pointer, name_size uint, options uint32, proc_handle unsafe.Pointer, vmar_handle unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_process_create(SB),NOSPLIT,$0-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW job+0(FP), R0
 	MOVD name+8(FP), R1
 	MOVD name_size+16(FP), R2
@@ -571,12 +928,19 @@
 	MOVD vmar_handle+40(FP), R5
 	BL vdso_zx_process_create(SB)
 	MOVW R0, ret+48(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_process_start(handle uint32, thread uint32, entry uintptr, stack uintptr, arg1 uint32, arg2 uintptr) int32
 TEXT runtime·vdsoCall_zx_process_start(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW thread+4(FP), R1
 	MOVD entry+8(FP), R2
@@ -585,12 +949,19 @@
 	MOVD arg2+32(FP), R5
 	BL vdso_zx_process_start(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_process_read_memory(handle uint32, vaddr uintptr, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_process_read_memory(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD vaddr+8(FP), R1
 	MOVD buffer+16(FP), R2
@@ -598,12 +969,19 @@
 	MOVD actual+32(FP), R4
 	BL vdso_zx_process_read_memory(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_process_write_memory(handle uint32, vaddr uintptr, buffer unsafe.Pointer, buffer_size uint, actual unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_process_write_memory(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD vaddr+8(FP), R1
 	MOVD buffer+16(FP), R2
@@ -611,23 +989,37 @@
 	MOVD actual+32(FP), R4
 	BL vdso_zx_process_write_memory(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_job_create(parent_job uint32, options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_job_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW parent_job+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_job_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_job_set_policy(handle uint32, options uint32, topic uint32, policy unsafe.Pointer, count uint32) int32
 TEXT runtime·vdsoCall_zx_job_set_policy(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVW topic+8(FP), R2
@@ -635,107 +1027,177 @@
 	MOVW count+24(FP), R4
 	BL vdso_zx_job_set_policy(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_task_bind_exception_port(handle uint32, port uint32, key uint64, options uint32) int32
 TEXT runtime·vdsoCall_zx_task_bind_exception_port(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW port+4(FP), R1
 	MOVD key+8(FP), R2
 	MOVW options+16(FP), R3
 	BL vdso_zx_task_bind_exception_port(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_task_suspend(handle uint32, token unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_task_suspend(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD token+8(FP), R1
 	BL vdso_zx_task_suspend(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_task_suspend_token(handle uint32, token unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_task_suspend_token(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD token+8(FP), R1
 	BL vdso_zx_task_suspend_token(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_task_resume_from_exception(handle uint32, port uint32, options uint32) int32
 TEXT runtime·vdsoCall_zx_task_resume_from_exception(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW port+4(FP), R1
 	MOVW options+8(FP), R2
 	BL vdso_zx_task_resume_from_exception(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_task_kill(handle uint32) int32
 TEXT runtime·vdsoCall_zx_task_kill(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_task_kill(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_event_create(options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_event_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out+8(FP), R1
 	BL vdso_zx_event_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_eventpair_create(options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_eventpair_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out0+8(FP), R1
 	MOVD out1+16(FP), R2
 	BL vdso_zx_eventpair_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_wait(value_ptr unsafe.Pointer, current_value int32, new_futex_owner uint32, deadline int64) int32
 TEXT runtime·vdsoCall_zx_futex_wait(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVW current_value+8(FP), R1
 	MOVW new_futex_owner+12(FP), R2
 	MOVD deadline+16(FP), R3
 	BL vdso_zx_futex_wait(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_wake(value_ptr unsafe.Pointer, wake_count uint32) int32
 TEXT runtime·vdsoCall_zx_futex_wake(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVW wake_count+8(FP), R1
 	BL vdso_zx_futex_wake(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_requeue(value_ptr unsafe.Pointer, wake_count uint32, current_value int32, requeue_ptr unsafe.Pointer, requeue_count uint32, new_requeue_owner uint32) int32
 TEXT runtime·vdsoCall_zx_futex_requeue(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVW wake_count+8(FP), R1
 	MOVW current_value+12(FP), R2
@@ -744,21 +1206,35 @@
 	MOVW new_requeue_owner+28(FP), R5
 	BL vdso_zx_futex_requeue(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_wake_single_owner(value_ptr unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_futex_wake_single_owner(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	BL vdso_zx_futex_wake_single_owner(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_requeue_single_owner(value_ptr unsafe.Pointer, current_value int32, requeue_ptr unsafe.Pointer, requeue_count uint32, new_requeue_owner uint32) int32
 TEXT runtime·vdsoCall_zx_futex_requeue_single_owner(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVW current_value+8(FP), R1
 	MOVD requeue_ptr+16(FP), R2
@@ -766,42 +1242,70 @@
 	MOVW new_requeue_owner+28(FP), R4
 	BL vdso_zx_futex_requeue_single_owner(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_get_owner(value_ptr unsafe.Pointer, koid unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_futex_get_owner(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVD koid+8(FP), R1
 	BL vdso_zx_futex_get_owner(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_port_create(options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_port_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out+8(FP), R1
 	BL vdso_zx_port_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_port_queue(handle uint32, packet unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_port_queue(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD packet+8(FP), R1
 	BL vdso_zx_port_queue(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_port_wait(handle uint32, deadline int64, packet unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_port_wait(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	CALL runtime·entersyscall(SB)
 	MOVW handle+0(FP), R0
 	MOVD deadline+8(FP), R1
@@ -809,109 +1313,179 @@
 	BL vdso_zx_port_wait(SB)
 	MOVW R0, ret+24(FP)
 	BL runtime·exitsyscall(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_port_cancel(handle uint32, source uint32, key uint64) int32
 TEXT runtime·vdsoCall_zx_port_cancel(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW source+4(FP), R1
 	MOVD key+8(FP), R2
 	BL vdso_zx_port_cancel(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_timer_create(options uint32, clock_id uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_timer_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVW clock_id+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_timer_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_timer_set(handle uint32, deadline int64, slack int64) int32
 TEXT runtime·vdsoCall_zx_timer_set(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD deadline+8(FP), R1
 	MOVD slack+16(FP), R2
 	BL vdso_zx_timer_set(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_timer_cancel(handle uint32) int32
 TEXT runtime·vdsoCall_zx_timer_cancel(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_timer_cancel(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_create(size uint64, options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD size+0(FP), R0
 	MOVW options+8(FP), R1
 	MOVD out+16(FP), R2
 	BL vdso_zx_vmo_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_read(handle uint32, buffer unsafe.Pointer, offset uint64, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_vmo_read(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD buffer+8(FP), R1
 	MOVD offset+16(FP), R2
 	MOVD buffer_size+24(FP), R3
 	BL vdso_zx_vmo_read(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_write(handle uint32, buffer unsafe.Pointer, offset uint64, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_vmo_write(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD buffer+8(FP), R1
 	MOVD offset+16(FP), R2
 	MOVD buffer_size+24(FP), R3
 	BL vdso_zx_vmo_write(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_get_size(handle uint32, size unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_get_size(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD size+8(FP), R1
 	BL vdso_zx_vmo_get_size(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_set_size(handle uint32, size uint64) int32
 TEXT runtime·vdsoCall_zx_vmo_set_size(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD size+8(FP), R1
 	BL vdso_zx_vmo_set_size(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_op_range(handle uint32, op uint32, offset uint64, size uint64, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_vmo_op_range(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW op+4(FP), R1
 	MOVD offset+8(FP), R2
@@ -920,12 +1494,19 @@
 	MOVD buffer_size+32(FP), R5
 	BL vdso_zx_vmo_op_range(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_clone(handle uint32, options uint32, offset uint64, size uint64, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_clone(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD offset+8(FP), R2
@@ -933,33 +1514,54 @@
 	MOVD out+24(FP), R4
 	BL vdso_zx_vmo_clone(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_set_cache_policy(handle uint32, cache_policy uint32) int32
 TEXT runtime·vdsoCall_zx_vmo_set_cache_policy(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW cache_policy+4(FP), R1
 	BL vdso_zx_vmo_set_cache_policy(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_replace_as_executable(handle uint32, vmex uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_replace_as_executable(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW vmex+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_vmo_replace_as_executable(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_allocate(parent_vmar uint32, options uint32, offset uint64, size uint64, child_vmar unsafe.Pointer, child_addr unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmar_allocate(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW parent_vmar+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD offset+8(FP), R2
@@ -968,21 +1570,35 @@
 	MOVD child_addr+32(FP), R5
 	BL vdso_zx_vmar_allocate(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_destroy(handle uint32) int32
 TEXT runtime·vdsoCall_zx_vmar_destroy(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_vmar_destroy(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_map(handle uint32, options uint32, vmar_offset uint64, vmo uint32, vmo_offset uint64, len uint64, mapped_addr unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmar_map(SB),NOSPLIT,$0-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD vmar_offset+8(FP), R2
@@ -992,64 +1608,106 @@
 	MOVD mapped_addr+40(FP), R6
 	BL vdso_zx_vmar_map(SB)
 	MOVW R0, ret+48(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_unmap(handle uint32, addr uintptr, len uint64) int32
 TEXT runtime·vdsoCall_zx_vmar_unmap(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD addr+8(FP), R1
 	MOVD len+16(FP), R2
 	BL vdso_zx_vmar_unmap(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_protect(handle uint32, options uint32, addr uintptr, len uint64) int32
 TEXT runtime·vdsoCall_zx_vmar_protect(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD addr+8(FP), R2
 	MOVD len+16(FP), R3
 	BL vdso_zx_vmar_protect(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_cprng_draw_once(buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_cprng_draw_once(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD buffer+0(FP), R0
 	MOVD buffer_size+8(FP), R1
 	BL vdso_zx_cprng_draw_once(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_cprng_draw(buffer unsafe.Pointer, buffer_size uint)
 TEXT runtime·vdsoCall_zx_cprng_draw(SB),NOSPLIT,$0-16
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD buffer+0(FP), R0
 	MOVD buffer_size+8(FP), R1
 	BL vdso_zx_cprng_draw(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_cprng_add_entropy(buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_cprng_add_entropy(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD buffer+0(FP), R0
 	MOVD buffer_size+8(FP), R1
 	BL vdso_zx_cprng_add_entropy(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_fifo_create(elem_count uint, elem_size uint, options uint32, out0 unsafe.Pointer, out1 unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_fifo_create(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD elem_count+0(FP), R0
 	MOVD elem_size+8(FP), R1
 	MOVW options+16(FP), R2
@@ -1057,12 +1715,19 @@
 	MOVD out1+32(FP), R4
 	BL vdso_zx_fifo_create(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_fifo_read(handle uint32, elem_size uint, data unsafe.Pointer, count uint, actual_count unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_fifo_read(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD elem_size+8(FP), R1
 	MOVD data+16(FP), R2
@@ -1070,12 +1735,19 @@
 	MOVD actual_count+32(FP), R4
 	BL vdso_zx_fifo_read(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_fifo_write(handle uint32, elem_size uint, data unsafe.Pointer, count uint, actual_count unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_fifo_write(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD elem_size+8(FP), R1
 	MOVD data+16(FP), R2
@@ -1083,81 +1755,130 @@
 	MOVD actual_count+32(FP), R4
 	BL vdso_zx_fifo_write(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_profile_create(root_job uint32, profile unsafe.Pointer, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_profile_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW root_job+0(FP), R0
 	MOVD profile+8(FP), R1
 	MOVD out+16(FP), R2
 	BL vdso_zx_profile_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmar_unmap_handle_close_thread_exit(vmar_handle uint32, addr uintptr, size uint, close_handle uint32) int32
 TEXT runtime·vdsoCall_zx_vmar_unmap_handle_close_thread_exit(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW vmar_handle+0(FP), R0
 	MOVD addr+8(FP), R1
 	MOVD size+16(FP), R2
 	MOVW close_handle+24(FP), R3
 	BL vdso_zx_vmar_unmap_handle_close_thread_exit(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_futex_wake_handle_close_thread_exit(value_ptr unsafe.Pointer, wake_count uint32, new_value int32, close_handle uint32)
 TEXT runtime·vdsoCall_zx_futex_wake_handle_close_thread_exit(SB),NOSPLIT,$0-24
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD value_ptr+0(FP), R0
 	MOVW wake_count+8(FP), R1
 	MOVW new_value+12(FP), R2
 	MOVW close_handle+16(FP), R3
 	BL vdso_zx_futex_wake_handle_close_thread_exit(SB)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debuglog_create(resource uint32, options uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_debuglog_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD out+8(FP), R2
 	BL vdso_zx_debuglog_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debuglog_write(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_debuglog_write(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD buffer+8(FP), R2
 	MOVD buffer_size+16(FP), R3
 	BL vdso_zx_debuglog_write(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debuglog_read(handle uint32, options uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_debuglog_read(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD buffer+8(FP), R2
 	MOVD buffer_size+16(FP), R3
 	BL vdso_zx_debuglog_read(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ktrace_read(handle uint32, data unsafe.Pointer, offset uint32, data_size uint, actual unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_ktrace_read(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD data+8(FP), R1
 	MOVW offset+16(FP), R2
@@ -1165,36 +1886,57 @@
 	MOVD actual+32(FP), R4
 	BL vdso_zx_ktrace_read(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ktrace_control(handle uint32, action uint32, options uint32, ptr unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_ktrace_control(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW action+4(FP), R1
 	MOVW options+8(FP), R2
 	MOVD ptr+16(FP), R3
 	BL vdso_zx_ktrace_control(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ktrace_write(handle uint32, id uint32, arg0 uint32, arg1 uint32) int32
 TEXT runtime·vdsoCall_zx_ktrace_write(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW id+4(FP), R1
 	MOVW arg0+8(FP), R2
 	MOVW arg1+12(FP), R3
 	BL vdso_zx_ktrace_write(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_mtrace_control(handle uint32, kind uint32, action uint32, options uint32, ptr unsafe.Pointer, ptr_size uint) int32
 TEXT runtime·vdsoCall_zx_mtrace_control(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW kind+4(FP), R1
 	MOVW action+8(FP), R2
@@ -1203,153 +1945,251 @@
 	MOVD ptr_size+24(FP), R5
 	BL vdso_zx_mtrace_control(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debug_read(handle uint32, buffer unsafe.Pointer, buffer_size unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_debug_read(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD buffer+8(FP), R1
 	MOVD buffer_size+16(FP), R2
 	BL vdso_zx_debug_read(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debug_write(buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_debug_write(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVD buffer+0(FP), R0
 	MOVD buffer_size+8(FP), R1
 	BL vdso_zx_debug_write(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_debug_send_command(resource uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_debug_send_command(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVD buffer+8(FP), R1
 	MOVD buffer_size+16(FP), R2
 	BL vdso_zx_debug_send_command(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_create(src_obj uint32, src_num uint32, options uint32, out_handle unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_interrupt_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW src_obj+0(FP), R0
 	MOVW src_num+4(FP), R1
 	MOVW options+8(FP), R2
 	MOVD out_handle+16(FP), R3
 	BL vdso_zx_interrupt_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_bind(handle uint32, port_handle uint32, key uint64, options uint32) int32
 TEXT runtime·vdsoCall_zx_interrupt_bind(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW port_handle+4(FP), R1
 	MOVD key+8(FP), R2
 	MOVW options+16(FP), R3
 	BL vdso_zx_interrupt_bind(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_wait(handle uint32, out_timestamp unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_interrupt_wait(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD out_timestamp+8(FP), R1
 	BL vdso_zx_interrupt_wait(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_destroy(handle uint32) int32
 TEXT runtime·vdsoCall_zx_interrupt_destroy(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_interrupt_destroy(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_ack(handle uint32) int32
 TEXT runtime·vdsoCall_zx_interrupt_ack(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_interrupt_ack(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_trigger(handle uint32, options uint32, timestamp int64) int32
 TEXT runtime·vdsoCall_zx_interrupt_trigger(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD timestamp+8(FP), R2
 	BL vdso_zx_interrupt_trigger(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_interrupt_bind_vcpu(handle uint32, vcpu uint32, options uint32) int32
 TEXT runtime·vdsoCall_zx_interrupt_bind_vcpu(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW vcpu+4(FP), R1
 	MOVW options+8(FP), R2
 	BL vdso_zx_interrupt_bind_vcpu(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_ioports_request(resource uint32, io_addr uint16, len uint32) int32
 TEXT runtime·vdsoCall_zx_ioports_request(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVD io_addr+4(FP), R1
 	MOVW len+8(FP), R2
 	BL vdso_zx_ioports_request(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_create_contiguous(bti uint32, size uint, alignment_log2 uint32, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_create_contiguous(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW bti+0(FP), R0
 	MOVD size+8(FP), R1
 	MOVW alignment_log2+16(FP), R2
 	MOVD out+24(FP), R3
 	BL vdso_zx_vmo_create_contiguous(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_vmo_create_physical(resource uint32, paddr uintptr, size uint, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_vmo_create_physical(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVD paddr+8(FP), R1
 	MOVD size+16(FP), R2
 	MOVD out+24(FP), R3
 	BL vdso_zx_vmo_create_physical(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_iommu_create(resource uint32, typ uint32, desc unsafe.Pointer, desc_size uint, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_iommu_create(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVW typ+4(FP), R1
 	MOVD desc+8(FP), R2
@@ -1357,24 +2197,38 @@
 	MOVD out+24(FP), R4
 	BL vdso_zx_iommu_create(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_bti_create(iommu uint32, options uint32, bti_id uint64, out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_bti_create(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW iommu+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD bti_id+8(FP), R2
 	MOVD out+16(FP), R3
 	BL vdso_zx_bti_create(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_bti_pin(handle uint32, options uint32, vmo uint32, offset uint64, size uint64, addrs unsafe.Pointer, addrs_count uint, pmt unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_bti_pin(SB),NOSPLIT,$0-60
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVW vmo+8(FP), R2
@@ -1385,30 +2239,51 @@
 	MOVD pmt+48(FP), R7
 	BL vdso_zx_bti_pin(SB)
 	MOVW R0, ret+56(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_bti_release_quarantine(handle uint32) int32
 TEXT runtime·vdsoCall_zx_bti_release_quarantine(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_bti_release_quarantine(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_pmt_unpin(handle uint32) int32
 TEXT runtime·vdsoCall_zx_pmt_unpin(SB),NOSPLIT,$0-12
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	BL vdso_zx_pmt_unpin(SB)
 	MOVW R0, ret+8(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_framebuffer_get_info(resource uint32, format unsafe.Pointer, width unsafe.Pointer, height unsafe.Pointer, stride unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_framebuffer_get_info(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVD format+8(FP), R1
 	MOVD width+16(FP), R2
@@ -1416,12 +2291,19 @@
 	MOVD stride+32(FP), R4
 	BL vdso_zx_framebuffer_get_info(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_framebuffer_set_range(resource uint32, vmo uint32, len uint32, format uint32, width uint32, height uint32, stride uint32) int32
 TEXT runtime·vdsoCall_zx_framebuffer_set_range(SB),NOSPLIT,$0-36
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVW vmo+4(FP), R1
 	MOVW len+8(FP), R2
@@ -1431,34 +2313,55 @@
 	MOVW stride+24(FP), R6
 	BL vdso_zx_framebuffer_set_range(SB)
 	MOVW R0, ret+32(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_pc_firmware_tables(handle uint32, acpi_rsdp unsafe.Pointer, smbios unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_pc_firmware_tables(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD acpi_rsdp+8(FP), R1
 	MOVD smbios+16(FP), R2
 	BL vdso_zx_pc_firmware_tables(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_smc_call(handle uint32, parameters unsafe.Pointer, out_smc_result unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_smc_call(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW handle+0(FP), R0
 	MOVD parameters+8(FP), R1
 	MOVD out_smc_result+16(FP), R2
 	BL vdso_zx_smc_call(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_resource_create(parent_rsrc uint32, options uint32, base uint64, size uint, name unsafe.Pointer, name_size uint, resource_out unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_resource_create(SB),NOSPLIT,$0-52
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW parent_rsrc+0(FP), R0
 	MOVW options+4(FP), R1
 	MOVD base+8(FP), R2
@@ -1468,62 +2371,120 @@
 	MOVD resource_out+40(FP), R6
 	BL vdso_zx_resource_create(SB)
 	MOVW R0, ret+48(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_mexec(resource uint32, kernel_vmo uint32, bootimage_vmo uint32) int32
 TEXT runtime·vdsoCall_zx_system_mexec(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVW kernel_vmo+4(FP), R1
 	MOVW bootimage_vmo+8(FP), R2
 	BL vdso_zx_system_mexec(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_mexec_payload_get(resource uint32, buffer unsafe.Pointer, buffer_size uint) int32
 TEXT runtime·vdsoCall_zx_system_mexec_payload_get(SB),NOSPLIT,$0-28
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVD buffer+8(FP), R1
 	MOVD buffer_size+16(FP), R2
 	BL vdso_zx_system_mexec_payload_get(SB)
 	MOVW R0, ret+24(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_system_powerctl(resource uint32, cmd uint32, arg unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_system_powerctl(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW resource+0(FP), R0
 	MOVW cmd+4(FP), R1
 	MOVD arg+8(FP), R2
 	BL vdso_zx_system_powerctl(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
 // func vdsoCall_zx_pager_create(options uint32, out_pager unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_pager_create(SB),NOSPLIT,$0-20
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW options+0(FP), R0
 	MOVD out_pager+8(FP), R1
 	BL vdso_zx_pager_create(SB)
 	MOVW R0, ret+16(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET
 
-// func vdsoCall_zx_pager_create_vmo(pager uint32, port uint32, key uint64, size uint64, options uint32, out_pager_vmo unsafe.Pointer) int32
+// func vdsoCall_zx_pager_create_vmo(pager uint32, options uint32, port uint32, key uint64, size uint64, out_pager_vmo unsafe.Pointer) int32
 TEXT runtime·vdsoCall_zx_pager_create_vmo(SB),NOSPLIT,$0-44
 	GO_ARGS
 	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
 	MOVW pager+0(FP), R0
-	MOVW port+4(FP), R1
-	MOVD key+8(FP), R2
-	MOVD size+16(FP), R3
-	MOVW options+24(FP), R4
+	MOVW options+4(FP), R1
+	MOVW port+8(FP), R2
+	MOVD key+16(FP), R3
+	MOVD size+24(FP), R4
 	MOVD out_pager_vmo+32(FP), R5
 	BL vdso_zx_pager_create_vmo(SB)
 	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
+	RET
+
+// func vdsoCall_zx_pager_supply_pages(pager uint32, pager_vmo uint32, offset uint64, length uint64, aux_vmo_handle uint32, aux_offset uint64) int32
+TEXT runtime·vdsoCall_zx_pager_supply_pages(SB),NOSPLIT,$0-44
+	GO_ARGS
+	NO_LOCAL_POINTERS
+	MOVD g_m(g), R21
+	MOVD LR, m_vdsoPC(R21)
+	MOVD RSP, R20
+	MOVD R20, m_vdsoSP(R21)
+	MOVD R21, 8(RSP)
+	MOVW pager+0(FP), R0
+	MOVW pager_vmo+4(FP), R1
+	MOVD offset+8(FP), R2
+	MOVD length+16(FP), R3
+	MOVW aux_vmo_handle+24(FP), R4
+	MOVD aux_offset+32(FP), R5
+	BL vdso_zx_pager_supply_pages(SB)
+	MOVW R0, ret+40(FP)
+	MOVD g_m(g), R21
+	MOVD $0, m_vdsoSP(R21)
 	RET