25 [[nodiscard]]
auto handle(cpu::irq::irq_frame* frame,
const u16 svc_code)
noexcept -> u64 {
26 const u32 packed_nr = svc_code;
27 const u64 a0 = frame->gprs[2];
28 const u64 a1 = frame->gprs[3];
29 const u64 a2 = frame->gprs[4];
30 const u64 a3 = frame->gprs[5];
31 const u64 a4 = frame->gprs[6];
33 const auto* lc = cpu::lowcore::get_current();
34 if (
const auto* d = lc ?
reinterpret_cast<zxfoundation::dgp::domain::domain*>(lc->current_domain) :
nullptr;
35 !d || d->ko.state != lifecycle_state::active) {
39 const u64 result = dispatch(packed_nr, a0, a1, a2, a3, a4);
40 const u32 shm_import = zxfoundation::dgp::gate::pack_call(
41 call_namespace::sys,
static_cast<u32>(sys_op::shm_import));
42 const u32 shm_map = zxfoundation::dgp::gate::pack_call(
43 call_namespace::sys,
static_cast<u32>(sys_op::shm_map));
44 if ((packed_nr == shm_import || packed_nr == shm_map) && result < 16U) {
45 auto* strand =
reinterpret_cast<zxfoundation::dgp::domain::strand*>(
46 lc->percpu.current_strand);
47 if (strand && strand->body) {
48 frame->access_regs[result] = strand->body->uregs.access_regs[result];