75 lines
2.0 KiB
Zig
75 lines
2.0 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn build(b: *std.Build) void {
|
|
const optimize = .Debug;
|
|
const target = b.standardTargetOptions(.{
|
|
.default_target = .{
|
|
.cpu_arch = .riscv64,
|
|
.os_tag = .freestanding,
|
|
.abi = .none,
|
|
}
|
|
});
|
|
|
|
const kernel_module = b.addModule("kernel", .{
|
|
.optimize = optimize,
|
|
.target = target,
|
|
.pic = true,
|
|
.red_zone = false,
|
|
.code_model = .medium,
|
|
.root_source_file = b.path("src/kernel.zig")
|
|
});
|
|
|
|
const kernel = b.addExecutable(.{
|
|
.name = "kernel",
|
|
.root_module = kernel_module,
|
|
.pic = true
|
|
});
|
|
kernel.pie = true;
|
|
|
|
kernel.entry = .{.symbol_name = "__rv64_entry"};
|
|
|
|
kernel.setLinkerScript(b.path("etc/riscv64-unknown-none.ld"));
|
|
kernel.addCSourceFiles(.{
|
|
.files = &.{
|
|
"src/arch/riscv64/entry.S"
|
|
},
|
|
.flags = &.{},
|
|
});
|
|
b.installArtifact(kernel);
|
|
|
|
const elf2bin = b.addSystemCommand(&.{
|
|
"llvm-objcopy",
|
|
"-O", "binary",
|
|
"zig-out/bin/kernel",
|
|
"zig-out/bin/kernel.bin"
|
|
});
|
|
|
|
// TODO QEMU binary override
|
|
const qemu_info = switch (target.result.cpu.arch) {
|
|
.riscv64 => .{ "qemu-system-riscv64", "rv64" },
|
|
else => unreachable,
|
|
};
|
|
|
|
const qemu_cmd = b.addSystemCommand(&.{
|
|
qemu_info[0],
|
|
"-M", "virt",
|
|
"-kernel", "zig-out/bin/kernel.bin",
|
|
"-m", "256M",
|
|
"-cpu", qemu_info[1],
|
|
"-serial", "mon:stdio",
|
|
"-display", "none"
|
|
});
|
|
|
|
if (target.result.cpu.arch == .riscv64) {
|
|
qemu_cmd.addArgs(&.{
|
|
"-bios", "etc/boot/rv64_fw_jump.bin"
|
|
});
|
|
}
|
|
|
|
elf2bin.step.dependOn(b.getInstallStep());
|
|
qemu_cmd.step.dependOn(&elf2bin.step);
|
|
if (b.args) |args| qemu_cmd.addArgs(args);
|
|
const run_step = b.step("run", "Start the OS in qemu");
|
|
run_step.dependOn(&qemu_cmd.step);
|
|
}
|