fix(kernel), feat(Timekeeping): Rely on system OVMF firmware for emulation, Rudimentary time zone support

This commit is contained in:
2025-12-06 17:41:58 +01:00
parent 18ab628682
commit bfcc74514b
4 changed files with 60 additions and 26 deletions
+16 -24
View File
@@ -30,23 +30,23 @@ run: run-$(ARCH)
run-hdd: run-hdd-$(ARCH) run-hdd: run-hdd-$(ARCH)
.PHONY: run-x86_64 .PHONY: run-x86_64
run-x86_64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso run-x86_64: $(IMAGE_NAME).iso
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M q35 \ -M q35 \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-cdrom $(IMAGE_NAME).iso \ -cdrom $(IMAGE_NAME).iso \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-hdd-x86_64 .PHONY: run-hdd-x86_64
run-hdd-x86_64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd run-hdd-x86_64: $(IMAGE_NAME).hdd
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M q35 \ -M q35 \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-hda $(IMAGE_NAME).hdd \ -hda $(IMAGE_NAME).hdd \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-aarch64 .PHONY: run-aarch64
run-aarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso run-aarch64: $(IMAGE_NAME).iso
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu cortex-a72 \ -cpu cortex-a72 \
@@ -54,12 +54,12 @@ run-aarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-cdrom $(IMAGE_NAME).iso \ -cdrom $(IMAGE_NAME).iso \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-hdd-aarch64 .PHONY: run-hdd-aarch64
run-hdd-aarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd run-hdd-aarch64: $(IMAGE_NAME).hdd
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu cortex-a72 \ -cpu cortex-a72 \
@@ -67,12 +67,12 @@ run-hdd-aarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-hda $(IMAGE_NAME).hdd \ -hda $(IMAGE_NAME).hdd \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-riscv64 .PHONY: run-riscv64
run-riscv64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso run-riscv64: $(IMAGE_NAME).iso
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu rv64 \ -cpu rv64 \
@@ -80,12 +80,12 @@ run-riscv64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-cdrom $(IMAGE_NAME).iso \ -cdrom $(IMAGE_NAME).iso \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-hdd-riscv64 .PHONY: run-hdd-riscv64
run-hdd-riscv64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd run-hdd-riscv64: $(IMAGE_NAME).hdd
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu rv64 \ -cpu rv64 \
@@ -93,12 +93,12 @@ run-hdd-riscv64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-hda $(IMAGE_NAME).hdd \ -hda $(IMAGE_NAME).hdd \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-loongarch64 .PHONY: run-loongarch64
run-loongarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso run-loongarch64: $(IMAGE_NAME).iso
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu la464 \ -cpu la464 \
@@ -106,12 +106,12 @@ run-loongarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).iso
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-cdrom $(IMAGE_NAME).iso \ -cdrom $(IMAGE_NAME).iso \
$(QEMUFLAGS) $(QEMUFLAGS)
.PHONY: run-hdd-loongarch64 .PHONY: run-hdd-loongarch64
run-hdd-loongarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd run-hdd-loongarch64: $(IMAGE_NAME).hdd
qemu-system-$(ARCH) \ qemu-system-$(ARCH) \
-M virt \ -M virt \
-cpu la464 \ -cpu la464 \
@@ -119,7 +119,7 @@ run-hdd-loongarch64: ovmf/ovmf-code-$(ARCH).fd $(IMAGE_NAME).hdd
-device qemu-xhci \ -device qemu-xhci \
-device usb-kbd \ -device usb-kbd \
-device usb-mouse \ -device usb-mouse \
-drive if=pflash,unit=0,format=raw,file=ovmf/ovmf-code-$(ARCH).fd,readonly=on \ -bios /usr/share/ovmf/OVMF.fd \
-hda $(IMAGE_NAME).hdd \ -hda $(IMAGE_NAME).hdd \
$(QEMUFLAGS) $(QEMUFLAGS)
@@ -139,14 +139,6 @@ run-hdd-bios: $(IMAGE_NAME).hdd
-hda $(IMAGE_NAME).hdd \ -hda $(IMAGE_NAME).hdd \
$(QEMUFLAGS) $(QEMUFLAGS)
ovmf/ovmf-code-$(ARCH).fd:
mkdir -p ovmf
curl -Lo $@ https://github.com/osdev0/edk2-ovmf-nightly/releases/latest/download/ovmf-code-$(ARCH).fd
case "$(ARCH)" in \
aarch64) dd if=/dev/zero of=$@ bs=1 count=0 seek=67108864 2>/dev/null;; \
riscv64) dd if=/dev/zero of=$@ bs=1 count=0 seek=33554432 2>/dev/null;; \
esac
limine/limine: limine/limine:
rm -rf limine rm -rf limine
git clone https://github.com/limine-bootloader/limine.git --branch=v9.x-binary --depth=1 git clone https://github.com/limine-bootloader/limine.git --branch=v9.x-binary --depth=1
+25 -1
View File
@@ -10,6 +10,29 @@
using namespace Kt; using namespace Kt;
void Timekeeping::Init(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second) { void Timekeeping::Init(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second) {
/* Hardcode CET for now */
TimeZone CET = {
"Central European Time",
"CET",
1, /* UTC+1 */
0,
false
};
Kt::KernelLogStream(INFO, "Timekeeping Service") << "Setting time zone to " << CET.TZLongName << " (" << CET.TZShortName << ")";
Minute = Minute + CET.MinuteOffset;
Hour = Hour + CET.HourOffset;
if (Minute >= 60) {
Minute -= 60;
Hour += 1;
}
if (Hour >= 24) {
Hour -= 24;
Day += 1;
/* Note: No month/day overflow handling yet */
}
kcp::cstringstream minuteStream; kcp::cstringstream minuteStream;
if (Minute < 10) { if (Minute < 10) {
minuteStream << "0"; minuteStream << "0";
@@ -33,7 +56,8 @@ void Timekeeping::Init(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour,
<< Hour << ":" << Hour << ":"
<< minuteStr << ":" << minuteStr << ":"
<< secondStr; << secondStr
<< " (" << CET.TZLongName << ")";
CString dateString = panelStr.c_str(); CString dateString = panelStr.c_str();
+18
View File
@@ -7,6 +7,24 @@
#include <CppLib/CString.hpp> #include <CppLib/CString.hpp>
namespace Timekeeping { namespace Timekeeping {
/*
Structure representing the attributes of a time zone; properties and time zone configuration will eventually
be loaded from disk/ramdisk.
*/
struct TimeZone {
/* Time zone naming scheme:
i.e. "Central European Time" / "CET"
*/
CString TZLongName;
CString TZShortName;
/* Hour offset from UTC */
int8_t HourOffset;
/* Minute offset from UTC */
int8_t MinuteOffset;
/* Is daylight saving time */
bool IsDST;
};
const CString Months[] = { const CString Months[] = {
nullptr, nullptr,
"January", "January",