diff options
Diffstat (limited to 'mirai.old/invocations/kata/yield.zig')
| -rw-r--r-- | mirai.old/invocations/kata/yield.zig | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/mirai.old/invocations/kata/yield.zig b/mirai.old/invocations/kata/yield.zig new file mode 100644 index 0000000..0da91af --- /dev/null +++ b/mirai.old/invocations/kata/yield.zig @@ -0,0 +1,42 @@ +//! Yield invocation - Voluntarily give up CPU time to Sensei + +const handler = @import("../handler.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 kata = sensei.get_current_kata() orelse return result.set_error(ctx); + + kata.state = kata_mod.State.Alive; + + // Save context before switching - schedule() may not return + kata.context.rax = 0; // Return value for yield + kata.context.rbx = ctx.rbx; + kata.context.rcx = ctx.rcx; + kata.context.rdx = ctx.rdx; + kata.context.rsi = ctx.rsi; + kata.context.rdi = ctx.rdi; + kata.context.rbp = ctx.rbp; + kata.context.rsp = ctx.rsp; + kata.context.r8 = ctx.r8; + kata.context.r9 = ctx.r9; + kata.context.r10 = ctx.r10; + kata.context.r11 = ctx.r11; + kata.context.r12 = ctx.r12; + kata.context.r13 = ctx.r13; + kata.context.r14 = ctx.r14; + kata.context.r15 = ctx.r15; + kata.context.rip = ctx.rip; + kata.context.rflags = ctx.rflags; + kata.context.cs = ctx.cs; + kata.context.ss = ctx.ss; + + if (!sensei.is_in_queue(kata)) { + sensei.enqueue_kata(kata); + } + + sensei.schedule(); + + result.set_ok(ctx); +} |
