refactor(amd64): rework MSR handling

This commit is contained in:
Loïc Grégoire
2026-04-14 22:21:36 -04:00
parent ddb1ce185f
commit a34f179d84
3 changed files with 24 additions and 6 deletions
+22 -4
View File
@@ -6,6 +6,7 @@ pub const name = "amd64";
pub const Msr = enum(u32) { pub const Msr = enum(u32) {
/// IA32_APIC_BASE /// IA32_APIC_BASE
LapicBase = 0x1B, LapicBase = 0x1B,
X2ApicBase = 0x800,
/// IA32_FS_BASE /// IA32_FS_BASE
FsBase = 0xC000_0100, FsBase = 0xC000_0100,
/// IA32_GS_BASE /// IA32_GS_BASE
@@ -20,6 +21,7 @@ pub const Msr = enum(u32) {
LStar = 0xC000_0082, LStar = 0xC000_0082,
/// MSR_KVM_SYSTEM_TIME_NEW /// MSR_KVM_SYSTEM_TIME_NEW
KvmSystemTimeNew = 0x4B564D01, KvmSystemTimeNew = 0x4B564D01,
_,
}; };
pub const IrqFrame = extern struct { pub const IrqFrame = extern struct {
@@ -92,26 +94,34 @@ pub inline fn inl(port: u16) u32 {
); );
} }
pub inline fn rdmsr(msr: Msr) u64 { pub inline fn rdmsr(msr: u32) u64 {
var low: u32 = undefined; var low: u32 = undefined;
var high: u32 = undefined; var high: u32 = undefined;
asm volatile ("rdmsr" asm volatile ("rdmsr"
: [low] "={eax}" (low), : [low] "={eax}" (low),
[high] "={edx}" (high), [high] "={edx}" (high),
: [msr] "{ecx}" (@intFromEnum(msr)), : [msr] "{ecx}" (msr),
); );
return @as(u64, high) << 32 | low; return @as(u64, high) << 32 | low;
} }
pub inline fn wrmsr(msr: Msr, value: u64) void { pub inline fn wrmsr(msr: u32, value: u64) void {
asm volatile ("wrmsr" asm volatile ("wrmsr"
: :
: [low] "{eax}" (@as(u32, @truncate(value))), : [low] "{eax}" (@as(u32, @truncate(value))),
[high] "{edx}" (@as(u32, @truncate(value >> 32))), [high] "{edx}" (@as(u32, @truncate(value >> 32))),
[msr] "{ecx}" (@intFromEnum(msr)), [msr] "{ecx}" (msr),
); );
} }
pub inline fn read_msr(comptime msr: Msr) u64 {
return rdmsr(@intFromEnum(msr));
}
pub inline fn write_msr(comptime msr: Msr, value: u64) void {
wrmsr(@intFromEnum(msr), value);
}
pub inline fn rdgsbase() usize { pub inline fn rdgsbase() usize {
return asm volatile ("rdgsbase %[ret]" return asm volatile ("rdgsbase %[ret]"
: [ret] "=r" (-> usize), : [ret] "=r" (-> usize),
@@ -630,6 +640,14 @@ pub const Idtr = extern struct {
base: usize align(1), base: usize align(1),
}; };
pub fn sidtr() Idtr {
var idtr: Idtr = undefined;
asm volatile ("sidt %[idtr]"
: [idtr] "={memory}" (idtr),
);
return idtr;
}
pub const IdtEntry = extern struct { pub const IdtEntry = extern struct {
offset_low: u16 align(1), offset_low: u16 align(1),
selector: u16 align(1), selector: u16 align(1),
+1 -1
View File
@@ -34,5 +34,5 @@ pub fn early_init() linksection(b.init) void {
int.init(); int.init();
// Enable Per-CPU data for this CPU // Enable Per-CPU data for this CPU
amd64.wrmsr(.GsBase, 0); amd64.write_msr(.GsBase, 0);
} }
+1 -1
View File
@@ -33,7 +33,7 @@ pub fn init() linksection(b.init) void {
const page = mm.phys.alloc(); const page = mm.phys.alloc();
pvclock = @ptrFromInt(mm.p2v(page)); pvclock = @ptrFromInt(mm.p2v(page));
amd64.wrmsr(.KvmSystemTimeNew, page | 1); amd64.write_msr(.KvmSystemTimeNew, page | 1);
time_at_boot = read_pvclock(); time_at_boot = read_pvclock();