blob: 3ad64befc6bfaa8e8c9fc80d15eaf1d2cc3346a4 (
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
|
//! Context shifting
const context = @import("../asm/context.zig");
const gdt = @import("../boot/gdt/gdt.zig");
const kata_memory = @import("memory.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 {
// Process any deferred page table cleanups before switching
// Exclude the target kata's page table from cleanup
kata_memory.process_deferred_cleanup(kata.page_table);
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;
}
}
|