crash-context 0.7.0

Provides portable types containing target specific contextual information at the time of a crash
Documentation
// UCONTEXT_SIGMASK_OFFSET = 40
// MCONTEXT_GREGS_OFFSET = 168
// MCONTEXT_GREGS_SIZE = 8

std::arch::global_asm! {
    ".text",
    ".attribute arch, \"rv64gc\"",
    ".globl crash_context_getcontext",
    ".hidden crash_context_getcontext",
    ".type crash_context_getcontext, @function",
    ".align 0",
    ".cfi_startproc",
"crash_context_getcontext:",

    // Save general registers
    "sd ra,  0xa8(a0)",
    "sd ra,  0xb0(a0)",
    "sd sp,  0xb8(a0)",
    "sd gp,  0xc0(a0)",
    "sd tp,  0xc8(a0)",
    "sd t0,  0xd0(a0)",
    "sd t1,  0xd8(a0)",
    "sd t2,  0xe0(a0)",
    "sd s0,  0xe8(a0)",
    "sd s1,  0xf0(a0)",
    "sd a0,  0xf8(a0)",
    "sd a1,  0x100(a0)",
    "sd a2,  0x108(a0)",
    "sd a3,  0x110(a0)",
    "sd a4,  0x118(a0)",
    "sd a5,  0x120(a0)",
    "sd a6,  0x128(a0)",
    "sd a7,  0x130(a0)",
    "sd s2,  0x138(a0)",
    "sd s3,  0x140(a0)",
    "sd s4,  0x148(a0)",
    "sd s5,  0x150(a0)",
    "sd s6,  0x158(a0)",
    "sd s7,  0x160(a0)",
    "sd s8,  0x168(a0)",
    "sd s9,  0x170(a0)",
    "sd s10, 0x178(a0)",
    "sd s11, 0x180(a0)",
    "sd t3,  0x188(a0)",
    "sd t4,  0x190(a0)",
    "sd t5,  0x198(a0)",
    "sd t6 , 0x1a0(a0)",

    // Save floating point registers
    "frsr a1",  // Save CSR
    "fsd ft0,  0x1a8(a0)",
    "fsd ft1,  0x1b0(a0)",
    "fsd ft2,  0x1b8(a0)",
    "fsd ft3,  0x1c0(a0)",
    "fsd ft4,  0x1c8(a0)",
    "fsd ft5,  0x1d0(a0)",
    "fsd ft6,  0x1d8(a0)",
    "fsd ft7,  0x1e0(a0)",
    "fsd fs0,  0x1e8(a0)",
    "fsd fs1,  0x1f0(a0)",
    "fsd fa0,  0x1f8(a0)",
    "fsd fa1,  0x200(a0)",
    "fsd fa2,  0x208(a0)",
    "fsd fa3,  0x210(a0)",
    "fsd fa4,  0x218(a0)",
    "fsd fa5,  0x220(a0)",
    "fsd fa6,  0x228(a0)",
    "fsd fa7,  0x230(a0)",
    "fsd fs2,  0x238(a0)",
    "fsd fs3,  0x240(a0)",
    "fsd fs4,  0x248(a0)",
    "fsd fs5,  0x250(a0)",
    "fsd fs6,  0x258(a0)",
    "fsd fs7,  0x260(a0)",
    "fsd fs8,  0x268(a0)",
    "fsd fs9,  0x270(a0)",
    "fsd fs10, 0x278(a0)",
    "fsd fs11, 0x280(a0)",
    "fsd ft8,  0x288(a0)",
    "fsd ft9,  0x290(a0)",
    "fsd ft10, 0x298(a0)",
    "fsd ft11, 0x2a0(a0)",
    "sw a1, 0x2a8(a0)",

    "mv a1, zero",
    "add a2, a0, 40",  // UCONTEXT_SIGMASK_OFFSET
    "li a3, 8",        // _NSIG8
    "mv a0, zero",
    "li a7, 135",      // __NR_rt_sigprocmask
    "ecall",

    "mv a0, zero",
    "ret",

    ".cfi_endproc",
    ".size crash_context_getcontext, . - crash_context_getcontext",
}