mirror of
https://github.com/rdmsr/zag.git
synced 2026-11-02 08:08:21 +00:00
refactor(amd64): rework MSR handling
This commit is contained in:
+22
-4
@@ -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),
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user