xref: /DragonOS/kernel/src/arch/riscv64/include/asm/asm.h (revision fae6e9ade46a52976ad5d099643d51cc20876448)
1 #pragma once
2 
3 #include "DragonOS/stdint.h"
4 #include <common/stddef.h>
5 #include <stdbool.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" ::: "memory")
19 #define io_sfence() __asm__ __volatile__("fence w,w\n\t" ::: "memory")
20 #define io_lfence() __asm__ __volatile__("fence r,r\n\t" ::: "memory")
21 
22 // 开启中断
23 #define sti() __asm__ __volatile__("csrsi mstatus, 8\n\t" ::: "memory")
24 
25 // 关闭中断
26 #define cli() __asm__ __volatile__("csrci mstatus, 8\n\t" ::: "memory")
27 
28 // 从io口读入8个bit
29 unsigned char io_in8(unsigned short port) {
30   while (1)
31     ;
32 }
33 
34 // 从io口读入32个bit
35 unsigned int io_in32(unsigned short port) {
36   while (1)
37     ;
38 }
39 
40 // 输出8个bit到输出端口
41 void io_out8(unsigned short port, unsigned char value) {
42   while (1)
43     ;
44 }
45 
46 // 输出32个bit到输出端口
47 void io_out32(unsigned short port, unsigned int value) {
48   while (1)
49     ;
50 }
51 
52 /**
53  * @brief 验证地址空间是否为用户地址空间
54  *
55  * @param addr_start 地址起始值
56  * @param length 地址长度
57  * @return true
58  * @return false
59  */
60 bool verify_area(uint64_t addr_start, uint64_t length) {
61   while (1)
62     ;
63 }