|  | #include <unwind-assembly.h> | 
|  |  | 
|  | /** | 
|  | * A direct re-implementation of unwind.h's cleanup_unwind() as a stackless | 
|  | * error handler. | 
|  | * | 
|  | * If there is no registered CleanupList structure (equivalently, there's no | 
|  | * CHERIOT_DURING block active at the time of the fault), then this requests | 
|  | * unwinding out of the compartment.  Otherwise, we will longjmp() out to the | 
|  | * indicated handler (that is, the CHERIOT_HANDLER block associated with the | 
|  | * current CHERIOT_DURING block), having reset the compartment error handler | 
|  | * invocation counter to zero. | 
|  | */ | 
|  | .section .compartment_error_handler_stackless,"aw",@progbits | 
|  | .globl compartment_error_handler_stackless | 
|  | .p2align 2 | 
|  | .type compartment_error_handler_stackless,@function | 
|  | compartment_error_handler_stackless: | 
|  | // Get the head of the error list (see cleanup_list_head) | 
|  | cgettop      t0, csp | 
|  | csetaddr     csp, csp, t0 | 
|  | clc          cs0, -INVOCATION_LOCAL_UNWIND_LIST_OFFSET(csp) | 
|  | beqz         s0, .Lforce_unwind | 
|  | // Pop the top error from the list | 
|  | clc          ct0, CleanupList_offset_next(cs0) | 
|  | csc          ct0, -INVOCATION_LOCAL_UNWIND_LIST_OFFSET(csp) | 
|  | // Mark this error handler as having finished.  We may still trap again | 
|  | // and reenter this, but now that we've popped the top element from the | 
|  | // stack we will run some different cleanup code next time. */ | 
|  | .Llookup_reset: | 
|  | auipcc          ct2, %cheriot_compartment_hi(__library_import_libcalls__Z39switcher_handler_invocation_count_resetv) | 
|  | clc             ct2, %cheriot_compartment_lo_i(.Llookup_reset)(ct2) | 
|  | cjalr           ct2 | 
|  | // longjmp to the error handler. | 
|  | clc          cs1, (CleanupList_offset_env + __jmp_buf_offset___cs1)(cs0) | 
|  | clc          csp, (CleanupList_offset_env + __jmp_buf_offset___csp)(cs0) | 
|  | clc          cra, (CleanupList_offset_env + __jmp_buf_offset___cra)(cs0) | 
|  | clc          cs0, (CleanupList_offset_env + __jmp_buf_offset___cs0)(cs0) | 
|  | cjr          cra | 
|  |  | 
|  | .Lforce_unwind: | 
|  | li           a0, 1 | 
|  | cret | 
|  |  | 
|  | .section	.compartment_imports,"aG",@progbits,__library_import_libcalls__Z39switcher_handler_invocation_count_resetv,comdat | 
|  | .type	__library_import_libcalls__Z39switcher_handler_invocation_count_resetv,@object | 
|  | .weak	__library_import_libcalls__Z39switcher_handler_invocation_count_resetv | 
|  | .p2align	3 | 
|  | __library_import_libcalls__Z39switcher_handler_invocation_count_resetv: | 
|  | .word	__library_export_libcalls__Z39switcher_handler_invocation_count_resetv+1 | 
|  | .word	0 | 
|  | .size	__library_import_libcalls__Z39switcher_handler_invocation_count_resetv, 8 | 
|  |  |