stos/amd64: Add MSR register helpers
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Chloe M.
|
||||
* Provided under the BSD-3 clause.
|
||||
*
|
||||
* Description: Model specific register helpers
|
||||
* Author: Chloe M.
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_MSR_H_
|
||||
#define _MACHINE_MSR_H_ 1
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#include <stdef.h>
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
|
||||
#define IA32_SPEC_CTL 0x00000048
|
||||
#define IA32_KERNEL_GS_BASE 0xC0000102
|
||||
#define IA32_GS_BASE 0xC0000101
|
||||
#define IA32_FS_BASE 0xC0000100
|
||||
#define IA32_APIC_BASE_MSR 0x0000001B
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
ALWAYS_INLINE static inline UQUAD
|
||||
MdRdmsr(ULONG Address)
|
||||
{
|
||||
ULONG Low, High;
|
||||
|
||||
ASMV(
|
||||
"rdmsr"
|
||||
: "=a" (Low), "=d" (High)
|
||||
: "c" (Address)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
return ((UQUAD)High << 32) | Low;
|
||||
}
|
||||
|
||||
ALWAYS_INLINE static inline VOID
|
||||
MdWrmsr(ULONG Address, UQUAD Value)
|
||||
{
|
||||
ULONG Low, High;
|
||||
|
||||
Low = Value & 0xFFFFFFFF;
|
||||
High = (Value >> 32) & 0xFFFFFFFF;
|
||||
|
||||
ASMV(
|
||||
"wrmsr"
|
||||
:
|
||||
: "a" (Low), "d" (High),
|
||||
"c" (Address)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
#endif /* !_MACHINE_MSR_H_ */
|
||||
Reference in New Issue
Block a user