)]}'
{
  "commit": "01f99b4e9540f34b44e13b25f6dd04b82ac952d9",
  "tree": "ec18a4ca73b57a0ab1c4b2b38d5e5150422eab45",
  "parents": [
    "c6a11f0dd279f374602794af60c7cde4585a1e6f"
  ],
  "author": {
    "name": "Keith Randall",
    "email": "khr@golang.org",
    "time": "Tue Aug 11 13:07:35 2020 -0700"
  },
  "committer": {
    "name": "Keith Randall",
    "email": "khr@golang.org",
    "time": "Sun Aug 16 17:05:28 2020 +0000"
  },
  "message": "cmd/compile: mark DUFFZERO/DUFFCOPY as async unsafe\n\nThese operations are async unsafe on architectures that use\nframe pointers.\n\nThe reason is they rely on data being safe when stored below the stack\npointer. They do:\n\n  45da69:       48 89 6c 24 f0          mov    %rbp,-0x10(%rsp)\n  45da6e:       48 8d 6c 24 f0          lea    -0x10(%rsp),%rbp\n  45da73:       e8 7d d0 ff ff          callq  45aaf5 \u003cruntime.duffzero+0x115\u003e\n  45da78:       48 8b 6d 00             mov    0x0(%rbp),%rbp\n\nThis dance ensures that inside duffzero, it looks like there is a\nproper frame pointer set up, so that stack walkbacks work correctly if\nthe kernel samples during duffzero.\n\nHowever, this instruction sequence depends on data not being clobbered\neven though it is below the stack pointer.\n\nIf there is an async interrupt at any of those last 3 instructions,\nand the interrupt decides to insert a call to asyncPreempt, then the\nsaved frame pointer on the stack gets clobbered. The last instruction\nabove then restores junk to the frame pointer.\n\nTo prevent this, mark these instructions as async unsafe.\n\n(The body of duffzero is already async unsafe, as it is in package runtime.)\n\nChange-Id: I5562e82f9f5bd2fb543dcf2b6b9133d87ff83032\nReviewed-on: https://go-review.googlesource.com/c/go/+/248261\nRun-TryBot: Keith Randall \u003ckhr@golang.org\u003e\nTryBot-Result: Gobot Gobot \u003cgobot@golang.org\u003e\nReviewed-by: Martin Möhrmann \u003cmoehrmann@google.com\u003e\nReviewed-by: Cherry Zhang \u003ccherryyz@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a3b29049df667277d3b4b8cf1ce5a3d9cf187839",
      "old_mode": 33188,
      "old_path": "src/cmd/compile/internal/ssa/gen/AMD64Ops.go",
      "new_id": "e6d66957ddd5f761e38397870aec49ec0545cccf",
      "new_mode": 33188,
      "new_path": "src/cmd/compile/internal/ssa/gen/AMD64Ops.go"
    },
    {
      "type": "modify",
      "old_id": "b402e35ea6f86ac05ba112ccfbbb7e7a751c8208",
      "old_mode": 33188,
      "old_path": "src/cmd/compile/internal/ssa/gen/ARM64Ops.go",
      "new_id": "2424e67e201dabefedf1bdc1bac63fe4b2dcc94f",
      "new_mode": 33188,
      "new_path": "src/cmd/compile/internal/ssa/gen/ARM64Ops.go"
    },
    {
      "type": "modify",
      "old_id": "9efa1bfcc4bdc4bc8dd922433f80d44421763aac",
      "old_mode": 33188,
      "old_path": "src/cmd/compile/internal/ssa/opGen.go",
      "new_id": "408c855dbdd5f1aa4e39f509e07d0fea060c9887",
      "new_mode": 33188,
      "new_path": "src/cmd/compile/internal/ssa/opGen.go"
    }
  ]
}
