kernel/x86_64: inline x86_{read, write}_msr()
This patch makes it possible to inline rdmsr and wrmsr instruction. The performance impact shouldn't be significant since they are used relatively rarely and wrmsr is usually a serializing instruction, but there is no reason not to do so.
This commit is contained in:
parent
88e8e24c84
commit
76636769bd
@ -9,6 +9,22 @@
|
|||||||
#include <arch_thread_types.h>
|
#include <arch_thread_types.h>
|
||||||
|
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
x86_read_msr(uint32_t msr)
|
||||||
|
{
|
||||||
|
uint64_t high, low;
|
||||||
|
asm volatile("rdmsr" : "=a" (low), "=d" (high) : "c" (msr));
|
||||||
|
return (high << 32) | low;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
x86_write_msr(uint32_t msr, uint64_t value)
|
||||||
|
{
|
||||||
|
asm volatile("wrmsr" : : "a" (value) , "d" (value >> 32), "c" (msr));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
x86_context_switch(arch_thread* oldState, arch_thread* newState)
|
x86_context_switch(arch_thread* oldState, arch_thread* newState)
|
||||||
{
|
{
|
||||||
|
@ -461,8 +461,6 @@ void x86_fxrstor(const void* fpuState);
|
|||||||
void x86_noop_swap(void* oldFpuState, const void* newFpuState);
|
void x86_noop_swap(void* oldFpuState, const void* newFpuState);
|
||||||
void x86_fxsave_swap(void* oldFpuState, const void* newFpuState);
|
void x86_fxsave_swap(void* oldFpuState, const void* newFpuState);
|
||||||
addr_t x86_get_stack_frame();
|
addr_t x86_get_stack_frame();
|
||||||
uint64 x86_read_msr(uint32 registerNumber);
|
|
||||||
void x86_write_msr(uint32 registerNumber, uint64 value);
|
|
||||||
uint32 x86_count_mtrrs(void);
|
uint32 x86_count_mtrrs(void);
|
||||||
void x86_set_mtrr(uint32 index, uint64 base, uint64 length, uint8 type);
|
void x86_set_mtrr(uint32 index, uint64 base, uint64 length, uint8 type);
|
||||||
status_t x86_get_mtrr(uint32 index, uint64* _base, uint64* _length,
|
status_t x86_get_mtrr(uint32 index, uint64* _base, uint64* _length,
|
||||||
@ -481,6 +479,10 @@ void x86_hardware_interrupt(iframe* frame);
|
|||||||
void x86_page_fault_exception(iframe* iframe);
|
void x86_page_fault_exception(iframe* iframe);
|
||||||
|
|
||||||
#ifndef __x86_64__
|
#ifndef __x86_64__
|
||||||
|
|
||||||
|
uint64 x86_read_msr(uint32 registerNumber);
|
||||||
|
void x86_write_msr(uint32 registerNumber, uint64 value);
|
||||||
|
|
||||||
void x86_context_switch(struct arch_thread* oldState,
|
void x86_context_switch(struct arch_thread* oldState,
|
||||||
struct arch_thread* newState);
|
struct arch_thread* newState);
|
||||||
|
|
||||||
|
@ -55,28 +55,6 @@ FUNCTION(x86_get_stack_frame):
|
|||||||
FUNCTION_END(x86_get_stack_frame)
|
FUNCTION_END(x86_get_stack_frame)
|
||||||
|
|
||||||
|
|
||||||
/* uint64 x86_read_msr(uint32 register); */
|
|
||||||
FUNCTION(x86_read_msr):
|
|
||||||
mov %edi, %ecx
|
|
||||||
rdmsr
|
|
||||||
shl $32, %rdx
|
|
||||||
mov %eax, %eax
|
|
||||||
or %rdx, %rax
|
|
||||||
ret
|
|
||||||
FUNCTION_END(x86_read_msr)
|
|
||||||
|
|
||||||
|
|
||||||
/* void x86_write_msr(uint32 register, uint64 value); */
|
|
||||||
FUNCTION(x86_write_msr):
|
|
||||||
mov %rsi, %rdx
|
|
||||||
mov %esi, %eax
|
|
||||||
mov %edi, %ecx
|
|
||||||
shr $32, %rdx
|
|
||||||
wrmsr
|
|
||||||
ret
|
|
||||||
FUNCTION_END(x86_write_msr)
|
|
||||||
|
|
||||||
|
|
||||||
/* void x86_64_thread_entry(); */
|
/* void x86_64_thread_entry(); */
|
||||||
FUNCTION(x86_64_thread_entry):
|
FUNCTION(x86_64_thread_entry):
|
||||||
xorq %rbp, %rbp
|
xorq %rbp, %rbp
|
||||||
|
Loading…
Reference in New Issue
Block a user