xref: /DragonOS/kernel/src/arch/riscv64/include/asm/asm.h (revision 7a29d4fcbcd89a226289c7bf541c2c78623de3ad)
1 #pragma once
2 
3 #include <DragonOS/stdint.h>
4 #include <stdbool.h>
5 #include <common/stddef.h>
6 
7 // RISC-V 没有直接的开启/关闭中断的指令,你需要通过修改CSR寄存器来实现
8 // 你可能需要在你的中断处理程序中处理这些操作
9 
10 #define nop() __asm__ __volatile__("nop\n\t")
11 
12 // RISC-V 没有 hlt 指令,你可能需要使用 wfi 指令来等待中断
13 #define hlt() __asm__ __volatile__("wfi\n\t")
14 
15 // RISC-V 没有 pause 指令,你可能需要使用其他方法来实现处理器等待
16 
17 // RISC-V 使用 fence 指令来实现内存屏障
18 #define io_mfence() __asm__ __volatile__("fence rw,rw\n\t" :: \
19                                              : "memory")
20 #define io_sfence() __asm__ __volatile__("fence w,w\n\t" :: \
21                                              : "memory")
22 #define io_lfence() __asm__ __volatile__("fence r,r\n\t" :: \
23                                              : "memory")
24 
25 // 开启中断
26 #define sti() __asm__ __volatile__("csrsi mstatus, 8\n\t" :: \
27                                        : "memory")
28 
29 // 关闭中断
30 #define cli() __asm__ __volatile__("csrci mstatus, 8\n\t" :: \
31                                        : "memory")
32 
33 
34 // 从io口读入8个bit
35 unsigned char io_in8(unsigned short port)
36 {
37     while(1);
38 }
39 
40 // 从io口读入32个bit
41 unsigned int io_in32(unsigned short port)
42 {
43     while(1);
44 }
45 
46 // 输出8个bit到输出端口
47 void io_out8(unsigned short port, unsigned char value)
48 {
49     while(1);
50 }
51 
52 // 输出32个bit到输出端口
53 void io_out32(unsigned short port, unsigned int value)
54 {
55     while(1);
56 }
57 
58 /**
59  * @brief 验证地址空间是否为用户地址空间
60  *
61  * @param addr_start 地址起始值
62  * @param length 地址长度
63  * @return true
64  * @return false
65  */
66 bool verify_area(uint64_t addr_start, uint64_t length){
67     while(1);
68 }