-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.zig
More file actions
77 lines (67 loc) · 3.41 KB
/
build.zig
File metadata and controls
77 lines (67 loc) · 3.41 KB
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
const std = @import("std");
pub fn build(b: *std.Build) void {
var disabled_features = std.Target.Cpu.Feature.Set.empty;
var enabled_features = std.Target.Cpu.Feature.Set.empty;
disabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.mmx));
disabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.sse));
disabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.sse2));
disabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.avx));
disabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.avx2));
enabled_features.addFeature(@intFromEnum(std.Target.x86.Feature.soft_float));
const target_query = std.Target.Query{
.cpu_arch = std.Target.Cpu.Arch.x86_64,
.os_tag = std.Target.Os.Tag.freestanding,
.abi = std.Target.Abi.none,
.cpu_features_sub = disabled_features,
.cpu_features_add = enabled_features,
};
const optimize = b.standardOptimizeOption(.{.preferred_optimize_mode = .ReleaseSafe});
const kernel = b.addExecutable(.{
.name = "kernel.elf",
.root_module = b.createModule(
.{
.root_source_file = b.path("src/kernel/main.zig"),
.target = b.resolveTargetQuery(target_query),
.optimize = optimize,
.code_model = .kernel
}),
});
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/boot/boot.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/gdt/reloadSegments.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/gdt/setCr3.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/scheduler/switch_to_task.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/scheduler/ring3.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/enable_sse.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/clear_sse.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/disable_sse.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/fxsave.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/fxrstor.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/enable_avx.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/xsave.S"));
kernel.addAssemblyFile(b.path("src/kernel/arch/x86_64/vector/xrstor.S"));
kernel.addAssemblyFile(b.path("src/kernel/syscalls/syscall.S"));
const installAssembly = b.addInstallBinFile(kernel.getEmittedAsm(), "kernel.s");
b.getInstallStep().dependOn(&installAssembly.step);
const limine_zig = b.dependency("limine_zig", .{
// The API revision of the Limine Boot Protocol to use, if not provided
// it defaults to 0. Newer revisions may change the behavior of the bootloader.
.api_revision = 3,
// Whether to allow using deprecated features of the Limine Boot Protocol.
// If set to false, the build will fail if deprecated features are used.
.allow_deprecated = false,
// Whether to expose pointers in the API. When set to true, any field
// that is a pointer will be exposed as a raw address instead.
.no_pointers = false,
});
// Get the Limine module
const limine_module = limine_zig.module("limine");
// Import the Limine module into the kernel
kernel.root_module.addImport("limine", limine_module);
kernel.addIncludePath(b.path("libsyscall"));
// Try to eliminate a GPF
kernel.root_module.error_tracing = false;
kernel.setLinkerScript(b.path("src/kernel/arch/x86_64/linker.ld"));
b.installArtifact(kernel);
const kernel_step = b.step("kernel", "Build the kernel");
kernel_step.dependOn(&kernel.step);
}