)]}'
{
  "commit": "4ef64ad1aa9bbbe9471610e2de6ef0c8afed8b1f",
  "tree": "8f8b66d13cb2abce08b2b485de4c9acc996ad5a4",
  "parents": [
    "c6133f911ea5ae4a4df59079c6299593fdec8afc"
  ],
  "author": {
    "name": "Ramin Moussavi",
    "email": "lordrasmus@gmail.com",
    "time": "Wed Jun 03 00:00:00 2026 +0200"
  },
  "committer": {
    "name": "Michael J. Eager",
    "email": "eager@eagercon.com",
    "time": "Fri Jun 12 08:40:33 2026 -0700"
  },
  "message": "microblaze: add Linux signal frame unwinding support\n\nlibgcc has no MD_FALLBACK_FRAME_STATE_FOR for microblaze*-linux*, so the\nDWARF unwinder cannot step through signal frames at all.  Anything that\nunwinds out of a signal handler -- most prominently NPTL asynchronous\npthread cancellation (SIGCANCEL) -- either stops early with\n_URC_END_OF_STACK (cleanup handlers below the signal frame never run) or\nmisinterprets the on-stack signal trampoline and crashes with SIGSEGV.\n\nAdd the standard fallback: recognize the two-instruction trampoline the\nkernel writes into struct rt_sigframe on the stack\n\n\taddik r12, r0, __NR_rt_sigreturn\n\tbrki  r14, 0x8\n\nand rebuild the frame state from the sigcontext\u0027s pt_regs.  The ucontext\nis anchored relative to the trampoline (its last member) rather than to\nthe CFA, so the layout of the frame head does not matter.\n\nThe interrupted PC is recorded in DWARF column 36, one past the hard\nregisters, because column 15 must keep the interrupted r15 (unrelated to\nthe resume address of a signal frame).  Declaring it as\nDWARF_ALT_FRAME_RETURN_COLUMN makes init_dwarf_reg_size_table size the\ncolumn; without that _Unwind_GetGR reads a zero size and aborts.\n\nTested with a microblazeel-linux-uclibc cross compiler against uClibc-ng\ngit, running its NPTL test suite under qemu-system-microblazeel -M\npetalogix-s3adsp1800.  Without the fix 17 tests fail (tst-cancel{1..5,7,\n9,16,20,x4,x7}, tst-cleanup{1..3}, tst-cond{16,17}) by SIGSEGV or by\nhanging in the unwinder; with it all 17 pass and the rest of the suite\nis unchanged.  The implementation follows the mips/aarch64\nlinux-unwind.h pattern.\n\ngcc/ChangeLog:\n\n\t* config/microblaze/microblaze.h (DWARF_ALT_FRAME_RETURN_COLUMN):\n\tDefine.\n\nlibgcc/ChangeLog:\n\n\t* config.host (microblaze*-linux*): Set md_unwind_header.\n\t* config/microblaze/linux-unwind.h: New file.\n\nSigned-off-by: Ramin Moussavi \u003cramin.moussavi@yacoub.de\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2b5bd52040f7f8e66a9c452e57b8e00a21215d83",
      "old_mode": 33188,
      "old_path": "gcc/config/microblaze/microblaze.h",
      "new_id": "fc8c4b87175453decc56cfbf7e97c6665d423ef2",
      "new_mode": 33188,
      "new_path": "gcc/config/microblaze/microblaze.h"
    },
    {
      "type": "modify",
      "old_id": "046156fa5e786b4391491695703fbfaaa1f3149d",
      "old_mode": 33188,
      "old_path": "libgcc/config.host",
      "new_id": "a685d5da7a10791b7646496d2172b95677f2f263",
      "new_mode": 33188,
      "new_path": "libgcc/config.host"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b54704a06519840bbaad88b8977e6f21ccc964c2",
      "new_mode": 33188,
      "new_path": "libgcc/config/microblaze/linux-unwind.h"
    }
  ]
}
