bugfix: 在物理机上,由于不支持的内存访问类型,导致无法初始化HPET

This commit is contained in:
fslongjin
2022-09-01 21:08:27 +08:00
parent dffa51b1ef
commit 33a1e2baad
4 changed files with 93 additions and 29 deletions

View File

@ -487,7 +487,69 @@ static inline uint64_t copy_to_user(void *dst, void *src, uint64_t size)
/**
* @brief 这个函数让蜂鸣器发声,目前仅用于真机调试。未来将移除,请勿依赖此函数。
*
*
* @param times 发声循环多少遍
*/
void __experimental_beep(uint64_t times);
void __experimental_beep(uint64_t times);
/**
* @brief 往指定地址写入8字节
* 防止由于编译器优化导致不支持的内存访问类型尤其是在mmio的时候
*
* @param vaddr 虚拟地址
* @param value 要写入的值
*/
static __always_inline void __write8b(uint64_t vaddr, uint64_t value)
{
asm volatile("movq %%rdx, 0(%%rax)" ::"a"(vaddr), "d"(value)
: "memory");
}
/**
* @brief 往指定地址写入4字节
* 防止由于编译器优化导致不支持的内存访问类型尤其是在mmio的时候
*
* @param vaddr 虚拟地址
* @param value 要写入的值
*/
static __always_inline void __write4b(uint64_t vaddr, uint32_t value)
{
asm volatile("movl %%edx, 0(%%rax)" ::"a"(vaddr), "d"(value)
: "memory");
}
/**
* @brief 从指定地址读取8字节
* 防止由于编译器优化导致不支持的内存访问类型尤其是在mmio的时候
*
* @param vaddr 虚拟地址
* @return uint64_t 读取到的值
*/
static __always_inline uint64_t __read8b(uint64_t vaddr)
{
uint64_t retval;
asm volatile("movq 0(%%rax), %0"
: "=r"(retval)
: "a"(vaddr)
: "memory");
return retval;
}
/**
* @brief 从指定地址读取4字节
* 防止由于编译器优化导致不支持的内存访问类型尤其是在mmio的时候
*
* @param vaddr 虚拟地址
* @return uint64_t 读取到的值
*/
static __always_inline uint32_t __read4b(uint64_t vaddr)
{
uint32_t retval;
asm volatile("movl 0(%%rax), %0"
: "=d"(retval)
: "a"(vaddr)
: "memory");
return retval;
}