mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 00:46:31 +00:00
bugfix: 在物理机上,由于不支持的内存访问类型,导致无法初始化HPET
This commit is contained in:
@ -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;
|
||||
}
|
Reference in New Issue
Block a user