Move tty to arch
This commit is contained in:
parent
c4083b0161
commit
e2533a2264
8 changed files with 2231 additions and 2209 deletions
|
@ -16,9 +16,11 @@ const multiboot = @import("multiboot.zig");
|
||||||
const pmm = @import("pmm.zig");
|
const pmm = @import("pmm.zig");
|
||||||
const vmm = @import("../../vmm.zig");
|
const vmm = @import("../../vmm.zig");
|
||||||
const log = @import("../../log.zig");
|
const log = @import("../../log.zig");
|
||||||
const tty = @import("../../tty.zig");
|
const tty = @import("tty.zig");
|
||||||
|
const vga = @import("vga.zig");
|
||||||
const Serial = @import("../../serial.zig").Serial;
|
const Serial = @import("../../serial.zig").Serial;
|
||||||
const panic = @import("../../panic.zig").panic;
|
const panic = @import("../../panic.zig").panic;
|
||||||
|
const TTY = @import("../../tty.zig").TTY;
|
||||||
const MemProfile = mem.MemProfile;
|
const MemProfile = mem.MemProfile;
|
||||||
|
|
||||||
/// The virtual end of the kernel code
|
/// The virtual end of the kernel code
|
||||||
|
@ -282,6 +284,25 @@ pub fn initSerial(boot_payload: BootPayload) Serial {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Initialise the TTY and construct a TTY instance
|
||||||
|
///
|
||||||
|
/// Arguments:
|
||||||
|
/// IN boot_payload: BootPayload - The payload passed to the kernel on boot
|
||||||
|
///
|
||||||
|
/// Return: tty.TTY
|
||||||
|
/// The TTY instance constructed with the information required by the rest of the kernel
|
||||||
|
///
|
||||||
|
pub fn initTTY(boot_payload: BootPayload) TTY {
|
||||||
|
return .{
|
||||||
|
.print = tty.writeString,
|
||||||
|
.setCursor = tty.setCursor,
|
||||||
|
.cols = vga.WIDTH,
|
||||||
|
.rows = vga.HEIGHT,
|
||||||
|
.clear = tty.clearScreen,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Initialise the system's memory. Populates a memory profile with boot modules from grub, the amount of available memory, the reserved regions of virtual and physical memory as well as the start and end of the kernel code
|
/// Initialise the system's memory. Populates a memory profile with boot modules from grub, the amount of available memory, the reserved regions of virtual and physical memory as well as the start and end of the kernel code
|
||||||
///
|
///
|
||||||
|
@ -391,6 +412,11 @@ pub fn init(mb_info: *multiboot.multiboot_info_t, mem_profile: *const MemProfile
|
||||||
syscalls.init();
|
syscalls.init();
|
||||||
|
|
||||||
enableInterrupts();
|
enableInterrupts();
|
||||||
|
|
||||||
|
// Initialise the VGA and TTY here since their tests belong the architecture and so should be a part of the
|
||||||
|
// arch init test messages
|
||||||
|
vga.init();
|
||||||
|
tty.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
test "" {
|
test "" {
|
||||||
|
@ -404,4 +430,7 @@ test "" {
|
||||||
_ = @import("rtc.zig");
|
_ = @import("rtc.zig");
|
||||||
_ = @import("syscalls.zig");
|
_ = @import("syscalls.zig");
|
||||||
_ = @import("paging.zig");
|
_ = @import("paging.zig");
|
||||||
|
_ = @import("serial.zig");
|
||||||
|
_ = @import("tty.zig");
|
||||||
|
_ = @import("vga.zig");
|
||||||
}
|
}
|
||||||
|
|
2106
src/kernel/arch/x86/tty.zig
Normal file
2106
src/kernel/arch/x86/tty.zig
Normal file
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,9 @@ const builtin = @import("builtin");
|
||||||
const is_test = builtin.is_test;
|
const is_test = builtin.is_test;
|
||||||
const expectEqual = std.testing.expectEqual;
|
const expectEqual = std.testing.expectEqual;
|
||||||
const build_options = @import("build_options");
|
const build_options = @import("build_options");
|
||||||
const mock_path = build_options.mock_path;
|
const arch = if (is_test) @import(build_options.arch_mock_path ++ "arch_mock.zig") else @import("arch.zig");
|
||||||
const arch = @import("arch.zig").internals;
|
const log = if (is_test) @import(build_options.arch_mock_path ++ "log_mock.zig") else @import("../../log.zig");
|
||||||
const log = if (is_test) @import(mock_path ++ "log_mock.zig") else @import("log.zig");
|
const panic = @import("../../panic.zig").panic;
|
||||||
const panic = @import("panic.zig").panic;
|
|
||||||
|
|
||||||
/// The port address for the VGA register selection.
|
/// The port address for the VGA register selection.
|
||||||
const PORT_ADDRESS: u16 = 0x03D4;
|
const PORT_ADDRESS: u16 = 0x03D4;
|
|
@ -55,8 +55,6 @@ export fn kmain(boot_payload: arch.BootPayload) void {
|
||||||
arch.init(boot_payload, &mem_profile, &fixed_allocator.allocator);
|
arch.init(boot_payload, &mem_profile, &fixed_allocator.allocator);
|
||||||
log.logInfo("Arch init done\n", .{});
|
log.logInfo("Arch init done\n", .{});
|
||||||
|
|
||||||
vga.init();
|
|
||||||
tty.init();
|
|
||||||
// Give the kernel heap 10% of the available memory. This can be fine-tuned as time goes on.
|
// Give the kernel heap 10% of the available memory. This can be fine-tuned as time goes on.
|
||||||
var heap_size = mem_profile.mem_kb / 10 * 1024;
|
var heap_size = mem_profile.mem_kb / 10 * 1024;
|
||||||
// The heap size must be a power of two so find the power of two smaller than or equal to the heap_size
|
// The heap size must be a power of two so find the power of two smaller than or equal to the heap_size
|
||||||
|
@ -66,8 +64,21 @@ export fn kmain(boot_payload: arch.BootPayload) void {
|
||||||
var kernel_heap = heap.init(arch.VmmPayload, &kernel_vmm, vmm.Attributes{ .kernel = true, .writable = true, .cachable = true }, heap_size, &fixed_allocator.allocator) catch |e| {
|
var kernel_heap = heap.init(arch.VmmPayload, &kernel_vmm, vmm.Attributes{ .kernel = true, .writable = true, .cachable = true }, heap_size, &fixed_allocator.allocator) catch |e| {
|
||||||
panic_root.panic(@errorReturnTrace(), "Failed to initialise kernel heap: {}\n", .{e});
|
panic_root.panic(@errorReturnTrace(), "Failed to initialise kernel heap: {}\n", .{e});
|
||||||
};
|
};
|
||||||
|
tty.init(&kernel_heap.allocator, boot_payload);
|
||||||
|
|
||||||
log.logInfo("Init done\n", .{});
|
log.logInfo("Init done\n", .{});
|
||||||
|
|
||||||
|
tty.clear();
|
||||||
|
const logo =
|
||||||
|
\\ _____ _ _ _ _______ ____
|
||||||
|
\\ | __ \ | | | | | | |__ __| / __ \
|
||||||
|
\\ | |__) | | | | | | | | | | | | |
|
||||||
|
\\ | ___/ | | | | | | | | | | | |
|
||||||
|
\\ | | | |____ | |__| | | | | |__| |
|
||||||
|
\\ |_| |______| \____/ |_| \____/
|
||||||
|
;
|
||||||
|
tty.print("{}\n\n", .{logo});
|
||||||
|
|
||||||
tty.print("Hello Pluto from kernel :)\n", .{});
|
tty.print("Hello Pluto from kernel :)\n", .{});
|
||||||
|
|
||||||
// The panic runtime tests must run last as they never return
|
// The panic runtime tests must run last as they never return
|
||||||
|
|
2255
src/kernel/tty.zig
2255
src/kernel/tty.zig
File diff suppressed because it is too large
Load diff
|
@ -36,4 +36,9 @@ def get_test_cases(TestCase):
|
||||||
TestCase("Syscalls init", [r"Init syscalls"]),
|
TestCase("Syscalls init", [r"Init syscalls"]),
|
||||||
TestCase("Syscalls tests", [r"Syscalls: Tested no args", r"Syscalls: Tested 1 arg", r"Syscalls: Tested 2 args", r"Syscalls: Tested 3 args", r"Syscalls: Tested 4 args", r"Syscalls: Tested 5 args"]),
|
TestCase("Syscalls tests", [r"Syscalls: Tested no args", r"Syscalls: Tested 1 arg", r"Syscalls: Tested 2 args", r"Syscalls: Tested 3 args", r"Syscalls: Tested 4 args", r"Syscalls: Tested 5 args"]),
|
||||||
TestCase("Syscalls done", [r"Done syscalls"]),
|
TestCase("Syscalls done", [r"Done syscalls"]),
|
||||||
|
TestCase("VGA init", [r"Init vga"]),
|
||||||
|
TestCase("VGA tests", [r"VGA: Tested max scan line", r"VGA: Tested cursor shape", r"VGA: Tested updating cursor"]),
|
||||||
|
TestCase("VGA done", [r"Done vga"]),
|
||||||
|
TestCase("TTY tests", [r"TTY: Tested globals", r"TTY: Tested printing"]),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -7,6 +7,7 @@ const idt = @import("idt_mock.zig");
|
||||||
const vmm = @import("vmm_mock.zig");
|
const vmm = @import("vmm_mock.zig");
|
||||||
const paging = @import("paging_mock.zig");
|
const paging = @import("paging_mock.zig");
|
||||||
const Serial = @import("../../../src/kernel/serial.zig").Serial;
|
const Serial = @import("../../../src/kernel/serial.zig").Serial;
|
||||||
|
const TTY = @import("../../../src/kernel/tty.zig").TTY;
|
||||||
|
|
||||||
const mock_framework = @import("mock_framework.zig");
|
const mock_framework = @import("mock_framework.zig");
|
||||||
pub const initTest = mock_framework.initTest;
|
pub const initTest = mock_framework.initTest;
|
||||||
|
@ -106,6 +107,16 @@ pub fn initSerial(boot_payload: BootPayload) Serial {
|
||||||
return .{ .write = undefined };
|
return .{ .write = undefined };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn initTTY(boot_payload: BootPayload) TTY {
|
||||||
|
return .{
|
||||||
|
.print = undefined,
|
||||||
|
.setCursor = undefined,
|
||||||
|
.cols = undefined,
|
||||||
|
.rows = undefined,
|
||||||
|
.clear = null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn initMem(payload: BootPayload) std.mem.Allocator.Error!mem.MemProfile {
|
pub fn initMem(payload: BootPayload) std.mem.Allocator.Error!mem.MemProfile {
|
||||||
return MemProfile{
|
return MemProfile{
|
||||||
.vaddr_end = @ptrCast([*]u8, &KERNEL_VADDR_END),
|
.vaddr_end = @ptrCast([*]u8, &KERNEL_VADDR_END),
|
||||||
|
|
|
@ -56,16 +56,12 @@ def get_pre_archinit_cases():
|
||||||
def get_post_archinit_cases():
|
def get_post_archinit_cases():
|
||||||
return [
|
return [
|
||||||
TestCase("Arch init finishes", [r"Arch init done"]),
|
TestCase("Arch init finishes", [r"Arch init done"]),
|
||||||
TestCase("VGA init", [r"Init vga"]),
|
|
||||||
TestCase("VGA tests", [r"VGA: Tested max scan line", r"VGA: Tested cursor shape", r"VGA: Tested updating cursor"]),
|
|
||||||
TestCase("VGA done", [r"Done vga"]),
|
|
||||||
|
|
||||||
TestCase("TTY init", [r"Init tty"]),
|
|
||||||
TestCase("TTY tests", [r"TTY: Tested globals", r"TTY: Tested printing"]),
|
|
||||||
TestCase("TTY done", [r"Done tty"]),
|
|
||||||
|
|
||||||
TestCase("Heap", [r"Init heap", r"Done heap"]),
|
TestCase("Heap", [r"Init heap", r"Done heap"]),
|
||||||
|
|
||||||
|
TestCase("TTY init", [r"Init tty"]),
|
||||||
|
TestCase("TTY done", [r"Done tty"]),
|
||||||
|
|
||||||
TestCase("Init finishes", [r"Init done"]),
|
TestCase("Init finishes", [r"Init done"]),
|
||||||
|
|
||||||
TestCase("Panic tests", [r"Kernel panic: integer overflow", r"c[a-z\d]+: panic", r"c[a-z\d]+: panic.runtimeTests", r"c[a-z\d]+: kmain", r"c[a-z\d]+: start_higher_half"], r"\[ERROR\] ")
|
TestCase("Panic tests", [r"Kernel panic: integer overflow", r"c[a-z\d]+: panic", r"c[a-z\d]+: panic.runtimeTests", r"c[a-z\d]+: kmain", r"c[a-z\d]+: start_higher_half"], r"\[ERROR\] ")
|
||||||
|
|
Loading…
Reference in a new issue