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
91
92
|
//! 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 reap = @import("kata/reap.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),
invocations.REAP => reap.invoke(ctx),
else => result.set_error(ctx),
}
}
|