)]}'
{
  "commit": "2f56debd77a8f52f1ac1d3c3d89cc7ce5e083230",
  "tree": "353847d10aa0d5bc1de2707ecd8fa2391ad096f3",
  "parents": [
    "e4d06b3f904ddfab4531a1e23f1f5e1bd284b605"
  ],
  "author": {
    "name": "Jeff Dike",
    "email": "jdike@addtoit.com",
    "time": "Sat Feb 23 15:23:49 2008 -0800"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@woody.linux-foundation.org",
    "time": "Sat Feb 23 17:12:15 2008 -0800"
  },
  "message": "uml: fix FP register corruption\n\nCommit ee3d9bd4de1ed93d2a7ee41c331ed30a1c7b8acd (\"uml: simplify SIGSEGV\nhandling\"), while greatly simplifying the kernel SIGSEGV handler that\nruns in the process address space, introduced a bug which corrupts FP\nstate in the process.\n\nPreviously, the SIGSEGV handler called the sigreturn system call by hand - it\ncouldn\u0027t return through the restorer provided to it because that could try to\ncall the libc restorer which likely wouldn\u0027t exist in the process address\nspace.  So, it blocked off some signals, including SIGUSR1, on entry to the\nSIGSEGV handler, queued a SIGUSR1 to itself, and invoked sigreturn.  The\nSIGUSR1 was delivered, and was visible to the UML kernel after sigreturn\nfinished.\n\nThe commit eliminated the signal masking and the call to sigreturn.  The\nhandler simply hits itself with a SIGTRAP to let the UML kernel know that it\nis finished.  UML then restores the process registers, which effectively\nlongjmps the process out of the signal handler, skipping sigreturn\u0027s restoring\nof register state and the signal mask.\n\nThe bug is that the host apparently sets used_fp to 0 when it saves the\nprocess FP state in the sigcontext on the process signal stack.  Thus, when\nthe process is longjmped out of the handler, its FP state is corrupt because\nit wasn\u0027t saved on the context switch to the UML kernel.\n\nThis manifested itself as sleep hanging.  For some reason, sleep uses floating\npoint in order to calculate the sleep interval.  When a page fault corrupts\nits FP state, it is faked into essentially sleeping forever.\n\nThis patch saves the FP state before entering the SIGSEGV handler and restores\nit afterwards.\n\nSigned-off-by: Jeff Dike \u003cjdike@linux.intel.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9ea1ae3c8f464d8c8b138eecf8d3694f238d32c5",
      "old_mode": 33188,
      "old_path": "arch/um/include/registers.h",
      "new_id": "b0b4589e0ebce804c3a6189da1835620069410cf",
      "new_mode": 33188,
      "new_path": "arch/um/include/registers.h"
    },
    {
      "type": "modify",
      "old_id": "899aa4b2a78d542888d09a4812fbb13da34035e3",
      "old_mode": 33188,
      "old_path": "arch/um/include/sysdep-i386/ptrace_user.h",
      "new_id": "75650723c38f15506144d12f5cfedfb0f63a8072",
      "new_mode": 33188,
      "new_path": "arch/um/include/sysdep-i386/ptrace_user.h"
    },
    {
      "type": "modify",
      "old_id": "4cd61a852fabd5c7af23beb1cab016cbff3ff393",
      "old_mode": 33188,
      "old_path": "arch/um/include/sysdep-x86_64/ptrace_user.h",
      "new_id": "45c0bd881cb3a36b64b657ee9090ee8a0bdf3b5a",
      "new_mode": 33188,
      "new_path": "arch/um/include/sysdep-x86_64/ptrace_user.h"
    },
    {
      "type": "modify",
      "old_id": "b14829469faefdf99a2511beede3ea6515c21927",
      "old_mode": 33188,
      "old_path": "arch/um/os-Linux/skas/process.c",
      "new_id": "1e8cba6550a99824df296e468747fabc109d6d44",
      "new_mode": 33188,
      "new_path": "arch/um/os-Linux/skas/process.c"
    },
    {
      "type": "modify",
      "old_id": "f74d853a0ee02372af46d4ab4ae244242a19ea4f",
      "old_mode": 33188,
      "old_path": "arch/um/os-Linux/sys-i386/registers.c",
      "new_id": "b613473b3ec1c1ef9ba83da234a207ef6f08aa38",
      "new_mode": 33188,
      "new_path": "arch/um/os-Linux/sys-i386/registers.c"
    },
    {
      "type": "modify",
      "old_id": "a375853337a703d7764dded31549725cf17376e8",
      "old_mode": 33188,
      "old_path": "arch/um/os-Linux/sys-x86_64/registers.c",
      "new_id": "594d97ad02b3408b8b351a3b4263f82cb88461ad",
      "new_mode": 33188,
      "new_path": "arch/um/os-Linux/sys-x86_64/registers.c"
    }
  ]
}
