aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/kata/shift.zig
blob: 52e87fbacb78f787b26eb237772272fd81d4e63d (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
//! Context shifting

const context = @import("../asm/context.zig");
const gdt = @import("../boot/gdt/gdt.zig");
const paging = @import("../memory/paging.zig");
const serial = @import("../drivers/serial/serial.zig");
const tss = @import("../boot/tss/tss.zig");
const types = @import("types.zig");

var current_context: ?*types.Context = null;

pub fn to_kata(kata: *types.Kata) void {
    // Validate that the target RIP is mapped in the page table
    if (paging.virt_to_phys(kata.page_table, kata.context.rip) == null) {
        serial.printf("shift: FATAL - kata {d} rip {x} not mapped!\n", .{ kata.id, kata.context.rip });
        paging.dump_pt_structure(kata.page_table, "corrupted");
        while (true) {}
    }

    tss.set_kernel_stack(kata.stack_top);
    current_context = &kata.context;

    context.switch_to_context(
        &kata.context,
        kata.page_table,
        kata.stack_top,
    );
}

pub fn save_current(int_ctx: *const types.InterruptContext) void {
    if (current_context) |ctx| {
        ctx.rax = int_ctx.rax;
        ctx.rbx = int_ctx.rbx;
        ctx.rcx = int_ctx.rcx;
        ctx.rdx = int_ctx.rdx;
        ctx.rsi = int_ctx.rsi;
        ctx.rdi = int_ctx.rdi;
        ctx.rbp = int_ctx.rbp;
        ctx.rsp = int_ctx.rsp;
        ctx.r8 = int_ctx.r8;
        ctx.r9 = int_ctx.r9;
        ctx.r10 = int_ctx.r10;
        ctx.r11 = int_ctx.r11;
        ctx.r12 = int_ctx.r12;
        ctx.r13 = int_ctx.r13;
        ctx.r14 = int_ctx.r14;
        ctx.r15 = int_ctx.r15;
        ctx.rip = int_ctx.rip;
        ctx.rflags = int_ctx.rflags;
        ctx.cs = int_ctx.cs;
        ctx.ss = int_ctx.ss;
    }
}