blob: 6c74c068396b2b28b0692762a317b15752aef393 [file] [log] [blame]
#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
* unwnding 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