aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/invocations/kata/yield.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai.old/invocations/kata/yield.zig')
-rw-r--r--mirai.old/invocations/kata/yield.zig42
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);
+}