ZXFoundation™ 26h2
Loading...
Searching...
No Matches
svc.cxxm
Go to the documentation of this file.
1/// SPDX-License-Identifier: Apache-2.0
2/// @file svc.cxxm
3/// @brief Centralized SVC dispatch.
4
5export module arch.s390x.trap.svc;
6import arch.s390x.cpu.lowcore;
7import arch.s390x.cpu.irq;
8import zxfoundation.dgp.gate.types;
9import zxfoundation.dgp.gate.dispatch;
10import zxfoundation.dgp.domain.types;
11import zxfoundation.dgp.domain.types;
12import zxfoundation.base.types;
13import zxfoundation.base.typestate;
14
15export {
16
17namespace arch::s390x::trap::svc {
18
19 using zxfoundation::dgp::gate::call_namespace;
20 using zxfoundation::dgp::gate::sys_op;
21 using zxfoundation::dgp::gate::dispatch::dispatch;
22 using zxfoundation::base::lifecycle_state;
23
24 /// @brief Centralized SVC nucleus-call dispatcher.
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];
32
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) {
36 return ~0ULL;
37 }
38
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];
49 }
50 }
51 return result;
52 }
53
54} // namespace arch::s390x::trap::svc
55
56} // end export