aboutsummaryrefslogtreecommitdiff
path: root/mirai/invocations/handler.zig
blob: 0855c721dd7f6f81941bf5da124227917ca0daaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//! Invocation Handler - Entry point for Kata programs calling Mirai

const afs = @import("../fs/afs/afs.zig");
const ahci = @import("../drivers/ahci/ahci.zig");
const invocations = @import("../common/constants/invocations.zig");
const result = @import("../utils/types/result.zig");
const syscall = @import("syscall.zig");

const attach = @import("io/attach.zig");
const getkeychar = @import("io/getkeychar.zig");
const mark = @import("io/mark.zig");
const seal = @import("io/seal.zig");
const view = @import("io/view.zig");
const wipe = @import("io/wipe.zig");

const getlocation = @import("fs/getlocation.zig");
const setlocation = @import("fs/setlocation.zig");
const viewstack = @import("fs/viewstack.zig");

const exit = @import("kata/exit.zig");
const postman = @import("kata/postman.zig");
const spawn = @import("kata/spawn.zig");
const wait = @import("kata/wait.zig");
const yield = @import("kata/yield.zig");

const cpuinfo = @import("os/cpuinfo.zig");
const diskinfo = @import("os/diskinfo.zig");
const gettime = @import("os/gettime.zig");
const meminfo = @import("os/meminfo.zig");
const uptime = @import("os/uptime.zig");

pub const InvocationContext = struct {
    rax: u64,
    rdi: u64,
    rsi: u64,
    rdx: u64,
    r10: u64,
    r8: u64,
    r9: u64,
    rbx: u64,
    rcx: u64,
    rbp: u64,
    rsp: u64,
    r11: u64,
    r12: u64,
    r13: u64,
    r14: u64,
    r15: u64,
    rip: u64,
    rflags: u64,
    cs: u64,
    ss: u64,
};

pub fn init(fs: *afs.AFS(ahci.BlockDevice)) void {
    exit.set_afs_instance(fs);
    attach.set_afs_instance(fs);
    seal.set_afs_instance(fs);
    spawn.set_afs_instance(fs);
    viewstack.set_afs_instance(fs);
    setlocation.set_afs_instance(fs);
    diskinfo.set_afs_instance(fs);

    syscall.init();
}

pub fn handle(ctx: *InvocationContext) void {
    switch (ctx.rax) {
        invocations.EXIT => exit.invoke(ctx),
        invocations.ATTACH => attach.invoke(ctx),
        invocations.SEAL => seal.invoke(ctx),
        invocations.VIEW => view.invoke(ctx),
        invocations.MARK => mark.invoke(ctx),
        invocations.SPAWN => spawn.invoke(ctx),
        invocations.WAIT => wait.invoke(ctx),
        invocations.YIELD => yield.invoke(ctx),
        invocations.GETKEYCHAR => getkeychar.invoke(ctx),
        invocations.VIEWSTACK => viewstack.invoke(ctx),
        invocations.GETLOCATION => getlocation.invoke(ctx),
        invocations.SETLOCATION => setlocation.invoke(ctx),
        invocations.POSTMAN => postman.invoke(ctx),
        invocations.WIPE => wipe.invoke(ctx),
        invocations.CPUINFO => cpuinfo.invoke(ctx),
        invocations.MEMINFO => meminfo.invoke(ctx),
        invocations.UPTIME => uptime.invoke(ctx),
        invocations.GETTIME => gettime.invoke(ctx),
        invocations.DISKINFO => diskinfo.invoke(ctx),
        else => result.set_error(ctx),
    }
}