xref: /DragonOS/kernel/src/arch/riscv64/include/asm/asm.h (revision 5c4224e5a8244cb0fb32512e70354362fccd6321)
14fda81ceSLoGin #pragma once
24fda81ceSLoGin 
3*5c4224e5SLoGin #include "DragonOS/stdint.h"
44fda81ceSLoGin #include <common/stddef.h>
5*5c4224e5SLoGin #include <stdbool.h>
64fda81ceSLoGin 
74fda81ceSLoGin // RISC-V 没有直接的开启/关闭中断的指令,你需要通过修改CSR寄存器来实现
84fda81ceSLoGin // 你可能需要在你的中断处理程序中处理这些操作
94fda81ceSLoGin 
104fda81ceSLoGin #define nop() __asm__ __volatile__("nop\n\t")
114fda81ceSLoGin 
124fda81ceSLoGin // RISC-V 没有 hlt 指令,你可能需要使用 wfi 指令来等待中断
134fda81ceSLoGin #define hlt() __asm__ __volatile__("wfi\n\t")
144fda81ceSLoGin 
154fda81ceSLoGin // RISC-V 没有 pause 指令,你可能需要使用其他方法来实现处理器等待
164fda81ceSLoGin 
174fda81ceSLoGin // RISC-V 使用 fence 指令来实现内存屏障
18*5c4224e5SLoGin #define io_mfence() __asm__ __volatile__("fence rw,rw\n\t" ::: "memory")
19*5c4224e5SLoGin #define io_sfence() __asm__ __volatile__("fence w,w\n\t" ::: "memory")
20*5c4224e5SLoGin #define io_lfence() __asm__ __volatile__("fence r,r\n\t" ::: "memory")
214fda81ceSLoGin 
224fda81ceSLoGin // 开启中断
23*5c4224e5SLoGin #define sti() __asm__ __volatile__("csrsi mstatus, 8\n\t" ::: "memory")
244fda81ceSLoGin 
254fda81ceSLoGin // 关闭中断
26*5c4224e5SLoGin #define cli() __asm__ __volatile__("csrci mstatus, 8\n\t" ::: "memory")
274fda81ceSLoGin 
284fda81ceSLoGin // 从io口读入8个bit
io_in8(unsigned short port)29*5c4224e5SLoGin unsigned char io_in8(unsigned short port) {
30*5c4224e5SLoGin   while (1)
31*5c4224e5SLoGin     ;
324fda81ceSLoGin }
334fda81ceSLoGin 
344fda81ceSLoGin // 从io口读入32个bit
io_in32(unsigned short port)35*5c4224e5SLoGin unsigned int io_in32(unsigned short port) {
36*5c4224e5SLoGin   while (1)
37*5c4224e5SLoGin     ;
384fda81ceSLoGin }
394fda81ceSLoGin 
404fda81ceSLoGin // 输出8个bit到输出端口
io_out8(unsigned short port,unsigned char value)41*5c4224e5SLoGin void io_out8(unsigned short port, unsigned char value) {
42*5c4224e5SLoGin   while (1)
43*5c4224e5SLoGin     ;
444fda81ceSLoGin }
454fda81ceSLoGin 
464fda81ceSLoGin // 输出32个bit到输出端口
io_out32(unsigned short port,unsigned int value)47*5c4224e5SLoGin void io_out32(unsigned short port, unsigned int value) {
48*5c4224e5SLoGin   while (1)
49*5c4224e5SLoGin     ;
504fda81ceSLoGin }
514fda81ceSLoGin 
524fda81ceSLoGin /**
534fda81ceSLoGin  * @brief 验证地址空间是否为用户地址空间
544fda81ceSLoGin  *
554fda81ceSLoGin  * @param addr_start 地址起始值
564fda81ceSLoGin  * @param length 地址长度
574fda81ceSLoGin  * @return true
584fda81ceSLoGin  * @return false
594fda81ceSLoGin  */
verify_area(uint64_t addr_start,uint64_t length)604fda81ceSLoGin bool verify_area(uint64_t addr_start, uint64_t length) {
61*5c4224e5SLoGin   while (1)
62*5c4224e5SLoGin     ;
634fda81ceSLoGin }