aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/invocations/kata/wait.zig
blob: e657e90895dd0610b3296a48c7e2e4bb76004b3d (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
//! Wait invocation - Wait for child Kata to dissolve

const handler = @import("../handler.zig");
const int = @import("../../utils/types/int.zig");
const kata_mod = @import("../../kata/kata.zig");
const result = @import("../../utils/types/result.zig");
const sensei = @import("../../kata/sensei/sensei.zig");

pub fn invoke(ctx: *handler.InvocationContext) void {
    const target_id = int.u32_of(ctx.rdi);

    const target = kata_mod.get_kata(target_id) orelse return result.set_error(ctx);

    // Zombie or Dissolved means the child has exited
    if (target.state == .Zombie or target.state == .Dissolved) {
        return result.set_value(ctx, target.exit_code);
    }

    const current = sensei.get_current_kata() orelse return result.set_error(ctx);

    current.state = .Stalled;
    current.waiting_for = target_id;

    current.context.rax = 0;
    current.context.rbx = ctx.rbx;
    current.context.rcx = ctx.rcx;
    current.context.rdx = ctx.rdx;
    current.context.rsi = ctx.rsi;
    current.context.rdi = ctx.rdi;
    current.context.rbp = ctx.rbp;
    current.context.rsp = ctx.rsp;
    current.context.r8 = ctx.r8;
    current.context.r9 = ctx.r9;
    current.context.r10 = ctx.r10;
    current.context.r11 = ctx.r11;
    current.context.r12 = ctx.r12;
    current.context.r13 = ctx.r13;
    current.context.r14 = ctx.r14;
    current.context.r15 = ctx.r15;
    current.context.rip = ctx.rip;
    current.context.rflags = ctx.rflags;
    current.context.cs = ctx.cs;
    current.context.ss = ctx.ss;

    sensei.schedule();
}