)]}'
{
  "commit": "81711cee933599fa114abb0d258d8bbabef8adfb",
  "tree": "cef17c099689b15b3b8bb29b0eae84acd474ed8a",
  "parents": [
    "bc4cf2bb271b2d557fc510426755da786fc985be"
  ],
  "author": {
    "name": "Chris Metcalf",
    "email": "cmetcalf@tilera.com",
    "time": "Tue Dec 14 16:07:25 2010 -0500"
  },
  "committer": {
    "name": "Chris Metcalf",
    "email": "cmetcalf@tilera.com",
    "time": "Fri Dec 17 16:59:29 2010 -0500"
  },
  "message": "arch/tile: handle rt_sigreturn() more cleanly\n\nThe current tile rt_sigreturn() syscall pattern uses the common idiom\nof loading up pt_regs with all the saved registers from the time of\nthe signal, then anticipating the fact that we will clobber the ABI\n\"return value\" register (r0) as we return from the syscall by setting\nthe rt_sigreturn return value to whatever random value was in the pt_regs\nfor r0.\n\nHowever, this breaks in our 64-bit kernel when running \"compat\" tasks,\nsince we always sign-extend the \"return value\" register to properly\nhandle returned pointers that are in the upper 2GB of the 32-bit compat\naddress space.  Doing this to the sigreturn path then causes occasional\nrandom corruption of the 64-bit r0 register.\n\nInstead, we stop doing the crazy \"load the return-value register\"\nhack in sigreturn.  We already have some sigreturn-specific assembly\ncode that we use to pass the pt_regs pointer to C code.  We extend that\ncode to also set the link register to point to a spot a few instructions\nafter the usual syscall return address so we don\u0027t clobber the saved r0.\nNow it no longer matters what the rt_sigreturn syscall returns, and the\npt_regs structure can be cleanly and completely reloaded.\n\nSigned-off-by: Chris Metcalf \u003ccmetcalf@tilera.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c1ee1d61d44ca8a07c504b9af425df3a9c7185c7",
      "old_mode": 33188,
      "old_path": "arch/tile/include/asm/signal.h",
      "new_id": "81d92a45cd4b613e2c18add9afe153e43a5d703e",
      "new_mode": 33188,
      "new_path": "arch/tile/include/asm/signal.h"
    },
    {
      "type": "modify",
      "old_id": "543d6a33aa26f6c02f7f41f59fcdceea1729bcd8",
      "old_mode": 33188,
      "old_path": "arch/tile/kernel/compat_signal.c",
      "new_id": "dbb0dfc7beceb10eaa25fd4b73579cdc620334c5",
      "new_mode": 33188,
      "new_path": "arch/tile/kernel/compat_signal.c"
    },
    {
      "type": "modify",
      "old_id": "f5821626247fee9891d47eca123b26440f6c025c",
      "old_mode": 33188,
      "old_path": "arch/tile/kernel/intvec_32.S",
      "new_id": "5eed4a02bf62335e17a39f663cd4485869f44ea5",
      "new_mode": 33188,
      "new_path": "arch/tile/kernel/intvec_32.S"
    },
    {
      "type": "modify",
      "old_id": "757407e36696688d59810453b1ffca8da8522a62",
      "old_mode": 33188,
      "old_path": "arch/tile/kernel/signal.c",
      "new_id": "1260321155f1d591b85131f44d9c72ad31122626",
      "new_mode": 33188,
      "new_path": "arch/tile/kernel/signal.c"
    }
  ]
}
