| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
|
|
| |
|
|
| const fail_s_reg |
| .asciz "callee-saved integer register clobbered" |
| endconst |
|
|
| const fail_fs_reg |
| .asciz "callee-saved floating-point register clobbered" |
| endconst |
|
|
| const fail_rsvd_reg |
| .asciz "unallocatable register clobbered" |
| endconst |
|
|
| .section .tbss, "waT" |
| .align 3 |
| .hidden checked_func |
| .hidden saved_regs |
| |
| checked_func: |
| .quad 0 |
| |
| saved_regs: |
| |
| .rept 4 + 12 + 12 |
| .quad 0 |
| .endr |
|
|
| func checkasm_set_function |
| la.tls.ie t0, checked_func |
| add t0, tp, t0 |
| sd a0, (t0) |
| ret |
| endfunc |
|
|
| func checkasm_get_wrapper, v |
| addi sp, sp, -16 |
| sd fp, (sp) |
| sd ra, 8(sp) |
| addi fp, sp, 16 |
|
|
| call av_get_cpu_flags |
| andi t0, a0, 8 |
|
|
| lla a0, 3f |
| beqz t0, 1f |
| lla a0, 2f |
| 1: |
| ld ra, 8(sp) |
| ld fp, (sp) |
| addi sp, sp, 16 |
| ret |
| |
| 2: |
| |
| vsetvli t0, zero, e32, m8, ta, ma |
| li t0, 0xdeadbeef |
| vmv.v.x v0, t0 |
| vmv.v.x v8, t0 |
| vmv.v.x v16, t0 |
| vmv.v.x v24, t0 |
|
|
| |
| li t0, 0 |
| li t1, -1 << 31 |
| vsetvl zero, t0, t1 |
| csrwi vxrm, 3 |
| csrwi vxsat, 1 |
| |
| 3: |
| |
| la.tls.ie t0, saved_regs |
| add t0, tp, t0 |
| sd ra, (t0) |
| sd sp, 8(t0) |
| sd gp, 16(t0) |
| sd tp, 24(t0) |
| .irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| sd s\n, (32 + (16 * \n))(t0) |
| fsd fs\n, (40 + (16 * \n))(t0) |
| .endr |
|
|
| |
| li t0, 0xdeadbeef1badf00d |
| .rept 16 |
| addi sp, sp, -16 |
| sd t0, (sp) |
| sd t0, 8(sp) |
| .endr |
| addi sp, sp, 256 |
|
|
| |
| .irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| .if (\n > 0 && \n < 7) |
| mv t\n, t0 |
| .endif |
| fmv.d.x ft\n, t0 |
| mv s\n, t0 |
| fmv.d.x fs\n, t0 |
| .endr |
|
|
| |
| la.tls.ie t0, checked_func |
| add t0, tp, t0 |
| ld t1, (t0) |
| sd zero, (t0) |
| jalr t1 |
|
|
| |
| la.tls.ie t0, saved_regs |
| add t0, tp, t0 |
| ld t1, 8(t0) |
| bne t1, sp, 5f |
| ld t1, 16(t0) |
| bne t1, gp, 5f |
| ld t1, 24(t0) // If TP was corrupted, we probably will have... |
| bne t1, tp, 5f // ...already crashed before we even get here. |
|
|
| |
| li t0, 0xdeadbeef1badf00d |
| .irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| bne t0, s\n, 6f |
| |
| |
| fmv.x.d t1, fs\n |
| bne t0, t1, 7f |
| |
| .endr |
| |
| 4: |
| |
| la.tls.ie t0, saved_regs |
| add t0, tp, t0 |
| ld ra, (t0) |
| .irp n, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| ld s\n, (32 + (16 * \n))(t0) |
| fld fs\n, (40 + (16 * \n))(t0) |
| .endr |
| ret |
| |
| 5: |
| lla a0, fail_rsvd_reg |
| call checkasm_fail_func |
| tail abort |
| |
| 6: |
| lla a0, fail_s_reg |
| call checkasm_fail_func |
| j 4b |
| |
| 7: |
| lla a0, fail_fs_reg |
| call checkasm_fail_func |
| j 4b |
| endfunc |
| |
|
|