| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ) |
| |
| .text |
| |
| /* Must match jmp_buf structure layout */ |
| .struct 0 |
| env_x19_x20: .quad 0, 0 |
| env_x21_x22: .quad 0, 0 |
| env_x23_x24: .quad 0, 0 |
| env_x25_x26: .quad 0, 0 |
| env_x27_x28: .quad 0, 0 |
| env_x29_x30: .quad 0, 0 |
| env_sp: .quad 0 |
| .previous |
| |
| /* |
| * Save stack context for non-local goto |
| */ |
| .globl setjmp |
| .type setjmp, %function |
| setjmp: |
| /* Store registers */ |
| stp x19, x20, [x0, #env_x19_x20] |
| stp x21, x22, [x0, #env_x21_x22] |
| stp x23, x24, [x0, #env_x23_x24] |
| stp x25, x26, [x0, #env_x25_x26] |
| stp x27, x28, [x0, #env_x27_x28] |
| stp x29, x30, [x0, #env_x29_x30] |
| mov x16, sp |
| str x16, [x0, #env_sp] |
| /* Return 0 when returning as setjmp() */ |
| mov x0, #0 |
| ret |
| .size setjmp, . - setjmp |
| |
| /* |
| * Non-local jump to a saved stack context |
| */ |
| .globl longjmp |
| .type longjmp, %function |
| longjmp: |
| /* Restore registers */ |
| ldp x19, x20, [x0, #env_x19_x20] |
| ldp x21, x22, [x0, #env_x21_x22] |
| ldp x23, x24, [x0, #env_x23_x24] |
| ldp x25, x26, [x0, #env_x25_x26] |
| ldp x27, x28, [x0, #env_x27_x28] |
| ldp x29, x30, [x0, #env_x29_x30] |
| ldr x16, [x0, #env_sp] |
| mov sp, x16 |
| /* Force result to non-zero */ |
| cmp w1, #0 |
| csinc w0, w1, w1, ne |
| /* Return to setjmp() caller */ |
| br x30 |
| .size longjmp, . - longjmp |