[
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non: [push, pull_request]\n\njobs:\n  test:\n    strategy:\n      matrix:\n        os: [ubuntu-latest, windows-latest]\n        go: ['1.19.13', '1.20.14', '1.21.13', '1.22.12', '1.23.12', '1.24.13', '1.25.9', '1.26.2']\n    name: Test with Go ${{ matrix.go }} on ${{ matrix.os }}\n    runs-on: ${{ matrix.os }}\n    defaults:\n      run:\n        shell: bash\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v4\n\n    - name: Set up the prerequisites\n      if: runner.os == 'Linux'\n      run: |\n        sudo apt-get update\n        sudo apt-get install -y gcc-aarch64-linux-gnu qemu-user\n\n    - name: Set up Go\n      uses: actions/setup-go@v5\n      with:\n        go-version: ${{ matrix.go }}\n\n    - name: Test (Linux, arm64)\n      if: runner.os == 'Linux'\n      run: |\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v fmt\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/abi\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/cpu\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/fmtsort\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/reflectlite\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/unsafeheader\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v math\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v math/big\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v math/bits\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v math/cmplx\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v math/rand\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v -test.short runtime\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/debug\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v strconv\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v strings\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v sort\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v sync\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v sync/atomic\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v time\"\n\n    - name: Test (Linux, arm64, Go <= 1.22)\n      if: runner.os == 'Linux' && (startsWith(matrix.go, '1.19.') || startsWith(matrix.go, '1.20.') || startsWith(matrix.go, '1.21.') || startsWith(matrix.go, '1.22.'))\n      run: |\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/itoa\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/internal/atomic\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/internal/math\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/internal/sys\"\n\n    - name: Test (Linux, arm64, Go == 1.23)\n      if: runner.os == 'Linux' && startsWith(matrix.go, '1.23.')\n      run: |\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/itoa\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/internal/math\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v runtime/internal/sys\"\n\n    - name: Test (Linux, arm64, Go >= 1.24 && <= 1.25)\n      if: runner.os == 'Linux' && (startsWith(matrix.go, '1.24.') || startsWith(matrix.go, '1.25.'))\n      run: |\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/itoa\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/math\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/sys\"\n\n    - name: Test (Linux, arm64, Go == 1.26)\n      if: runner.os == 'Linux' && startsWith(matrix.go, '1.26.')\n      run: |\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/strconv\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/math\"\n        GOARCH=arm64 go run test.go -qemu -args=\"-test.run=^Test -test.v internal/runtime/sys\"\n\n    - name: Test (amd64)\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v fmt\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/abi\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/cpu\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/fmtsort\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/reflectlite\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/unsafeheader\"\n        go run test.go -args=\"-test.run=^Test -test.v math\"\n        go run test.go -args=\"-test.run=^Test -test.v math/big\"\n        go run test.go -args=\"-test.run=^Test -test.v math/bits\"\n        go run test.go -args=\"-test.run=^Test -test.v math/cmplx\"\n        # math/rand's TestDefaultRace doesn't work well by default.\n        # Set an environment to do the default tests.\n        GO_RAND_TEST_HELPER_CODE=1 go run test.go -args=\"-test.run=^Test -test.v math/rand\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/debug\"\n        go run test.go -args=\"-test.run=^Test -test.v strconv\"\n        go run test.go -args=\"-test.run=^Test -test.v strings\"\n        go run test.go -args=\"-test.run=^Test -test.v sort\"\n        go run test.go -args=\"-test.run=^Test -test.v sync\"\n        go run test.go -args=\"-test.run=^Test -test.v sync/atomic\"\n        go run test.go -args=\"-test.run=^Test -test.v time\"\n\n    - name: Test (amd64, Go <= 1.22)\n      if: startsWith(matrix.go, '1.19.') || startsWith(matrix.go, '1.20.') || startsWith(matrix.go, '1.21.') || startsWith(matrix.go, '1.22.')\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v internal/itoa\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/internal/atomic\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/internal/math\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/internal/sys\"\n\n    - name: Test (amd64, Go == 1.23)\n      if: startsWith(matrix.go, '1.23.')\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v internal/itoa\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/internal/math\"\n        go run test.go -args=\"-test.run=^Test -test.v runtime/internal/sys\"\n\n    - name: Test (amd64, Go >= 1.24 && <= 1.25)\n      if: startsWith(matrix.go, '1.24.') || startsWith(matrix.go, '1.25.')\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v internal/itoa\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/math\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/sys\"\n\n    - name: Test (amd64, Go >= 1.26)\n      # strconv/ftoa.go is missing in 1.26.\n      if: startsWith(matrix.go, '1.26.')\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v internal/strconv\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/atomic\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/math\"\n        go run test.go -args=\"-test.run=^Test -test.v internal/runtime/sys\"\n\n    - name: Test (amd64, runtime)\n      # Skip runtime tests with Go 1.19 and Windows, as there is an issue (probably golang/go#51007 and golang/go#57455).\n      if: runner.os == 'Linux' || !startsWith(matrix.go, '1.19.')\n      run: |\n        go run test.go -args=\"-test.run=^Test -test.v -test.short runtime\"\n"
  },
  {
    "path": ".gitignore",
    "content": "*~\n.DS_Store\n*.a\n"
  },
  {
    "path": "1.19_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n       return\n"
  },
  {
    "path": "1.19_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n\tif os.Getenv(\"GO_GCFLAGS\") != \"\" {\n\t\t// It's too much work to require every caller of the go command\n\t\t// to pass along \"-gcflags=\"+os.Getenv(\"GO_GCFLAGS\").\n\t\t// For now, if $GO_GCFLAGS is set, report that we simply can't\n\t\t// run go build.\n\t\treturn false\n\t}\n\tswitch runtime.GOOS {\n\tcase \"android\", \"js\", \"ios\":\n\t\treturn false\n\t}\n\treturn true\n}\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n}\n//--from\nfunc HasExec() bool {\n\tswitch runtime.GOOS {\n\tcase \"js\", \"ios\":\n\t\treturn false\n\t}\n\treturn true\n}\n//--to\nfunc HasExec() bool {\n\treturn false\n}\n"
  },
  {
    "path": "1.19_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm)\n//--to\n//go:build windows || plan9 || (js && wasm) || linux\n"
  },
  {
    "path": "1.19_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.19_linux/math/big/link_test.go.patch",
    "content": "//--from\nimport (\n\t\"bytes\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestLinkerGC(t *testing.T) {\n\tif testing.Short() {\n\t\tt.Skip(\"skipping in short mode\")\n\t}\n\tt.Parallel()\n\ttmp := t.TempDir()\n\tgoBin := testenv.GoToolPath(t)\n\tgoFile := filepath.Join(tmp, \"x.go\")\n\tfile := []byte(`package main\nimport _ \"math/big\"\nfunc main() {}\n`)\n\tif err := os.WriteFile(goFile, file, 0644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcmd := exec.Command(goBin, \"build\", \"-o\", \"x.exe\", \"x.go\")\n\tcmd.Dir = tmp\n\tif out, err := cmd.CombinedOutput(); err != nil {\n\t\tt.Fatalf(\"compile: %v, %s\", err, out)\n\t}\n\n\tcmd = exec.Command(goBin, \"tool\", \"nm\", \"x.exe\")\n\tcmd.Dir = tmp\n\tnm, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tt.Fatalf(\"nm: %v, %s\", err, nm)\n\t}\n\tconst want = \"runtime.main\"\n\tif !bytes.Contains(nm, []byte(want)) {\n\t\t// Test the test.\n\t\tt.Errorf(\"expected symbol %q not found\", want)\n\t}\n\tbad := []string{\n\t\t\"math/big.(*Float)\",\n\t\t\"math/big.(*Rat)\",\n\t\t\"math/big.(*Int)\",\n\t}\n\tfor _, sym := range bad {\n\t\tif bytes.Contains(nm, []byte(sym)) {\n\t\t\tt.Errorf(\"unexpected symbol %q found\", sym)\n\t\t}\n\t}\n\tif t.Failed() {\n\t\tt.Logf(\"Got: %s\", nm)\n\t}\n}\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/align_test.go.patch",
    "content": "//--from\nimport (\n\t\"bytes\"\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/importer\"\n\t\"go/parser\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"os\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"bytes\"\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"strings\"\n\t\"testing\"\n)\n//--from\nfunc TestAtomicAlignment(t *testing.T) {\n\t// Read the code making the tables above, to see which fields and\n\t// variables we are currently checking.\n\tchecked := map[string]bool{}\n\tx, err := os.ReadFile(\"./align_runtime_test.go\")\n\tif err != nil {\n\t\tt.Fatalf(\"read failed: %v\", err)\n\t}\n\tfieldDesc := map[int]string{}\n\tr := regexp.MustCompile(`unsafe[.]Offsetof[(](\\w+){}[.](\\w+)[)]`)\n\tmatches := r.FindAllStringSubmatch(string(x), -1)\n\tfor i, v := range matches {\n\t\tchecked[\"field runtime.\"+v[1]+\".\"+v[2]] = true\n\t\tfieldDesc[i] = v[1] + \".\" + v[2]\n\t}\n\tvarDesc := map[int]string{}\n\tr = regexp.MustCompile(`unsafe[.]Pointer[(]&(\\w+)[)]`)\n\tmatches = r.FindAllStringSubmatch(string(x), -1)\n\tfor i, v := range matches {\n\t\tchecked[\"var \"+v[1]] = true\n\t\tvarDesc[i] = v[1]\n\t}\n\n\t// Check all of our alignemnts. This is the actual core of the test.\n\tfor i, d := range runtime.AtomicFields {\n\t\tif d%8 != 0 {\n\t\t\tt.Errorf(\"field alignment of %s failed: offset is %d\", fieldDesc[i], d)\n\t\t}\n\t}\n\tfor i, p := range runtime.AtomicVariables {\n\t\tif uintptr(p)%8 != 0 {\n\t\t\tt.Errorf(\"variable alignment of %s failed: address is %x\", varDesc[i], p)\n\t\t}\n\t}\n\n\t// The code above is the actual test. The code below attempts to check\n\t// that the tables used by the code above are exhaustive.\n\n\t// Parse the whole runtime package, checking that arguments of\n\t// appropriate atomic operations are in the list above.\n\tfset := token.NewFileSet()\n\tm, err := parser.ParseDir(fset, \".\", nil, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"parsing runtime failed: %v\", err)\n\t}\n\tpkg := m[\"runtime\"] // Note: ignore runtime_test and main packages\n\n\t// Filter files by those for the current architecture/os being tested.\n\tfileMap := map[string]bool{}\n\tfor _, f := range buildableFiles(t, \".\") {\n\t\tfileMap[f] = true\n\t}\n\tvar files []*ast.File\n\tfor fname, f := range pkg.Files {\n\t\tif fileMap[fname] {\n\t\t\tfiles = append(files, f)\n\t\t}\n\t}\n\n\t// Call go/types to analyze the runtime package.\n\tvar info types.Info\n\tinfo.Types = map[ast.Expr]types.TypeAndValue{}\n\tconf := types.Config{Importer: importer.Default()}\n\t_, err = conf.Check(\"runtime\", fset, files, &info)\n\tif err != nil {\n\t\tt.Fatalf(\"typechecking runtime failed: %v\", err)\n\t}\n\n\t// Analyze all atomic.*64 callsites.\n\tv := Visitor{t: t, fset: fset, types: info.Types, checked: checked}\n\tast.Walk(&v, pkg)\n}\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\t// Make sure we don't have any extra frames on the stack (due to\n\t// open-coded defer processing)\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersNilPointerPanic.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\",\n\t\t\"runtime_test.TestCallersNilPointerPanic\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t}()\n\tvar p *int\n\tif *p == 3 {\n\t\tt.Fatal(\"did not see nil pointer panic\")\n\t}\n}\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\t// Make sure we don't have any extra frames on the stack. We cut off the check\n\t// at runtime.sigpanic, because non-open-coded defers (which may be used in\n\t// non-opt or race checker mode) include an extra 'deferreturn' frame (which is\n\t// where the nil pointer deref happens).\n\tstate := 1\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersDeferNilFuncPanic.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t\tif state == 1 {\n\t\t\tt.Fatal(\"nil defer func panicked at defer time rather than function exit time\")\n\t\t}\n\n\t}()\n\tvar f func()\n\tdefer f()\n\t// Use the value of 'state' to make sure nil defer func f causes panic at\n\t// function exit, rather than at the defer statement.\n\tstate = 2\n}\n\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tstate := 1\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersDeferNilFuncPanicWithLoop.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\", \"runtime.deferreturn\", \"runtime_test.TestCallersDeferNilFuncPanicWithLoop\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t\tif state == 1 {\n\t\t\tt.Fatal(\"nil defer func panicked at defer time rather than function exit time\")\n\t\t}\n\n\t}()\n\n\tfor i := 0; i < 1; i++ {\n\t\tvar f func()\n\t\tdefer f()\n\t}\n\t// Use the value of 'state' to make sure nil defer func f causes panic at\n\t// function exit, rather than at the defer statement.\n\tstate = 2\n}\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--to\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_setstacksize(attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int index = 0;\n  int found = 0;\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  int32_t fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = &pseudo_files[index];\n  size_t rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  const static int kENOENT = 0x2;\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  const static int kEBADF = 0x9;\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  int ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    int ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <signal.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n#include <signal.h> // for sigset_t and struct sigaction\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(sigset_t *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(sigset_t *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(sigset_t *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(const sigset_t *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.19_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.19_linux/runtime/crash_test.go.patch",
    "content": "//--from\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"bytes\"\n\t\"flag\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n)\n//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tif *flagQuick {\n\t\tt.Skip(\"-quick\")\n\t}\n\ttestenv.MustHaveGoBuild(t)\n\n\ttestprog.Lock()\n\tif testprog.dir == \"\" {\n\t\tdir, err := os.MkdirTemp(\"\", \"go-build\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create temp directory: %v\", err)\n\t\t}\n\t\ttestprog.dir = dir\n\t\ttoRemove = append(toRemove, dir)\n\t}\n\n\tif testprog.target == nil {\n\t\ttestprog.target = make(map[string]*buildexe)\n\t}\n\tname := binary\n\tif len(flags) > 0 {\n\t\tname += \"_\" + strings.Join(flags, \"_\")\n\t}\n\ttarget, ok := testprog.target[name]\n\tif !ok {\n\t\ttarget = &buildexe{}\n\t\ttestprog.target[name] = target\n\t}\n\n\tdir := testprog.dir\n\n\t// Unlock testprog while actually building, so that other\n\t// tests can look up executables that were already built.\n\ttestprog.Unlock()\n\n\ttarget.once.Do(func() {\n\t\t// Only do two \"go build\"'s at a time,\n\t\t// to keep load from getting too high.\n\t\tserializeBuild <- true\n\t\tdefer func() { <-serializeBuild }()\n\n\t\t// Don't get confused if testenv.GoToolPath calls t.Skip.\n\t\ttarget.err = errors.New(\"building test called t.Skip\")\n\n\t\texe := filepath.Join(dir, name+\".exe\")\n\n\t\tt.Logf(\"running go build -o %s %s\", exe, strings.Join(flags, \" \"))\n\t\tcmd := exec.Command(testenv.GoToolPath(t), append([]string{\"build\", \"-o\", exe}, flags...)...)\n\t\tcmd.Dir = \"testdata/\" + binary\n\t\tout, err := testenv.CleanCmdEnv(cmd).CombinedOutput()\n\t\tif err != nil {\n\t\t\ttarget.err = fmt.Errorf(\"building %s %v: %v\\n%s\", binary, flags, err, out)\n\t\t} else {\n\t\t\ttarget.exe = exe\n\t\t\ttarget.err = nil\n\t\t}\n\t})\n\n\treturn target.exe, target.err\n}\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n\treturn \"\", nil\n}\n//--from\nfunc TestPanicInlined(t *testing.T) {\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"recover failed\")\n\t\t}\n\t\tbuf := make([]byte, 2048)\n\t\tn := runtime.Stack(buf, false)\n\t\tbuf = buf[:n]\n\t\tif !bytes.Contains(buf, []byte(\"(*point).negate(\")) {\n\t\t\tt.Fatalf(\"expecting stack trace to contain call to (*point).negate()\")\n\t\t}\n\t}()\n\n\tpt := new(point)\n\tpt.negate()\n}\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"recover failed\")\n\t\t}\n\t\tbuf := make([]byte, 2048)\n\t\tn := runtime.Stack(buf, false)\n\t\tbuf = buf[:n]\n\t\tif !bytes.Contains(buf, []byte(\"(*point).negate(\")) {\n\t\t\tt.Fatalf(\"expecting stack trace to contain call to (*point).negate()\")\n\t\t}\n\t}()\n\n\tpt := new(point)\n\tpt.negate()\n}\n"
  },
  {
    "path": "1.19_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.19_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nimport (\n\t\"os\"\n\t\"runtime\"\n\t. \"runtime/debug\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\tWriteHeapDump(f.Fd())\n\tfi, err := f.Stat()\n\tif err != nil {\n\t\tt.Fatalf(\"Stat failed: %v\", err)\n\t}\n\tconst minSize = 1\n\tif size := fi.Size(); size < minSize {\n\t\tt.Fatalf(\"Heap dump size %d bytes, expected at least %d bytes\", size, minSize)\n\t}\n}\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\n\t// bug 9172: WriteHeapDump couldn't handle more than one finalizer\n\tprintln(\"allocating objects\")\n\tx := &Obj{}\n\truntime.SetFinalizer(x, objfin)\n\ty := &Obj{}\n\truntime.SetFinalizer(y, objfin)\n\n\t// Trigger collection of x and y, queueing of their finalizers.\n\tprintln(\"starting gc\")\n\truntime.GC()\n\n\t// Make sure WriteHeapDump doesn't fail with multiple queued finalizers.\n\tprintln(\"starting dump\")\n\tWriteHeapDump(f.Fd())\n\tprintln(\"done dump\")\n}\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\tWriteHeapDump(f.Fd())\n\tdummy.M()\n\tdummy2.M()\n}\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nimport (\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"syscall\"\n\t\"testing\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestPanicOnFault(t *testing.T) {\n\tif runtime.GOARCH == \"s390x\" {\n\t\tt.Skip(\"s390x fault addresses are missing the low order bits\")\n\t}\n\tif runtime.GOOS == \"ios\" {\n\t\tt.Skip(\"iOS doesn't provide fault addresses\")\n\t}\n\tif runtime.GOOS == \"netbsd\" && runtime.GOARCH == \"arm\" {\n\t\tt.Skip(\"netbsd-arm doesn't provide fault address (golang.org/issue/45026)\")\n\t}\n\tm, err := syscall.Mmap(-1, 0, 0x1000, syscall.PROT_READ /* Note: no PROT_WRITE */, syscall.MAP_SHARED|syscall.MAP_ANON)\n\tif err != nil {\n\t\tt.Fatalf(\"can't map anonymous memory: %s\", err)\n\t}\n\tdefer syscall.Munmap(m)\n\told := debug.SetPanicOnFault(true)\n\tdefer debug.SetPanicOnFault(old)\n\tconst lowBits = 0x3e7\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"write did not fault\")\n\t\t}\n\t\ttype addressable interface {\n\t\t\tAddr() uintptr\n\t\t}\n\t\ta, ok := r.(addressable)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"fault does not contain address\")\n\t\t}\n\t\twant := uintptr(unsafe.Pointer(&m[lowBits]))\n\t\tgot := a.Addr()\n\t\tif got != want {\n\t\t\tt.Fatalf(\"fault address %x, want %x\", got, want)\n\t\t}\n\t}()\n\tm[lowBits] = 1 // will fault\n}\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.19_linux/runtime/export_linux_test.go.patch",
    "content": "//--from\nimport \"unsafe\"\n//--to\n//--from\nfunc Epollctl(epfd, op, fd int32, ev unsafe.Pointer) int32 {\n\treturn epollctl(epfd, op, fd, (*epollevent)(ev))\n}\n//--to\n"
  },
  {
    "path": "1.19_linux/runtime/export_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.19_linux/runtime/internal/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.19_linux/runtime/internal/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.19_linux/runtime/internal/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n//--from\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\treturn Syscall6(num, a1, a2, a3, a4, a5, a6)\n}\n//--to\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at RawSyscall6\", num)\n\tpanic(\"syscall.RawSyscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.19_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.19_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n\treturn\n"
  },
  {
    "path": "1.19_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.19_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.19_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.19_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.19_linux/runtime/norace_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestNewOSProc0(t *testing.T) {\n\truntime.NewOSProc0(0x800000, unsafe.Pointer(abi.FuncPCABIInternal(newOSProcCreated)))\n\tcheck := time.NewTicker(100 * time.Millisecond)\n\tdefer check.Stop()\n\tend := time.After(5 * time.Second)\n\tfor {\n\t\tselect {\n\t\tcase <-check.C:\n\t\t\tif newOSProcDone {\n\t\t\t\treturn\n\t\t\t}\n\t\tcase <-end:\n\t\t\tt.Fatalf(\"couldn't create new OS process\")\n\t\t}\n\t}\n}\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\tif sysauxv(auxv[:]) != 0 {\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\tvar buf [128]uintptr\n\tn = read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tbuf[len(buf)-2] = _AT_NULL\n\tsysauxv(buf[:])\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\tvar buf [128]uintptr\n\tn := read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tbuf[len(buf)-2] = _AT_NULL\n\tsysauxv(buf[:])\n}\n//--from\nfunc getRandomData(r []byte) {\n\tif startupRandomData != nil {\n\t\tn := copy(r, startupRandomData)\n\t\textendRandom(r, n)\n\t\treturn\n\t}\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\textendRandom(r, int(n))\n}\n//--to\n// Use getRandomData in os_plan9.go.\n\n//go:nosplit\nfunc getRandomData(r []byte) {\n\t// inspired by wyrand see hash32.go for detail\n\tt := nanotime()\n\tv := getg().m.procid ^ uint64(t)\n\n\tfor len(r) > 0 {\n\t\tv ^= 0xa0761d6478bd642f\n\t\tv *= 0xe7037ed1a0b428db\n\t\tsize := 8\n\t\tif len(r) < 8 {\n\t\t\tsize = len(r)\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\tr[i] = byte(v >> (8 * i))\n\t\t}\n\t\tr = r[size:]\n\t\tv = v>>32 | v<<32\n\t}\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.19_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.19_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n"
  },
  {
    "path": "1.19_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n\tvar dst byte\n\tv := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst)\n\n\tconst EINVAL = 0x16\n\tif v != -EINVAL {\n\t\tt.Errorf(\"mincore = %v, want %v\", v, -EINVAL)\n\t}\n}\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n}\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := Epollctl(-1, 1, -1, unsafe.Pointer(&EpollEvent{}))\n\n\tconst EBADF = 0x09\n\tif v != -EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, -EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.19_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tif GOOS == \"js\" {\n\t\tt.Skip(\"js does not support catching faults\")\n\t}\n\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\t*nfault++\n\t\t}\n\t}()\n\n\t// The read should fault, except that sometimes we hit\n\t// addresses that have had C or kernel pages mapped there\n\t// readable by user code. So just log the content.\n\t// If no addresses fault, we'll fail the test.\n\tv := *(*byte)(unsafe.Pointer(addr))\n\tt.Logf(\"addr %#x: %#x\\n\", addr, v)\n}\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.19_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\t// Push a defer that will walk the stack.\n\tdefer func() {\n\t\tif err := recover(); err == nil {\n\t\t\tt.Fatal(\"expected panic from nil pointer\")\n\t\t}\n\t\tGC()\n\t}()\n\t// Call a leaf function. We must set up the exact call stack:\n\t//\n\t//  defering function -> leaf function -> sigpanic\n\t//\n\t// On LR machines, the leaf function will have the same SP as\n\t// the SP pushed for the defer frame.\n\ttestDeferLeafSigpanic1()\n}\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Run(\"sigpanic\", func(t *testing.T) {\n\t\t// nil calls to interface methods cause a sigpanic.\n\t\ttestStackWrapperPanic(t, func() { I.M(nil) }, \"runtime_test.I.M\")\n\t})\n\tt.Run(\"panicwrap\", func(t *testing.T) {\n\t\t// Nil calls to value method wrappers call panicwrap.\n\t\twrapper := (*structWithMethod).nop\n\t\ttestStackWrapperPanic(t, func() { wrapper(nil) }, \"runtime_test.(*structWithMethod).nop\")\n\t})\n}\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestTracebackInlineExcluded(t *testing.T) {\n\tdefer func() {\n\t\trecover()\n\t\tbuf := make([]byte, 4<<10)\n\t\tstk := string(buf[:Stack(buf, false)])\n\n\t\tt.Log(stk)\n\n\t\tif not := \"tracebackExcluded\"; strings.Contains(stk, not) {\n\t\t\tt.Errorf(\"found but did not expect %q\", not)\n\t\t}\n\t\tif want := \"tracebackNotExcluded\"; !strings.Contains(stk, want) {\n\t\t\tt.Errorf(\"expected %q in stack\", want)\n\t\t}\n\t}()\n\ttracebackExcluded()\n}\n//--to\nfunc TestTracebackInlineExcluded(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.19_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.19_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.19_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$-8\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.19_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_fcntl\t\t25\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_epoll_create1\t20\n#define SYS_epoll_ctl\t\t21\n#define SYS_epoll_pwait\t\t22\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_fcntl\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_epoll_create1\t2147483647\n#define SYS_epoll_ctl\t\t2147483647\n#define SYS_epoll_pwait\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.19_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.19_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.19_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.19_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.19_linux/strconv/fp_test.go.patch",
    "content": "//--from\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n)\n//--from\nfunc TestFp(t *testing.T) {\n\tf, err := os.Open(\"testdata/testfp.txt\")\n\tif err != nil {\n\t\tt.Fatal(\"testfp: open testdata/testfp.txt:\", err)\n\t}\n\tdefer f.Close()\n\n\ts := bufio.NewScanner(f)\n\n\tfor lineno := 1; s.Scan(); lineno++ {\n\t\tline := s.Text()\n\t\tif len(line) == 0 || line[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\ta := strings.Split(line, \" \")\n\t\tif len(a) != 4 {\n\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": wrong field count\")\n\t\t\tcontinue\n\t\t}\n\t\tvar s string\n\t\tvar v float64\n\t\tswitch a[0] {\n\t\tcase \"float64\":\n\t\t\tvar ok bool\n\t\t\tv, ok = myatof64(a[2])\n\t\t\tif !ok {\n\t\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": cannot atof64 \", a[2])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts = fmt.Sprintf(a[1], v)\n\t\tcase \"float32\":\n\t\t\tv1, ok := myatof32(a[2])\n\t\t\tif !ok {\n\t\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": cannot atof32 \", a[2])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts = fmt.Sprintf(a[1], v1)\n\t\t\tv = float64(v1)\n\t\t}\n\t\tif s != a[3] {\n\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": \", a[0], \" \", a[1], \" \", a[2], \" (\", v, \") \",\n\t\t\t\t\"want \", a[3], \" got \", s)\n\t\t}\n\t}\n\tif s.Err() != nil {\n\t\tt.Fatal(\"testfp: read testdata/testfp.txt: \", s.Err())\n\t}\n}\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tif runtime.NumCPU() == 1 {\n\t\tt.Skipf(\"Skipping test on %v processor machine\", runtime.NumCPU())\n\t}\n\tdefer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))\n\tN := int32(1e3)\n\tif testing.Short() {\n\t\tN = int32(1e2)\n\t}\n\tc := make(chan bool, 2)\n\tX := [2]int32{}\n\tack := [2][3]int32{{-1, -1, -1}, {-1, -1, -1}}\n\tfor p := 0; p < 2; p++ {\n\t\tgo func(me int) {\n\t\t\the := 1 - me\n\t\t\tfor i := int32(1); i < N; i++ {\n\t\t\t\tStoreInt32(&X[me], i)\n\t\t\t\tmy := LoadInt32(&X[he])\n\t\t\t\tStoreInt32(&ack[me][i%3], my)\n\t\t\t\tfor w := 1; LoadInt32(&ack[he][i%3]) == -1; w++ {\n\t\t\t\t\tif w%1000 == 0 {\n\t\t\t\t\t\truntime.Gosched()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\this := LoadInt32(&ack[he][i%3])\n\t\t\t\tif (my != i && my != i-1) || (his != i && his != i-1) {\n\t\t\t\t\tt.Errorf(\"invalid values: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif my != i && his != i {\n\t\t\t\t\tt.Errorf(\"store/load are not sequentially consistent: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tStoreInt32(&ack[me][(i-1)%3], -1)\n\t\t\t}\n\t\t\tc <- true\n\t\t}(p)\n\t}\n\t<-c\n\t<-c\n}\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n}\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tif runtime.NumCPU() == 1 {\n\t\tt.Skipf(\"Skipping test on %v processor machine\", runtime.NumCPU())\n\t}\n\tif test64err != nil {\n\t\tt.Skipf(\"Skipping 64-bit tests: %v\", test64err)\n\t}\n\tdefer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))\n\tN := int64(1e3)\n\tif testing.Short() {\n\t\tN = int64(1e2)\n\t}\n\tc := make(chan bool, 2)\n\tX := [2]int64{}\n\tack := [2][3]int64{{-1, -1, -1}, {-1, -1, -1}}\n\tfor p := 0; p < 2; p++ {\n\t\tgo func(me int) {\n\t\t\the := 1 - me\n\t\t\tfor i := int64(1); i < N; i++ {\n\t\t\t\tStoreInt64(&X[me], i)\n\t\t\t\tmy := LoadInt64(&X[he])\n\t\t\t\tStoreInt64(&ack[me][i%3], my)\n\t\t\t\tfor w := 1; LoadInt64(&ack[he][i%3]) == -1; w++ {\n\t\t\t\t\tif w%1000 == 0 {\n\t\t\t\t\t\truntime.Gosched()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\this := LoadInt64(&ack[he][i%3])\n\t\t\t\tif (my != i && my != i-1) || (his != i && his != i-1) {\n\t\t\t\t\tt.Errorf(\"invalid values: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif my != i && his != i {\n\t\t\t\t\tt.Errorf(\"store/load are not sequentially consistent: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tStoreInt64(&ack[me][(i-1)%3], -1)\n\t\t\t}\n\t\t\tc <- true\n\t\t}(p)\n\t}\n\t<-c\n\t<-c\n}\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n}\n//--from\nfunc TestNilDeref(t *testing.T) {\n\tfuncs := [...]func(){\n\t\tfunc() { CompareAndSwapInt32(nil, 0, 0) },\n\t\tfunc() { (*Int32)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapInt64(nil, 0, 0) },\n\t\tfunc() { (*Int64)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUint32(nil, 0, 0) },\n\t\tfunc() { (*Uint32)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUint64(nil, 0, 0) },\n\t\tfunc() { (*Uint64)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUintptr(nil, 0, 0) },\n\t\tfunc() { (*Uintptr)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapPointer(nil, nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).CompareAndSwap(nil, nil) },\n\t\tfunc() { SwapInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Swap(0) },\n\t\tfunc() { SwapUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Swap(0) },\n\t\tfunc() { SwapInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Swap(0) },\n\t\tfunc() { SwapUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Swap(0) },\n\t\tfunc() { SwapUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Swap(0) },\n\t\tfunc() { SwapPointer(nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Swap(nil) },\n\t\tfunc() { AddInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Add(0) },\n\t\tfunc() { AddUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Add(0) },\n\t\tfunc() { AddInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Add(0) },\n\t\tfunc() { AddUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Add(0) },\n\t\tfunc() { AddUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Add(0) },\n\t\tfunc() { LoadInt32(nil) },\n\t\tfunc() { (*Int32)(nil).Load() },\n\t\tfunc() { LoadInt64(nil) },\n\t\tfunc() { (*Int64)(nil).Load() },\n\t\tfunc() { LoadUint32(nil) },\n\t\tfunc() { (*Uint32)(nil).Load() },\n\t\tfunc() { LoadUint64(nil) },\n\t\tfunc() { (*Uint64)(nil).Load() },\n\t\tfunc() { LoadUintptr(nil) },\n\t\tfunc() { (*Uintptr)(nil).Load() },\n\t\tfunc() { LoadPointer(nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Load() },\n\t\tfunc() { StoreInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Store(0) },\n\t\tfunc() { StoreInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Store(0) },\n\t\tfunc() { StoreUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Store(0) },\n\t\tfunc() { StoreUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Store(0) },\n\t\tfunc() { StoreUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Store(0) },\n\t\tfunc() { StorePointer(nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Store(nil) },\n\t}\n\tfor _, f := range funcs {\n\t\tfunc() {\n\t\t\tdefer func() {\n\t\t\t\truntime.GC()\n\t\t\t\trecover()\n\t\t\t}()\n\t\t\tf()\n\t\t}()\n\t}\n}\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.19_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.19_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {\n\t\torigRlimitNofile.Store(lim)\n\t\tlim.Cur = lim.Max\n\t\tadjustFileLimit(&lim)\n\t\tsetrlimit(RLIMIT_NOFILE, &lim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.19_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\treturn RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n}\n//--to\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tprintln(\"not implemented syscall at RawSyscall\", trap)\n\tpanic(\"syscall.RawSyscall\")\n\treturn 0, 0, ENOSYS\n}\n//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.19_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.19_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n\n\tbaghdad, err := LoadLocation(\"Asia/Baghdad\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tvar t1, t2 Time\n\n\tt1, err = ParseInLocation(\"Jan 02 2006 MST\", \"Feb 01 2013 AST\", baghdad)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t_, offset := t1.Zone()\n\n\t// A zero offset means that ParseInLocation did not recognize the\n\t// 'AST' abbreviation as matching the current location (Baghdad,\n\t// where we'd expect a +03 hrs offset); likely because we're using\n\t// a recent tzdata release (2017a or newer).\n\t// If it happens, skip the Baghdad test.\n\tif offset != 0 {\n\t\tt2 = Date(2013, February, 1, 00, 00, 00, 0, baghdad)\n\t\tif t1 != t2 {\n\t\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Baghdad) = %v, want %v\", t1, t2)\n\t\t}\n\t\tif offset != 3*60*60 {\n\t\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Baghdad).Zone = _, %d, want _, %d\", offset, 3*60*60)\n\t\t}\n\t}\n\n\tblancSablon, err := LoadLocation(\"America/Blanc-Sablon\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// In this case 'AST' means 'Atlantic Standard Time', and we\n\t// expect the abbreviation to correctly match the american\n\t// location.\n\tt1, err = ParseInLocation(\"Jan 02 2006 MST\", \"Feb 01 2013 AST\", blancSablon)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tt2 = Date(2013, February, 1, 00, 00, 00, 0, blancSablon)\n\tif t1 != t2 {\n\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Blanc-Sablon) = %v, want %v\", t1, t2)\n\t}\n\t_, offset = t1.Zone()\n\tif offset != -4*60*60 {\n\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Blanc-Sablon).Zone = _, %d, want _, %d\", offset, -4*60*60)\n\t}\n}\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\t_, err := LoadLocation(\"Australia/Sydney\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.19_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n\tconst delay = 100 * Millisecond\n\tgo func() {\n\t\tSleep(delay / 2)\n\t\tInterrupt()\n\t}()\n\tstart := Now()\n\tSleep(delay)\n\tdelayadj := delay\n\tif runtime.GOOS == \"windows\" {\n\t\tdelayadj -= windowsInaccuracy\n\t}\n\tduration := Now().Sub(start)\n\tif duration < delayadj {\n\t\tt.Fatalf(\"Sleep(%s) slept for only %s\", delay, duration)\n\t}\n}\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n}\n//--from\nfunc TestIssue5745(t *testing.T) {\n\tticker := NewTicker(Hour)\n\tdefer func() {\n\t\t// would deadlock here before the fix due to\n\t\t// lock taken before the segfault.\n\t\tticker.Stop()\n\n\t\tif r := recover(); r == nil {\n\t\t\tt.Error(\"Expected panic, but none happened.\")\n\t\t}\n\t}()\n\n\t// cause a panic due to a segfault\n\tvar timer *Timer\n\ttimer.Stop()\n\tt.Error(\"Should be unreachable.\")\n}\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n\t// Issue 4064: handle locations without any zone transitions.\n\tloc, err := LoadLocation(\"Etc/GMT+1\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// The tzdata name Etc/GMT+1 uses \"east is negative\",\n\t// but Go and most other systems use \"east is positive\".\n\t// So GMT+1 corresponds to -3600 in the Go zone, not +3600.\n\tname, offset := Now().In(loc).Zone()\n\t// The zone abbreviation is \"-01\" since tzdata-2016g, and \"GMT+1\"\n\t// on earlier versions; we accept both. (Issue #17276).\n\tif !(name == \"GMT+1\" || name == \"-01\") || offset != -1*60*60 {\n\t\tt.Errorf(\"Now().In(loc).Zone() = %q, %d, want %q or %q, %d\",\n\t\t\tname, offset, \"GMT+1\", \"-01\", -1*60*60)\n\t}\n}\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\ttzWithDST, err := LoadLocation(\"Australia/Sydney\")\n\tif err != nil {\n\t\tt.Fatalf(\"could not load tz 'Australia/Sydney': %v\", err)\n\t}\n\ttzWithoutDST, err := LoadLocation(\"Australia/Brisbane\")\n\tif err != nil {\n\t\tt.Fatalf(\"could not load tz 'Australia/Brisbane': %v\", err)\n\t}\n\ttzFixed := FixedZone(\"FIXED_TIME\", 12345)\n\n\ttests := [...]struct {\n\t\ttime Time\n\t\twant bool\n\t}{\n\t\t0: {Date(2009, 1, 1, 12, 0, 0, 0, UTC), false},\n\t\t1: {Date(2009, 6, 1, 12, 0, 0, 0, UTC), false},\n\t\t2: {Date(2009, 1, 1, 12, 0, 0, 0, tzWithDST), true},\n\t\t3: {Date(2009, 6, 1, 12, 0, 0, 0, tzWithDST), false},\n\t\t4: {Date(2009, 1, 1, 12, 0, 0, 0, tzWithoutDST), false},\n\t\t5: {Date(2009, 6, 1, 12, 0, 0, 0, tzWithoutDST), false},\n\t\t6: {Date(2009, 1, 1, 12, 0, 0, 0, tzFixed), false},\n\t\t7: {Date(2009, 6, 1, 12, 0, 0, 0, tzFixed), false},\n\t}\n\n\tfor i, tt := range tests {\n\t\tgot := tt.time.IsDST()\n\t\tif got != tt.want {\n\t\t\tt.Errorf(\"#%d:: (%#v).IsDST()=%t, want %t\", i, tt.time.Format(RFC3339), got, tt.want)\n\t\t}\n\t}\n}\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\tloc, err := LoadLocation(\"Asia/Shanghai\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := [...]struct {\n\t\tgive Time\n\t\twant Time\n\t}{\n\t\t// 14 Apr 1991 - Daylight Saving Time Started\n\t\t// When time of \"Asia/Shanghai\" was about to reach\n\t\t// Sunday, 14 April 1991, 02:00:00 clocks were turned forward 1 hour to\n\t\t// Sunday, 14 April 1991, 03:00:00 local daylight time instead.\n\t\t// The UTC time was 13 April 1991, 18:00:00\n\t\t0: {Date(1991, April, 13, 17, 50, 0, 0, loc), Date(1991, April, 13, 9, 50, 0, 0, UTC)},\n\t\t1: {Date(1991, April, 13, 18, 0, 0, 0, loc), Date(1991, April, 13, 10, 0, 0, 0, UTC)},\n\t\t2: {Date(1991, April, 14, 1, 50, 0, 0, loc), Date(1991, April, 13, 17, 50, 0, 0, UTC)},\n\t\t3: {Date(1991, April, 14, 3, 0, 0, 0, loc), Date(1991, April, 13, 18, 0, 0, 0, UTC)},\n\n\t\t// 15 Sep 1991 - Daylight Saving Time Ended\n\t\t// When local daylight time of \"Asia/Shanghai\" was about to reach\n\t\t// Sunday, 15 September 1991, 02:00:00 clocks were turned backward 1 hour to\n\t\t// Sunday, 15 September 1991, 01:00:00 local standard time instead.\n\t\t// The UTC time was 14 September 1991, 17:00:00\n\t\t4: {Date(1991, September, 14, 16, 50, 0, 0, loc), Date(1991, September, 14, 7, 50, 0, 0, UTC)},\n\t\t5: {Date(1991, September, 14, 17, 0, 0, 0, loc), Date(1991, September, 14, 8, 0, 0, 0, UTC)},\n\t\t6: {Date(1991, September, 15, 0, 50, 0, 0, loc), Date(1991, September, 14, 15, 50, 0, 0, UTC)},\n\t\t7: {Date(1991, September, 15, 2, 00, 0, 0, loc), Date(1991, September, 14, 18, 00, 0, 0, UTC)},\n\t}\n\n\tfor i, tt := range tests {\n\t\tif !tt.give.Equal(tt.want) {\n\t\t\tt.Errorf(\"#%d:: %#v is not equal to %#v\", i, tt.give.Format(RFC3339), tt.want.Format(RFC3339))\n\t\t}\n\t}\n}\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt0, err := Parse(RFC3339, \"1880-01-01T00:00:00Z\")\n\tif err != nil {\n\t\tt.Errorf(\"Failed to parse time, error = %v\", err)\n\t}\n\tloc, err := LoadLocation(\"US/Eastern\")\n\tif err != nil {\n\t\tt.Errorf(\"Failed to load location, error = %v\", err)\n\t}\n\tt1 := t0.In(loc)\n\tb, err := t1.MarshalBinary()\n\tif err != nil {\n\t\tt.Errorf(\"Failed to Marshal, error = %v\", err)\n\t}\n\n\tt2 := Time{}\n\terr = t2.UnmarshalBinary(b)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to Unmarshal, error = %v\", err)\n\t}\n\n\tif !(t0.Equal(t1) && t1.Equal(t2)) {\n\t\tif !t0.Equal(t1) {\n\t\t\tt.Errorf(\"The result t1: %+v after Marshal is not matched original t0: %+v\", t1, t0)\n\t\t}\n\t\tif !t1.Equal(t2) {\n\t\t\tt.Errorf(\"The result t2: %+v after Unmarshal is not matched original t1: %+v\", t2, t1)\n\t\t}\n\t}\n}\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/time/tzdata_test.go.patch",
    "content": "//--from\nimport (\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\t_ \"time/tzdata\"\n)\n//--to\nimport (\n\t\"reflect\"\n\t\"testing\"\n\t_ \"time/tzdata\"\n)\n//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tfor _, zone := range zones {\n\t\tref, err := time.LoadLocation(zone)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadLocation(%q): %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tembedded, err := time.LoadFromEmbeddedTZData(zone)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadFromEmbeddedTZData(%q): %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\t\tsample, err := time.LoadLocationFromTZData(zone, []byte(embedded))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadLocationFromTZData failed for %q: %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Compare the name and zone fields of ref and sample.\n\t\t// The tx field changes faster as tzdata is updated.\n\t\t// The cache fields are expected to differ.\n\t\tv1 := reflect.ValueOf(ref).Elem()\n\t\tv2 := reflect.ValueOf(sample).Elem()\n\t\ttyp := v1.Type()\n\t\tnf := typ.NumField()\n\t\tfound := 0\n\t\tfor i := 0; i < nf; i++ {\n\t\t\tft := typ.Field(i)\n\t\t\tif ft.Name != \"name\" && ft.Name != \"zone\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfound++\n\t\t\tif !equal(t, v1.Field(i), v2.Field(i)) {\n\t\t\t\tt.Errorf(\"zone %s: system and embedded tzdata field %s differs\", zone, ft.Name)\n\t\t\t}\n\t\t}\n\t\tif found != 2 {\n\t\t\tt.Errorf(\"test must be updated for change to time.Location struct\")\n\t\t}\n\t}\n}\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n)\n//--from\nfunc TestEnvVarUsage(t *testing.T) {\n\ttime.ResetZoneinfoForTesting()\n\n\tconst testZoneinfo = \"foo.zip\"\n\tconst env = \"ZONEINFO\"\n\n\tt.Setenv(env, testZoneinfo)\n\n\t// Result isn't important, we're testing the side effect of this command\n\ttime.LoadLocation(\"Asia/Jerusalem\")\n\tdefer time.ResetZoneinfoForTesting()\n\n\tif zoneinfo := time.ZoneinfoForTesting(); testZoneinfo != *zoneinfo {\n\t\tt.Errorf(\"zoneinfo does not match env variable: got %q want %q\", *zoneinfo, testZoneinfo)\n\t}\n}\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n\ttime.ResetZoneinfoForTesting()\n\tloc := \"Asia/SomethingNotExist\"\n\twant := errors.New(\"unknown time zone \" + loc)\n\t_, err := time.LoadLocation(loc)\n\tif err.Error() != want.Error() {\n\t\tt.Errorf(\"LoadLocation(%q) error = %v; want %v\", loc, err, want)\n\t}\n}\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestVersion3(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\t_, err := time.LoadLocation(\"Asia/Jerusalem\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestFirstZone(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst format = \"Mon, 02 Jan 2006 15:04:05 -0700 (MST)\"\n\tvar tests = []struct {\n\t\tzone  string\n\t\tunix  int64\n\t\twant1 string\n\t\twant2 string\n\t}{\n\t\t{\n\t\t\t\"PST8PDT\",\n\t\t\t-1633269601,\n\t\t\t\"Sun, 31 Mar 1918 01:59:59 -0800 (PST)\",\n\t\t\t\"Sun, 31 Mar 1918 03:00:00 -0700 (PDT)\",\n\t\t},\n\t\t{\n\t\t\t\"Pacific/Fakaofo\",\n\t\t\t1325242799,\n\t\t\t\"Thu, 29 Dec 2011 23:59:59 -1100 (-11)\",\n\t\t\t\"Sat, 31 Dec 2011 00:00:00 +1300 (+13)\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tz, err := time.LoadLocation(test.zone)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ts := time.Unix(test.unix, 0).In(z).Format(format)\n\t\tif s != test.want1 {\n\t\t\tt.Errorf(\"for %s %d got %q want %q\", test.zone, test.unix, s, test.want1)\n\t\t}\n\t\ts = time.Unix(test.unix+1, 0).In(z).Format(format)\n\t\tif s != test.want2 {\n\t\t\tt.Errorf(\"for %s %d got %q want %q\", test.zone, test.unix, s, test.want2)\n\t\t}\n\t}\n}\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst locationName = \"Asia/Jerusalem\"\n\treference, err := time.LoadLocation(locationName)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgorootSource, ok := time.GorootZoneSource(testenv.GOROOT(t))\n\tif !ok {\n\t\tt.Fatal(\"Failed to locate tzinfo source in GOROOT.\")\n\t}\n\ttzinfo, err := time.LoadTzinfo(locationName, gorootSource)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsample, err := time.LoadLocationFromTZData(locationName, tzinfo)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif !reflect.DeepEqual(reference, sample) {\n\t\tt.Errorf(\"return values of LoadLocationFromTZData and LoadLocation don't match\")\n\t}\n}\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst locName = \"America/New_York\"\n\tloc, err := time.LoadLocation(locName)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\td := time.Date(1900, time.January, 1, 0, 0, 0, 0, loc)\n\ttzName, tzOffset := d.Zone()\n\tif want := \"EST\"; tzName != want {\n\t\tt.Errorf(\"Zone name == %s, want %s\", tzName, want)\n\t}\n\tif want := -18000; tzOffset != want {\n\t\tt.Errorf(\"Zone offset == %d, want %d\", tzOffset, want)\n\t}\n}\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tfor _, test := range slimTests {\n\t\ttzData, err := os.ReadFile(\"testdata/\" + test.fileName)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\t\treference, err := time.LoadLocationFromTZData(test.zoneName, tzData)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\td := test.date(reference)\n\t\ttzName, tzOffset := d.Zone()\n\t\tif tzName != test.wantName {\n\t\t\tt.Errorf(\"Zone name == %s, want %s\", tzName, test.wantName)\n\t\t}\n\t\tif tzOffset != test.wantOffset {\n\t\t\tt.Errorf(\"Zone offset == %d, want %d\", tzOffset, test.wantOffset)\n\t\t}\n\t}\n}\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.19_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEnvTZUsage(t *testing.T) {\n\tconst env = \"TZ\"\n\ttz, ok := os.LookupEnv(env)\n\tif !ok {\n\t\tdefer os.Unsetenv(env)\n\t} else {\n\t\tdefer os.Setenv(env, tz)\n\t}\n\tdefer time.ForceUSPacificForTesting()\n\n\tlocalZoneName := \"Local\"\n\t// The file may not exist.\n\tif _, err := os.Stat(\"/etc/localtime\"); os.IsNotExist(err) {\n\t\tlocalZoneName = \"UTC\"\n\t}\n\n\tcases := []struct {\n\t\tnilFlag bool\n\t\ttz      string\n\t\tlocal   string\n\t}{\n\t\t// no $TZ means use the system default /etc/localtime.\n\t\t{true, \"\", localZoneName},\n\t\t// $TZ=\"\" means use UTC.\n\t\t{false, \"\", \"UTC\"},\n\t\t{false, \":\", \"UTC\"},\n\t\t{false, \"Asia/Shanghai\", \"Asia/Shanghai\"},\n\t\t{false, \":Asia/Shanghai\", \"Asia/Shanghai\"},\n\t\t{false, \"/etc/localtime\", localZoneName},\n\t\t{false, \":/etc/localtime\", localZoneName},\n\t}\n\n\tfor _, c := range cases {\n\t\ttime.ResetLocalOnceForTest()\n\t\tif c.nilFlag {\n\t\t\tos.Unsetenv(env)\n\t\t} else {\n\t\t\tos.Setenv(env, c.tz)\n\t\t}\n\t\tif time.Local.String() != c.local {\n\t\t\tt.Errorf(\"invalid Local location name for %q: got %q want %q\", c.tz, time.Local, c.local)\n\t\t}\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\t// The file may not exist on Solaris 2 and IRIX 6.\n\tpath := \"/usr/share/zoneinfo/Asia/Shanghai\"\n\tos.Setenv(env, path)\n\tif _, err := os.Stat(path); os.IsNotExist(err) {\n\t\tif time.Local.String() != \"UTC\" {\n\t\t\tt.Errorf(`invalid path should fallback to UTC: got %q want \"UTC\"`, time.Local)\n\t\t}\n\t\treturn\n\t}\n\tif time.Local.String() != path {\n\t\tt.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path)\n\t}\n\n\ttimeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)\n\tsameTimeInShanghai := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)\n\tif !timeInUTC.Equal(sameTimeInShanghai) {\n\t\tt.Errorf(\"invalid timezone: got %q want %q\", timeInUTC, sameTimeInShanghai)\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\tos.Setenv(env, \":\"+path)\n\tif time.Local.String() != path {\n\t\tt.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path)\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\tos.Setenv(env, path[:len(path)-1])\n\tif time.Local.String() != \"UTC\" {\n\t\tt.Errorf(`invalid path should fallback to UTC: got %q want \"UTC\"`, time.Local)\n\t}\n}\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_windows/runtime/abi_test.go.patch",
    "content": "//--from\nfunc TestFinalizerRegisterABI(t *testing.T) {\n//--to\nfunc TestFinalizerRegisterABI(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.19_windows/runtime/cgo/gcc_fatalf.c.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n"
  },
  {
    "path": "1.19_windows/runtime/cgo/gcc_libinit.c.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n"
  },
  {
    "path": "1.19_windows/runtime/cgo/gcc_libinit_windows.c.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n"
  },
  {
    "path": "1.19_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--from\nstatic void\nthreadentry(void *v)\n{\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.19_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n#define stderr dummy_stderr\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n#define dummy_stderr 2\n"
  },
  {
    "path": "1.19_windows/runtime/crash_test.go.patch",
    "content": "//--from\nfunc TestRuntimePanic(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\tcmd := testenv.CleanCmdEnv(exec.Command(os.Args[0], \"-test.run=TestRuntimePanic\"))\n\tcmd.Env = append(cmd.Env, \"GO_TEST_RUNTIME_PANIC=1\")\n\tout, err := cmd.CombinedOutput()\n\tt.Logf(\"%s\", out)\n\tif err == nil {\n\t\tt.Error(\"child process did not fail\")\n\t} else if want := \"runtime.unexportedPanicForTesting\"; !bytes.Contains(out, []byte(want)) {\n\t\tt.Errorf(\"output did not contain expected string %q\", want)\n\t}\n}\n//--to\nfunc TestRuntimePanic(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n//--from\nfunc TestG0StackOverflow(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\n\tswitch runtime.GOOS {\n\tcase \"darwin\", \"dragonfly\", \"freebsd\", \"linux\", \"netbsd\", \"openbsd\", \"android\":\n\t\tt.Skipf(\"g0 stack is wrong on pthread platforms (see golang.org/issue/26061)\")\n\t}\n\n\tif os.Getenv(\"TEST_G0_STACK_OVERFLOW\") != \"1\" {\n\t\tcmd := testenv.CleanCmdEnv(exec.Command(os.Args[0], \"-test.run=TestG0StackOverflow\", \"-test.v\"))\n\t\tcmd.Env = append(cmd.Env, \"TEST_G0_STACK_OVERFLOW=1\")\n\t\tout, err := cmd.CombinedOutput()\n\t\t// Don't check err since it's expected to crash.\n\t\tif n := strings.Count(string(out), \"morestack on g0\\n\"); n != 1 {\n\t\t\tt.Fatalf(\"%s\\n(exit status %v)\", out, err)\n\t\t}\n\t\t// Check that it's a signal-style traceback.\n\t\tif runtime.GOOS != \"windows\" {\n\t\t\tif want := \"PC=\"; !strings.Contains(string(out), want) {\n\t\t\t\tt.Errorf(\"output does not contain %q:\\n%s\", want, out)\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\truntime.G0StackOverflow()\n}\n//--to\nfunc TestG0StackOverflow(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.19_windows/runtime/malloc_test.go.patch",
    "content": "//--from\nfunc TestArenaCollision(t *testing.T) {\n//--to\nfunc TestArenaCollision(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.19_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t_timeBeginPeriod,\n\t_timeEndPeriod,\n//--to\n//--from\n\tvar winmmdll = []byte(\"winmm.dll\\000\")\n\tm32 := windowsLoadSystemLib(winmmdll)\n\tif m32 == 0 {\n\t\tthrow(\"winmm.dll not found\")\n\t}\n\t_timeBeginPeriod = windowsFindfunc(m32, []byte(\"timeBeginPeriod\\000\"))\n\t_timeEndPeriod = windowsFindfunc(m32, []byte(\"timeEndPeriod\\000\"))\n\tif _timeBeginPeriod == nil || _timeEndPeriod == nil {\n\t\tthrow(\"timeBegin/EndPeriod not found\")\n\t}\n//--to\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tif relax {\n\t\treturn uint32(stdcall1(_timeEndPeriod, 1))\n\t} else {\n\t\treturn uint32(stdcall1(_timeBeginPeriod, 1))\n\t}\n}\n//--to\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tthrow(\"not reached\")\n\treturn 0\n}\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.19_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif trap == 0 {\n\t\tpanic(\"trap must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.19_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.19_windows/sync/mutex_test.go.patch",
    "content": "//--from\nimport (\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"strings\"\n\t. \"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t. \"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--from\nfunc TestMutexMisuse(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\tfor _, test := range misuseTests {\n\t\tout, err := exec.Command(os.Args[0], \"TESTMISUSE\", test.name).CombinedOutput()\n\t\tif err == nil || !strings.Contains(string(out), \"unlocked\") {\n\t\t\tt.Errorf(\"%s: did not find failure with message about unlocked lock: %s\\n%s\\n\", test.name, err, out)\n\t\t}\n\t}\n}\n//--to\nfunc TestMutexMisuse(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n       return\n"
  },
  {
    "path": "1.20_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc HasExec() bool {\n\tswitch runtime.GOOS {\n\tcase \"js\", \"ios\":\n\t\treturn false\n\t}\n\treturn true\n}\n//--to\nfunc HasExec() bool {\n\treturn false\n}\n"
  },
  {
    "path": "1.20_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n\tif os.Getenv(\"GO_GCFLAGS\") != \"\" {\n\t\t// It's too much work to require every caller of the go command\n\t\t// to pass along \"-gcflags=\"+os.Getenv(\"GO_GCFLAGS\").\n\t\t// For now, if $GO_GCFLAGS is set, report that we simply can't\n\t\t// run go build.\n\t\treturn false\n\t}\n\tswitch runtime.GOOS {\n\tcase \"android\", \"js\", \"ios\":\n\t\treturn false\n\t}\n\treturn true\n}\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n}\n"
  },
  {
    "path": "1.20_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm)\n//--to\n//go:build windows || plan9 || (js && wasm) || linux\n"
  },
  {
    "path": "1.20_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.20_linux/math/big/link_test.go.patch",
    "content": "//--from\nimport (\n\t\"bytes\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestLinkerGC(t *testing.T) {\n\tif testing.Short() {\n\t\tt.Skip(\"skipping in short mode\")\n\t}\n\tt.Parallel()\n\ttmp := t.TempDir()\n\tgoBin := testenv.GoToolPath(t)\n\tgoFile := filepath.Join(tmp, \"x.go\")\n\tfile := []byte(`package main\nimport _ \"math/big\"\nfunc main() {}\n`)\n\tif err := os.WriteFile(goFile, file, 0644); err != nil {\n\t\tt.Fatal(err)\n\t}\n\tcmd := exec.Command(goBin, \"build\", \"-o\", \"x.exe\", \"x.go\")\n\tcmd.Dir = tmp\n\tif out, err := cmd.CombinedOutput(); err != nil {\n\t\tt.Fatalf(\"compile: %v, %s\", err, out)\n\t}\n\n\tcmd = exec.Command(goBin, \"tool\", \"nm\", \"x.exe\")\n\tcmd.Dir = tmp\n\tnm, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tt.Fatalf(\"nm: %v, %s\", err, nm)\n\t}\n\tconst want = \"runtime.main\"\n\tif !bytes.Contains(nm, []byte(want)) {\n\t\t// Test the test.\n\t\tt.Errorf(\"expected symbol %q not found\", want)\n\t}\n\tbad := []string{\n\t\t\"math/big.(*Float)\",\n\t\t\"math/big.(*Rat)\",\n\t\t\"math/big.(*Int)\",\n\t}\n\tfor _, sym := range bad {\n\t\tif bytes.Contains(nm, []byte(sym)) {\n\t\t\tt.Errorf(\"unexpected symbol %q found\", sym)\n\t\t}\n\t}\n\tif t.Failed() {\n\t\tt.Logf(\"Got: %s\", nm)\n\t}\n}\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/align_test.go.patch",
    "content": "//--from\nimport (\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/importer\"\n\t\"go/parser\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"strings\"\n\t\"testing\"\n)\n//--from\nfunc TestAtomicAlignment(t *testing.T) {\n\ttestenv.MustHaveGoBuild(t) // go command needed to resolve std .a files for importer.Default().\n\n\t// Read the code making the tables above, to see which fields and\n\t// variables we are currently checking.\n\tchecked := map[string]bool{}\n\tx, err := os.ReadFile(\"./align_runtime_test.go\")\n\tif err != nil {\n\t\tt.Fatalf(\"read failed: %v\", err)\n\t}\n\tfieldDesc := map[int]string{}\n\tr := regexp.MustCompile(`unsafe[.]Offsetof[(](\\w+){}[.](\\w+)[)]`)\n\tmatches := r.FindAllStringSubmatch(string(x), -1)\n\tfor i, v := range matches {\n\t\tchecked[\"field runtime.\"+v[1]+\".\"+v[2]] = true\n\t\tfieldDesc[i] = v[1] + \".\" + v[2]\n\t}\n\tvarDesc := map[int]string{}\n\tr = regexp.MustCompile(`unsafe[.]Pointer[(]&(\\w+)[)]`)\n\tmatches = r.FindAllStringSubmatch(string(x), -1)\n\tfor i, v := range matches {\n\t\tchecked[\"var \"+v[1]] = true\n\t\tvarDesc[i] = v[1]\n\t}\n\n\t// Check all of our alignemnts. This is the actual core of the test.\n\tfor i, d := range runtime.AtomicFields {\n\t\tif d%8 != 0 {\n\t\t\tt.Errorf(\"field alignment of %s failed: offset is %d\", fieldDesc[i], d)\n\t\t}\n\t}\n\tfor i, p := range runtime.AtomicVariables {\n\t\tif uintptr(p)%8 != 0 {\n\t\t\tt.Errorf(\"variable alignment of %s failed: address is %x\", varDesc[i], p)\n\t\t}\n\t}\n\n\t// The code above is the actual test. The code below attempts to check\n\t// that the tables used by the code above are exhaustive.\n\n\t// Parse the whole runtime package, checking that arguments of\n\t// appropriate atomic operations are in the list above.\n\tfset := token.NewFileSet()\n\tm, err := parser.ParseDir(fset, \".\", nil, 0)\n\tif err != nil {\n\t\tt.Fatalf(\"parsing runtime failed: %v\", err)\n\t}\n\tpkg := m[\"runtime\"] // Note: ignore runtime_test and main packages\n\n\t// Filter files by those for the current architecture/os being tested.\n\tfileMap := map[string]bool{}\n\tfor _, f := range buildableFiles(t, \".\") {\n\t\tfileMap[f] = true\n\t}\n\tvar files []*ast.File\n\tfor fname, f := range pkg.Files {\n\t\tif fileMap[fname] {\n\t\t\tfiles = append(files, f)\n\t\t}\n\t}\n\n\t// Call go/types to analyze the runtime package.\n\tvar info types.Info\n\tinfo.Types = map[ast.Expr]types.TypeAndValue{}\n\tconf := types.Config{Importer: importer.Default()}\n\t_, err = conf.Check(\"runtime\", fset, files, &info)\n\tif err != nil {\n\t\tt.Fatalf(\"typechecking runtime failed: %v\", err)\n\t}\n\n\t// Analyze all atomic.*64 callsites.\n\tv := Visitor{t: t, fset: fset, types: info.Types, checked: checked}\n\tast.Walk(&v, pkg)\n}\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\t// Make sure we don't have any extra frames on the stack (due to\n\t// open-coded defer processing)\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersNilPointerPanic.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\",\n\t\t\"runtime_test.TestCallersNilPointerPanic\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t}()\n\tvar p *int\n\tif *p == 3 {\n\t\tt.Fatal(\"did not see nil pointer panic\")\n\t}\n}\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\t// Make sure we don't have any extra frames on the stack. We cut off the check\n\t// at runtime.sigpanic, because non-open-coded defers (which may be used in\n\t// non-opt or race checker mode) include an extra 'deferreturn' frame (which is\n\t// where the nil pointer deref happens).\n\tstate := 1\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersDeferNilFuncPanic.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t\tif state == 1 {\n\t\t\tt.Fatal(\"nil defer func panicked at defer time rather than function exit time\")\n\t\t}\n\n\t}()\n\tvar f func()\n\tdefer f()\n\t// Use the value of 'state' to make sure nil defer func f causes panic at\n\t// function exit, rather than at the defer statement.\n\tstate = 2\n}\n\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tstate := 1\n\twant := []string{\"runtime.Callers\", \"runtime_test.TestCallersDeferNilFuncPanicWithLoop.func1\",\n\t\t\"runtime.gopanic\", \"runtime.panicmem\", \"runtime.sigpanic\", \"runtime.deferreturn\", \"runtime_test.TestCallersDeferNilFuncPanicWithLoop\"}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatal(\"did not panic\")\n\t\t}\n\t\tpcs := make([]uintptr, 20)\n\t\tpcs = pcs[:runtime.Callers(0, pcs)]\n\t\ttestCallersEqual(t, pcs, want)\n\t\tif state == 1 {\n\t\t\tt.Fatal(\"nil defer func panicked at defer time rather than function exit time\")\n\t\t}\n\n\t}()\n\n\tfor i := 0; i < 1; i++ {\n\t\tvar f func()\n\t\tdefer f()\n\t}\n\t// Use the value of 'state' to make sure nil defer func f causes panic at\n\t// function exit, rather than at the defer statement.\n\tstate = 2\n}\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--to\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_setstacksize(attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n// +build linux,amd64 linux,arm64 linux,ppc64le\n//--to\n// +build linux,arm64 linux,ppc64le\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int index = 0;\n  int found = 0;\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  int32_t fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = &pseudo_files[index];\n  size_t rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  const static int kENOENT = 0x2;\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  const static int kEBADF = 0x9;\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  int ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    int ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.20_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n//--to\n//go:build (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n"
  },
  {
    "path": "1.20_linux/runtime/crash_test.go.patch",
    "content": "//--from\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"flag\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tif *flagQuick {\n\t\tt.Skip(\"-quick\")\n\t}\n\ttestenv.MustHaveGoBuild(t)\n\n\ttestprog.Lock()\n\tif testprog.dir == \"\" {\n\t\tdir, err := os.MkdirTemp(\"\", \"go-build\")\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"failed to create temp directory: %v\", err)\n\t\t}\n\t\ttestprog.dir = dir\n\t\ttoRemove = append(toRemove, dir)\n\t}\n\n\tif testprog.target == nil {\n\t\ttestprog.target = make(map[string]*buildexe)\n\t}\n\tname := binary\n\tif len(flags) > 0 {\n\t\tname += \"_\" + strings.Join(flags, \"_\")\n\t}\n\ttarget, ok := testprog.target[name]\n\tif !ok {\n\t\ttarget = &buildexe{}\n\t\ttestprog.target[name] = target\n\t}\n\n\tdir := testprog.dir\n\n\t// Unlock testprog while actually building, so that other\n\t// tests can look up executables that were already built.\n\ttestprog.Unlock()\n\n\ttarget.once.Do(func() {\n\t\t// Only do two \"go build\"'s at a time,\n\t\t// to keep load from getting too high.\n\t\tserializeBuild <- true\n\t\tdefer func() { <-serializeBuild }()\n\n\t\t// Don't get confused if testenv.GoToolPath calls t.Skip.\n\t\ttarget.err = errors.New(\"building test called t.Skip\")\n\n\t\texe := filepath.Join(dir, name+\".exe\")\n\n\t\tt.Logf(\"running go build -o %s %s\", exe, strings.Join(flags, \" \"))\n\t\tcmd := exec.Command(testenv.GoToolPath(t), append([]string{\"build\", \"-o\", exe}, flags...)...)\n\t\tcmd.Dir = \"testdata/\" + binary\n\t\tout, err := testenv.CleanCmdEnv(cmd).CombinedOutput()\n\t\tif err != nil {\n\t\t\ttarget.err = fmt.Errorf(\"building %s %v: %v\\n%s\", binary, flags, err, out)\n\t\t} else {\n\t\t\ttarget.exe = exe\n\t\t\ttarget.err = nil\n\t\t}\n\t})\n\n\treturn target.exe, target.err\n}\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n\treturn \"\", nil\n}\n//--from\nfunc TestPanicInlined(t *testing.T) {\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"recover failed\")\n\t\t}\n\t\tbuf := make([]byte, 2048)\n\t\tn := runtime.Stack(buf, false)\n\t\tbuf = buf[:n]\n\t\tif !bytes.Contains(buf, []byte(\"(*point).negate(\")) {\n\t\t\tt.Fatalf(\"expecting stack trace to contain call to (*point).negate()\")\n\t\t}\n\t}()\n\n\tpt := new(point)\n\tpt.negate()\n}\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"recover failed\")\n\t\t}\n\t\tbuf := make([]byte, 2048)\n\t\tn := runtime.Stack(buf, false)\n\t\tbuf = buf[:n]\n\t\tif !bytes.Contains(buf, []byte(\"(*point).negate(\")) {\n\t\t\tt.Fatalf(\"expecting stack trace to contain call to (*point).negate()\")\n\t\t}\n\t}()\n\n\tpt := new(point)\n\tpt.negate()\n}\n"
  },
  {
    "path": "1.20_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.20_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nimport (\n\t\"os\"\n\t\"runtime\"\n\t. \"runtime/debug\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\tWriteHeapDump(f.Fd())\n\tfi, err := f.Stat()\n\tif err != nil {\n\t\tt.Fatalf(\"Stat failed: %v\", err)\n\t}\n\tconst minSize = 1\n\tif size := fi.Size(); size < minSize {\n\t\tt.Fatalf(\"Heap dump size %d bytes, expected at least %d bytes\", size, minSize)\n\t}\n}\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\n\t// bug 9172: WriteHeapDump couldn't handle more than one finalizer\n\tprintln(\"allocating objects\")\n\tx := &Obj{}\n\truntime.SetFinalizer(x, objfin)\n\ty := &Obj{}\n\truntime.SetFinalizer(y, objfin)\n\n\t// Trigger collection of x and y, queueing of their finalizers.\n\tprintln(\"starting gc\")\n\truntime.GC()\n\n\t// Make sure WriteHeapDump doesn't fail with multiple queued finalizers.\n\tprintln(\"starting dump\")\n\tWriteHeapDump(f.Fd())\n\tprintln(\"done dump\")\n}\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tif runtime.GOOS == \"js\" {\n\t\tt.Skipf(\"WriteHeapDump is not available on %s.\", runtime.GOOS)\n\t}\n\tf, err := os.CreateTemp(\"\", \"heapdumptest\")\n\tif err != nil {\n\t\tt.Fatalf(\"TempFile failed: %v\", err)\n\t}\n\tdefer os.Remove(f.Name())\n\tdefer f.Close()\n\tWriteHeapDump(f.Fd())\n\tdummy.M()\n\tdummy2.M()\n}\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nimport (\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"syscall\"\n\t\"testing\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestPanicOnFault(t *testing.T) {\n\tif runtime.GOARCH == \"s390x\" {\n\t\tt.Skip(\"s390x fault addresses are missing the low order bits\")\n\t}\n\tif runtime.GOOS == \"ios\" {\n\t\tt.Skip(\"iOS doesn't provide fault addresses\")\n\t}\n\tif runtime.GOOS == \"netbsd\" && runtime.GOARCH == \"arm\" {\n\t\tt.Skip(\"netbsd-arm doesn't provide fault address (golang.org/issue/45026)\")\n\t}\n\tm, err := syscall.Mmap(-1, 0, 0x1000, syscall.PROT_READ /* Note: no PROT_WRITE */, syscall.MAP_SHARED|syscall.MAP_ANON)\n\tif err != nil {\n\t\tt.Fatalf(\"can't map anonymous memory: %s\", err)\n\t}\n\tdefer syscall.Munmap(m)\n\told := debug.SetPanicOnFault(true)\n\tdefer debug.SetPanicOnFault(old)\n\tconst lowBits = 0x3e7\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil {\n\t\t\tt.Fatalf(\"write did not fault\")\n\t\t}\n\t\ttype addressable interface {\n\t\t\tAddr() uintptr\n\t\t}\n\t\ta, ok := r.(addressable)\n\t\tif !ok {\n\t\t\tt.Fatalf(\"fault does not contain address\")\n\t\t}\n\t\twant := uintptr(unsafe.Pointer(&m[lowBits]))\n\t\tgot := a.Addr()\n\t\tif got != want {\n\t\t\tt.Fatalf(\"fault address %x, want %x\", got, want)\n\t\t}\n\t}()\n\tm[lowBits] = 1 // will fault\n}\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.20_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.20_linux/runtime/internal/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.20_linux/runtime/internal/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.20_linux/runtime/internal/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n//--from\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\treturn Syscall6(num, a1, a2, a3, a4, a5, a6)\n}\n//--to\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at RawSyscall6\", num)\n\tpanic(\"syscall.RawSyscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.20_linux/runtime/internal/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.20_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n\treturn\n"
  },
  {
    "path": "1.20_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.20_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.20_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.20_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.20_linux/runtime/norace_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestNewOSProc0(t *testing.T) {\n\truntime.NewOSProc0(0x800000, unsafe.Pointer(abi.FuncPCABIInternal(newOSProcCreated)))\n\tcheck := time.NewTicker(100 * time.Millisecond)\n\tdefer check.Stop()\n\tend := time.After(5 * time.Second)\n\tfor {\n\t\tselect {\n\t\tcase <-check.C:\n\t\t\tif newOSProcDone {\n\t\t\t\treturn\n\t\t\t}\n\t\tcase <-end:\n\t\t\tt.Fatalf(\"couldn't create new OS process\")\n\t\t}\n\t}\n}\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\tif sysauxv(auxv[:]) != 0 {\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\tvar buf [128]uintptr\n\tn = read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tbuf[len(buf)-2] = _AT_NULL\n\tsysauxv(buf[:])\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\tvar buf [128]uintptr\n\tn := read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tbuf[len(buf)-2] = _AT_NULL\n\tsysauxv(buf[:])\n}\n//--from\nfunc getRandomData(r []byte) {\n\tif startupRandomData != nil {\n\t\tn := copy(r, startupRandomData)\n\t\textendRandom(r, n)\n\t\treturn\n\t}\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\textendRandom(r, int(n))\n}\n//--to\n// Use getRandomData in os_plan9.go.\n\n//go:nosplit\nfunc getRandomData(r []byte) {\n\t// inspired by wyrand see hash32.go for detail\n\tt := nanotime()\n\tv := getg().m.procid ^ uint64(t)\n\n\tfor len(r) > 0 {\n\t\tv ^= 0xa0761d6478bd642f\n\t\tv *= 0xe7037ed1a0b428db\n\t\tsize := 8\n\t\tif len(r) < 8 {\n\t\t\tsize = len(r)\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\tr[i] = byte(v >> (8 * i))\n\t\t}\n\t\tr = r[size:]\n\t\tv = v>>32 | v<<32\n\t}\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.20_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.20_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.20_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n\tvar dst byte\n\tv := Mincore(Add(unsafe.Pointer(new(int32)), 1), 1, &dst)\n\n\tconst EINVAL = 0x16\n\tif v != -EINVAL {\n\t\tt.Errorf(\"mincore = %v, want %v\", v, -EINVAL)\n\t}\n}\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.20_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tif GOOS == \"js\" {\n\t\tt.Skip(\"js does not support catching faults\")\n\t}\n\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\t*nfault++\n\t\t}\n\t}()\n\n\t// The read should fault, except that sometimes we hit\n\t// addresses that have had C or kernel pages mapped there\n\t// readable by user code. So just log the content.\n\t// If no addresses fault, we'll fail the test.\n\tv := *(*byte)(unsafe.Pointer(addr))\n\tt.Logf(\"addr %#x: %#x\\n\", addr, v)\n}\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.20_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\t// Push a defer that will walk the stack.\n\tdefer func() {\n\t\tif err := recover(); err == nil {\n\t\t\tt.Fatal(\"expected panic from nil pointer\")\n\t\t}\n\t\tGC()\n\t}()\n\t// Call a leaf function. We must set up the exact call stack:\n\t//\n\t//  defering function -> leaf function -> sigpanic\n\t//\n\t// On LR machines, the leaf function will have the same SP as\n\t// the SP pushed for the defer frame.\n\ttestDeferLeafSigpanic1()\n}\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Run(\"sigpanic\", func(t *testing.T) {\n\t\t// nil calls to interface methods cause a sigpanic.\n\t\ttestStackWrapperPanic(t, func() { I.M(nil) }, \"runtime_test.I.M\")\n\t})\n\tt.Run(\"panicwrap\", func(t *testing.T) {\n\t\t// Nil calls to value method wrappers call panicwrap.\n\t\twrapper := (*structWithMethod).nop\n\t\ttestStackWrapperPanic(t, func() { wrapper(nil) }, \"runtime_test.(*structWithMethod).nop\")\n\t})\n}\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n//--from\nfunc TestTracebackInlineExcluded(t *testing.T) {\n\tdefer func() {\n\t\trecover()\n\t\tbuf := make([]byte, 4<<10)\n\t\tstk := string(buf[:Stack(buf, false)])\n\n\t\tt.Log(stk)\n\n\t\tif not := \"tracebackExcluded\"; strings.Contains(stk, not) {\n\t\t\tt.Errorf(\"found but did not expect %q\", not)\n\t\t}\n\t\tif want := \"tracebackNotExcluded\"; !strings.Contains(stk, want) {\n\t\t\tt.Errorf(\"expected %q in stack\", want)\n\t\t}\n\t}()\n\ttracebackExcluded()\n}\n//--to\nfunc TestTracebackInlineExcluded(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.20_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.20_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.20_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$-8\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.20_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.20_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.20_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.20_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.20_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.20_linux/strconv/fp_test.go.patch",
    "content": "//--from\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n)\n//--from\nfunc TestFp(t *testing.T) {\n\tf, err := os.Open(\"testdata/testfp.txt\")\n\tif err != nil {\n\t\tt.Fatal(\"testfp: open testdata/testfp.txt:\", err)\n\t}\n\tdefer f.Close()\n\n\ts := bufio.NewScanner(f)\n\n\tfor lineno := 1; s.Scan(); lineno++ {\n\t\tline := s.Text()\n\t\tif len(line) == 0 || line[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\ta := strings.Split(line, \" \")\n\t\tif len(a) != 4 {\n\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": wrong field count\")\n\t\t\tcontinue\n\t\t}\n\t\tvar s string\n\t\tvar v float64\n\t\tswitch a[0] {\n\t\tcase \"float64\":\n\t\t\tvar ok bool\n\t\t\tv, ok = myatof64(a[2])\n\t\t\tif !ok {\n\t\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": cannot atof64 \", a[2])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts = fmt.Sprintf(a[1], v)\n\t\tcase \"float32\":\n\t\t\tv1, ok := myatof32(a[2])\n\t\t\tif !ok {\n\t\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": cannot atof32 \", a[2])\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts = fmt.Sprintf(a[1], v1)\n\t\t\tv = float64(v1)\n\t\t}\n\t\tif s != a[3] {\n\t\t\tt.Error(\"testdata/testfp.txt:\", lineno, \": \", a[0], \" \", a[1], \" \", a[2], \" (\", v, \") \",\n\t\t\t\t\"want \", a[3], \" got \", s)\n\t\t}\n\t}\n\tif s.Err() != nil {\n\t\tt.Fatal(\"testfp: read testdata/testfp.txt: \", s.Err())\n\t}\n}\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tif runtime.NumCPU() == 1 {\n\t\tt.Skipf(\"Skipping test on %v processor machine\", runtime.NumCPU())\n\t}\n\tdefer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))\n\tN := int32(1e3)\n\tif testing.Short() {\n\t\tN = int32(1e2)\n\t}\n\tc := make(chan bool, 2)\n\tX := [2]int32{}\n\tack := [2][3]int32{{-1, -1, -1}, {-1, -1, -1}}\n\tfor p := 0; p < 2; p++ {\n\t\tgo func(me int) {\n\t\t\the := 1 - me\n\t\t\tfor i := int32(1); i < N; i++ {\n\t\t\t\tStoreInt32(&X[me], i)\n\t\t\t\tmy := LoadInt32(&X[he])\n\t\t\t\tStoreInt32(&ack[me][i%3], my)\n\t\t\t\tfor w := 1; LoadInt32(&ack[he][i%3]) == -1; w++ {\n\t\t\t\t\tif w%1000 == 0 {\n\t\t\t\t\t\truntime.Gosched()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\this := LoadInt32(&ack[he][i%3])\n\t\t\t\tif (my != i && my != i-1) || (his != i && his != i-1) {\n\t\t\t\t\tt.Errorf(\"invalid values: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif my != i && his != i {\n\t\t\t\t\tt.Errorf(\"store/load are not sequentially consistent: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tStoreInt32(&ack[me][(i-1)%3], -1)\n\t\t\t}\n\t\t\tc <- true\n\t\t}(p)\n\t}\n\t<-c\n\t<-c\n}\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n}\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tif runtime.NumCPU() == 1 {\n\t\tt.Skipf(\"Skipping test on %v processor machine\", runtime.NumCPU())\n\t}\n\tdefer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))\n\tN := int64(1e3)\n\tif testing.Short() {\n\t\tN = int64(1e2)\n\t}\n\tc := make(chan bool, 2)\n\tX := [2]int64{}\n\tack := [2][3]int64{{-1, -1, -1}, {-1, -1, -1}}\n\tfor p := 0; p < 2; p++ {\n\t\tgo func(me int) {\n\t\t\the := 1 - me\n\t\t\tfor i := int64(1); i < N; i++ {\n\t\t\t\tStoreInt64(&X[me], i)\n\t\t\t\tmy := LoadInt64(&X[he])\n\t\t\t\tStoreInt64(&ack[me][i%3], my)\n\t\t\t\tfor w := 1; LoadInt64(&ack[he][i%3]) == -1; w++ {\n\t\t\t\t\tif w%1000 == 0 {\n\t\t\t\t\t\truntime.Gosched()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\this := LoadInt64(&ack[he][i%3])\n\t\t\t\tif (my != i && my != i-1) || (his != i && his != i-1) {\n\t\t\t\t\tt.Errorf(\"invalid values: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif my != i && his != i {\n\t\t\t\t\tt.Errorf(\"store/load are not sequentially consistent: %d/%d (%d)\", my, his, i)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tStoreInt64(&ack[me][(i-1)%3], -1)\n\t\t\t}\n\t\t\tc <- true\n\t\t}(p)\n\t}\n\t<-c\n\t<-c\n}\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n}\n//--from\nfunc TestNilDeref(t *testing.T) {\n\tfuncs := [...]func(){\n\t\tfunc() { CompareAndSwapInt32(nil, 0, 0) },\n\t\tfunc() { (*Int32)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapInt64(nil, 0, 0) },\n\t\tfunc() { (*Int64)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUint32(nil, 0, 0) },\n\t\tfunc() { (*Uint32)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUint64(nil, 0, 0) },\n\t\tfunc() { (*Uint64)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapUintptr(nil, 0, 0) },\n\t\tfunc() { (*Uintptr)(nil).CompareAndSwap(0, 0) },\n\t\tfunc() { CompareAndSwapPointer(nil, nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).CompareAndSwap(nil, nil) },\n\t\tfunc() { SwapInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Swap(0) },\n\t\tfunc() { SwapUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Swap(0) },\n\t\tfunc() { SwapInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Swap(0) },\n\t\tfunc() { SwapUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Swap(0) },\n\t\tfunc() { SwapUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Swap(0) },\n\t\tfunc() { SwapPointer(nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Swap(nil) },\n\t\tfunc() { AddInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Add(0) },\n\t\tfunc() { AddUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Add(0) },\n\t\tfunc() { AddInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Add(0) },\n\t\tfunc() { AddUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Add(0) },\n\t\tfunc() { AddUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Add(0) },\n\t\tfunc() { LoadInt32(nil) },\n\t\tfunc() { (*Int32)(nil).Load() },\n\t\tfunc() { LoadInt64(nil) },\n\t\tfunc() { (*Int64)(nil).Load() },\n\t\tfunc() { LoadUint32(nil) },\n\t\tfunc() { (*Uint32)(nil).Load() },\n\t\tfunc() { LoadUint64(nil) },\n\t\tfunc() { (*Uint64)(nil).Load() },\n\t\tfunc() { LoadUintptr(nil) },\n\t\tfunc() { (*Uintptr)(nil).Load() },\n\t\tfunc() { LoadPointer(nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Load() },\n\t\tfunc() { StoreInt32(nil, 0) },\n\t\tfunc() { (*Int32)(nil).Store(0) },\n\t\tfunc() { StoreInt64(nil, 0) },\n\t\tfunc() { (*Int64)(nil).Store(0) },\n\t\tfunc() { StoreUint32(nil, 0) },\n\t\tfunc() { (*Uint32)(nil).Store(0) },\n\t\tfunc() { StoreUint64(nil, 0) },\n\t\tfunc() { (*Uint64)(nil).Store(0) },\n\t\tfunc() { StoreUintptr(nil, 0) },\n\t\tfunc() { (*Uintptr)(nil).Store(0) },\n\t\tfunc() { StorePointer(nil, nil) },\n\t\tfunc() { (*Pointer[byte])(nil).Store(nil) },\n\t}\n\tfor _, f := range funcs {\n\t\tfunc() {\n\t\t\tdefer func() {\n\t\t\t\truntime.GC()\n\t\t\t\trecover()\n\t\t\t}()\n\t\t\tf()\n\t\t}()\n\t}\n}\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.20_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.20_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {\n\t\torigRlimitNofile.Store(lim)\n\t\tlim.Cur = lim.Max\n\t\tadjustFileLimit(&lim)\n\t\tsetrlimit(RLIMIT_NOFILE, &lim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.20_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\treturn RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n}\n//--to\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tprintln(\"not implemented syscall at RawSyscall\", trap)\n\tpanic(\"syscall.RawSyscall\")\n\treturn 0, 0, ENOSYS\n}\n//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.20_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.20_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n\n\tbaghdad, err := LoadLocation(\"Asia/Baghdad\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tvar t1, t2 Time\n\n\tt1, err = ParseInLocation(\"Jan 02 2006 MST\", \"Feb 01 2013 AST\", baghdad)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t_, offset := t1.Zone()\n\n\t// A zero offset means that ParseInLocation did not recognize the\n\t// 'AST' abbreviation as matching the current location (Baghdad,\n\t// where we'd expect a +03 hrs offset); likely because we're using\n\t// a recent tzdata release (2017a or newer).\n\t// If it happens, skip the Baghdad test.\n\tif offset != 0 {\n\t\tt2 = Date(2013, February, 1, 00, 00, 00, 0, baghdad)\n\t\tif t1 != t2 {\n\t\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Baghdad) = %v, want %v\", t1, t2)\n\t\t}\n\t\tif offset != 3*60*60 {\n\t\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Baghdad).Zone = _, %d, want _, %d\", offset, 3*60*60)\n\t\t}\n\t}\n\n\tblancSablon, err := LoadLocation(\"America/Blanc-Sablon\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// In this case 'AST' means 'Atlantic Standard Time', and we\n\t// expect the abbreviation to correctly match the american\n\t// location.\n\tt1, err = ParseInLocation(\"Jan 02 2006 MST\", \"Feb 01 2013 AST\", blancSablon)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tt2 = Date(2013, February, 1, 00, 00, 00, 0, blancSablon)\n\tif t1 != t2 {\n\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Blanc-Sablon) = %v, want %v\", t1, t2)\n\t}\n\t_, offset = t1.Zone()\n\tif offset != -4*60*60 {\n\t\tt.Fatalf(\"ParseInLocation(Feb 01 2013 AST, Blanc-Sablon).Zone = _, %d, want _, %d\", offset, -4*60*60)\n\t}\n}\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\t_, err := LoadLocation(\"Australia/Sydney\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.20_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n\tconst delay = 100 * Millisecond\n\tgo func() {\n\t\tSleep(delay / 2)\n\t\tInterrupt()\n\t}()\n\tstart := Now()\n\tSleep(delay)\n\tdelayadj := delay\n\tif runtime.GOOS == \"windows\" {\n\t\tdelayadj -= windowsInaccuracy\n\t}\n\tduration := Now().Sub(start)\n\tif duration < delayadj {\n\t\tt.Fatalf(\"Sleep(%s) slept for only %s\", delay, duration)\n\t}\n}\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n}\n//--from\nfunc TestIssue5745(t *testing.T) {\n\tticker := NewTicker(Hour)\n\tdefer func() {\n\t\t// would deadlock here before the fix due to\n\t\t// lock taken before the segfault.\n\t\tticker.Stop()\n\n\t\tif r := recover(); r == nil {\n\t\t\tt.Error(\"Expected panic, but none happened.\")\n\t\t}\n\t}()\n\n\t// cause a panic due to a segfault\n\tvar timer *Timer\n\ttimer.Stop()\n\tt.Error(\"Should be unreachable.\")\n}\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n\t// Issue 4064: handle locations without any zone transitions.\n\tloc, err := LoadLocation(\"Etc/GMT+1\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// The tzdata name Etc/GMT+1 uses \"east is negative\",\n\t// but Go and most other systems use \"east is positive\".\n\t// So GMT+1 corresponds to -3600 in the Go zone, not +3600.\n\tname, offset := Now().In(loc).Zone()\n\t// The zone abbreviation is \"-01\" since tzdata-2016g, and \"GMT+1\"\n\t// on earlier versions; we accept both. (Issue #17276).\n\tif !(name == \"GMT+1\" || name == \"-01\") || offset != -1*60*60 {\n\t\tt.Errorf(\"Now().In(loc).Zone() = %q, %d, want %q or %q, %d\",\n\t\t\tname, offset, \"GMT+1\", \"-01\", -1*60*60)\n\t}\n}\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\ttzWithDST, err := LoadLocation(\"Australia/Sydney\")\n\tif err != nil {\n\t\tt.Fatalf(\"could not load tz 'Australia/Sydney': %v\", err)\n\t}\n\ttzWithoutDST, err := LoadLocation(\"Australia/Brisbane\")\n\tif err != nil {\n\t\tt.Fatalf(\"could not load tz 'Australia/Brisbane': %v\", err)\n\t}\n\ttzFixed := FixedZone(\"FIXED_TIME\", 12345)\n\n\ttests := [...]struct {\n\t\ttime Time\n\t\twant bool\n\t}{\n\t\t0: {Date(2009, 1, 1, 12, 0, 0, 0, UTC), false},\n\t\t1: {Date(2009, 6, 1, 12, 0, 0, 0, UTC), false},\n\t\t2: {Date(2009, 1, 1, 12, 0, 0, 0, tzWithDST), true},\n\t\t3: {Date(2009, 6, 1, 12, 0, 0, 0, tzWithDST), false},\n\t\t4: {Date(2009, 1, 1, 12, 0, 0, 0, tzWithoutDST), false},\n\t\t5: {Date(2009, 6, 1, 12, 0, 0, 0, tzWithoutDST), false},\n\t\t6: {Date(2009, 1, 1, 12, 0, 0, 0, tzFixed), false},\n\t\t7: {Date(2009, 6, 1, 12, 0, 0, 0, tzFixed), false},\n\t}\n\n\tfor i, tt := range tests {\n\t\tgot := tt.time.IsDST()\n\t\tif got != tt.want {\n\t\t\tt.Errorf(\"#%d:: (%#v).IsDST()=%t, want %t\", i, tt.time.Format(RFC3339), got, tt.want)\n\t\t}\n\t}\n}\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tundo := DisablePlatformSources()\n\tdefer undo()\n\n\tloc, err := LoadLocation(\"Asia/Shanghai\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\ttests := [...]struct {\n\t\tgive Time\n\t\twant Time\n\t}{\n\t\t// 14 Apr 1991 - Daylight Saving Time Started\n\t\t// When time of \"Asia/Shanghai\" was about to reach\n\t\t// Sunday, 14 April 1991, 02:00:00 clocks were turned forward 1 hour to\n\t\t// Sunday, 14 April 1991, 03:00:00 local daylight time instead.\n\t\t// The UTC time was 13 April 1991, 18:00:00\n\t\t0: {Date(1991, April, 13, 17, 50, 0, 0, loc), Date(1991, April, 13, 9, 50, 0, 0, UTC)},\n\t\t1: {Date(1991, April, 13, 18, 0, 0, 0, loc), Date(1991, April, 13, 10, 0, 0, 0, UTC)},\n\t\t2: {Date(1991, April, 14, 1, 50, 0, 0, loc), Date(1991, April, 13, 17, 50, 0, 0, UTC)},\n\t\t3: {Date(1991, April, 14, 3, 0, 0, 0, loc), Date(1991, April, 13, 18, 0, 0, 0, UTC)},\n\n\t\t// 15 Sep 1991 - Daylight Saving Time Ended\n\t\t// When local daylight time of \"Asia/Shanghai\" was about to reach\n\t\t// Sunday, 15 September 1991, 02:00:00 clocks were turned backward 1 hour to\n\t\t// Sunday, 15 September 1991, 01:00:00 local standard time instead.\n\t\t// The UTC time was 14 September 1991, 17:00:00\n\t\t4: {Date(1991, September, 14, 16, 50, 0, 0, loc), Date(1991, September, 14, 7, 50, 0, 0, UTC)},\n\t\t5: {Date(1991, September, 14, 17, 0, 0, 0, loc), Date(1991, September, 14, 8, 0, 0, 0, UTC)},\n\t\t6: {Date(1991, September, 15, 0, 50, 0, 0, loc), Date(1991, September, 14, 15, 50, 0, 0, UTC)},\n\t\t7: {Date(1991, September, 15, 2, 00, 0, 0, loc), Date(1991, September, 14, 18, 00, 0, 0, UTC)},\n\t}\n\n\tfor i, tt := range tests {\n\t\tif !tt.give.Equal(tt.want) {\n\t\t\tt.Errorf(\"#%d:: %#v is not equal to %#v\", i, tt.give.Format(RFC3339), tt.want.Format(RFC3339))\n\t\t}\n\t}\n}\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt0, err := Parse(RFC3339, \"1880-01-01T00:00:00Z\")\n\tif err != nil {\n\t\tt.Errorf(\"Failed to parse time, error = %v\", err)\n\t}\n\tloc, err := LoadLocation(\"US/Eastern\")\n\tif err != nil {\n\t\tt.Errorf(\"Failed to load location, error = %v\", err)\n\t}\n\tt1 := t0.In(loc)\n\tb, err := t1.MarshalBinary()\n\tif err != nil {\n\t\tt.Errorf(\"Failed to Marshal, error = %v\", err)\n\t}\n\n\tt2 := Time{}\n\terr = t2.UnmarshalBinary(b)\n\tif err != nil {\n\t\tt.Errorf(\"Failed to Unmarshal, error = %v\", err)\n\t}\n\n\tif !(t0.Equal(t1) && t1.Equal(t2)) {\n\t\tif !t0.Equal(t1) {\n\t\t\tt.Errorf(\"The result t1: %+v after Marshal is not matched original t0: %+v\", t1, t0)\n\t\t}\n\t\tif !t1.Equal(t2) {\n\t\t\tt.Errorf(\"The result t2: %+v after Unmarshal is not matched original t1: %+v\", t2, t1)\n\t\t}\n\t}\n}\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/time/tzdata_test.go.patch",
    "content": "//--from\nimport (\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n\t_ \"time/tzdata\"\n)\n//--to\nimport (\n\t\"reflect\"\n\t\"testing\"\n\t_ \"time/tzdata\"\n)\n//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tfor _, zone := range zones {\n\t\tref, err := time.LoadLocation(zone)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadLocation(%q): %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tembedded, err := time.LoadFromEmbeddedTZData(zone)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadFromEmbeddedTZData(%q): %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\t\tsample, err := time.LoadLocationFromTZData(zone, []byte(embedded))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"LoadLocationFromTZData failed for %q: %v\", zone, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Compare the name and zone fields of ref and sample.\n\t\t// The tx field changes faster as tzdata is updated.\n\t\t// The cache fields are expected to differ.\n\t\tv1 := reflect.ValueOf(ref).Elem()\n\t\tv2 := reflect.ValueOf(sample).Elem()\n\t\ttyp := v1.Type()\n\t\tnf := typ.NumField()\n\t\tfound := 0\n\t\tfor i := 0; i < nf; i++ {\n\t\t\tft := typ.Field(i)\n\t\t\tif ft.Name != \"name\" && ft.Name != \"zone\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfound++\n\t\t\tif !equal(t, v1.Field(i), v2.Field(i)) {\n\t\t\t\tt.Errorf(\"zone %s: system and embedded tzdata field %s differs\", zone, ft.Name)\n\t\t\t}\n\t\t}\n\t\tif found != 2 {\n\t\t\tt.Errorf(\"test must be updated for change to time.Location struct\")\n\t\t}\n\t}\n}\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"reflect\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n)\n//--from\nfunc TestEnvVarUsage(t *testing.T) {\n\ttime.ResetZoneinfoForTesting()\n\n\tconst testZoneinfo = \"foo.zip\"\n\tconst env = \"ZONEINFO\"\n\n\tt.Setenv(env, testZoneinfo)\n\n\t// Result isn't important, we're testing the side effect of this command\n\ttime.LoadLocation(\"Asia/Jerusalem\")\n\tdefer time.ResetZoneinfoForTesting()\n\n\tif zoneinfo := time.ZoneinfoForTesting(); testZoneinfo != *zoneinfo {\n\t\tt.Errorf(\"zoneinfo does not match env variable: got %q want %q\", *zoneinfo, testZoneinfo)\n\t}\n}\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n\ttime.ResetZoneinfoForTesting()\n\tloc := \"Asia/SomethingNotExist\"\n\twant := errors.New(\"unknown time zone \" + loc)\n\t_, err := time.LoadLocation(loc)\n\tif err.Error() != want.Error() {\n\t\tt.Errorf(\"LoadLocation(%q) error = %v; want %v\", loc, err, want)\n\t}\n}\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestVersion3(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\t_, err := time.LoadLocation(\"Asia/Jerusalem\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestFirstZone(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst format = \"Mon, 02 Jan 2006 15:04:05 -0700 (MST)\"\n\tvar tests = []struct {\n\t\tzone  string\n\t\tunix  int64\n\t\twant1 string\n\t\twant2 string\n\t}{\n\t\t{\n\t\t\t\"PST8PDT\",\n\t\t\t-1633269601,\n\t\t\t\"Sun, 31 Mar 1918 01:59:59 -0800 (PST)\",\n\t\t\t\"Sun, 31 Mar 1918 03:00:00 -0700 (PDT)\",\n\t\t},\n\t\t{\n\t\t\t\"Pacific/Fakaofo\",\n\t\t\t1325242799,\n\t\t\t\"Thu, 29 Dec 2011 23:59:59 -1100 (-11)\",\n\t\t\t\"Sat, 31 Dec 2011 00:00:00 +1300 (+13)\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tz, err := time.LoadLocation(test.zone)\n\t\tif err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t\ts := time.Unix(test.unix, 0).In(z).Format(format)\n\t\tif s != test.want1 {\n\t\t\tt.Errorf(\"for %s %d got %q want %q\", test.zone, test.unix, s, test.want1)\n\t\t}\n\t\ts = time.Unix(test.unix+1, 0).In(z).Format(format)\n\t\tif s != test.want2 {\n\t\t\tt.Errorf(\"for %s %d got %q want %q\", test.zone, test.unix, s, test.want2)\n\t\t}\n\t}\n}\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst locationName = \"Asia/Jerusalem\"\n\treference, err := time.LoadLocation(locationName)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tgorootSource, ok := time.GorootZoneSource(testenv.GOROOT(t))\n\tif !ok {\n\t\tt.Fatal(\"Failed to locate tzinfo source in GOROOT.\")\n\t}\n\ttzinfo, err := time.LoadTzinfo(locationName, gorootSource)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tsample, err := time.LoadLocationFromTZData(locationName, tzinfo)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tif !reflect.DeepEqual(reference, sample) {\n\t\tt.Errorf(\"return values of LoadLocationFromTZData and LoadLocation don't match\")\n\t}\n}\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n\tundo := time.DisablePlatformSources()\n\tdefer undo()\n\n\tconst locName = \"America/New_York\"\n\tloc, err := time.LoadLocation(locName)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\td := time.Date(1900, time.January, 1, 0, 0, 0, 0, loc)\n\ttzName, tzOffset := d.Zone()\n\tif want := \"EST\"; tzName != want {\n\t\tt.Errorf(\"Zone name == %s, want %s\", tzName, want)\n\t}\n\tif want := -18000; tzOffset != want {\n\t\tt.Errorf(\"Zone offset == %d, want %d\", tzOffset, want)\n\t}\n}\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tfor _, test := range slimTests {\n\t\ttzData, err := os.ReadFile(\"testdata/\" + test.fileName)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\t\treference, err := time.LoadLocationFromTZData(test.zoneName, tzData)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\td := test.date(reference)\n\t\ttzName, tzOffset := d.Zone()\n\t\tif tzName != test.wantName {\n\t\t\tt.Errorf(\"Zone name == %s, want %s\", tzName, test.wantName)\n\t\t}\n\t\tif tzOffset != test.wantOffset {\n\t\t\tt.Errorf(\"Zone offset == %d, want %d\", tzOffset, test.wantOffset)\n\t\t}\n\t}\n}\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.20_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEnvTZUsage(t *testing.T) {\n\tconst env = \"TZ\"\n\ttz, ok := os.LookupEnv(env)\n\tif !ok {\n\t\tdefer os.Unsetenv(env)\n\t} else {\n\t\tdefer os.Setenv(env, tz)\n\t}\n\tdefer time.ForceUSPacificForTesting()\n\n\tlocalZoneName := \"Local\"\n\t// The file may not exist.\n\tif _, err := os.Stat(\"/etc/localtime\"); os.IsNotExist(err) {\n\t\tlocalZoneName = \"UTC\"\n\t}\n\n\tcases := []struct {\n\t\tnilFlag bool\n\t\ttz      string\n\t\tlocal   string\n\t}{\n\t\t// no $TZ means use the system default /etc/localtime.\n\t\t{true, \"\", localZoneName},\n\t\t// $TZ=\"\" means use UTC.\n\t\t{false, \"\", \"UTC\"},\n\t\t{false, \":\", \"UTC\"},\n\t\t{false, \"Asia/Shanghai\", \"Asia/Shanghai\"},\n\t\t{false, \":Asia/Shanghai\", \"Asia/Shanghai\"},\n\t\t{false, \"/etc/localtime\", localZoneName},\n\t\t{false, \":/etc/localtime\", localZoneName},\n\t}\n\n\tfor _, c := range cases {\n\t\ttime.ResetLocalOnceForTest()\n\t\tif c.nilFlag {\n\t\t\tos.Unsetenv(env)\n\t\t} else {\n\t\t\tos.Setenv(env, c.tz)\n\t\t}\n\t\tif time.Local.String() != c.local {\n\t\t\tt.Errorf(\"invalid Local location name for %q: got %q want %q\", c.tz, time.Local, c.local)\n\t\t}\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\t// The file may not exist on Solaris 2 and IRIX 6.\n\tpath := \"/usr/share/zoneinfo/Asia/Shanghai\"\n\tos.Setenv(env, path)\n\tif _, err := os.Stat(path); os.IsNotExist(err) {\n\t\tif time.Local.String() != \"UTC\" {\n\t\t\tt.Errorf(`invalid path should fallback to UTC: got %q want \"UTC\"`, time.Local)\n\t\t}\n\t\treturn\n\t}\n\tif time.Local.String() != path {\n\t\tt.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path)\n\t}\n\n\ttimeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC)\n\tsameTimeInShanghai := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local)\n\tif !timeInUTC.Equal(sameTimeInShanghai) {\n\t\tt.Errorf(\"invalid timezone: got %q want %q\", timeInUTC, sameTimeInShanghai)\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\tos.Setenv(env, \":\"+path)\n\tif time.Local.String() != path {\n\t\tt.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path)\n\t}\n\n\ttime.ResetLocalOnceForTest()\n\tos.Setenv(env, path[:len(path)-1])\n\tif time.Local.String() != \"UTC\" {\n\t\tt.Errorf(`invalid path should fallback to UTC: got %q want \"UTC\"`, time.Local)\n\t}\n}\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_windows/runtime/abi_test.go.patch",
    "content": "//--from\nfunc TestFinalizerRegisterABI(t *testing.T) {\n//--to\nfunc TestFinalizerRegisterABI(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.20_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic void\nthreadentry(void *v)\n{\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.20_windows/runtime/crash_test.go.patch",
    "content": "//--from\nfunc TestRuntimePanic(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\tcmd := testenv.CleanCmdEnv(exec.Command(os.Args[0], \"-test.run=TestRuntimePanic\"))\n\tcmd.Env = append(cmd.Env, \"GO_TEST_RUNTIME_PANIC=1\")\n\tout, err := cmd.CombinedOutput()\n\tt.Logf(\"%s\", out)\n\tif err == nil {\n\t\tt.Error(\"child process did not fail\")\n\t} else if want := \"runtime.unexportedPanicForTesting\"; !bytes.Contains(out, []byte(want)) {\n\t\tt.Errorf(\"output did not contain expected string %q\", want)\n\t}\n}\n//--to\nfunc TestRuntimePanic(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n//--from\nfunc TestG0StackOverflow(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\n\tswitch runtime.GOOS {\n\tcase \"darwin\", \"dragonfly\", \"freebsd\", \"linux\", \"netbsd\", \"openbsd\", \"android\":\n\t\tt.Skipf(\"g0 stack is wrong on pthread platforms (see golang.org/issue/26061)\")\n\t}\n\n\tif os.Getenv(\"TEST_G0_STACK_OVERFLOW\") != \"1\" {\n\t\tcmd := testenv.CleanCmdEnv(exec.Command(os.Args[0], \"-test.run=TestG0StackOverflow\", \"-test.v\"))\n\t\tcmd.Env = append(cmd.Env, \"TEST_G0_STACK_OVERFLOW=1\")\n\t\tout, err := cmd.CombinedOutput()\n\t\t// Don't check err since it's expected to crash.\n\t\tif n := strings.Count(string(out), \"morestack on g0\\n\"); n != 1 {\n\t\t\tt.Fatalf(\"%s\\n(exit status %v)\", out, err)\n\t\t}\n\t\t// Check that it's a signal-style traceback.\n\t\tif runtime.GOOS != \"windows\" {\n\t\t\tif want := \"PC=\"; !strings.Contains(string(out), want) {\n\t\t\t\tt.Errorf(\"output does not contain %q:\\n%s\", want, out)\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\truntime.G0StackOverflow()\n}\n//--to\nfunc TestG0StackOverflow(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.20_windows/runtime/malloc_test.go.patch",
    "content": "//--from\nfunc TestArenaCollision(t *testing.T) {\n//--to\nfunc TestArenaCollision(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.20_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t_timeBeginPeriod,\n\t_timeEndPeriod,\n//--to\n//--from\n\tvar winmmdll = []byte(\"winmm.dll\\000\")\n\tm32 := windowsLoadSystemLib(winmmdll)\n\tif m32 == 0 {\n\t\tthrow(\"winmm.dll not found\")\n\t}\n\t_timeBeginPeriod = windowsFindfunc(m32, []byte(\"timeBeginPeriod\\000\"))\n\t_timeEndPeriod = windowsFindfunc(m32, []byte(\"timeEndPeriod\\000\"))\n\tif _timeBeginPeriod == nil || _timeEndPeriod == nil {\n\t\tthrow(\"timeBegin/EndPeriod not found\")\n\t}\n//--to\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tif relax {\n\t\treturn uint32(stdcall1(_timeEndPeriod, 1))\n\t} else {\n\t\treturn uint32(stdcall1(_timeBeginPeriod, 1))\n\t}\n}\n//--to\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tthrow(\"not reached\")\n\treturn 0\n}\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.20_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif trap == 0 {\n\t\tpanic(\"trap must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.20_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.20_windows/sync/mutex_test.go.patch",
    "content": "//--from\nimport (\n\t\"fmt\"\n\t\"internal/testenv\"\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"strings\"\n\t. \"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--to\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t. \"sync\"\n\t\"testing\"\n\t\"time\"\n)\n//--from\nfunc TestMutexMisuse(t *testing.T) {\n\ttestenv.MustHaveExec(t)\n\tfor _, test := range misuseTests {\n\t\tout, err := exec.Command(os.Args[0], \"TESTMISUSE\", test.name).CombinedOutput()\n\t\tif err == nil || !strings.Contains(string(out), \"unlocked\") {\n\t\t\tt.Errorf(\"%s: did not find failure with message about unlocked lock: %s\\n%s\\n\", test.name, err, out)\n\t\t}\n\t}\n}\n//--to\nfunc TestMutexMisuse(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.21_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.21_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc tryExec() error {\n//--to\nfunc tryExec() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.21_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.21_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.21_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.21_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--to\nvoid\nx_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)\n{\n\tpthread_attr_t *attr;\n\tsize_t size;\n\n\t/* The memory sanitizer distributed with versions of clang\n\t   before 3.8 has a bug: if you call mmap before malloc, mmap\n\t   may return an address that is later overwritten by the msan\n\t   library.  Avoid this problem by forcing a call to malloc\n\t   here, before we ever call malloc.\n\n\t   This is only required for the memory sanitizer, so it's\n\t   unfortunate that we always run it.  It should be possible\n\t   to remove this when we no longer care about versions of\n\t   clang before 3.8.  The test for this is\n\t   misc/cgo/testsanitizers.\n\n\t   GCC works hard to eliminate a seemingly unnecessary call to\n\t   malloc, so we actually use the memory we allocate.  */\n\n\tsetg_gcc = setg;\n\tattr = (pthread_attr_t*)malloc(sizeof *attr);\n\tif (attr == NULL) {\n\t\tfatalf(\"malloc failed: %s\", strerror(errno));\n\t}\n\tpthread_attr_init(attr);\n\tpthread_attr_setstacksize(attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(attr, &size);\n\tg->stacklo = (uintptr)&size - size + 4096;\n\tpthread_attr_destroy(attr);\n\tfree(attr);\n\n\tif (x_cgo_inittls) {\n\t\tx_cgo_inittls(tlsg, tlsbase);\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (amd64 || arm64 || ppc64le)\n//--to\n//go:build linux && (arm64 || ppc64le)\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int index = 0;\n  int found = 0;\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  int32_t fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = &pseudo_files[index];\n  size_t rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  const static int kENOENT = 0x2;\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  const static int kEBADF = 0x9;\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  int ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    int ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.21_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n//--to\n//go:build (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n"
  },
  {
    "path": "1.21_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.21_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.21_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.21_linux/runtime/internal/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.21_linux/runtime/internal/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.21_linux/runtime/internal/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n//--from\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\treturn Syscall6(num, a1, a2, a3, a4, a5, a6)\n}\n//--to\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at RawSyscall6\", num)\n\tpanic(\"syscall.RawSyscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.21_linux/runtime/internal/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.21_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.21_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.21_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.21_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.21_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.21_linux/runtime/norace_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nfunc getRandomData(r []byte) {\n\tif startupRandomData != nil {\n\t\tn := copy(r, startupRandomData)\n\t\textendRandom(r, n)\n\t\treturn\n\t}\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\textendRandom(r, int(n))\n}\n//--to\n// Use getRandomData in os_plan9.go.\n\n//go:nosplit\nfunc getRandomData(r []byte) {\n\t// inspired by wyrand see hash32.go for detail\n\tt := nanotime()\n\tv := getg().m.procid ^ uint64(t)\n\n\tfor len(r) > 0 {\n\t\tv ^= 0xa0761d6478bd642f\n\t\tv *= 0xe7037ed1a0b428db\n\t\tsize := 8\n\t\tif len(r) < 8 {\n\t\t\tsize = len(r)\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\tr[i] = byte(v >> (8 * i))\n\t\t}\n\t\tr = r[size:]\n\t\tv = v>>32 | v<<32\n\t}\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.21_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.21_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.21_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.21_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.21_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.21_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.21_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.21_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.21_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.21_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.21_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.21_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.21_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.21_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.21_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.21_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {\n\t\torigRlimitNofile.Store(lim)\n\t\tlim.Cur = lim.Max\n\t\tadjustFileLimit(&lim)\n\t\tsetrlimit(RLIMIT_NOFILE, &lim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.21_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\treturn RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n}\n//--to\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tprintln(\"not implemented syscall at RawSyscall\", trap)\n\tpanic(\"syscall.RawSyscall\")\n\treturn 0, 0, ENOSYS\n}\n//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.21_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.21_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.21_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.21_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.21_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.21_windows/runtime/abi_test.go.patch",
    "content": "//--from\nfunc TestFinalizerRegisterABI(t *testing.T) {\n//--to\nfunc TestFinalizerRegisterABI(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.21_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic void\nthreadentry(void *v)\n{\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.21_windows/runtime/crash_test.go.patch",
    "content": "//--from\nfunc TestRuntimePanic(t *testing.T) {\n//--to\nfunc TestRuntimePanic(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n//--from\nfunc TestG0StackOverflow(t *testing.T) {\n//--to\nfunc TestG0StackOverflow(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n"
  },
  {
    "path": "1.21_windows/runtime/malloc_test.go.patch",
    "content": "//--from\nfunc TestArenaCollision(t *testing.T) {\n//--to\nfunc TestArenaCollision(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.21_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t_timeBeginPeriod,\n\t_timeEndPeriod,\n//--to\n//--from\n\tm32 := windowsLoadSystemLib(winmmdll[:])\n\tif m32 == 0 {\n\t\tthrow(\"winmm.dll not found\")\n\t}\n\t_timeBeginPeriod = windowsFindfunc(m32, []byte(\"timeBeginPeriod\\000\"))\n\t_timeEndPeriod = windowsFindfunc(m32, []byte(\"timeEndPeriod\\000\"))\n\tif _timeBeginPeriod == nil || _timeEndPeriod == nil {\n\t\tthrow(\"timeBegin/EndPeriod not found\")\n\t}\n//--to\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tif relax {\n\t\treturn uint32(stdcall1(_timeEndPeriod, 1))\n\t} else {\n\t\treturn uint32(stdcall1(_timeBeginPeriod, 1))\n\t}\n}\n//--to\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tthrow(\"not reached\")\n\treturn 0\n}\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.21_windows/runtime/runtime-gdb_test.go.patch",
    "content": "//--from\npackage runtime_test\n//--to\n//go:build !windows\n\npackage runtime_test\n"
  },
  {
    "path": "1.21_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif trap == 0 {\n\t\tpanic(\"trap must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.21_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.21_windows/sync/mutex_test.go.patch",
    "content": "//--from\nfunc TestMutexMisuse(t *testing.T) {\n//--to\nfunc TestMutexMisuse(t *testing.T) {\n\tt.Skip(\"analyzing output is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.22_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc tryExec() error {\n//--to\nfunc tryExec() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.22_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.22_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.22_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.22_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (amd64 || arm64 || ppc64le)\n//--to\n//go:build linux && (arm64 || ppc64le)\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int index = 0;\n  int found = 0;\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  int32_t fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = &pseudo_files[index];\n  size_t rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  int32_t index = fd - kFDOffset;\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  const static int kENOENT = 0x2;\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  const static int kEBADF = 0x9;\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  int ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    int ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.22_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n//--to\n//go:build (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n"
  },
  {
    "path": "1.22_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.22_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64 || ppc64le) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.22_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.22_linux/runtime/fds_unix.go.patch",
    "content": "//--from\nfunc checkfds() {\n//--to\nfunc checkfds() {\n\treturn\n"
  },
  {
    "path": "1.22_linux/runtime/internal/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.22_linux/runtime/internal/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.22_linux/runtime/internal/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n//--from\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\treturn Syscall6(num, a1, a2, a3, a4, a5, a6)\n}\n//--to\nfunc syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at RawSyscall6\", num)\n\tpanic(\"syscall.RawSyscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.22_linux/runtime/internal/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.22_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.22_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/metrics_test.go.patch",
    "content": "//--from\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n//--to\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n\t\t\t\tt.Skip(\"debug.WriteHeapDump is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.22_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.22_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.22_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.22_linux/runtime/norace_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"runtime/internal/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nvar urandom_dev = []byte(\"/dev/urandom\\x00\")\n\nfunc readRandom(r []byte) int {\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\treturn int(n)\n}\n//--to\n//go:nosplit\nfunc readRandom(r []byte) int {\n\treturn 0\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.22_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.22_linux/runtime/rand_test.go.patch",
    "content": "//--from\nfunc TestReadRandom(t *testing.T) {\n//--to\nfunc TestReadRandom(t *testing.T) {\n\tt.Skip(\"readRandom is not available in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.22_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.22_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.22_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"runtime/internal/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.22_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.22_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.22_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.22_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.22_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.22_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.22_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.22_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.22_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.22_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.22_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {\n\t\torigRlimitNofile.Store(&lim)\n\t\tnlim := lim\n\t\tnlim.Cur = nlim.Max\n\t\tadjustFileLimit(&nlim)\n\t\tsetrlimit(RLIMIT_NOFILE, &nlim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.22_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\treturn RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n}\n//--to\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tprintln(\"not implemented syscall at RawSyscall\", trap)\n\tpanic(\"syscall.RawSyscall\")\n\treturn 0, 0, ENOSYS\n}\n//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.22_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.22_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.22_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.22_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.22_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.22_windows/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc tryExec() error {\n//--to\nfunc tryExec() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.22_windows/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.22_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic void\nthreadentry(void *v)\n{\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.22_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n"
  },
  {
    "path": "1.22_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WerGetFlags,\n\t_WerSetFlags,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t_timeBeginPeriod,\n\t_timeEndPeriod,\n//--to\n//--from\n\tm32 := windowsLoadSystemLib(winmmdll[:])\n\tif m32 == 0 {\n\t\tthrow(\"winmm.dll not found\")\n\t}\n\t_timeBeginPeriod = windowsFindfunc(m32, []byte(\"timeBeginPeriod\\000\"))\n\t_timeEndPeriod = windowsFindfunc(m32, []byte(\"timeEndPeriod\\000\"))\n\tif _timeBeginPeriod == nil || _timeEndPeriod == nil {\n\t\tthrow(\"timeBegin/EndPeriod not found\")\n\t}\n//--to\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tif relax {\n\t\treturn uint32(stdcall1(_timeEndPeriod, 1))\n\t} else {\n\t\treturn uint32(stdcall1(_timeBeginPeriod, 1))\n\t}\n}\n//--to\nfunc osRelax(relax bool) uint32 {\n\tif haveHighResTimer {\n\t\t// If the high resolution timer is available, the runtime uses the timer\n\t\t// to sleep for short durations. This means there's no need to adjust\n\t\t// the global clock frequency.\n\t\treturn 0\n\t}\n\n\tthrow(\"not reached\")\n\treturn 0\n}\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.22_windows/runtime/signal_windows.go.patch",
    "content": "//--from\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n\n\t// Disable WER fault reporting UI.\n\t// Do this even if WER is disabled as a whole,\n\t// as WER might be enabled later with setTraceback(\"wer\")\n\t// and we still want the fault reporting UI to be disabled if this happens.\n\tvar werflags uintptr\n\tstdcall2(_WerGetFlags, currentProcess, uintptr(unsafe.Pointer(&werflags)))\n\tstdcall1(_WerSetFlags, werflags|_WER_FAULT_REPORTING_NO_UI)\n}\n//--to\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n}\n"
  },
  {
    "path": "1.22_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif trap == 0 {\n\t\tpanic(\"trap must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.22_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.23_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/internal/runtime/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.23_linux/internal/runtime/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.23_linux/internal/runtime/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.23_linux/internal/runtime/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.23_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.23_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc tryExec() error {\n//--to\nfunc tryExec() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.23_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.23_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.23_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.23_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (amd64 || arm64 || ppc64le)\n//--to\n//go:build linux && (arm64 || ppc64le)\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  int index = 0;\n  int found = 0;\n  int32_t fd = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = NULL;\n  size_t rest = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  file = &pseudo_files[index];\n  rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  int32_t index = fd - kFDOffset;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  const static int kENOENT = 0x2;\n\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  const static int kEBADF = 0x9;\n\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n  int ret = 0;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.23_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n//--to\n//go:build (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n"
  },
  {
    "path": "1.23_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.23_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64 || ppc64le) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.23_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.23_linux/runtime/fds_unix.go.patch",
    "content": "//--from\nfunc checkfds() {\n//--to\nfunc checkfds() {\n\treturn\n"
  },
  {
    "path": "1.23_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.23_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/metrics_test.go.patch",
    "content": "//--from\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n//--to\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n\t\t\t\tt.Skip(\"debug.WriteHeapDump is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.23_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.23_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.23_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.23_linux/runtime/norace_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nvar urandom_dev = []byte(\"/dev/urandom\\x00\")\n\nfunc readRandom(r []byte) int {\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\treturn int(n)\n}\n//--to\n//go:nosplit\nfunc readRandom(r []byte) int {\n\treturn 0\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.23_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.23_linux/runtime/rand_test.go.patch",
    "content": "//--from\nfunc TestReadRandom(t *testing.T) {\n//--to\nfunc TestReadRandom(t *testing.T) {\n\tt.Skip(\"readRandom is not available in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.23_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.23_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.23_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.23_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.23_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.23_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.23_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.23_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.23_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.23_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.23_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.23_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.23_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.23_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Cur != lim.Max {\n\t\torigRlimitNofile.Store(&lim)\n\t\tnlim := lim\n\t\tnlim.Cur = nlim.Max\n\t\tadjustFileLimit(&nlim)\n\t\tsetrlimit(RLIMIT_NOFILE, &nlim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.23_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.23_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.23_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.23_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.23_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.23_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.23_windows/internal/testenv/exec.go.patch",
    "content": "//--from\nfunc tryExec() error {\n//--to\nfunc tryExec() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.23_windows/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.23_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic void\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.23_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n"
  },
  {
    "path": "1.23_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WerGetFlags,\n\t_WerSetFlags,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.23_windows/runtime/signal_windows.go.patch",
    "content": "//--from\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n\n\t// Disable WER fault reporting UI.\n\t// Do this even if WER is disabled as a whole,\n\t// as WER might be enabled later with setTraceback(\"wer\")\n\t// and we still want the fault reporting UI to be disabled if this happens.\n\tvar werflags uintptr\n\tstdcall2(_WerGetFlags, currentProcess, uintptr(unsafe.Pointer(&werflags)))\n\tstdcall1(_WerSetFlags, werflags|_WER_FAULT_REPORTING_NO_UI)\n}\n//--to\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n}\n"
  },
  {
    "path": "1.23_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == 0 {\n\t\tpanic(\"fn must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.23_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.24_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/internal/runtime/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.24_linux/internal/runtime/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.24_linux/internal/runtime/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.24_linux/internal/runtime/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.24_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.24_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.24_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.24_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.24_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.24_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (amd64 || arm64 || ppc64le)\n//--to\n//go:build linux && (arm64 || ppc64le)\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  int index = 0;\n  int found = 0;\n  int32_t fd = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = NULL;\n  size_t rest = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  file = &pseudo_files[index];\n  rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  int32_t index = fd - kFDOffset;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  const static int kENOENT = 0x2;\n\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  const static int kEBADF = 0x9;\n\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n  int ret = 0;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  return calloc(n, 1);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.24_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && amd64) || (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n//--to\n//go:build (freebsd && amd64) || (linux && arm64) || (linux && ppc64le)\n"
  },
  {
    "path": "1.24_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.24_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64 || loong64 || ppc64le) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.24_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.24_linux/runtime/fds_unix.go.patch",
    "content": "//--from\nfunc checkfds() {\n//--to\nfunc checkfds() {\n\treturn\n"
  },
  {
    "path": "1.24_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOS(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOS(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.24_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/metrics_test.go.patch",
    "content": "//--from\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n//--to\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n\t\t\t\tt.Skip(\"debug.WriteHeapDump is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.24_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.24_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.24_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.24_linux/runtime/nosan_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nvar urandom_dev = []byte(\"/dev/urandom\\x00\")\n\nfunc readRandom(r []byte) int {\n\t// Note that all supported Linux kernels should provide AT_RANDOM which\n\t// populates startupRand, so this fallback should be unreachable.\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\treturn int(n)\n}\n//--to\n//go:nosplit\nfunc readRandom(r []byte) int {\n\treturn 0\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.24_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.24_linux/runtime/rand_test.go.patch",
    "content": "//--from\nfunc TestReadRandom(t *testing.T) {\n//--to\nfunc TestReadRandom(t *testing.T) {\n\tt.Skip(\"readRandom is not available in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.24_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.24_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.24_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.24_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.24_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.24_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.24_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.24_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.24_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.24_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64)\n//--to\n//go:build !faketime && !windows\n"
  },
  {
    "path": "1.24_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64)\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.24_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.24_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.24_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Max > 0 && lim.Cur < lim.Max-1 {\n\t\torigRlimitNofile.Store(&lim)\n\t\tnlim := lim\n\n\t\t// We set Cur to Max - 1 so that we are more likely to\n\t\t// detect cases where another process uses prlimit\n\t\t// to change our resource limits. The theory is that\n\t\t// using prlimit to change to Cur == Max is more likely\n\t\t// than using prlimit to change to Cur == Max - 1.\n\t\t// The place we check for this is in exec_linux.go.\n\t\tnlim.Cur = nlim.Max - 1\n\n\t\tadjustFileLimit(&nlim)\n\t\tsetrlimit(RLIMIT_NOFILE, &nlim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.24_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.24_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.24_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.24_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.24_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.24_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.24_windows/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.24_windows/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.24_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic void\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic void\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.24_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n"
  },
  {
    "path": "1.24_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WerGetFlags,\n\t_WerSetFlags,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.24_windows/runtime/signal_windows.go.patch",
    "content": "//--from\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n\n\t// Disable WER fault reporting UI.\n\t// Do this even if WER is disabled as a whole,\n\t// as WER might be enabled later with setTraceback(\"wer\")\n\t// and we still want the fault reporting UI to be disabled if this happens.\n\tvar werflags uintptr\n\tstdcall2(_WerGetFlags, currentProcess, uintptr(unsafe.Pointer(&werflags)))\n\tstdcall1(_WerSetFlags, werflags|_WER_FAULT_REPORTING_NO_UI)\n}\n//--to\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n}\n"
  },
  {
    "path": "1.24_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == 0 {\n\t\tpanic(\"fn must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.24_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.25_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/internal/runtime/cgroup/cgroup_linux.go.patch",
    "content": "//--from\nfunc FindCPURelativePath(out []byte, scratch []byte) (int, Version, error) {\n//--to\nfunc FindCPURelativePath(out []byte, scratch []byte) (int, Version, error) {\n    return 0, 0, ErrNoCgroup\n//--from\nfunc FindCPUMountPoint(out []byte, scratch []byte) (int, error) {\n//--to\nfunc FindCPUMountPoint(out []byte, scratch []byte) (int, error) {\n    return 0, ErrNoCgroup\n"
  },
  {
    "path": "1.25_linux/internal/runtime/syscall/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.25_linux/internal/runtime/syscall/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.25_linux/internal/runtime/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.25_linux/internal/runtime/syscall/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/syscall\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := syscall.EpollCtl(-1, 1, -1, &syscall.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.25_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.25_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.25_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.25_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.25_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.25_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (amd64 || arm64 || loong64 || ppc64le)\n//--to\n//go:build linux && (arm64 || loong64 || ppc64le)\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  int index = 0;\n  int found = 0;\n  int32_t fd = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = NULL;\n  size_t rest = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  file = &pseudo_files[index];\n  rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  int32_t index = fd - kFDOffset;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  const static int kENOENT = 0x2;\n\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  const static int kEBADF = 0x9;\n\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n  int ret = 0;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  // The returned pointer must be aligned to 1 << 9 bytes.\n  // See also:\n  // * https://cs.opensource.google/go/go/+/refs/tags/go1.25.0:src/runtime/tagptr_64bit.go\n  // * https://go.dev/cl/665815/\n  return aligned_alloc(1 << 9, n);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.25_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && (amd64 || arm64 || loong64 || ppc64le)) || (freebsd && amd64)\n//--to\n//go:build (linux && (arm64 || loong64 || ppc64le)) || (freebsd && amd64)\n"
  },
  {
    "path": "1.25_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.25_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/debug/stack_test.go.patch",
    "content": "//--from\nfunc TestSetCrashOutput(t *testing.T) {\n//--to\nfunc TestSetCrashOutput(t *testing.T) {\n    t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64 || loong64 || ppc64le) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.25_linux/runtime/decoratemappings_test.go.patch",
    "content": "//--from\nfunc TestDecorateMappings(t *testing.T) {\n//--to\nfunc TestDecorateMappings(t *testing.T) {\n    t.Skip(\"files are not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.25_linux/runtime/fds_unix.go.patch",
    "content": "//--from\nfunc checkfds() {\n//--to\nfunc checkfds() {\n\treturn\n"
  },
  {
    "path": "1.25_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\nconst (\n\t_EINVAL = 22\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\nfunc sysAllocOS(n uintptr, vmaName string) (ptr unsafe.Pointer) {\n\treturn sysAllocOSImpl(n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOSImpl(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\nfunc sysReserveOS(v unsafe.Pointer, n uintptr, vmaName string) (ptr unsafe.Pointer) {\n\treturn sysReserveOSImpl(v, n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOSImpl(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\nfunc sysMapOS(v unsafe.Pointer, n uintptr, vmaName string) {\n\tsysMapOSImpl(v, n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOSImpl(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n"
  },
  {
    "path": "1.25_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/metrics_test.go.patch",
    "content": "//--from\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n//--to\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n\t\t\t\tt.Skip(\"debug.WriteHeapDump is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.25_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.25_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.25_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.25_linux/runtime/nosan_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/strconv\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/strconv\"\n\t\"internal/runtime/syscall\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nvar urandom_dev = []byte(\"/dev/urandom\\x00\")\n\nfunc readRandom(r []byte) int {\n\t// Note that all supported Linux kernels should provide AT_RANDOM which\n\t// populates startupRand, so this fallback should be unreachable.\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\treturn int(n)\n}\n//--to\n//go:nosplit\nfunc readRandom(r []byte) int {\n\treturn 0\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := syscall.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.25_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.25_linux/runtime/rand_test.go.patch",
    "content": "//--from\nfunc TestReadRandom(t *testing.T) {\n//--to\nfunc TestReadRandom(t *testing.T) {\n\tt.Skip(\"readRandom is not available in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.25_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.25_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.25_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.25_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.25_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || (openbsd && !mips64)\n//--to\n//go:build darwin || (openbsd && !mips64) || linux\n"
  },
  {
    "path": "1.25_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.25_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.25_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.25_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.25_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64) && !plan9\n//--to\n//go:build !faketime && !windows && !plan9\n"
  },
  {
    "path": "1.25_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64) && !plan9\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !plan9\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.25_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.25_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.25_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Max > 0 && lim.Cur < lim.Max-1 {\n\t\torigRlimitNofile.Store(&lim)\n\t\tnlim := lim\n\n\t\t// We set Cur to Max - 1 so that we are more likely to\n\t\t// detect cases where another process uses prlimit\n\t\t// to change our resource limits. The theory is that\n\t\t// using prlimit to change to Cur == Max is more likely\n\t\t// than using prlimit to change to Cur == Max - 1.\n\t\t// The place we check for this is in exec_linux.go.\n\t\tnlim.Cur = nlim.Max - 1\n\n\t\tadjustFileLimit(&nlim)\n\t\tsetrlimit(RLIMIT_NOFILE, &nlim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.25_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.25_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.25_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.25_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.25_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.25_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.25_windows/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.25_windows/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.25_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic unsigned long\n__stdcall\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic unsigned long\n__stdcall\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.25_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n"
  },
  {
    "path": "1.25_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WerGetFlags,\n\t_WerSetFlags,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall2(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall2(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall1(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall1(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall5(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall5(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall1(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.25_windows/runtime/signal_windows.go.patch",
    "content": "//--from\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n\n\t// Disable WER fault reporting UI.\n\t// Do this even if WER is disabled as a whole,\n\t// as WER might be enabled later with setTraceback(\"wer\")\n\t// and we still want the fault reporting UI to be disabled if this happens.\n\tvar werflags uintptr\n\tstdcall2(_WerGetFlags, currentProcess, uintptr(unsafe.Pointer(&werflags)))\n\tstdcall1(_WerSetFlags, werflags|_WER_FAULT_REPORTING_NO_UI)\n}\n//--to\nfunc preventErrorDialogs() {\n\terrormode := stdcall0(_GetErrorMode)\n\tstdcall1(_SetErrorMode, errormode|_SEM_FAILCRITICALERRORS|_SEM_NOGPFAULTERRORBOX|_SEM_NOOPENFILEERRORBOX)\n}\n"
  },
  {
    "path": "1.25_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == 0 {\n\t\tpanic(\"fn must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.25_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "1.26_linux/internal/reflectlite/reflect_mirror_test.go.patch",
    "content": "//--from\nfunc TestMirrorWithReflect(t *testing.T) {\n//--to\nfunc TestMirrorWithReflect(t *testing.T) {\n       t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/internal/runtime/cgroup/cgroup_linux.go.patch",
    "content": "//--from\nfunc FindCPUCgroup(out []byte, scratch []byte) (int, Version, error) {\n//--to\nfunc FindCPUCgroup(out []byte, scratch []byte) (int, Version, error) {\n    return 0, 0, ErrNoCgroup\n//--from\nfunc FindCPUMountPoint(out, cgroup []byte, version Version, scratch []byte) (int, error) {\n//--to\nfunc FindCPUMountPoint(out, cgroup []byte, version Version, scratch []byte) (int, error) {\n    return 0, ErrNoCgroup\n"
  },
  {
    "path": "1.26_linux/internal/runtime/syscall/linux/asm_linux_amd64.s.patch",
    "content": "//--from\nTEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0\n\t// a6 already in R9.\n\t// a5 already in R8.\n\tMOVQ\tSI, R10 // a4\n\tMOVQ\tDI, DX  // a3\n\tMOVQ\tCX, SI  // a2\n\tMOVQ\tBX, DI  // a1\n\t// num already in AX.\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\tok\n\tNEGQ\tAX\n\tMOVQ\tAX, CX  // errno\n\tMOVQ\t$-1, AX // r1\n\tMOVQ\t$0, BX  // r2\n\tRET\nok:\n\t// r1 already in AX.\n\tMOVQ\tDX, BX // r2\n\tMOVQ\t$0, CX // errno\n\tRET\n//--to\n"
  },
  {
    "path": "1.26_linux/internal/runtime/syscall/linux/asm_linux_arm64.s.patch",
    "content": "//--from\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tMOVD\tnum+0(FP), R8\t// syscall entry\n\tMOVD\ta1+8(FP), R0\n\tMOVD\ta2+16(FP), R1\n\tMOVD\ta3+24(FP), R2\n\tMOVD\ta4+32(FP), R3\n\tMOVD\ta5+40(FP), R4\n\tMOVD\ta6+48(FP), R5\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$-1, R4\n\tMOVD\tR4, r1+56(FP)\n\tMOVD\tZR, r2+64(FP)\n\tNEG\tR0, R0\n\tMOVD\tR0, errno+72(FP)\n\tRET\nok:\n\tMOVD\tR0, r1+56(FP)\n\tMOVD\tR1, r2+64(FP)\n\tMOVD\tZR, errno+72(FP)\n\tRET\n//--to\n"
  },
  {
    "path": "1.26_linux/internal/runtime/syscall/linux/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)\n//--to\nfunc Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {\n\tprintln(\"not implemented syscall at Syscall6\", num)\n\tpanic(\"syscall.Syscall6\")\n\treturn 0, 0, 0x26 // ENOSYS\n}\n"
  },
  {
    "path": "1.26_linux/internal/runtime/syscall/linux/syscall_linux_test.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/syscall/linux\"\n\t\"testing\"\n)\n//--to\nimport (\n\t\"testing\"\n)\n//--from\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tv := linux.EpollCtl(-1, 1, -1, &linux.EpollEvent{})\n\n\tconst EBADF = 0x09\n\tif v != EBADF {\n\t\tt.Errorf(\"epollctl = %v, want %v\", v, EBADF)\n\t}\n}\n//--to\nfunc TestEpollctlErrorSign(t *testing.T) {\n\tt.Skip(\"Epollctl is not supported in this environment\")\n}\n"
  },
  {
    "path": "1.26_linux/internal/strconv/fp_test.go.patch",
    "content": "//--from\nfunc TestFp(t *testing.T) {\n//--to\nfunc TestFp(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/internal/syscall/unix/fcntl_unix.go.patch",
    "content": "//--from\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\tval, errno := fcntl(int32(fd), int32(cmd), int32(arg))\n\tif val == -1 {\n\t\treturn int(val), syscall.Errno(errno)\n\t}\n\treturn int(val), nil\n}\n//--to\nfunc Fcntl(fd int, cmd int, arg int) (int, error) {\n\treturn 0, syscall.ENOSYS\n}\n"
  },
  {
    "path": "1.26_linux/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.26_linux/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.26_linux/internal/testenv/testenv_notunix.go.patch",
    "content": "//--from\n//go:build windows || plan9 || (js && wasm) || wasip1\n//--to\n//go:build windows || plan9 || (js && wasm) || wasip1 || linux\n"
  },
  {
    "path": "1.26_linux/internal/testenv/testenv_unix.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.26_linux/math/big/link_test.go.patch",
    "content": "//--from\nfunc TestLinkerGC(t *testing.T) {\n//--to\nfunc TestLinkerGC(t *testing.T) {\n\tt.Skip(\"go tools are not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/math/rand/default_test.go.patch",
    "content": "//--from\nfunc TestDefaultRace(t *testing.T) {\n//--to\nfunc TestDefaultRace(t *testing.T) {\n\tt.Skip(\"os.Getenv and creating processes are not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/align_test.go.patch",
    "content": "//--from\nfunc TestAtomicAlignment(t *testing.T) {\n//--to\nfunc TestAtomicAlignment(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/asm_arm64.s.patch",
    "content": "//--from\nTEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0\n\tMOVWU\tcycles+0(FP), R0\n\tCBZ\t R0, done\n\t//Prevent speculation of subsequent counter/timer reads and memory accesses.\n\tISB     $15\n\t// If the delay is very short, just return.\n\t// Hardcode 18ns as the first ISB delay.\n\tCMP     $18, R0\n\tBLS     done\n\t// Adjust for overhead of initial ISB.\n\tSUB     $18, R0, R0\n\t// Convert the delay from nanoseconds to counter/timer ticks.\n\t// Read the counter/timer frequency.\n\t// delay_ticks = (delay * CNTFRQ_EL0) / 1e9\n\t// With the below simplifications and adjustments,\n\t// we are usually within 2% of the correct value:\n\t// delay_ticks = (delay + delay / 16) * CNTFRQ_EL0 >> 30\n\tMRS     CNTFRQ_EL0, R1\n\tADD     R0>>4, R0, R0\n\tMUL     R1, R0, R0\n\tLSR     $30, R0, R0\n\tCBZ     R0, done\n\t// start = current counter/timer value\n\tMRS     CNTVCT_EL0, R2\ndelay:\n\t// Delay using ISB for all ticks.\n\tISB     $15\n\t// Substract and compare to handle counter roll-over.\n\t// counter_read() - start < delay_ticks\n\tMRS     CNTVCT_EL0, R1\n\tSUB     R2, R1, R1\n\tCMP     R0, R1\n\tBCC     delay\ndone:\n\tRET\n//--to\nTEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0\n\tMOVWU\tcycles+0(FP), R0\n\tCBZ\tR0, done\nagain:\n\tYIELD\n\tSUBW\t$1, R0\n\tCBNZ\tR0, again\ndone:\n\tRET\n"
  },
  {
    "path": "1.26_linux/runtime/callers_test.go.patch",
    "content": "//--from\nfunc TestCallersNilPointerPanic(t *testing.T) {\n//--to\nfunc TestCallersNilPointerPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n//--to\nfunc TestCallersDeferNilFuncPanicWithLoop(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/cgo.go.patch",
    "content": "//--from\n*/\nimport \"C\"\n//--to\n#cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all\n#cgo darwin LDFLAGS: -Wl,-undefined,dynamic_lookup\n*/\nimport \"C\"\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/gcc_clearenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_clearenv(void **_unused)\n{\n\t_cgo_tsan_acquire();\n\tclearenv();\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_clearenv(void **_unused)\n{\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/gcc_linux_amd64.c.patch",
    "content": "//--from\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <signal.h>\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--to\n#include <pthread.h>\n#include <errno.h>\n#include <string.h> // strerror\n#include <stdlib.h>\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/gcc_linux_arm64.c.patch",
    "content": "//--from\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--to\nvoid\n_cgo_sys_thread_start(ThreadStart *ts)\n{\n\tpthread_attr_t attr;\n\tsigset_t ign, oset;\n\tpthread_t p;\n\tsize_t size;\n\tint err;\n\n\tsigfillset(&ign);\n\tpthread_sigmask(SIG_SETMASK, &ign, &oset);\n\n\tpthread_attr_init(&attr);\n\tpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\tpthread_attr_setstacksize(&attr, 16 * 4096); // Hack for some special environments\n\tpthread_attr_getstacksize(&attr, &size);\n\t// Leave stacklo=0 and set stackhi=size; mstart will do the rest.\n\tts->g->stackhi = size;\n\terr = _cgo_try_pthread_create(&p, &attr, threadentry, ts);\n\n\tpthread_sigmask(SIG_SETMASK, &oset, nil);\n\n\tif (err != 0) {\n\t\tfatalf(\"pthread_create failed: %s\", strerror(err));\n\t}\n}\n//--from\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic void*\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\t// Note that threadentry will also be defined in gcc_linux.go in Go 1.22.\n\textern void hitsumabushi_initializeThread(void);\n\thitsumabushi_initializeThread();\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/gcc_setenv.c.patch",
    "content": "//--from\nvoid\nx_cgo_setenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tsetenv(arg[0], arg[1], 1);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_setenv(char **arg)\n{\n}\n//--from\nvoid\nx_cgo_unsetenv(char **arg)\n{\n\t_cgo_tsan_acquire();\n\tunsetenv(arg[0]);\n\t_cgo_tsan_release();\n}\n//--to\nvoid\nx_cgo_unsetenv(char **arg)\n{\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/gcc_sigaction.c.patch",
    "content": "//--from\n//go:build linux && (386 || amd64 || arm64 || loong64 || ppc64le)\n//--to\n//go:build linux && (386 || arm64 || loong64 || ppc64le)\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_clock_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <time.h>\n\nint hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp) {\n  return clock_gettime(clk_id, tp);\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_cpu_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n\nint32_t hitsumabushi_getproccount() {\n\treturn 1;\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_filesystem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\nstatic const int kFDOffset = 100;\n\ntypedef struct {\n  const void* content;\n  size_t      content_size;\n  size_t      current;\n  int32_t     fd;\n} pseudo_file;\n\n// TODO: Do we need to protect this by mutex?\nstatic pseudo_file pseudo_files[100];\n\nstatic pthread_mutex_t* pseudo_file_mutex() {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  return &mutex;\n}\n\nstatic int32_t open_pseudo_file(const void* content, size_t content_size) {\n  int index = 0;\n  int found = 0;\n  int32_t fd = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  for (int i = 0; i < sizeof(pseudo_files) / sizeof(pseudo_file); i++) {\n    if (pseudo_files[i].fd == 0) {\n      index = i;\n      found = 1;\n      break;\n    }\n  }\n  if (!found) {\n    // Too many pseudo files are opened.\n    pthread_mutex_unlock(pseudo_file_mutex());\n    return -1;\n  }\n  fd = index + kFDOffset;\n  pseudo_files[index].content = content;\n  pseudo_files[index].content_size = content_size;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = fd;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return fd;\n}\n\nstatic size_t read_pseudo_file(int32_t fd, void *p, int32_t n) {\n  int32_t index = fd - kFDOffset;\n  pseudo_file *file = NULL;\n  size_t rest = 0;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  file = &pseudo_files[index];\n  rest = file->content_size - file->current;\n  if (rest < n) {\n    n = rest;\n  }\n  memcpy(p, file->content + file->current, n);\n  pseudo_files[index].current += n;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n  return n;\n}\n\nstatic void close_pseudo_file(int32_t fd) {\n  int32_t index = fd - kFDOffset;\n\n  pthread_mutex_lock(pseudo_file_mutex());\n\n  pseudo_files[index].content = NULL;\n  pseudo_files[index].content_size = 0;\n  pseudo_files[index].current = 0;\n  pseudo_files[index].fd = 0;\n\n  pthread_mutex_unlock(pseudo_file_mutex());\n}\n\nint32_t hitsumabushi_closefd(int32_t fd) {\n  if (fd >= kFDOffset) {\n    close_pseudo_file(fd);\n    return 0;\n  }\n  fprintf(stderr, \"syscall close(%d) is not implemented\\n\", fd);\n  return 0;\n}\n\nint32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm) {\n  const static int kENOENT = 0x2;\n\n  if (strcmp(name, \"/proc/self/auxv\") == 0) {\n    static const char auxv[] =\n      \"\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // _AT_PAGESZ tag (6)\n      \"\\x00\\x10\\x00\\x00\\x00\\x00\\x00\\x00\"  // 4096 bytes per page\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"  // Dummy bytes\n      \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"; // Dummy bytes\n    return open_pseudo_file(auxv, sizeof(auxv) / sizeof(char));\n  }\n  if (strcmp(name, \"/sys/kernel/mm/transparent_hugepage/hpage_pmd_size\") == 0) {\n    static const char hpage_pmd_size[] =\n      \"\\x30\\x5c\"; // '0', '\\n'\n    return open_pseudo_file(hpage_pmd_size, sizeof(hpage_pmd_size) / sizeof(char));\n  }\n  fprintf(stderr, \"syscall open(%s, %d, %d) is not implemented\\n\", name, mode, perm);\n  return kENOENT;\n}\n\nint32_t hitsumabushi_read(int32_t fd, void *p, int32_t n) {\n  const static int kEBADF = 0x9;\n\n  if (fd >= kFDOffset) {\n    return read_pseudo_file(fd, p, n);\n  }\n  fprintf(stderr, \"syscall read(%d, %p, %d) is not implemented\\n\", fd, p, n);\n  return kEBADF;\n}\n\nint32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n) {\n  static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;\n  int32_t ret = 0;\n\n  pthread_mutex_lock(&m);\n  switch (fd) {\n  case 1:\n    ret = fwrite(p, 1, n, stdout);\n    fflush(stdout);\n    break;\n  case 2:\n    ret = fwrite(p, 1, n, stderr);\n    fflush(stderr);\n    break;\n  default:\n    fprintf(stderr, \"syscall write(%lu, %p, %d) is not implemented\\n\", fd, p, n);\n    ret = -EBADF;\n    break;\n  }\n  pthread_mutex_unlock(&m);\n  return ret;\n}\n\nint32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence) {\n  fprintf(stderr, \"syscall lseek(%lu, %lu, %d) is not implemented\\n\", fd, offset, whence);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n{\n  if (fd == 0 || fd == 1 || fd == 2) {\n    if (cmd == F_GETFL) {\n      return 0;\n    }\n  }\n  fprintf(stderr, \"syscall fcntl(%d, %d, %d) is not implemented\\n\", fd, cmd, arg);\n  return -EBADF;\n}\n\nint32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n{\n  fprintf(stderr, \"syscall fstat(%d, %p) is not implemented\\n\", fd, stat);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n{\n  fprintf(stderr, \"syscall renameat(%d, %s, %d, %s) is not implemented\\n\", fd1, name1, fd2, name2);\n  return -ENOSYS;\n}\n\nint32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n{\n  fprintf(stderr, \"syscall fstatat(%d, %s, %p, %d) is not implemented\\n\", fd, name, p, flags);\n  return -ENOSYS;\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_futex_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nstatic const int kPseudoFutexWait = 0;\nstatic const int kPseudoFutexWake = 1;\n\nstatic void pseudo_futex(uint32_t *uaddr, int mode, uint32_t val, const struct timespec *reltime) {\n  static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;\n  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;\n  int ret = 0;\n\n  struct timespec abstime;\n  if (reltime) {\n    // We are not sure CLOCK_REALTIME is correct or not here.\n    // However, this time limit is actually not used as the condition variable is shared by\n    // all the threads. Before the time limit reaches, the thread wakes up in 99.9999...% cases.\n    clock_gettime(CLOCK_REALTIME, &abstime);\n    abstime.tv_sec += reltime->tv_sec;\n    abstime.tv_nsec += reltime->tv_nsec;\n    if (1000000000 <= abstime.tv_nsec) {\n      abstime.tv_sec += 1;\n      abstime.tv_nsec -= 1000000000;\n    }\n  }\n\n  ret = pthread_mutex_lock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_lock failed: %d\\n\", ret);\n    abort();\n  }\n\n  switch (mode) {\n  case kPseudoFutexWait:\n    if (reltime) {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_timedwait(&cond, &mutex, &abstime);\n        if (ret && ret != ETIMEDOUT) {\n          fprintf(stderr, \"pthread_cond_timedwait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    } else {\n      uint32_t v = 0;\n      __atomic_load(uaddr, &v, __ATOMIC_RELAXED);\n      if (v == val) {\n        int ret = pthread_cond_wait(&cond, &mutex);\n        if (ret) {\n          fprintf(stderr, \"pthread_cond_wait failed: %d\\n\", ret);\n          abort();\n        }\n      }\n    }\n    break;\n  case kPseudoFutexWake:\n    if (val != 1) {\n      fprintf(stderr, \"val for waking must be 1 but %d\\n\", val);\n      abort();\n    }\n    // TODO: broadcasting is not efficient. Use a mutex for each uaddr.\n    ret = pthread_cond_broadcast(&cond);\n    if (ret) {\n      fprintf(stderr, \"pthread_cond_broadcast failed: %d\\n\", ret);\n      abort();\n    }\n    break;\n  }\n\n  ret = pthread_mutex_unlock(&mutex);\n  if (ret) {\n    fprintf(stderr, \"pthread_mutex_unlock failed: %d\\n\", ret);\n    abort();\n  }\n}\n\nint32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val,\n                           const struct timespec *timeout,\n                           uint32_t *uaddr2, uint32_t val3) {\n  enum {\n    kFutexWaitPrivate = 128,\n    kFutexWakePrivate = 129,\n  };\n\n  switch (futex_op) {\n  case kFutexWaitPrivate:\n    pseudo_futex(uaddr, kPseudoFutexWait, val, timeout);\n    break;\n  case kFutexWakePrivate:\n    pseudo_futex(uaddr, kPseudoFutexWake, val, NULL);\n    break;\n  }\n\n  // This function should return the number of awaken threads, but now it is impossible.\n  // Just return 0.\n  return 0;\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_mem_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n#include <stdint.h>\n#include <stdlib.h>\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n);\n\nvoid* hitsumabushi_sysAllocOS(uintptr_t n) {\n  return hitsumabushi_sysReserveOS(NULL, n);\n}\n\nvoid hitsumabushi_sysUnusedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysUsedOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysHugePageOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFreeOS(void* v, uintptr_t n) {\n}\n\nvoid hitsumabushi_sysFaultOS(void* v, uintptr_t n) {\n}\n\nvoid* hitsumabushi_sysReserveOS(void* v, uintptr_t n) {\n  if (v) {\n    return NULL;\n  }\n  // The returned pointer must be aligned to 1 << 9 bytes.\n  // See also:\n  // * https://cs.opensource.google/go/go/+/refs/tags/go1.25.0:src/runtime/tagptr_64bit.go\n  // * https://go.dev/cl/665815/\n  return aligned_alloc(1 << 9, n);\n}\n\nvoid hitsumabushi_sysMapOS(void* v, uintptr_t n) {\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_syscalls_linux.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\n// This file defines C functions and system calls for Cgo.\n\n#include <pthread.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdatomic.h>\n#include <unistd.h> // for usleep\n#include <stddef.h> // for size_t\n\n#include \"libcgo.h\"\n#include \"libcgo_unix.h\"\n\ntypedef unsigned int gid_t;\n\nextern int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp);\nextern int32_t hitsumabushi_getproccount();\n\nvoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {\n  abort();\n  return NULL;\n}\n\nint munmap(void *addr, size_t length) {\n  abort();\n  return 0;\n}\n\nint pthread_sigmask(int how, void *set, void *oldset) {\n  // Do nothing.\n  return 0;\n}\n\nint setegid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint seteuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgid(gid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint setgroups(size_t size, const gid_t *list) {\n  // Do nothing.\n  return 0;\n}\n\nint setregid(gid_t rgid, gid_t egid) {\n  // Do nothing.\n  return 0;\n}\n\nint setreuid(uid_t ruid, uid_t euid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresgid(gid_t rgid, gid_t egid, gid_t sgid) {\n  // Do nothing.\n  return 0;\n}\n\nint setresuid(uid_t ruid, uid_t euid, uid_t suid) {\n  // Do nothing.\n  return 0;\n}\n\nint setuid(uid_t gid) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaction(int signum, void *act, void *oldact) {\n  // Do nothing.\n  return 0;\n}\n\nint sigaddset(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nint sigemptyset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigfillset(void *set) {\n  // Do nothing.\n  return 0;\n}\n\nint sigismember(void *set, int signum) {\n  // Do nothing.\n  return 0;\n}\n\nuint32_t hitsumabushi_gettid() {\n  uint64_t tid64 = (uint64_t)(pthread_self());\n  uint32_t tid = (uint32_t)(tid64 >> 32) ^ (uint32_t)(tid64);\n  return tid;\n}\n\nint64_t hitsumabushi_nanotime1() {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_MONOTONIC, &tp);\n  return (int64_t)(tp.tv_sec) * 1000000000ll + (int64_t)tp.tv_nsec;\n}\n\nint32_t hitsumabushi_osyield() {\n  return sched_yield();\n}\n\nint32_t hitsumabushi_sched_getaffinity(pid_t pid, size_t cpusetsize, void *mask) {\n    int32_t numcpu = hitsumabushi_getproccount();\n    for (int32_t i = 0; i < numcpu; i += 8)\n        ((unsigned char*)mask)[i / 8] = (unsigned char)((1u << (numcpu - i)) - 1);\n    // https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html\n    // > On success, the raw sched_getaffinity() system call returns the\n    // > number of bytes placed copied into the mask buffer;\n    return (numcpu + 7) / 8;\n}\n\nvoid hitsumabushi_usleep(useconds_t usec) {\n  usleep(usec);\n}\n\nvoid hitsumabushi_walltime1(int64_t* sec, int32_t* nsec) {\n  struct timespec tp;\n  hitsumabushi_clock_gettime(CLOCK_REALTIME, &tp);\n  *sec = tp.tv_sec;\n  *nsec = tp.tv_nsec;\n}\n\nvoid hitsumabushi_exit(int32_t code) {\n  exit(code);\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/hitsumabushi_thread_linux.c",
    "content": "void hitsumabushi_initializeThread(void) {\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/linux_syscall.c.patch",
    "content": "//--from\n#include <grp.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--to\n#include <sys/types.h>\n#include <unistd.h>\n#include <errno.h>\n#include \"libcgo.h\"\n//--from\nvoid\n_cgo_libc_setegid(argset_t* x) {\n\tSET_RETVAL(setegid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setegid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n\tSET_RETVAL(seteuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_seteuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgid(argset_t* x) {\n\tSET_RETVAL(setgid((gid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n\tSET_RETVAL(setgroups((size_t) x->args[0], (const gid_t *) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setgroups(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setregid(argset_t* x) {\n\tSET_RETVAL(setregid((gid_t) x->args[0], (gid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setregid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n\tSET_RETVAL(setresgid((gid_t) x->args[0], (gid_t) x->args[1],\n\t\t\t     (gid_t) x->args[2]));\n}\n//--to\nvoid\n_cgo_libc_setresgid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n\tSET_RETVAL(setreuid((uid_t) x->args[0], (uid_t) x->args[1]));\n}\n//--to\nvoid\n_cgo_libc_setreuid(argset_t* x) {\n}\n//--from\nvoid\n_cgo_libc_setuid(argset_t* x) {\n\tSET_RETVAL(setuid((uid_t) x->args[0]));\n}\n//--to\nvoid\n_cgo_libc_setuid(argset_t* x) {\n}\n"
  },
  {
    "path": "1.26_linux/runtime/cgo/sigaction.go.patch",
    "content": "//--from\n//go:build (linux && (386 || amd64 || arm64 || loong64 || ppc64le)) || (freebsd && amd64)\n//--to\n//go:build (linux && (386 || arm64 || loong64 || ppc64le)) || (freebsd && amd64)\n"
  },
  {
    "path": "1.26_linux/runtime/crash_test.go.patch",
    "content": "//--from\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n//--to\nfunc buildTestProg(t *testing.T, binary string, flags ...string) (string, error) {\n\tt.Skip(\"buildTestProg is not supported in this environment\")\n//--from\nfunc TestPanicInlined(t *testing.T) {\n//--to\nfunc TestPanicInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/crash_unix_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.26_linux/runtime/debug/heapdump_test.go.patch",
    "content": "//--from\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpNonempty(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpFinalizers(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n//--from\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n//--to\nfunc TestWriteHeapDumpTypeName(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/debug/panic_test.go.patch",
    "content": "//--from\nfunc TestPanicOnFault(t *testing.T) {\n//--to\nfunc TestPanicOnFault(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/debug/stack_test.go.patch",
    "content": "//--from\nfunc TestSetCrashOutput(t *testing.T) {\n//--to\nfunc TestSetCrashOutput(t *testing.T) {\n    t.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/debug_test.go.patch",
    "content": "//--from\n//go:build (amd64 || arm64 || loong64 || ppc64le) && linux && !race\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.26_linux/runtime/decoratemappings_test.go.patch",
    "content": "//--from\nfunc TestDecorateMappings(t *testing.T) {\n//--to\nfunc TestDecorateMappings(t *testing.T) {\n    t.Skip(\"files are not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/export_unix_test.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:build unix\n\npackage runtime\n\nconst (\n\tO_WRONLY = _O_WRONLY\n\tO_CREAT  = _O_CREAT\n\tO_TRUNC  = _O_TRUNC\n)\n"
  },
  {
    "path": "1.26_linux/runtime/fds_unix.go.patch",
    "content": "//--from\nfunc checkfds() {\n//--to\nfunc checkfds() {\n\treturn\n"
  },
  {
    "path": "1.26_linux/runtime/mem_linux.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This implementation is the most fundamental and minimal allocations like Wasm.\n// Malloced memory regions are never freed.\n\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n\nconst (\n\t_EINVAL = 22\n)\n\n// Don't split the stack as this method may be invoked without a valid G, which\n// prevents us from allocating more stack.\n//\n//go:nosplit\nfunc sysAllocOS(n uintptr, vmaName string) (ptr unsafe.Pointer) {\n\treturn sysAllocOSImpl(n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysAllocOSImpl(n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysAllocOS_trampoline)), unsafe.Pointer(&n))\n\treturn\n}\nfunc sysAllocOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUnusedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUnusedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUnusedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysUsedOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysUsedOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysUsedOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysHugePageOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysHugePageOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysHugePageOS_trampoline(n uintptr, size uintptr)\n\nfunc sysNoHugePageOS(v unsafe.Pointer, n uintptr) {\n}\n\nfunc sysHugePageCollapseOS(v unsafe.Pointer, n uintptr) {\n}\n\n// Don't split the stack as this function may be invoked without a valid G,\n// which prevents us from allocating more stack.\n//\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFreeOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFreeOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFreeOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysFaultOS(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysFaultOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysFaultOS_trampoline(n uintptr, size uintptr)\n\n//go:nosplit\nfunc sysReserveOS(v unsafe.Pointer, n uintptr, vmaName string) (ptr unsafe.Pointer) {\n\treturn sysReserveOSImpl(v, n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysReserveOSImpl(v unsafe.Pointer, n uintptr) (ptr unsafe.Pointer) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysReserveOS_trampoline)), unsafe.Pointer(&v))\n\treturn\n}\nfunc sysReserveOS_trampoline(n uintptr, size uintptr) uintptr\n\n//go:nosplit\nfunc sysMapOS(v unsafe.Pointer, n uintptr, vmaName string) {\n\tsysMapOSImpl(v, n)\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sysMapOSImpl(v unsafe.Pointer, n uintptr) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(sysMapOS_trampoline)), unsafe.Pointer(&v))\n}\nfunc sysMapOS_trampoline(n uintptr, size uintptr)\n\nfunc needZeroAfterSysUnusedOS() bool {\n\treturn true\n}\n"
  },
  {
    "path": "1.26_linux/runtime/memmove_linux_amd64_test.go.patch",
    "content": "//--from\nfunc TestMemmoveOverflow(t *testing.T) {\n//--to\nfunc TestMemmoveOverflow(t *testing.T) {\n\tt.Skip(\"file is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/metrics_test.go.patch",
    "content": "//--from\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n//--to\n\t\t\tname: \"runtime/debug.WriteHeapDump\",\n\t\t\tfn: func(t *testing.T) {\n\t\t\t\tt.Skip(\"debug.WriteHeapDump is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/nbpipe_pipe2.go.patch",
    "content": "//--from\n//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris\n//--to\n//go:build dragonfly || freebsd || netbsd || openbsd || solaris\n"
  },
  {
    "path": "1.26_linux/runtime/nbpipe_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.26_linux/runtime/netpoll_epoll.go.patch",
    "content": "//--from\n//go:build linux\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.26_linux/runtime/netpoll_fake.go.patch",
    "content": "//--from\n//go:build js && wasm\n//--to\n//go:build linux\n"
  },
  {
    "path": "1.26_linux/runtime/nosan_linux_test.go.patch",
    "content": "//--from\nfunc TestNewOSProc0(t *testing.T) {\n//--to\nfunc TestNewOSProc0(t *testing.T) {\n\tt.Skip(\"newosproc0 is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/os_linux.go.patch",
    "content": "//--from\nimport (\n\t\"internal/abi\"\n\t\"internal/goarch\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall/linux\"\n\t\"internal/strconv\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"internal/runtime/syscall/linux\"\n\t\"internal/strconv\"\n\t\"unsafe\"\n)\n//--from\nfunc sysargs(argc int32, argv **byte) {\n\tn := argc + 1\n\n\t// skip over argv, envp to get to auxv\n\tfor argv_index(argv, n) != nil {\n\t\tn++\n\t}\n\n\t// skip NULL separator\n\tn++\n\n\t// now argv+n is auxv\n\tauxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))\n\n\tif pairs := sysauxv(auxvp[:]); pairs != 0 {\n\t\tauxv = auxvp[: pairs*2 : pairs*2]\n\t\treturn\n\t}\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--to\nfunc sysargs(argc int32, argv **byte) {\n\t// argc/argv is not reliable on some machines.\n\t// Skip analysing them.\n\n\t// In some situations we don't get a loader-provided\n\t// auxv, such as when loaded as a library on Android.\n\t// Fall back to /proc/self/auxv.\n\tfd := open(&procAuxv[0], 0 /* O_RDONLY */, 0)\n\tif fd < 0 {\n\t\t// On Android, /proc/self/auxv might be unreadable (issue 9229), so we fallback to\n\t\t// try using mincore to detect the physical page size.\n\t\t// mincore should return EINVAL when address is not a multiple of system page size.\n\t\tconst size = 256 << 10 // size of memory region to allocate\n\t\tp, err := mmap(nil, size, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0)\n\t\tif err != 0 {\n\t\t\treturn\n\t\t}\n\t\tvar n uintptr\n\t\tfor n = 4 << 10; n < size; n <<= 1 {\n\t\t\terr := mincore(unsafe.Pointer(uintptr(p)+n), 1, &addrspace_vec[0])\n\t\t\tif err == 0 {\n\t\t\t\tphysPageSize = n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif physPageSize == 0 {\n\t\t\tphysPageSize = size\n\t\t}\n\t\tmunmap(p, size)\n\t\treturn\n\t}\n\n\tn := read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))\n\tclosefd(fd)\n\tif n < 0 {\n\t\treturn\n\t}\n\t// Make sure buf is terminated, even if we didn't read\n\t// the whole file.\n\tauxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL\n\tpairs := sysauxv(auxvreadbuf[:])\n\tauxv = auxvreadbuf[: pairs*2 : pairs*2]\n}\n//--from\nvar urandom_dev = []byte(\"/dev/urandom\\x00\")\n\nfunc readRandom(r []byte) int {\n\t// Note that all supported Linux kernels should provide AT_RANDOM which\n\t// populates startupRand, so this fallback should be unreachable.\n\tfd := open(&urandom_dev[0], 0 /* O_RDONLY */, 0)\n\tn := read(fd, unsafe.Pointer(&r[0]), int32(len(r)))\n\tclosefd(fd)\n\treturn int(n)\n}\n//--to\n//go:nosplit\nfunc readRandom(r []byte) int {\n\treturn 0\n}\n//--from\nfunc gettid() uint32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc gettid() (tid uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(gettid_trampoline)), unsafe.Pointer(&tid))\n\treturn\n}\nfunc gettid_trampoline() uint32\n//--from\n//go:noescape\nfunc sigaltstack(new, old *stackt)\n//--to\nfunc sigaltstack(new, old *stackt) {\n\t// Do nothing.\n}\n//--from\nfunc sigprocmask(how int32, new, old *sigset) {\n\trtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--to\nfunc sigprocmask(how int32, new, old *sigset) {\n\t// Do nothing.\n\t// rtsigprocmask(how, new, old, int32(unsafe.Sizeof(*new)))\n}\n//--from\nfunc raise(sig uint32)\n//--to\nfunc raise(sig uint32) {\n\t// Do nothing\n}\n//--from\nfunc raiseproc(sig uint32)\n//--to\nfunc raiseproc(sig uint32) {\n\t// Do nothing\n}\n//--from\n//go:noescape\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc sched_getaffinity(pid, len uintptr, buf *byte) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(sched_getaffinity_trampoline)), unsafe.Pointer(&pid))\n}\nfunc sched_getaffinity_trampoline(pid, len uintptr, buf *byte) int32\n//--from\nfunc osyield()\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc osyield() {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(osyield_trampoline)), nil)\n}\nfunc osyield_trampoline()\n//--from\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n//--to\nfunc sysSigaction(sig uint32, new, old *sigactiont) {\n\t// Do nothing.\n\treturn\n//--from\nfunc signalM(mp *m, sig int) {\n\ttgkill(getpid(), int(mp.procid), sig)\n}\n//--to\nfunc signalM(mp *m, sig int) {\n\t// Do nothiing.\n}\n//--from\nfunc runPerThreadSyscall() {\n\tgp := getg()\n\tif gp.m.needPerThreadSyscall.Load() == 0 {\n\t\treturn\n\t}\n\n\targs := perThreadSyscall\n\tr1, r2, errno := linux.Syscall6(args.trap, args.a1, args.a2, args.a3, args.a4, args.a5, args.a6)\n\tif GOARCH == \"ppc64\" || GOARCH == \"ppc64le\" {\n\t\t// TODO(https://go.dev/issue/51192 ): ppc64 doesn't use r2.\n\t\tr2 = 0\n\t}\n\tif errno != 0 || r1 != args.r1 || r2 != args.r2 {\n\t\tprint(\"trap:\", args.trap, \", a123456=[\", args.a1, \",\", args.a2, \",\", args.a3, \",\", args.a4, \",\", args.a5, \",\", args.a6, \"]\\n\")\n\t\tprint(\"results: got {r1=\", r1, \",r2=\", r2, \",errno=\", errno, \"}, want {r1=\", args.r1, \",r2=\", args.r2, \",errno=0}\\n\")\n\t\tfatal(\"AllThreadsSyscall6 results differ between threads; runtime corrupted\")\n\t}\n\n\tgp.m.needPerThreadSyscall.Store(0)\n}\n//--to\nfunc runPerThreadSyscall() {\n\t// Do nothing.\n\t// needPerThreadSyscall should never be 1 as syscall_runtime_doAllThreadsSyscall is not available with Cgo.\n}\n//--append\n//go:linkname hitsumabushi_closefd hitsumabushi_closefd\n//go:cgo_import_static hitsumabushi_closefd\nvar hitsumabushi_closefd byte\n\n//go:linkname hitsumabushi_exit hitsumabushi_exit\n//go:cgo_import_static hitsumabushi_exit\nvar hitsumabushi_exit byte\n\n//go:linkname hitsumabushi_gettid hitsumabushi_gettid\n//go:cgo_import_static hitsumabushi_gettid\nvar hitsumabushi_gettid byte\n\n//go:linkname hitsumabushi_nanotime1 hitsumabushi_nanotime1\n//go:cgo_import_static hitsumabushi_nanotime1\nvar hitsumabushi_nanotime1 byte\n\n//go:linkname hitsumabushi_open hitsumabushi_open\n//go:cgo_import_static hitsumabushi_open\nvar hitsumabushi_open byte\n\n//go:linkname hitsumabushi_osyield hitsumabushi_osyield\n//go:cgo_import_static hitsumabushi_osyield\nvar hitsumabushi_osyield byte\n\n//go:linkname hitsumabushi_read hitsumabushi_read\n//go:cgo_import_static hitsumabushi_read\nvar hitsumabushi_read byte\n\n//go:linkname hitsumabushi_sched_getaffinity hitsumabushi_sched_getaffinity\n//go:cgo_import_static hitsumabushi_sched_getaffinity\nvar hitsumabushi_sched_getaffinity byte\n\n//go:linkname hitsumabushi_usleep hitsumabushi_usleep\n//go:cgo_import_static hitsumabushi_usleep\nvar hitsumabushi_usleep byte\n\n//go:linkname hitsumabushi_walltime1 hitsumabushi_walltime1\n//go:cgo_import_static hitsumabushi_walltime1\nvar hitsumabushi_walltime1 byte\n\n//go:linkname hitsumabushi_write1 hitsumabushi_write1\n//go:cgo_import_static hitsumabushi_write1\nvar hitsumabushi_write1 byte\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fcntl1(fd, cmd, arg int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fcntl_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fcntl_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstat1(fd int, stat unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstat_trampoline(fd int, stat unsafe.Pointer) int32\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc lseek1(fd int, offset int64, whence int) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(lseek_trampoline)), unsafe.Pointer(&fd))\n}\nfunc lseek_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc renameat(fd1 int, name1 unsafe.Pointer, fd2 int, name2 unsafe.Pointer) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(renameat_trampoline)), unsafe.Pointer(&fd1))\n}\nfunc renameat_trampoline()\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(fstatat_trampoline)), unsafe.Pointer(&fd))\n}\nfunc fstatat_trampoline()\n"
  },
  {
    "path": "1.26_linux/runtime/os_linux64.go.patch",
    "content": "//--from\nimport (\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\n//go:noescape\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts *timespec, addr2 unsafe.Pointer, val3 uint32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc futex(addr unsafe.Pointer, op int32, val uint32, ts *timespec, addr2 unsafe.Pointer, val3 uint32) int32 {\n\tret := libcCall(unsafe.Pointer(abi.FuncPCABI0(futex_trampoline)), unsafe.Pointer(&addr))\n\treturn ret\n}\nfunc futex_trampoline(addr unsafe.Pointer, op int32, val uint32, ts *timespec, addr2 unsafe.Pointer, val3 uint32) int32\n"
  },
  {
    "path": "1.26_linux/runtime/panicnil_test.go.patch",
    "content": "//--from\nfunc TestPanicNil(t *testing.T) {\n//--to\nfunc TestPanicNil(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/proc_test.go.patch",
    "content": "//--from\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\ttestGoroutineParallelism2(t, false, true)\n\ttestGoroutineParallelism2(t, true, true)\n}\n//--to\nfunc TestGoroutineParallelism2(t *testing.T) {\n\t//testGoroutineParallelism2(t, false, false)\n\ttestGoroutineParallelism2(t, true, false)\n\t//testGoroutineParallelism2(t, false, true)\n\t//testGoroutineParallelism2(t, true, true)\n}\n"
  },
  {
    "path": "1.26_linux/runtime/rand_test.go.patch",
    "content": "//--from\nfunc TestReadRandom(t *testing.T) {\n//--to\nfunc TestReadRandom(t *testing.T) {\n\tt.Skip(\"readRandom is not available in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/runtime1.go.patch",
    "content": "//--from\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*goarch.PtrSize))\n}\n//--to\nfunc argv_index(argv **byte, i int32) *byte {\n\treturn nil\n}\n//--from\nfunc args(c int32, v **byte) {\n\targc = c\n\targv = v\n\tsysargs(c, v)\n}\n//--to\nfunc args(c int32, v **byte) {\n\t// In the original code, physPageSize is determined at sysargs.\n\t// Hitsumabushi gives an initial value for physPageSize at its declaration, so sysargs doesn't have to be called.\n}\n//--append\n// Expose the entry point for some special environments.\n\n//go:cgo_export_static _rt0_amd64_linux_lib\n//go:cgo_export_dynamic _rt0_amd64_linux_lib\n"
  },
  {
    "path": "1.26_linux/runtime/runtime_linux_test.go.patch",
    "content": "//--from\nfunc TestMincoreErrorSign(t *testing.T) {\n//--to\nfunc TestMincoreErrorSign(t *testing.T) {\n\tt.Skip(\"mincore is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/runtime_mmap_test.go.patch",
    "content": "//--from\n//go:build unix\n//--to\n//go:build unix && !linux\n"
  },
  {
    "path": "1.26_linux/runtime/runtime_test.go.patch",
    "content": "//--from\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n//--to\nfunc testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {\n\tt.Skip(\"catching faults is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/runtime_unix_test.go.patch",
    "content": "//--from\n//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || plan9\n//--to\n//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || plan9\n"
  },
  {
    "path": "1.26_linux/runtime/stack_test.go.patch",
    "content": "//--from\nfunc TestDeferLeafSigpanic(t *testing.T) {\n//--to\nfunc TestDeferLeafSigpanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n//--from\nfunc TestStackWrapperStackPanic(t *testing.T) {\n//--to\nfunc TestStackWrapperStackPanic(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/runtime/stubs2.go.patch",
    "content": "//--from\nimport (\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--to\nimport (\n\t\"internal/abi\"\n\t\"internal/runtime/atomic\"\n\t\"unsafe\"\n)\n//--from\nfunc read(fd int32, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc read(fd int32, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(read_trampoline)), unsafe.Pointer(&fd))\n}\nfunc read_trampoline(fd int32, p unsafe.Pointer, n int32) int32\n//--from\nfunc closefd(fd int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc closefd(fd int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(closefd_trampoline)), unsafe.Pointer(&fd))\n}\nfunc closefd_trampoline(fd int32) int32\n//--from\nfunc exit(code int32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc exit(code int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(exit_trampoline)), unsafe.Pointer(&code))\n}\nfunc exit_trampoline(code int32)\n//--from\nfunc usleep(usec uint32)\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep(usec uint32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\nfunc usleep_trampoline(usec uint32)\n//--from\n//go:nosplit\nfunc usleep_no_g(usec uint32) {\n\tusleep(usec)\n}\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc usleep_no_g(usec uint32) {\n\tasmcgocall_no_g(unsafe.Pointer(abi.FuncPCABI0(usleep_trampoline)), unsafe.Pointer(&usec))\n}\n//--from\n//go:noescape\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(write1_trampoline)), unsafe.Pointer(&fd))\n}\nfunc write1_trampoline(fd uintptr, p unsafe.Pointer, n int32) int32\n//--from\n//go:noescape\nfunc open(name *byte, mode, perm int32) int32\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc open(name *byte, mode, perm int32) int32 {\n\treturn libcCall(unsafe.Pointer(abi.FuncPCABI0(open_trampoline)), unsafe.Pointer(&name))\n}\nfunc open_trampoline(name *byte, mode, perm int32) int32\n"
  },
  {
    "path": "1.26_linux/runtime/stubs3.go.patch",
    "content": "//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc nanotime1() int64\n//--to\n//go:nosplit\n//go:cgo_unsafe_args\nfunc nanotime1() (now int64) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(nanotime1_trampoline)), unsafe.Pointer(&now))\n\treturn\n}\nfunc nanotime1_trampoline() int64\n"
  },
  {
    "path": "1.26_linux/runtime/sys_libc.go.patch",
    "content": "//--from\n//go:build darwin || openbsd\n//--to\n//go:build darwin || openbsd || linux\n"
  },
  {
    "path": "1.26_linux/runtime/sys_linux_amd64.s.patch",
    "content": "//--from\nTEXT runtime·open(SB),NOSPLIT,$0-20\n\t// This uses openat instead of open, because Android O blocks open.\n\tMOVL\t$AT_FDCWD, DI // AT_FDCWD, so this acts like open\n\tMOVQ\tname+0(FP), SI\n\tMOVL\tmode+8(FP), DX\n\tMOVL\tperm+12(FP), R10\n\tMOVL\t$SYS_openat, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t\t// BX is callee-saved\n\tMOVL\t8(DI), SI\t\t// arg 2 flags\n\tMOVL\t12(DI), DX\t\t// arg 3 mode\n\tMOVQ\t0(DI), DI\t\t// arg 1 pathname\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_open(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT,$0\n\tMOVQ\taddr+0(FP), DI\n\tMOVL\top+8(FP), SI\n\tMOVL\tval+12(FP), DX\n\tMOVQ\tts+16(FP), R10\n\tMOVQ\taddr2+24(FP), R8\n\tMOVL\tval3+32(FP), R9\n\tMOVL\t$SYS_futex, AX\n\tSYSCALL\n\tMOVL\tAX, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1 addr\n\tMOVL\t8(BX), SI\t\t// arg 2 op\n\tMOVL\t12(BX), DX\t\t// arg 3 val\n\tMOVQ\t16(BX), CX\t\t// arg 4 ts\n\tMOVQ\t24(BX), R8\t\t// arg 5 addr2\n\tMOVL\t32(BX), R9\t\t// arg 6 val3\n\tCALL\thitsumabushi_futex(SB)\n\tMOVL\tAX, 40(BX)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·exit(SB),NOSPLIT,$0-4\n\tMOVL\tcode+0(FP), DI\n\tMOVL\t$SYS_exit_group, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 exit status\n\tCALL\thitsumabushi_exit(SB)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT,$0-28\n\tMOVL\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_read, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t0(BX), DI\t// arg 1 fd\n\tMOVQ\t8(BX), SI\t// arg 2 buf\n\tMOVQ\t16(BX), DX\t// arg 3 count\n\tCALL\thitsumabushi_read(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT,$0-12\n\tMOVL\tfd+0(FP), DI\n\tMOVL\t$SYS_close, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$-1, AX\n\tMOVL\tAX, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_closefd(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_gettid(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT,$0\n\tMOVQ\tnew+0(FP), DI\n\tMOVQ\told+8(FP), SI\n\tMOVQ\t$SYS_sigaltstack, AX\n\tSYSCALL\n\tCMPQ\tAX, $0xfffffffffffff001\n\tJLS\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tRET\n//--to\nTEXT runtime·sigaltstack_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 old\n\tMOVQ\t0(DI), DI\t\t// arg 1 new\n\tCALL\thitsumabushi_sigaltstack(SB)\n\tTESTQ\tAX, AX\n\tJEQ\t2(PC)\n\tMOVL\t$0xf1, 0xf1  // crash\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, R12\n\tMOVL\t$SYS_gettid, AX\n\tSYSCALL\n\tMOVL\tAX, SI\t// arg 2 tid\n\tMOVL\tR12, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), DX\t// arg 3\n\tMOVL\t$SYS_tgkill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raise_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 signal\n\tCALL\thitsumabushi_raise(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT,$0\n\tMOVL\t$SYS_getpid, AX\n\tSYSCALL\n\tMOVL\tAX, DI\t// arg 1 pid\n\tMOVL\tsig+0(FP), SI\t// arg 2\n\tMOVL\t$SYS_kill, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·raiseproc_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), BX\t// signal\n\tCALL\thitsumabushi_getpid(SB)\n\tMOVL\tAX, DI\t\t// arg 1 pid\n\tMOVL\tBX, SI\t\t// arg 2 signal\n\tCALL\thitsumabushi_kill(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT,$0\n\tMOVQ\tpid+0(FP), DI\n\tMOVQ\tlen+8(FP), SI\n\tMOVQ\tbuf+16(FP), DX\n\tMOVL\t$SYS_sched_getaffinity, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 len\n\tMOVQ\t16(DI), DX\t// arg 3 buf\n\tMOVQ\t0(DI), DI\t// arg 1 pid\n\tCALL\thitsumabushi_sched_getaffinity(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·osyield(SB),NOSPLIT,$0\n\tMOVL\t$SYS_sched_yield, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_osyield(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$16\n\tMOVL\t$0, DX\n\tMOVL\tusec+0(FP), AX\n\tMOVL\t$1000000, CX\n\tDIVL\tCX\n\tMOVQ\tAX, 0(SP)\n\tMOVL\t$1000, AX\t// usec to nsec\n\tMULL\tDX\n\tMOVQ\tAX, 8(SP)\n\n\t// nanosleep(&ts, 0)\n\tMOVQ\tSP, DI\n\tMOVL\t$0, SI\n\tMOVL\t$SYS_nanosleep, AX\n\tSYSCALL\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVL\t0(DI), DI\t// arg 1 usec\n\tCALL\thitsumabushi_usleep(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT,$0-28\n\tMOVQ\tfd+0(FP), DI\n\tMOVQ\tp+8(FP), SI\n\tMOVL\tn+16(FP), DX\n\tMOVL\t$SYS_write, AX\n\tSYSCALL\n\tMOVL\tAX, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t// arg 2 p\n\tMOVQ\t16(DI), DX\t// arg 3 n\n\tMOVQ\t0(DI), DI\t// arg 1 fd\n\tCALL\thitsumabushi_write1(SB)\n\tPOPQ\tBP\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$16-8\n\t// We don't know how much stack space the VDSO code will need,\n\t// so switch to g0.\n\t// In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n\n\t// and hardening can use a full page of stack space in gettime_sym\n\t// due to stack probes inserted to avoid stack/heap collisions.\n\t// See issue #20427.\n\n#ifdef GOEXPERIMENT_runtimesecret\n\t// The kernel might spill our secrets onto g0\n\t// erase our registers here.\n\t// TODO(dmo): what is the ABI guarantee here? we use\n\t// R14 later, but the function is ABI0\n\tCMPL\tg_secret(R14), $0\n\tJEQ\tnosecret\n\tCALL\t·secretEraseRegisters(SB)\n\nnosecret:\n#endif\n\n\tMOVQ\tSP, R12\t// Save old SP; R12 unchanged by C code.\n\n\tMOVQ\tg_m(R14), BX // BX unchanged by C code.\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVQ\tm_vdsoPC(BX), CX\n\tMOVQ\tm_vdsoSP(BX), DX\n\tMOVQ\tCX, 0(SP)\n\tMOVQ\tDX, 8(SP)\n\n\tLEAQ\tret+0(FP), DX\n\tMOVQ\t-8(DX), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\tMOVQ\tDX, m_vdsoSP(BX)\n\n\tCMPQ\tR14, m_curg(BX)\t// Only switch if on curg.\n\tJNE\tnoswitch\n\n\tMOVQ\tm_g0(BX), DX\n\tMOVQ\t(g_sched+gobuf_sp)(DX), SP\t// Set SP to g0 stack\n\nnoswitch:\n\tSUBQ\t$16, SP\t\t// Space for results\n\tANDQ\t$~15, SP\t// Align for C code\n\n\tMOVL\t$1, DI // CLOCK_MONOTONIC\n\tLEAQ\t0(SP), SI\n\tMOVQ\truntime·vdsoClockgettimeSym(SB), AX\n\tCMPQ\tAX, $0\n\tJEQ\tfallback\n\tCALL\tAX\nret:\n\tMOVQ\t0(SP), AX\t// sec\n\tMOVQ\t8(SP), DX\t// nsec\n\tMOVQ\tR12, SP\t\t// Restore real SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVQ\t8(SP), CX\n\tMOVQ\tCX, m_vdsoSP(BX)\n\tMOVQ\t0(SP), CX\n\tMOVQ\tCX, m_vdsoPC(BX)\n\t// sec is in AX, nsec in DX\n\t// return nsec in AX\n\tIMULQ\t$1000000000, AX\n\tADDQ\tDX, AX\n\tMOVQ\tAX, ret+0(FP)\n\tRET\nfallback:\n\tMOVQ\t$SYS_clock_gettime, AX\n\tSYSCALL\n\tJMP\tret\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\tSP, BP\n\tCALL\thitsumabushi_nanotime1(SB)\n\tMOVQ\tAX, 0(BX)\n\tPOPQ\tBP\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysAllocOS(SB)\n\tMOVQ\tAX, 8(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUnusedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysUsedOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysHugePageOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFreeOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysFaultOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysReserveOS(SB)\n\tMOVQ\tAX, 16(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_sysMapOS(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\t\t// BX is callee-saved\n\tMOVQ\t8(DI), SI\n\tMOVQ\t0(DI), DI\n\tCALL\thitsumabushi_walltime1(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\t8(DI), SI\t\t// arg 2 cmd\n\tMOVQ\t16(DI), DX\t\t// arg 3 arg\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_fcntl(SB)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 stat\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tCALL\thitsumabushi_fstat(SB)\n\tMOVQ\tAX, 16(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t8(DI), SI\t\t// arg 2 offset\n\tMOVQ\t16(DI), DX\t\t// arg 3 whence\n\tMOVQ\t0(DI), DI\t\t// arg 1 fd\n\tXORL\tAX, AX\t\t\t// vararg: say \"no float args\"\n\tCALL\thitsumabushi_lseek(SB)\n\tMOVQ\tAX, 24(BX)\t// return value\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_renameat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT|NOFRAME,$0\n\tPUSHQ\tBP\n\tMOVQ\tSP, BP\n\tMOVQ\tDI, BX\n\tMOVQ\t0(BX), DI\t\t// arg 1\n\tMOVQ\t8(BX), SI\t\t// arg 2\n\tMOVQ\t16(BX), DX\t\t// arg 3\n\tMOVQ\t24(BX), CX\t\t// arg 4\n\tCALL\thitsumabushi_fstatat(SB)\n\tMOVL\tAX, 32(BX)\n\tPOPQ\tBP\n\tRET\n"
  },
  {
    "path": "1.26_linux/runtime/sys_linux_arm64.s.patch",
    "content": "//--from\n#define SYS_exit\t\t93\n#define SYS_read\t\t63\n#define SYS_write\t\t64\n#define SYS_openat\t\t56\n#define SYS_close\t\t57\n#define SYS_pipe2\t\t59\n#define SYS_nanosleep\t\t101\n#define SYS_mmap\t\t222\n#define SYS_munmap\t\t215\n#define SYS_setitimer\t\t103\n#define SYS_clone\t\t220\n#define SYS_sched_yield\t\t124\n#define SYS_rt_sigreturn\t139\n#define SYS_rt_sigaction\t134\n#define SYS_rt_sigprocmask\t135\n#define SYS_sigaltstack\t\t132\n#define SYS_madvise\t\t233\n#define SYS_mincore\t\t232\n#define SYS_getpid\t\t172\n#define SYS_gettid\t\t178\n#define SYS_kill\t\t129\n#define SYS_tgkill\t\t131\n#define SYS_futex\t\t98\n#define SYS_sched_getaffinity\t123\n#define SYS_exit_group\t\t94\n#define SYS_clock_gettime\t113\n#define SYS_faccessat\t\t48\n#define SYS_socket\t\t198\n#define SYS_connect\t\t203\n#define SYS_brk\t\t\t214\n#define SYS_timer_create\t107\n#define SYS_timer_settime\t110\n#define SYS_timer_delete\t111\n//--to\n#define SYS_exit\t\t2147483647\n#define SYS_read\t\t2147483647\n#define SYS_write\t\t2147483647\n#define SYS_openat\t\t2147483647\n#define SYS_close\t\t2147483647\n#define SYS_pipe2\t\t2147483647\n#define SYS_nanosleep\t\t2147483647\n#define SYS_mmap\t\t2147483647\n#define SYS_munmap\t\t2147483647\n#define SYS_setitimer\t\t2147483647\n#define SYS_clone\t\t2147483647\n#define SYS_sched_yield\t\t2147483647\n#define SYS_rt_sigreturn\t2147483647\n#define SYS_rt_sigaction\t2147483647\n#define SYS_rt_sigprocmask\t2147483647\n#define SYS_sigaltstack\t\t2147483647\n#define SYS_madvise\t\t2147483647\n#define SYS_mincore\t\t2147483647\n#define SYS_getpid\t\t2147483647\n#define SYS_gettid\t\t2147483647\n#define SYS_kill\t\t2147483647\n#define SYS_tgkill\t\t2147483647\n#define SYS_futex\t\t2147483647\n#define SYS_sched_getaffinity\t2147483647\n#define SYS_exit_group\t\t2147483647\n#define SYS_clock_gettime\t2147483647\n#define SYS_faccessat\t\t2147483647\n#define SYS_socket\t\t2147483647\n#define SYS_connect\t\t2147483647\n#define SYS_brk\t\t\t2147483647\n#define SYS_timer_create\t2147483647\n#define SYS_timer_settime\t2147483647\n#define SYS_timer_delete\t2147483647\n//--from\nTEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4\n\tMOVW\tcode+0(FP), R0\n\tMOVD\t$SYS_exit_group, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·exit_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_exit(SB)\n\tRET\n//--from\nTEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20\n\tMOVD\t$AT_FDCWD, R0\n\tMOVD\tname+0(FP), R1\n\tMOVW\tmode+8(FP), R2\n\tMOVW\tperm+12(FP), R3\n\tMOVD\t$SYS_openat, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+16(FP)\n\tRET\n//--to\nTEXT runtime·open_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_open(SB)\n\tRET\n//--from\nTEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12\n\tMOVW\tfd+0(FP), R0\n\tMOVD\t$SYS_close, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tdone\n\tMOVW\t$-1, R0\ndone:\n\tMOVW\tR0, ret+8(FP)\n\tRET\n//--to\nTEXT runtime·closefd_trampoline(SB),NOSPLIT,$0-12\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_closefd(SB)\n\tRET\n//--from\nTEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVD\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_write, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·write1_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_write1(SB)\n\tRET\n//--from\nTEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28\n\tMOVW\tfd+0(FP), R0\n\tMOVD\tp+8(FP), R1\n\tMOVW\tn+16(FP), R2\n\tMOVD\t$SYS_read, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·read_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_read(SB)\n\tRET\n//--from\nTEXT runtime·usleep(SB),NOSPLIT,$24-4\n\tMOVWU\tusec+0(FP), R3\n\tMOVD\tR3, R5\n\tMOVW\t$1000000, R4\n\tUDIV\tR4, R3\n\tMOVD\tR3, 8(RSP)\n\tMUL\tR3, R4\n\tSUB\tR4, R5\n\tMOVW\t$1000, R4\n\tMUL\tR4, R5\n\tMOVD\tR5, 16(RSP)\n\n\t// nanosleep(&ts, 0)\n\tADD\t$8, RSP, R0\n\tMOVD\t$0, R1\n\tMOVD\t$SYS_nanosleep, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·usleep_trampoline(SB),NOSPLIT,$0\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_usleep(SB)\n\tRET\n//--from\nTEXT runtime·gettid(SB),NOSPLIT,$0-4\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·gettid_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_gettid(SB)\n\tMOVW\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R19\n\tMOVD\t$SYS_gettid, R8\n\tSVC\n\tMOVW\tR0, R1\t// arg 2 tid\n\tMOVW\tR19, R0\t// arg 1 pid\n\tMOVW\tsig+0(FP), R2\t// arg 3\n\tMOVD\t$SYS_tgkill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_getpid, R8\n\tSVC\n\tMOVW\tR0, R0\t\t// arg 1 pid\n\tMOVW\tsig+0(FP), R1\t// arg 2\n\tMOVD\t$SYS_kill, R8\n\tSVC\n\tRET\n//--to\n//--from\nTEXT runtime·walltime(SB),NOSPLIT,$24-12\n#ifdef GOEXPERIMENT_runtimesecret\n\tMOVW \tg_secret(g), R20\n\tCBZ \tR20, nosecret\n\tBL\t·secretEraseRegisters(SB)\n\nnosecret:\n#endif\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$16, R1\n\tBIC\t$15, R1\t// Align for C code\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_REALTIME, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\tMOVD\tR3, sec+0(FP)\n\tMOVW\tR5, nsec+8(FP)\n\tRET\n//--to\nTEXT runtime·walltime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_walltime1(SB)\n\tRET\n//--from\nTEXT runtime·nanotime1(SB),NOSPLIT,$24-8\n#ifdef GOEXPERIMENT_runtimesecret\n\tMOVW\tg_secret(g), R20\n\tCBZ\tR20, nosecret\n\tBL\t·secretEraseRegisters(SB)\n\nnosecret:\n#endif\n\tMOVD\tRSP, R20\t// R20 is unchanged by C code\n\tMOVD\tRSP, R1\n\n\tMOVD\tg_m(g), R21\t// R21 = m\n\n\t// Set vdsoPC and vdsoSP for SIGPROF traceback.\n\t// Save the old values on stack and restore them on exit,\n\t// so this function is reentrant.\n\tMOVD\tm_vdsoPC(R21), R2\n\tMOVD\tm_vdsoSP(R21), R3\n\tMOVD\tR2, 8(RSP)\n\tMOVD\tR3, 16(RSP)\n\n\tMOVD\t$ret-8(FP), R2 // caller's SP\n\tMOVD\tLR, m_vdsoPC(R21)\n\tMOVD\tR2, m_vdsoSP(R21)\n\n\tMOVD\tm_curg(R21), R0\n\tCMP\tg, R0\n\tBNE\tnoswitch\n\n\tMOVD\tm_g0(R21), R3\n\tMOVD\t(g_sched+gobuf_sp)(R3), R1\t// Set RSP to g0 stack\n\nnoswitch:\n\tSUB\t$32, R1\n\tBIC\t$15, R1\n\tMOVD\tR1, RSP\n\n\tMOVW\t$CLOCK_MONOTONIC, R0\n\tMOVD\truntime·vdsoClockgettimeSym(SB), R2\n\tCBZ\tR2, fallback\n\n\t// Store g on gsignal's stack, so if we receive a signal\n\t// during VDSO code we can find the g.\n\t// If we don't have a signal stack, we won't receive signal,\n\t// so don't bother saving g.\n\t// When using cgo, we already saved g on TLS, also don't save\n\t// g here.\n\t// Also don't save g if we are already on the signal stack.\n\t// We won't get a nested signal.\n\tMOVBU\truntime·iscgo(SB), R22\n\tCBNZ\tR22, nosaveg\n\tMOVD\tm_gsignal(R21), R22          // g.m.gsignal\n\tCBZ\tR22, nosaveg\n\tCMP\tg, R22\n\tBEQ\tnosaveg\n\tMOVD\t(g_stack+stack_lo)(R22), R22 // g.m.gsignal.stack.lo\n\tMOVD\tg, (R22)\n\n\tBL\t(R2)\n\n\tMOVD\tZR, (R22)  // clear g slot, R22 is unchanged by C code\n\n\tB\tfinish\n\nnosaveg:\n\tBL\t(R2)\n\tB\tfinish\n\nfallback:\n\tMOVD\t$SYS_clock_gettime, R8\n\tSVC\n\nfinish:\n\tMOVD\t0(RSP), R3\t// sec\n\tMOVD\t8(RSP), R5\t// nsec\n\n\tMOVD\tR20, RSP\t// restore SP\n\t// Restore vdsoPC, vdsoSP\n\t// We don't worry about being signaled between the two stores.\n\t// If we are not in a signal handler, we'll restore vdsoSP to 0,\n\t// and no one will care about vdsoPC. If we are in a signal handler,\n\t// we cannot receive another signal.\n\tMOVD\t16(RSP), R1\n\tMOVD\tR1, m_vdsoSP(R21)\n\tMOVD\t8(RSP), R1\n\tMOVD\tR1, m_vdsoPC(R21)\n\n\t// sec is in R3, nsec in R5\n\t// return nsec in R3\n\tMOVD\t$1000000000, R4\n\tMUL\tR4, R3\n\tADD\tR5, R3\n\tMOVD\tR3, ret+0(FP)\n\tRET\n//--to\nTEXT runtime·nanotime1_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tBL\thitsumabushi_nanotime1(SB)\n\tMOVD\tR0, 0(R19)\t// return value\n\tRET\n//--from\nTEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\taddr+0(FP), R0\n\tMOVW\top+8(FP), R1\n\tMOVW\tval+12(FP), R2\n\tMOVD\tts+16(FP), R3\n\tMOVD\taddr2+24(FP), R4\n\tMOVW\tval3+32(FP), R5\n\tMOVD\t$SYS_futex, R8\n\tSVC\n\tMOVW\tR0, ret+40(FP)\n\tRET\n//--to\nTEXT runtime·futex_trampoline(SB),NOSPLIT,$0\n\tMOVW\t8(R0), R1\n\tMOVW\t12(R0), R2\n\tMOVD\t16(R0), R3\n\tMOVD\t24(R0), R4\n\tMOVW\t32(R0), R5\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_futex(SB)\n\tRET\n//--from\nTEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tnew+0(FP), R0\n\tMOVD\told+8(FP), R1\n\tMOVD\t$SYS_sigaltstack, R8\n\tSVC\n\tCMN\t$4095, R0\n\tBCC\tok\n\tMOVD\t$0, R0\n\tMOVD\tR0, (R0)\t// crash\nok:\n\tRET\n//--to\n//--from\nTEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\t$SYS_sched_yield, R8\n\tSVC\n\tRET\n//--to\nTEXT runtime·osyield_trampoline(SB),NOSPLIT,$0\n\tBL\thitsumabushi_osyield(SB)\n\tRET\n//--from\nTEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0\n\tMOVD\tpid+0(FP), R0\n\tMOVD\tlen+8(FP), R1\n\tMOVD\tbuf+16(FP), R2\n\tMOVD\t$SYS_sched_getaffinity, R8\n\tSVC\n\tMOVW\tR0, ret+24(FP)\n\tRET\n//--to\nTEXT runtime·sched_getaffinity_trampoline(SB),NOSPLIT,$0-28\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sched_getaffinity(SB)\n\tRET\n//--append\nTEXT runtime·sysAllocOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysAllocOS(SB)\n\tMOVD\tR0, 8(R19)\t// return value\n\tRET\n\nTEXT runtime·sysUnusedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUnusedOS(SB)\n\tRET\n\nTEXT runtime·sysUsedOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysUsedOS(SB)\n\tRET\n\nTEXT runtime·sysHugePageOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysHugePageOS(SB)\n\tRET\n\nTEXT runtime·sysFreeOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFreeOS(SB)\n\tRET\n\nTEXT runtime·sysFaultOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysFaultOS(SB)\n\tRET\n\nTEXT runtime·sysReserveOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysReserveOS(SB)\n\tMOVD\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·sysMapOS_trampoline(SB),NOSPLIT,$0\n\tMOVD\t8(R0), R1\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_sysMapOS(SB)\n\tRET\n\nTEXT runtime·fcntl_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVW\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fcntl(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·fstat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_fstat(SB)\n\tMOVW\tR0, 16(R19)\t// return value\n\tRET\n\nTEXT runtime·lseek_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVW\t16(R0), R2\n\tMOVW\t0(R0), R0\n\tBL\thitsumabushi_lseek(SB)\n\tMOVW\tR0, 24(R19)\t// return value\n\tRET\n\nTEXT runtime·renameat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_renameat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n\nTEXT runtime·fstatat_trampoline(SB),NOSPLIT,$0\n\tMOVD\tR0, R19\t\t// R19 is callee-save\n\tMOVD\t8(R0), R1\n\tMOVD\t16(R0), R2\n\tMOVW\t24(R0), R3\n\tMOVD\t0(R0), R0\n\tBL\thitsumabushi_fstatat(SB)\n\tMOVW\tR0, 32(R19)\t// return value\n\tRET\n"
  },
  {
    "path": "1.26_linux/runtime/time_linux_amd64.s.patch",
    "content": "//--from\n//go:build !faketime\n//--to\n//go:build ignore\n"
  },
  {
    "path": "1.26_linux/runtime/timeasm.go.patch",
    "content": "//--from\n//go:build !faketime && (windows || (linux && amd64))\n//--to\n//go:build !faketime && windows\n"
  },
  {
    "path": "1.26_linux/runtime/timestub.go.patch",
    "content": "//--from\n//go:build !faketime && !windows && !(linux && amd64) && !plan9\n//--to\n//go:build !faketime && !windows && !plan9\n"
  },
  {
    "path": "1.26_linux/runtime/timestub2.go.patch",
    "content": "//--from\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !(linux && amd64) && !plan9\n//--to\n//go:build !aix && !darwin && !freebsd && !openbsd && !solaris && !wasip1 && !windows && !plan9\n//--from\npackage runtime\n//--to\npackage runtime\n\nimport (\n\t\"internal/abi\"\n\t\"unsafe\"\n)\n//--from\nfunc walltime() (sec int64, nsec int32)\n//--to\nfunc walltime() (sec int64, nsec int32) {\n\twalltime1(&sec, &nsec)\n\treturn\n}\n\n//go:nosplit\n//go:cgo_unsafe_args\nfunc walltime1(sec *int64, nsec *int32) {\n\tlibcCall(unsafe.Pointer(abi.FuncPCABI0(walltime1_trampoline)), unsafe.Pointer(&sec))\n}\nfunc walltime1_trampoline(sec *int64, nsec *int32)\n"
  },
  {
    "path": "1.26_linux/runtime/traceback_test.go.patch",
    "content": "//--from\nfunc TestTracebackInlined(t *testing.T) {\n//--to\nfunc TestTracebackInlined(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/sync/atomic/atomic_test.go.patch",
    "content": "//--from\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst32(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n//--to\nfunc TestStoreLoadSeqCst64(t *testing.T) {\n\tt.Skip(\"didn't work on QEMU. see golang/go#50188\")\n//--from\nfunc TestNilDeref(t *testing.T) {\n//--to\nfunc TestNilDeref(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/syscall/hitsumabushi_stubs_linux_amd64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_FSTATAT = 0xffffffffffffffff // Stub: on amd64 Go uses SYS_NEWFSTATAT instead\n)\n"
  },
  {
    "path": "1.26_linux/syscall/hitsumabushi_stubs_linux_arm64.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 The Hitsumabushi Authors\n\npackage syscall\n\nconst (\n\tSYS_NEWFSTATAT = 0xffffffffffffffff // Stub: on arm64 Go uses SYS_FSTATAT instead\n)\n"
  },
  {
    "path": "1.26_linux/syscall/rlimit.go.patch",
    "content": "//--from\nfunc init() {\n\tvar lim Rlimit\n\tif err := Getrlimit(RLIMIT_NOFILE, &lim); err == nil && lim.Max > 0 && lim.Cur < lim.Max-1 {\n\t\torigRlimitNofile.Store(&lim)\n\t\tnlim := lim\n\n\t\t// We set Cur to Max - 1 so that we are more likely to\n\t\t// detect cases where another process uses prlimit\n\t\t// to change our resource limits. The theory is that\n\t\t// using prlimit to change to Cur == Max is more likely\n\t\t// than using prlimit to change to Cur == Max - 1.\n\t\t// The place we check for this is in exec_linux.go.\n\t\tnlim.Cur = nlim.Max - 1\n\n\t\tadjustFileLimit(&nlim)\n\t\tsetrlimit(RLIMIT_NOFILE, &nlim)\n\t}\n}\n//--to\nfunc init() {\n}\n"
  },
  {
    "path": "1.26_linux/syscall/syscall_linux.go.patch",
    "content": "//--from\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\t// N.B. Calling RawSyscall here is unsafe with atomic coverage\n\t// instrumentation and race mode.\n\t//\n\t// Coverage instrumentation will add a sync/atomic call to RawSyscall.\n\t// Race mode will add race instrumentation to sync/atomic. Race\n\t// instrumentation requires a P, which we no longer have.\n\t//\n\t// RawSyscall6 is fine because it is implemented in assembly and thus\n\t// has no coverage instrumentation.\n\t//\n\t// This is typically not a problem in the runtime because cmd/go avoids\n\t// adding coverage instrumentation to the runtime in race mode.\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, 0, 0, 0)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FCNTL:\n\t\tr = fcntl1(a1, a2, a3)\n\tcase SYS_FSTAT:\n\t\tr = fstat1(a1, unsafe.Pointer(a2))\n\tcase SYS_READ:\n\t\tr = runtime_read(uintptr(a1), unsafe.Pointer(a2), int32(a3))\n\tcase SYS_WRITE:\n\t\tr = write1(a1, unsafe.Pointer(a2), int32(a3))\n\tcase SYS_LSEEK:\n\t\tr = lseek1(a1, int64(a2), int32(a3))\n\tcase SYS_CLOSE:\n\t\tr = runtime_closefd(int32(a1))\n\tcase SYS_MKDIRAT:\n\t\tprintln(\"syscall mkdirat() is not implemented\")\n\t\t// Default to permission denied. TODO: implement this\n\t\treturn 0, 0, EPERM\n\tcase SYS_GETDENTS64:\n\t\tprintln(\"syscall getdents64() is not implemented\")\n\t\t// Default to empty directory. TODO: implement this\n\t\treturn 0, 0, 0\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall\", trap)\n\t\tpanic(\"syscall.Syscall\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n\n//go:linkname open runtime.open\nfunc open(name *byte, mode, perm int32) int32\n//go:linkname write1 runtime.write1\nfunc write1(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname fcntl1 runtime.fcntl1\nfunc fcntl1(fd uintptr, a uintptr, b uintptr) int32\n//go:linkname fstat1 runtime.fstat1\nfunc fstat1(fd uintptr, p unsafe.Pointer) int32\n//go:linkname lseek1 runtime.lseek1\nfunc lseek1(fd uintptr, offset int64, whence int32) int32\n//go:linkname runtime_read runtime.read\nfunc runtime_read(fd uintptr, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_closefd runtime.closefd\nfunc runtime_closefd(fd int32) int32\n//go:linkname runtime_fstatat runtime.fstatat\nfunc runtime_fstatat(fd uintptr, name unsafe.Pointer, p unsafe.Pointer, n int32) int32\n//go:linkname runtime_renameat runtime.renameat\nfunc runtime_renameat(fd1 uintptr, name1 unsafe.Pointer, fd2 uintptr, name2 unsafe.Pointer) int32\n//--from\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\truntime_entersyscall()\n\tr1, r2, err = RawSyscall6(trap, a1, a2, a3, a4, a5, a6)\n\truntime_exitsyscall()\n\treturn\n}\n//--to\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {\n\tvar r int32\n\tswitch trap {\n\tcase SYS_FSTATAT, SYS_NEWFSTATAT:\n\t\tr = runtime_fstatat(uintptr(a1), unsafe.Pointer(a2), unsafe.Pointer(a3), int32(a4))\n\tcase SYS_RENAMEAT:\n\t\tr = runtime_renameat(uintptr(a1), unsafe.Pointer(a2), uintptr(a3), unsafe.Pointer(a4))\n\tdefault:\n\t\tprintln(\"unimplemented syscall at runtime.Syscall6\", trap)\n\t\tpanic(\"syscall.Syscall6\")\n\t\treturn 0, 0, ENOSYS\n\t}\n\n\tif r < 0 {\n\t\treturn 0, 0, Errno(-r)\n\t}\n\treturn uintptr(r), 0, 0\n}\n//--from\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(_AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n//--to\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tp0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn -1, errnoErr(EINVAL)\n\t}\n\tfd = int(open(p0, int32(mode|O_LARGEFILE), int32(perm)))\n\tif fd < 0 {\n\t\treturn -1, errnoErr(ENOENT)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "1.26_linux/testing/run_example.go",
    "content": "package testing\n\nfunc runExample(eg InternalExample) (ok bool) {\n\t// Do nothing.\n\t// TODO: Implement os.Pipe2 and use this here.\n\treturn true\n}\n"
  },
  {
    "path": "1.26_linux/time/format_test.go.patch",
    "content": "//--from\nfunc TestParseInLocation(t *testing.T) {\n//--to\nfunc TestParseInLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationZipFile(t *testing.T) {\n//--to\nfunc TestLoadLocationZipFile(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/time/internal_test.go.patch",
    "content": "//--from\nfunc initTestingZone() {\n\t// For hermeticity, use only tzinfo source from the test's GOROOT,\n\t// not the system sources and not whatever GOROOT may happen to be\n\t// set in the process's environment (if any).\n\t// This test runs in GOROOT/src/time, so GOROOT is \"../..\",\n\t// but it is theoretically possible\n\tsources := []string{\"../../lib/time/zoneinfo.zip\"}\n\tz, err := loadLocation(\"America/Los_Angeles\", sources)\n\tif err != nil {\n\t\tpanic(\"cannot load America/Los_Angeles for testing: \" + err.Error() + \"; you may want to use -tags=timetzdata\")\n\t}\n\tz.name = \"Local\"\n\tlocalLoc = *z\n}\n//--to\nfunc initTestingZone() {\n\t// Data from the playground.\n\t// https://go.dev/play/p/VGXU57KZZ-x\n\t// name is replaced with \"Local\".\n\t// cachStart, cacheEnd, and cacheZone are removed.\n\tlocalLoc = Location{name:\"Local\",zone:[]zone{zone{name:\"LMT\", offset:-28378, isDST:false}, zone{name:\"PDT\", offset:-25200, isDST:true}, zone{name:\"PST\", offset:-28800, isDST:false}, zone{name:\"PWT\", offset:-25200, isDST:true}, zone{name:\"PPT\", offset:-25200, isDST:true}}, tx:[]zoneTrans{zoneTrans{when:-576460752303423488, index:0x0, isstd:false, isutc:false}, zoneTrans{when:-2717640000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1633269600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-1615129200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-1601820000, index:0x1, isstd:true, isutc:true}, zoneTrans{when:-1583679600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-880207200, index:0x3, isstd:false, isutc:false}, zoneTrans{when:-769395600, index:0x4, isstd:false, isutc:false}, zoneTrans{when:-765385200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-687967140, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-662655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-620838000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-608137200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-589388400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-576082800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-557938800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-544633200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-526489200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-513183600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-495039600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-481734000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-463590000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-450284400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-431535600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-418230000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-400086000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-386780400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-368636400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-355330800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-337186800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-323881200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-305737200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-292431600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-273682800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-260982000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-242233200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-226508400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-210783600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-195058800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-179334000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-163609200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-147884400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-131554800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-116434800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-100105200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-84376800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-68655600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-52927200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-37206000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:-21477600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:-5756400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:9972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:25693200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:41421600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:57747600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:73476000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:89197200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:104925600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:120646800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:126698400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:152096400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:162381600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:183546000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:199274400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:215600400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:230724000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:247050000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:262778400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:278499600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:294228000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:309949200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:325677600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:341398800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:357127200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:372848400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:388576800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:404902800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:420026400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:436352400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:452080800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:467802000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:483530400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:499251600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:514980000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:530701200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:544615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:562150800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:576064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:594205200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:607514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:625654800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:638964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:657104400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:671018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:688554000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:702468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:720003600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:733917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:752058000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:765367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:783507600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:796816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:814957200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:828871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:846406800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:860320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:877856400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:891770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:909306000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:923220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:941360400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:954669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:972810000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:986119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1004259600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1018173600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1035709200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1049623200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1067158800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1081072800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1099213200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1112522400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1130662800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1143972000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1162112400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1173607200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1194166800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1205056800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1225616400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1236506400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1257066000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1268560800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1289120400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1300010400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1320570000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1331460000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1352019600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1362909600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1383469200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1394359200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1414918800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1425808800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1446368400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1457863200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1478422800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1489312800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1509872400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1520762400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1541322000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1552212000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1572771600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1583661600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1604221200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1615716000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1636275600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1647165600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1667725200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1678615200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1699174800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1710064800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1730624400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1741514400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1762074000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1772964000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1793523600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1805018400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1825578000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1836468000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1857027600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1867917600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1888477200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1899367200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1919926800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1930816800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1951376400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1962871200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:1983430800, index:0x2, isstd:false, isutc:false}, zoneTrans{when:1994320800, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2014880400, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2025770400, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2046330000, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2057220000, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2077779600, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2088669600, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2109229200, index:0x2, isstd:false, isutc:false}, zoneTrans{when:2120119200, index:0x1, isstd:false, isutc:false}, zoneTrans{when:2140678800, index:0x2, isstd:false, isutc:false}}, extend:\"PST8PDT,M3.2.0,M11.1.0\"}\n}\n"
  },
  {
    "path": "1.26_linux/time/sleep_test.go.patch",
    "content": "//--from\nfunc TestSleep(t *testing.T) {\n//--to\nfunc TestSleep(t *testing.T) {\n\tt.Skip(\"Interrupt (syscall.Kill) is not supported in this environment\")\n//--from\nfunc TestIssue5745(t *testing.T) {\n//--to\nfunc TestIssue5745(t *testing.T) {\n\tt.Skip(\"handling nil pointer access is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/time/time_test.go.patch",
    "content": "//--from\nfunc TestLoadFixed(t *testing.T) {\n//--to\nfunc TestLoadFixed(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeIsDST(t *testing.T) {\n//--to\nfunc TestTimeIsDST(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestTimeWithZoneTransition(t *testing.T) {\n//--to\nfunc TestTimeWithZoneTransition(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n//--to\nfunc TestMarshalBinaryVersion2(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/time/tzdata_test.go.patch",
    "content": "//--from\nfunc TestEmbeddedTZData(t *testing.T) {\n//--to\nfunc TestEmbeddedTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/time/zoneinfo_test.go.patch",
    "content": "//--from\nfunc TestEnvVarUsage(t *testing.T) {\n//--to\nfunc TestEnvVarUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestBadLocationErrMsg(t *testing.T) {\n//--to\nfunc TestBadLocationErrMsg(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestVersion3(t *testing.T) {\n//--to\nfunc TestVersion3(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestFirstZone(t *testing.T) {\n//--to\nfunc TestFirstZone(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZData(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZData(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestEarlyLocation(t *testing.T) {\n//--to\nfunc TestEarlyLocation(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n//--from\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n//--to\nfunc TestLoadLocationFromTZDataSlim(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.26_linux/time/zoneinfo_unix.go.patch",
    "content": "//--from\nimport (\n\t\"syscall\"\n)\n//--to\n//--from\nfunc initLocal() {\n\t// consult $TZ to find the time zone to use.\n\t// no $TZ means use the system default /etc/localtime.\n\t// $TZ=\"\" means use UTC.\n\t// $TZ=\"foo\" or $TZ=\":foo\" if foo is an absolute path, then the file pointed\n\t// by foo will be used to initialize timezone; otherwise, file\n\t// /usr/share/zoneinfo/foo will be used.\n\n\ttz, ok := syscall.Getenv(\"TZ\")\n\tswitch {\n\tcase !ok:\n\t\tz, err := loadLocation(\"localtime\", []string{\"/etc\"})\n\t\tif err == nil {\n\t\t\tlocalLoc = *z\n\t\t\tlocalLoc.name = \"Local\"\n\t\t\treturn\n\t\t}\n\tcase tz != \"\":\n\t\tif tz[0] == ':' {\n\t\t\ttz = tz[1:]\n\t\t}\n\t\tif tz != \"\" && tz[0] == '/' {\n\t\t\tif z, err := loadLocation(tz, []string{\"\"}); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\tif tz == \"/etc/localtime\" {\n\t\t\t\t\tlocalLoc.name = \"Local\"\n\t\t\t\t} else {\n\t\t\t\t\tlocalLoc.name = tz\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t} else if tz != \"\" && tz != \"UTC\" {\n\t\t\tif z, err := loadLocation(tz, platformZoneSources); err == nil {\n\t\t\t\tlocalLoc = *z\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fall back to UTC.\n\tlocalLoc.name = \"UTC\"\n}\n//--to\nfunc initLocal() {\n\tlocalLoc.name = \"UTC\"\n}\n"
  },
  {
    "path": "1.26_linux/time/zoneinfo_unix_test.go.patch",
    "content": "//--from\nfunc TestEnvTZUsage(t *testing.T) {\n//--to\nfunc TestEnvTZUsage(t *testing.T) {\n\tt.Skip(\"location is not supported in this environment\")\n"
  },
  {
    "path": "1.26_windows/internal/testenv/exec.go.patch",
    "content": "//--from\nvar tryExec = sync.OnceValue(func() error {\n//--to\nvar tryExec = sync.OnceValue(func() error {\n\treturn fmt.Errorf(\"can't probe for exec support\")\n"
  },
  {
    "path": "1.26_windows/internal/testenv/testenv.go.patch",
    "content": "//--from\nfunc HasGoBuild() bool {\n//--to\nfunc HasGoBuild() bool {\n\treturn false\n"
  },
  {
    "path": "1.26_windows/runtime/cgo/gcc_windows_amd64.c.patch",
    "content": "//--from\nstatic unsigned long\n__stdcall\nthreadentry(void *v)\n{\n\tThreadStart ts;\n//--to\nstatic int getproccount() {\n\tstatic int proccount = 0;\n\tif (!proccount) {\n\t\tSYSTEM_INFO info;\n\t\tGetSystemInfo(&info);\n\t\tproccount = info.dwNumberOfProcessors;\n\t}\n\treturn proccount;\n}\n\nstatic unsigned long\n__stdcall\nthreadentry(void *v)\n{\n\tThreadStart ts;\n\n\tSetThreadAffinityMask(GetCurrentThread(), (1<<getproccount())-1);\n"
  },
  {
    "path": "1.26_windows/runtime/cgo/libcgo.h.patch",
    "content": "//--from\n#include <stdio.h>\n//--to\n//--append\n#define fprintf dummy_fprintf\n\n// TODO: Use OutputDebugMessage.\n#define dummy_fprintf(stream, format, ...)\n"
  },
  {
    "path": "1.26_windows/runtime/os_windows.go.patch",
    "content": "//--from\n//go:cgo_import_dynamic runtime._GetConsoleMode GetConsoleMode%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._LoadLibraryExW LoadLibraryExW%3 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._LoadLibraryExW LoadLibraryExW%3 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 \"kernel32.dll\"\n//--from\n//go:cgo_import_dynamic runtime._SetConsoleCtrlHandler SetConsoleCtrlHandler%2 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WerGetFlags WerGetFlags%2 \"kernel32.dll\"\n//go:cgo_import_dynamic runtime._WerSetFlags WerSetFlags%1 \"kernel32.dll\"\n//--to\n//--from\n//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 \"kernel32.dll\"\n//--to\n//go:cgo_import_dynamic runtime._OutputDebugStringW OutputDebugStringW%1 \"kernel32.dll\"\n//--from\n\t_GetConsoleMode,\n//--to\n//--from\n\t_LoadLibraryExW,\n//--to\n\t_LoadLibraryExW,\n\t_LoadLibraryW,\n//--from\n\t_SetConsoleCtrlHandler,\n//--to\n//--from\n\t_WerGetFlags,\n\t_WerSetFlags,\n//--to\n//--from\n\t_WriteConsoleW,\n//--to\n\t_OutputDebugStringW,\n//--from\n\t// We call these all the way here, late in init, so that malloc works\n\t// for the callback functions these generate.\n\tvar fn any = ctrlHandler\n\tctrlHandlerPC := compileCallback(*efaceOf(&fn), true)\n\tstdcall(_SetConsoleCtrlHandler, ctrlHandlerPC, 1)\n//--to\n//--from\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tisASCII := true\n\tb := (*[1 << 30]byte)(buf)[:n]\n\tfor _, x := range b {\n\t\tif x >= 0x80 {\n\t\t\tisASCII = false\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !isASCII {\n\t\tvar m uint32\n\t\tisConsole := stdcall(_GetConsoleMode, handle, uintptr(unsafe.Pointer(&m))) != 0\n\t\t// If this is a console output, various non-unicode code pages can be in use.\n\t\t// Use the dedicated WriteConsole call to ensure unicode is printed correctly.\n\t\tif isConsole {\n\t\t\treturn int32(writeConsole(handle, buf, n))\n\t\t}\n\t}\n\tvar written uint32\n\tstdcall(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--to\nfunc write1(fd uintptr, buf unsafe.Pointer, n int32) int32 {\n\tconst (\n\t\t_STD_OUTPUT_HANDLE = ^uintptr(10) // -11\n\t\t_STD_ERROR_HANDLE  = ^uintptr(11) // -12\n\t)\n\tvar handle uintptr\n\tswitch fd {\n\tcase 1:\n\t\thandle = stdcall(_GetStdHandle, _STD_OUTPUT_HANDLE)\n\tcase 2:\n\t\thandle = stdcall(_GetStdHandle, _STD_ERROR_HANDLE)\n\tdefault:\n\t\t// assume fd is real windows handle.\n\t\thandle = fd\n\t}\n\tif fd == 1 || fd == 2 {\n\t\t// Note that handle is not used anyway.\n\t\treturn int32(writeConsole(handle, buf, n))\n\t}\n\tvar written uint32\n\tstdcall(_WriteFile, handle, uintptr(buf), uintptr(n), uintptr(unsafe.Pointer(&written)), 0)\n\treturn int32(written)\n}\n//--from\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tl := uint32(len(b))\n\tif l == 0 {\n\t\treturn\n\t}\n\tvar written uint32\n\tstdcall(_WriteConsoleW,\n\t\thandle,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t\tuintptr(l),\n\t\tuintptr(unsafe.Pointer(&written)),\n\t\t0,\n\t)\n\treturn\n}\n//--to\nfunc writeConsoleUTF16(handle uintptr, b []uint16) {\n\tb = b[:len(b)+1]\n\tb[len(b)-1] = 0\n\tl := uint32(len(b))\n\tif l <= 1 {\n\t\treturn\n\t}\n\tstdcall(_OutputDebugStringW,\n\t\tuintptr(unsafe.Pointer(&b[0])),\n\t)\n\treturn\n}\n"
  },
  {
    "path": "1.26_windows/runtime/signal_windows.go.patch",
    "content": "//--from\nfunc preventErrorDialogs() {\n\terrormode := stdcall(_GetErrorMode)\n\tstdcall(_SetErrorMode, errormode|windows.SEM_FAILCRITICALERRORS|windows.SEM_NOGPFAULTERRORBOX|windows.SEM_NOOPENFILEERRORBOX)\n\n\t// Disable WER fault reporting UI.\n\t// Do this even if WER is disabled as a whole,\n\t// as WER might be enabled later with setTraceback(\"wer\")\n\t// and we still want the fault reporting UI to be disabled if this happens.\n\tvar werflags uintptr\n\tstdcall(_WerGetFlags, windows.CurrentProcess, uintptr(unsafe.Pointer(&werflags)))\n\tstdcall(_WerSetFlags, werflags|windows.WER_FAULT_REPORTING_NO_UI)\n}\n//--to\nfunc preventErrorDialogs() {\n\terrormode := stdcall(_GetErrorMode)\n\tstdcall(_SetErrorMode, errormode|windows.SEM_FAILCRITICALERRORS|windows.SEM_NOGPFAULTERRORBOX|windows.SEM_NOOPENFILEERRORBOX)\n}\n"
  },
  {
    "path": "1.26_windows/runtime/syscall_windows.go.patch",
    "content": "//--from\nfunc syscall_syscalln(fn, n uintptr, args ...uintptr) (r1, r2, err uintptr) {\n//--to\nfunc syscall_syscalln(fn, n uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == 0 {\n\t\tpanic(\"fn must not be 0 at SyscallN\")\n\t}\n"
  },
  {
    "path": "1.26_windows/runtime/syscall_windows_test.go.patch",
    "content": "//--from\nfunc TestNumCPU(t *testing.T) {\n//--to\nfunc TestNumCPU(t *testing.T) {\n\tt.Skip(\"creating a new process with os.Args[0] doesn't work in this environment\")\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# Hitsumabushi (ひつまぶし)\n\nPackage hitsumabushi provides APIs to generate JSON for go-build's `-overlay` option.\nHitsumabushi aims to make Go programs work on almost everywhere by overwriting system calls with C function calls.\nNow the generated JSON works only for Linux/Amd64, Linux/Arm64, and Windows/Amd64 so far.\nFor GOOS=windows, Hitsumabushi replaces some functions that don't work on some special Windows-like systems.\n\nGo version: 1.19-1.25\n\n## Example\n\nOn Arm Linux, run these commands:\n\n```\ncd example/helloworld\n./run.sh\n```\n\n## Tips\n\nWith VC++, you might have to call `_rt0_amd64_windows_lib()` at the beginning of the entry point explicitly.\nSee also https://github.com/golang/go/issues/42190.\n"
  },
  {
    "path": "doc.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2021 Hajime Hoshi\n\n// Package hitsumabushi provides APIs to generate JSON for go-build's `-overlay` option.\n// Hitsumabushi aims to make Go programs work on almost everywhere by overwriting system calls with C function calls.\n// Now the generated JSON works only for Linux/Amd64, Linux/Arm64, and Windows/Amd64 so far.\n// For GOOS=windows, Hitsumabushi replaces some functions that don't work on some special Windows-like systems.\npackage hitsumabushi\n"
  },
  {
    "path": "example/helloworld/.gitignore",
    "content": "*.a\nhelloworld.h\n"
  },
  {
    "path": "example/helloworld/genoverlayjson.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2022 Hajime Hoshi\n\n//go:build ignore\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/hajimehoshi/hitsumabushi\"\n)\n\nfunc main() {\n\tif err := build(); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc build() error {\n\toptions := []hitsumabushi.Option{\n\t\thitsumabushi.Args(os.Args...),\n\t\thitsumabushi.GOOS(\"linux\"),\n\t}\n\toverlayJSON, err := hitsumabushi.GenOverlayJSON(options...)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err := os.Stdout.Write(overlayJSON); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "example/helloworld/main.c",
    "content": "// SPDX-License-Identifier: Apache-2.0\n\n//go:build ignore\n\n#include \"helloworld.h\"\n\nint main() {\n  HelloWorld();\n  return 0;\n}\n"
  },
  {
    "path": "example/helloworld/main.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n\npackage main\n\nimport \"C\"\n\n//export HelloWorld\nfunc HelloWorld() {\n\tprintln(\"Hello, World!\")\n}\n\nfunc main() {\n\t// -buildmode=c-archive requires a main package.\n}\n"
  },
  {
    "path": "example/helloworld/run.sh",
    "content": "# SPDX-License-Identifier: Apache-2.0\n# SPDX-FileCopyrightText: 2022 Hajime Hoshi\n\nset -e\n\ngo run genoverlayjson.go > /tmp/overlay.json\nenv GOOS=linux GOARCH=arm64 CGO_ENABLED=1 \\\n    CGO_CFLAGS='-fno-common -fno-short-enums -ffunction-sections -fdata-sections -fPIC -g -O3' \\\n    go build -buildmode=c-archive -overlay=/tmp/overlay.json -o=helloworld.a\ngcc -o helloworld main.c helloworld.a -lpthread \n./helloworld\n"
  },
  {
    "path": "example/helloworld/run_cross.sh",
    "content": "# SPDX-License-Identifier: Apache-2.0\n# SPDX-FileCopyrightText: 2023 Hajime Hoshi\n\nset -e\n\nCC=\"aarch64-linux-gnu-gcc\"\ngo run genoverlayjson.go > /tmp/overlay.json\nenv GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=$CC \\\n    CGO_CFLAGS='-fno-common -fno-short-enums -ffunction-sections -fdata-sections -fPIC -g -O3' \\\n    go build -buildmode=c-archive -overlay=/tmp/overlay.json -o=helloworld.a\n$CC -o helloworld main.c helloworld.a -lpthread \nenv QEMU_LD_PREFIX=/usr/aarch64-linux-gnu qemu-aarch64 ./helloworld\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/hajimehoshi/hitsumabushi\n\ngo 1.19\n"
  },
  {
    "path": "overlay.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2021 Hajime Hoshi\n\npackage hitsumabushi\n\nimport (\n\t\"bytes\"\n\t\"embed\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode/utf16\"\n)\n\ntype Option func(*config)\n\ntype replaceString struct {\n\tfrom string\n\tto   string\n}\n\ntype config struct {\n\ttestPkgs    []string\n\toverlayDir  string\n\tos          string\n\targs        []string\n\tpageSize    int\n\treplaceDLLs []replaceString\n\toverlay     []replaceString\n}\n\n// TestPkg represents a package for testing.\n// When generating a JSON, importing `runtime/cgo` is inserted in the testing package.\nfunc TestPkg(pkg string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.testPkgs = append(cfg.testPkgs, pkg)\n\t}\n}\n\n// OverlayDir sets the temporary working directory where overlay files are stored.\nfunc OverlayDir(dir string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.overlayDir = dir\n\t}\n}\n\n// Args is arguments when executing.\n// The first argument must be a program name.\nfunc Args(args ...string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.args = append(cfg.args, args...)\n\t}\n}\n\n// GOOS specifies GOOS to generate the JSON.\n// The default value is runtime.GOOS.\nfunc GOOS(os string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.os = os\n\t}\n}\n\n// PageSize specifies the page size.\n// The deafult value is 4096.\n//\n// This works only for Linux.\nfunc PageSize(pageSize int) Option {\n\treturn func(cfg *config) {\n\t\tcfg.pageSize = pageSize\n\t}\n}\n\n// ReplaceDLL replaces a DLL file name loaded at LoadLibraryW and LoadLibraryExW.\n//\n// This works only for Windows.\nfunc ReplaceDLL(from, to string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.replaceDLLs = append(cfg.replaceDLLs, replaceString{\n\t\t\tfrom: from,\n\t\t\tto:   to,\n\t\t})\n\t}\n}\n\n// Overlay adds or replaces an entry for the -overlay option.\nfunc Overlay(from, to string) Option {\n\treturn func(cfg *config) {\n\t\tcfg.overlay = append(cfg.overlay, replaceString{\n\t\t\tfrom: from,\n\t\t\tto:   to,\n\t\t})\n\t}\n}\n\n//go:embed 1.*_*\nvar patchFiles embed.FS\n\n// reGoVersion represents a regular expression for Go version.\n// With gotip, the version might start with \"devel \", so '^' is not used here.\nvar reGoVersion = regexp.MustCompile(`go(\\d+\\.\\d+)`)\n\nfunc goVersion() string {\n\tm := reGoVersion.FindStringSubmatch(runtime.Version())\n\treturn m[1]\n}\n\nfunc goMajorMinorVersion() (int, int) {\n\ttokens := strings.Split(goVersion(), \".\")\n\tmajor, _ := strconv.Atoi(tokens[0])\n\tminor, _ := strconv.Atoi(tokens[1])\n\treturn major, minor\n}\n\n// GenOverlayJSON generates a JSON file for go-build's `-overlay` option.\n// GenOverlayJSON returns a JSON file content, or an error if generating it fails.\n//\n// Now the generated JSON works only for Arm64 so far.\nfunc GenOverlayJSON(options ...Option) ([]byte, error) {\n\ttype overlay struct {\n\t\tReplace map[string]string\n\t}\n\n\tcfg := config{\n\t\tos:       runtime.GOOS,\n\t\tpageSize: 4096,\n\t}\n\tfor _, op := range options {\n\t\top(&cfg)\n\t}\n\n\troot := goVersion() + \"_\" + cfg.os\n\tdir, err := patchFiles.Open(root)\n\tif err != nil {\n\t\tif errors.Is(err, fs.ErrNotExist) {\n\t\t\treturn nil, fmt.Errorf(\"hitsumabushi: Hitsumabushi does not support the Go version %s and GOOS=%s\", runtime.Version(), cfg.os)\n\t\t}\n\t\treturn nil, err\n\t}\n\tdir.Close()\n\n\tsubFiles, err := fs.Sub(patchFiles, root)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttmpDir := cfg.overlayDir\n\tif tmpDir == \"\" {\n\t\tvar err error\n\t\ttmpDir, err = os.MkdirTemp(\"\", \"\")\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treplaces := map[string]string{}\n\tif err := fs.WalkDir(subFiles, \".\", func(entryPath string, d fs.DirEntry, err error) error {\n\t\tif d.IsDir() {\n\t\t\treturn nil\n\t\t}\n\n\t\tconst (\n\t\t\tmodTypeReplace = \".replace\"\n\t\t\tmodTypeAppend  = \".append\"\n\t\t\tmodTypePatch   = \".patch\"\n\t\t)\n\t\tmodType := modTypeReplace\n\n\t\torigFilename := path.Base(entryPath)\n\t\tfor _, m := range []string{modTypeAppend, modTypePatch} {\n\t\t\tif strings.HasSuffix(origFilename, m) {\n\t\t\t\torigFilename = origFilename[:len(origFilename)-len(m)]\n\t\t\t\tmodType = m\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\text := path.Ext(origFilename)\n\t\tif ext != \".go\" && ext != \".c\" && ext != \".h\" && ext != \".s\" {\n\t\t\treturn nil\n\t\t}\n\n\t\tpkg := path.Dir(entryPath)\n\t\torigDir, err := goPkgDir(pkg, cfg.os)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tsrc, err := subFiles.Open(entryPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer src.Close()\n\n\t\tif err := os.MkdirAll(filepath.Join(tmpDir, filepath.FromSlash(pkg)), 0755); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdst, err := os.Create(filepath.Join(tmpDir, filepath.FromSlash(pkg), origFilename))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer dst.Close()\n\n\t\torigPath := filepath.Join(origDir, origFilename)\n\t\tdefer func() {\n\t\t\treplaces[origPath] = dst.Name()\n\t\t}()\n\n\t\tswitch modType {\n\t\tcase modTypeReplace:\n\t\t\tif _, err := io.Copy(dst, src); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase modTypeAppend:\n\t\t\torig, err := os.Open(origPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdefer orig.Close()\n\n\t\t\tif _, err := io.Copy(dst, io.MultiReader(orig, src)); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tcase modTypePatch:\n\t\t\torig, err := os.Open(origPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdefer orig.Close()\n\n\t\t\tp, err := parsePatch(entryPath, src)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpatched, err := p.apply(orig)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif _, err := io.Copy(dst, patched); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"hitsumabushi: unexpected modType: %s\", modType)\n\t\t}\n\n\t\treturn nil\n\t}); err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch cfg.os {\n\tcase \"linux\":\n\t\t// Replace the arguments.\n\t\t{\n\t\t\tvar strs []string\n\t\t\tfor _, arg := range cfg.args {\n\t\t\t\tstrs = append(strs, fmt.Sprintf(`%q`, arg))\n\t\t\t}\n\t\t\targvDef := \"var __argv = [...]string{\" + strings.Join(strs, \", \") + \"}\"\n\n\t\t\told := `func goargs() {\n\tif GOOS == \"windows\" {\n\t\treturn\n\t}\n\targslice = make([]string, argc)\n\tfor i := int32(0); i < argc; i++ {\n\t\targslice[i] = gostringnocopy(argv_index(argv, i))\n\t}\n}`\n\t\t\tnew := fmt.Sprintf(`%s\n\nfunc goargs() {\n\tif GOOS == \"windows\" {\n\t\treturn\n\t}\n\targslice = make([]string, %[2]d)\n\tif len(argslice) == 0 {\n\t\t// os.Executable is not available here. Give a dummy name.\n\t\targslice = []string{\"hitsumabushi_app\"}\n\t} else {\n\t\tfor i := int32(0); i < %[2]d; i++ {\n\t\t\targslice[i] = __argv[i]\n\t\t}\n\t}\n}`, argvDef, len(cfg.args))\n\t\t\tif err := replace(tmpDir, replaces, \"runtime\", \"runtime1.go\", old, new, cfg.os); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\told := `var physPageSize uintptr`\n\t\t\tnew := fmt.Sprintf(`var physPageSize uintptr = %d`, cfg.pageSize)\n\t\t\tif err := replace(tmpDir, replaces, \"runtime\", \"malloc.go\", old, new, cfg.os); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\tcase \"windows\":\n\t\t// Replace the arguments.\n\t\t{\n\t\t\tvar strs []string\n\t\t\tfor _, arg := range cfg.args {\n\t\t\t\tstrs = append(strs, fmt.Sprintf(`%q`, arg))\n\t\t\t}\n\t\t\targvDef := \"var __argv = []string{\" + strings.Join(strs, \", \") + \"}\"\n\n\t\t\t// It is hard to emulate GetCommandLine exactly.\n\t\t\t// See http://daviddeley.com/autohotkey/parameters/parameters.htm#WINARGV\n\t\t\t// Initialize os.Args directly instead.\n\t\t\told := `func init() {\n\tcmd := windows.UTF16PtrToString(syscall.GetCommandLine())\n\tif len(cmd) == 0 {\n\t\targ0, _ := Executable()\n\t\tArgs = []string{arg0}\n\t} else {\n\t\tArgs = commandLineToArgv(cmd)\n\t}\n}`\n\t\t\tnew := fmt.Sprintf(`%s\n\nfunc init() {\n\tif len(__argv) == 0 {\n\t\targ0, _ := Executable()\n\t\t__argv = []string{arg0}\n\t}\n\tArgs = __argv\n}`, argvDef)\n\t\t\tif err := replace(tmpDir, replaces, \"os\", \"exec_windows.go\", old, new, cfg.os); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tmajor, minor := goMajorMinorVersion()\n\t\t\tif major != 1 {\n\t\t\t\treturn nil, fmt.Errorf(\"hitsumabushi: unexpected major version: %d\", major)\n\t\t\t}\n\t\t\tif minor >= 23 {\n\t\t\t\tif err := replace(tmpDir, replaces, \"os\", \"exec_windows.go\", `import (\n\t\"errors\"\n\t\"internal/syscall/windows\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n)`, `import (\n\t\"errors\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n)`, cfg.os); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := replace(tmpDir, replaces, \"os\", \"exec_windows.go\", `import (\n\t\"errors\"\n\t\"internal/syscall/windows\"\n\t\"runtime\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"time\"\n)`, `import (\n\t\"errors\"\n\t\"runtime\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"time\"\n)`, cfg.os); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Replace loaded DLLs\n\t\tif len(cfg.replaceDLLs) > 0 {\n\t\t\tvar old string\n\t\t\t_, minor := goMajorMinorVersion()\n\t\t\tif minor <= 22 {\n\t\t\t\told = \"func syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\"\n\t\t\t} else if minor <= 25 {\n\t\t\t\told = \"func syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\"\n\t\t\t} else {\n\t\t\t\told = \"func syscall_syscalln(fn, n uintptr, args ...uintptr) (r1, r2, err uintptr) {\"\n\t\t\t}\n\t\t\tnew := `func _toLower(x uint16) uint16 {\n\tif 'A' <= x && x <= 'Z' {\n\t\treturn x - 'A' + 'a'\n\t}\n\treturn x\n}\n\nfunc _areUTF16StringsSame(a *uint16, b *uint16) bool {\n\tfor _toLower(*a) == _toLower(*b) {\n\t\ta = (*uint16)(unsafe.Add(unsafe.Pointer(a), 2))\n\t\tb = (*uint16)(unsafe.Add(unsafe.Pointer(b), 2))\n\t\tif *a == 0 || *b == 0 {\n\t\t\treturn *a == 0 && *b == 0\n\t\t}\n\t}\n\treturn false\n}\n\nvar _replacingDLLFroms = [][]uint16{\n\t{{.Froms}}\n}\n\nvar _replacingDLLTos = [][]uint16{\n\t{{.Tos}}\n}\n`\n\t\t\tif minor <= 22 {\n\t\t\t\tnew += `\nfunc syscall_SyscallN(trap uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif trap == getLoadLibrary() || trap == getLoadLibraryEx() {\n\t\tfor i, from := range _replacingDLLFroms {\n\t\t\tif _areUTF16StringsSame((*uint16)(unsafe.Pointer(args[0])), &from[0]) {\n\t\t\t\targs[0] = uintptr(unsafe.Pointer(&_replacingDLLTos[i][0]))\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}`\n\t\t\t} else if minor <= 25 {\n\t\t\t\tnew += `\nfunc syscall_SyscallN(fn uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == uintptr(unsafe.Pointer(_LoadLibraryW)) || fn == uintptr(unsafe.Pointer(_LoadLibraryExW)) {\n\t\tfor i, from := range _replacingDLLFroms {\n\t\t\tif _areUTF16StringsSame((*uint16)(unsafe.Pointer(args[0])), &from[0]) {\n\t\t\t\targs[0] = uintptr(unsafe.Pointer(&_replacingDLLTos[i][0]))\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}`\n\t\t\t} else {\n\t\t\t\tnew += `\nfunc syscall_syscalln(fn, n uintptr, args ...uintptr) (r1, r2, err uintptr) {\n\tif fn == uintptr(unsafe.Pointer(_LoadLibraryW)) || fn == uintptr(unsafe.Pointer(_LoadLibraryExW)) {\n\t\tfor i, from := range _replacingDLLFroms {\n\t\t\tif _areUTF16StringsSame((*uint16)(unsafe.Pointer(args[0])), &from[0]) {\n\t\t\t\targs[0] = uintptr(unsafe.Pointer(&_replacingDLLTos[i][0]))\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}`\n\t\t\t}\n\t\t\tvar froms []string\n\t\t\tvar tos []string\n\t\t\tfor _, replace := range cfg.replaceDLLs {\n\t\t\t\tfrom, err := utf16FromString(replace.from)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tfroms = append(froms, fmt.Sprintf(\"%#v,\", from))\n\n\t\t\t\tto, err := utf16FromString(replace.to)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\ttos = append(tos, fmt.Sprintf(\"%#v,\", to))\n\t\t\t}\n\t\t\tnew = strings.ReplaceAll(new, \"{{.Froms}}\", strings.Join(froms, \"\\n\\t\"))\n\t\t\tnew = strings.ReplaceAll(new, \"{{.Tos}}\", strings.Join(tos, \"\\n\\t\"))\n\t\t\tif err := replace(tmpDir, replaces, \"runtime\", \"syscall_windows.go\", old, new, cfg.os); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add importing \"runtime/cgo\" for testing packages.\n\tfor _, pkg := range cfg.testPkgs {\n\t\torigPath, err := goExternalTestFile(pkg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tpkgName, err := goPkgName(pkg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Read the source before opening the destination.\n\t\t// The destination might be the same as the source.\n\t\tsrcPath := origPath\n\t\tif p, ok := replaces[origPath]; ok {\n\t\t\tsrcPath = p\n\t\t}\n\t\tsrcContent, err := os.ReadFile(srcPath)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif err := os.MkdirAll(filepath.Join(tmpDir, filepath.FromSlash(pkg)), 0755); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdst, err := os.Create(filepath.Join(tmpDir, filepath.FromSlash(pkg), filepath.Base(origPath)))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer dst.Close()\n\n\t\t// This assumes that there is an external test package.\n\t\told := \"package \" + pkgName + \"_test\"\n\t\tnew := old + \"\\n\\n\" + `import _ \"runtime/cgo\"`\n\t\treplaced := strings.Replace(string(srcContent), old, new, 1)\n\n\t\tif _, err := io.Copy(dst, bytes.NewReader([]byte(replaced))); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treplaces[origPath] = dst.Name()\n\t}\n\n\tfor _, r := range cfg.overlay {\n\t\treplaces[r.from] = r.to\n\t}\n\n\treturn json.Marshal(&overlay{Replace: replaces})\n}\n\nfunc goPkgDir(pkg string, goos string) (string, error) {\n\tvar buf bytes.Buffer\n\tcmd := exec.Command(\"go\", \"list\", \"-f\", \"{{.Dir}}\", pkg)\n\tcmd.Env = append(os.Environ(), \"GOOS=\"+goos)\n\tcmd.Stderr = &buf\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"hitsumabushi: %v\\n%s\", err, buf.String())\n\t}\n\treturn strings.TrimSpace(string(out)), nil\n}\n\nfunc goExternalTestFile(pkg string) (string, error) {\n\tidx := 0\n\tfor {\n\t\tvar buf bytes.Buffer\n\t\tcmd := exec.Command(\"go\", \"list\", \"-f\", \"{{.Dir}}\"+string(filepath.Separator)+fmt.Sprintf(\"{{index .XTestGoFiles %d}}\", idx), pkg)\n\t\tcmd.Stderr = &buf\n\t\tout, err := cmd.Output()\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"hitsumabushi: %v\\n%s\\nperhaps this package doesn't have an external test\", err, buf.String())\n\t\t}\n\n\t\tf := strings.TrimSpace(string(out))\n\n\t\t// runtime/callers_test.go is very special and the line number matters.\n\t\tif pkg == \"runtime\" && filepath.Base(f) == \"callers_test.go\" {\n\t\t\tidx++\n\t\t\tcontinue\n\t\t}\n\n\t\treturn f, nil\n\t}\n}\n\nfunc goPkgName(pkg string) (string, error) {\n\tvar buf bytes.Buffer\n\tcmd := exec.Command(\"go\", \"list\", \"-f\", \"{{.Name}}\", pkg)\n\tcmd.Stderr = &buf\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"hitsumabushi: %v\\n%s\", err, buf.String())\n\t}\n\treturn strings.TrimSpace(string(out)), nil\n}\n\nfunc replace(tmpDir string, replaces map[string]string, pkg string, filename string, old, new string, goos string) error {\n\torigDir, err := goPkgDir(pkg, goos)\n\tif err != nil {\n\t\treturn err\n\t}\n\torigPath := filepath.Join(origDir, filename)\n\n\t// Read the source before opening the destination.\n\t// The destination might be the same as the source.\n\tsrcPath := origPath\n\tif p, ok := replaces[origPath]; ok {\n\t\tsrcPath = p\n\t}\n\tsrcContent, err := os.ReadFile(srcPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := os.MkdirAll(filepath.Join(tmpDir, filepath.FromSlash(pkg)), 0755); err != nil {\n\t\treturn err\n\t}\n\tdst, err := os.Create(filepath.Join(tmpDir, filepath.FromSlash(pkg), filepath.Base(origPath)))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer dst.Close()\n\n\tif !strings.Contains(string(srcContent), old) {\n\t\treturn fmt.Errorf(\"hitsumabushi: replacing %s/%s failed: %s\", pkg, filename, old)\n\t}\n\n\treplaced := strings.Replace(string(srcContent), old, new, 1)\n\tif string(srcContent) == replaced {\n\t\treturn fmt.Errorf(\"hitsumabushi: replacing %s/%s failed: replacing result is the same\", pkg, filename)\n\t}\n\tif _, err := io.Copy(dst, bytes.NewReader([]byte(replaced))); err != nil {\n\t\treturn err\n\t}\n\n\treplaces[origPath] = dst.Name()\n\treturn nil\n}\n\nfunc utf16FromString(s string) ([]uint16, error) {\n\tif strings.IndexByte(s, 0) != -1 {\n\t\treturn nil, fmt.Errorf(\"hitsumabushi: the given string must not include a NUL character\")\n\t}\n\t// TODO: Use golang.org/x/sys/windows.UTF16FromString, but be careful that this is available only on Windows.\n\t// See https://github.com/golang/go/issues/59971\n\treturn utf16.Encode([]rune(s + \"\\x00\")), nil\n}\n\nfunc replacementFilePath(fn, pkg, os, file string) (string, error) {\n\tif os != \"linux\" {\n\t\treturn \"\", fmt.Errorf(\"hitsumabushi: %s() is not available in this environment: GOOS: %s\", fn, os)\n\t}\n\n\ttokens := strings.Split(goVersion(), \".\")\n\tmajor, err := strconv.Atoi(tokens[0])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tminor, err := strconv.Atoi(tokens[1])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif major == 1 && minor < 19 {\n\t\treturn \"\", fmt.Errorf(\"hitsumabushi: %s() is not available in this environment: Go version: %s\", fn, runtime.Version())\n\t}\n\n\tdir, err := goPkgDir(pkg, os)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn filepath.Join(dir, file), nil\n}\n\n// ClockFilePath returns a C file's path for the clock functions.\n// This file works only when linux is specified as the GOOS option.\n//\n// The file includes this function:\n//\n//   - int hitsumabushi_clock_gettime(clockid_t clk_id, struct timespec *tp)\n//\n// The default implementation calls clock_gettime.\nfunc ClockFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"ClockFilePath\", \"runtime/cgo\", os, \"hitsumabushi_clock_\"+os+\".c\")\n}\n\n// FutexFilePath returns a C file's path for the futex functions.\n// This file works only when linux is specified as the GOOS option.\n//\n// The file includes this function:\n//\n//   - int32_t hitsumabushi_futex(uint32_t *uaddr, int32_t futex_op, uint32_t val, const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n//\n// The default implementation is a pseudo futex by pthread.\nfunc FutexFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"FutexFilePath\", \"runtime/cgo\", os, \"hitsumabushi_futex_\"+os+\".c\")\n}\n\n// FilesystemFilePath returns a C file's path for the filesystem functions.\n// This file works only when linux is specified as the GOOS option.\n//\n// The file includes these functions:\n//\n//   - int32_t hitsumabushi_closefd(int32_t fd)\n//   - int32_t hitsumabushi_open(char *name, int32_t mode, int32_t perm)\n//   - int32_t hitsumabushi_read(int32_t fd, void *p, int32_t n)\n//   - int32_t hitsumabushi_write1(uintptr_t fd, void *p, int32_t n)\n//   - int32_t hitsumabushi_lseek(uintptr_t fd, off_t offset, int32_t whence)\n//   - int32_t hitsumabushi_fcntl(int32_t fd, int32_t cmd, int32_t arg)\n//   - int32_t hitsumabushi_fstat(int32_t fd, struct stat *stat)\n//   - int32_t hitsumabushi_renameat(int32_t fd1, char* name1, int32_t fd2, char* name2)\n//   - int32_t hitsumabushi_fstatat(int32_t fd, char* name, struct stat* p, int32_t flags)\n//\n// The default implementation only handles stdout, stderr, and some pseudo-files.\nfunc FilesystemFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"FilesystemFilePath\", \"runtime/cgo\", os, \"hitsumabushi_filesystem_\"+os+\".c\")\n}\n\n// MemoryFilePath returns a C file's path for the memory functions.\n// This file works only when linux is specified as the GOOS option.\n//\n// The file includes these functions:\n//\n//   - void* hitsumabushi_sysAllocOS(uintptr_t n)\n//   - void hitsumabushi_sysUnusedOS(void* v, uintptr_t n)\n//   - void hitsumabushi_sysUsedOS(void* v, uintptr_t n)\n//   - void hitsumabushi_sysHugePageOS(void* v, uintptr_t n)\n//   - void hitsumabushi_sysFreeOS(void* v, uintptr_t n)\n//   - void hitsumabushi_sysFaultOS(void* v, uintptr_t n)\n//   - void* hitsumabushi_sysReserveOS(void* v, uintptr_t n)\n//   - void hitsumabushi_sysMapOS(void* v, uintptr_t n)\n//\n// The default implementation is a pseudo allocation by calloc without free.\n//\n// For the implementation details, see https://cs.opensource.google/go/go/+/master:src/runtime/mem.go .\n//\n// Note that allocated memory address must be aligned to 1 << 9 bytes as of Go 1.25.\nfunc MemoryFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"MemoryFilePath\", \"runtime/cgo\", os, \"hitsumabushi_mem_\"+os+\".c\")\n}\n\n// CPUFilePath returns a C file's path for the CPU functions.\n// This file works only when linux is specified as the GOOS option.\n//\n// The file includes this function:\n//\n//   - int32_t hitsumabushi_getproccount()\n//\n// The default implementation uses 1.\nfunc CPUFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"CPUFilePath\", \"runtime/cgo\", os, \"hitsumabushi_cpu_\"+os+\".c\")\n}\n\nfunc ThreadFilePath(os string) (string, error) {\n\treturn replacementFilePath(\"ThreadFilePath\", \"runtime/cgo\", os, \"hitsumabushi_thread_\"+os+\".c\")\n}\n"
  },
  {
    "path": "patch.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2021 Hajime Hoshi\n\npackage hitsumabushi\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype patch struct {\n\tname     string\n\treplaces map[string]string\n\tappend   string\n}\n\nfunc parsePatch(name string, r io.Reader) (*patch, error) {\n\tp := &patch{\n\t\tname:     name,\n\t\treplaces: map[string]string{},\n\t}\n\tvar from string\n\tvar to string\n\n\tconst (\n\t\tphaseInit = iota\n\t\tphaseFrom\n\t\tphaseTo\n\t\tphaseAppend\n\t)\n\tvar phase int\n\n\ts := bufio.NewScanner(r)\n\tvar i int\n\tfor s.Scan() {\n\t\tswitch line := s.Text(); line {\n\t\tcase \"//--from\":\n\t\t\tif phase == phaseFrom {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected //--from at %s:L%d\", p.name, i)\n\t\t\t}\n\t\t\tif phase != phaseInit {\n\t\t\t\tp.replaces[from] = to\n\t\t\t\tfrom = \"\"\n\t\t\t\tto = \"\"\n\t\t\t}\n\t\t\tphase = phaseFrom\n\n\t\tcase \"//--to\":\n\t\t\tif phase != phaseFrom {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected //--to at %s:L%d\", p.name, i)\n\t\t\t}\n\t\t\tphase = phaseTo\n\n\t\tcase \"//--append\":\n\t\t\tif phase == phaseFrom {\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected //--append at %s:L%d\", p.name, i)\n\t\t\t}\n\t\t\tif phase != phaseInit {\n\t\t\t\tp.replaces[from] = to\n\t\t\t\tfrom = \"\"\n\t\t\t\tto = \"\"\n\t\t\t}\n\t\t\tphase = phaseAppend\n\n\t\tdefault:\n\t\t\tswitch phase {\n\t\t\tcase phaseInit:\n\t\t\t\treturn nil, fmt.Errorf(\"unexpected content at %s:L%d\", p.name, i)\n\t\t\tcase phaseFrom:\n\t\t\t\tfrom += line + \"\\n\"\n\t\t\tcase phaseTo:\n\t\t\t\tto += line + \"\\n\"\n\t\t\tcase phaseAppend:\n\t\t\t\tp.append += line + \"\\n\"\n\t\t\t}\n\n\t\t}\n\t\ti++\n\t}\n\n\tif from != \"\" {\n\t\tp.replaces[from] = to\n\t}\n\treturn p, nil\n}\n\nfunc (p *patch) apply(r io.Reader) (io.Reader, error) {\n\tbuf, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tstr := string(buf)\n\tfor from, to := range p.replaces {\n\t\tif !strings.Contains(str, from) {\n\t\t\treturn nil, fmt.Errorf(\"hitsumabushi: patching %s failed: %s\", p.name, from[:strings.IndexByte(from, '\\n')])\n\t\t}\n\t\told := str\n\t\tnew := strings.Replace(old, from, to, 1)\n\t\tif old == new {\n\t\t\treturn nil, fmt.Errorf(\"hitsumabushi: patching %s failed: replacing result is the same\", p.name)\n\t\t}\n\t\tstr = new\n\t}\n\tstr += p.append\n\treturn bytes.NewBufferString(str), nil\n}\n"
  },
  {
    "path": "test.go",
    "content": "// SPDX-License-Identifier: Apache-2.0\n// SPDX-FileCopyrightText: 2021 Hajime Hoshi\n\n//go:build ignore\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/hajimehoshi/hitsumabushi\"\n)\n\nvar (\n\tflagArgs = flag.String(\"args\", \"\", \"arguments\")\n\tflagQEMU = flag.Bool(\"qemu\", false, \"use QEMU\")\n)\n\nfunc main() {\n\tflag.Parse()\n\n\tif err := run(); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n\nfunc run() error {\n\targs, err := splitArgs(*flagArgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tpath, err := createJSON(args)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := buildTestBinary(path, args); err != nil {\n\t\treturn err\n\t}\n\n\tdir, err := pkgDir(args[len(args)-1])\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := runTestBinary(dir); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc createJSON(args []string) (string, error) {\n\targs = append([]string{\"hitsumabushi_program\"}, args...)\n\toptions := []hitsumabushi.Option{\n\t\thitsumabushi.Args(args...),\n\t\thitsumabushi.TestPkg(args[len(args)-1]),\n\t}\n\tif runtime.GOOS == \"windows\" {\n\t\t// TODO: Test with a real DLL.\n\t\toptions = append(options, hitsumabushi.ReplaceDLL(\"foofoo.dll\", \"barbar.dll\"))\n\t}\n\toverlayJSON, err := hitsumabushi.GenOverlayJSON(options...)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tf, err := os.CreateTemp(\"\", \"*.json\")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer f.Close()\n\n\tif _, err := f.Write(overlayJSON); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn f.Name(), nil\n}\n\nfunc buildTestBinary(jsonPath string, args []string) error {\n\t// Create a temporary working directory to use a fixed Go version for go.mod.\n\t// go.mod's Go version matters as this might change some Go's behavior (e.g. runtime.TestPanicNil).\n\ttmp, err := os.MkdirTemp(\"\", \"hitsumabushi-*\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer os.RemoveAll(tmp)\n\n\tcmd := exec.Command(\"go\", \"mod\", \"init\", \"hitsumabushitest\")\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\tcmd.Dir = tmp\n\tif err := cmd.Run(); err != nil {\n\t\treturn err\n\t}\n\n\twd, err := os.Getwd()\n\tif err != nil {\n\t\treturn err\n\t}\n\tbin := filepath.Join(wd, \"test\")\n\tif runtime.GOOS == \"windows\" {\n\t\tbin += \".exe\"\n\t}\n\tcmd = exec.Command(\"go\", \"test\", \"-c\", \"-vet=off\", \"-overlay=\"+jsonPath, \"-o=\"+bin)\n\tcmd.Args = append(cmd.Args, args...)\n\tcmd.Env = append(os.Environ(),\n\t\t\"CGO_ENABLED=1\",\n\t\t\"CGO_CFLAGS=-fno-common -fno-short-enums -ffunction-sections -fdata-sections -fPIC -g -O3\")\n\tif *flagQEMU {\n\t\tcmd.Env = append(cmd.Env, \"CC=aarch64-linux-gnu-gcc\")\n\t}\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\tcmd.Dir = tmp\n\tif err := cmd.Run(); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc runTestBinary(dir string) error {\n\tbinFilename := \"test\"\n\tif runtime.GOOS == \"windows\" {\n\t\tbinFilename += \".exe\"\n\t}\n\n\tbin, err := filepath.Abs(binFilename)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar cmd *exec.Cmd\n\tif *flagQEMU {\n\t\tcmd = exec.Command(\"qemu-aarch64\", bin)\n\t\tcmd.Env = append(os.Environ(), \"QEMU_LD_PREFIX=/usr/aarch64-linux-gnu\")\n\t} else {\n\t\tcmd = exec.Command(bin)\n\t}\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\tcmd.Dir = dir\n\n\tif err := cmd.Run(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc isSpaceByte(c byte) bool {\n\treturn c == ' ' || c == '\\t' || c == '\\n' || c == '\\r'\n}\n\nfunc splitArgs(s string) ([]string, error) {\n\t// Copied from cmd/internal/quoted/quoted.go\n\n\t// Split fields allowing '' or \"\" around elements.\n\t// Quotes further inside the string do not count.\n\tvar f []string\n\tfor len(s) > 0 {\n\t\tfor len(s) > 0 && isSpaceByte(s[0]) {\n\t\t\ts = s[1:]\n\t\t}\n\t\tif len(s) == 0 {\n\t\t\tbreak\n\t\t}\n\t\t// Accepted quoted string. No unescaping inside.\n\t\tif s[0] == '\"' || s[0] == '\\'' {\n\t\t\tquote := s[0]\n\t\t\ts = s[1:]\n\t\t\ti := 0\n\t\t\tfor i < len(s) && s[i] != quote {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif i >= len(s) {\n\t\t\t\treturn nil, fmt.Errorf(\"unterminated %c string\", quote)\n\t\t\t}\n\t\t\tf = append(f, s[:i])\n\t\t\ts = s[i+1:]\n\t\t\tcontinue\n\t\t}\n\t\ti := 0\n\t\tfor i < len(s) && !isSpaceByte(s[i]) {\n\t\t\ti++\n\t\t}\n\t\tf = append(f, s[:i])\n\t\ts = s[i:]\n\t}\n\treturn f, nil\n}\n\nfunc pkgDir(pkg string) (string, error) {\n\tcmd := exec.Command(\"go\", \"list\", \"-f\", \"{{.Dir}}\", pkg)\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn strings.TrimSpace(string(out)), nil\n}\n"
  }
]