glib.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. //
  2. // 内核全局通用库
  3. // Created by longjin on 2022/1/22.
  4. //
  5. #pragma once
  6. //引入对bool类型的支持
  7. #include <stdbool.h>
  8. #include <stdint.h>
  9. #define NULL 0
  10. #define sti() __asm__ __volatile__("sti\n\t" :: \
  11. : "memory") //开启外部中断
  12. #define cli() __asm__ __volatile__("cli\n\t" :: \
  13. : "memory") //关闭外部中断
  14. #define nop() __asm__ __volatile__("nop\n\t")
  15. //内存屏障
  16. #define io_mfence() __asm__ __volatile__("mfence\n\t" :: \
  17. : "memory") // 在mfence指令前的读写操作必须在mfence指令后的读写操作前完成。
  18. #define io_sfence() __asm__ __volatile__("sfence\n\t" :: \
  19. : "memory") // 在sfence指令前的写操作必须在sfence指令后的写操作前完成
  20. #define io_lfence() __asm__ __volatile__("lfence\n\t" :: \
  21. : "memory") // 在lfence指令前的读操作必须在lfence指令后的读操作前完成。
  22. /**
  23. * @brief 根据结构体变量内某个成员变量member的基地址,计算出该结构体变量的基地址
  24. * @param ptr 指向结构体变量内的成员变量member的指针
  25. * @param type 成员变量所在的结构体
  26. * @param member 成员变量名
  27. *
  28. * 方法:使用ptr减去结构体内的偏移,得到结构体变量的基地址
  29. */
  30. #define container_of(ptr, type, member) \
  31. ({ \
  32. typeof(((type *)0)->member) *p = (ptr); \
  33. (type *)((unsigned long)p - (unsigned long)&(((type *)0)->member)); \
  34. })
  35. // 定义类型的缩写
  36. typedef unsigned char uchar;
  37. typedef unsigned short ushort;
  38. typedef unsigned int uint;
  39. typedef unsigned long ul;
  40. typedef unsigned long long int ull;
  41. typedef long long int ll;
  42. #define ABS(x) ((x) > 0 ? (x) : -(x)) // 绝对值
  43. // 最大最小值
  44. #define max(x, y) ((x > y) ? (x) : (y))
  45. #define min(x, y) ((x < y) ? (x) : (y))
  46. // 遮罩高32bit
  47. #define MASK_HIGH_32bit(x) (x & (0x00000000ffffffffUL))
  48. // 四舍五入成整数
  49. ul round(double x)
  50. {
  51. return (ul)(x + 0.5);
  52. }
  53. /**
  54. * @brief 地址按照align进行对齐
  55. *
  56. * @param addr
  57. * @param _align
  58. * @return ul 对齐后的地址
  59. */
  60. ul ALIGN(const ul addr, const ul _align)
  61. {
  62. return (ul)((addr + _align - 1) & (~(_align - 1)));
  63. }
  64. //链表数据结构
  65. struct List
  66. {
  67. struct List *prev, *next;
  68. };
  69. //初始化循环链表
  70. static inline void list_init(struct List *list)
  71. {
  72. list->next = list;
  73. list->prev = list;
  74. }
  75. /**
  76. * @brief
  77. * @param entry 给定的节点
  78. * @param node 待插入的节点
  79. **/
  80. static inline void list_add(struct List *entry, struct List *node)
  81. {
  82. node->next = entry->next;
  83. node->prev = entry;
  84. node->next->prev = node;
  85. entry->next = node;
  86. }
  87. static inline void list_append(struct List *entry, struct List *node)
  88. {
  89. /**
  90. * @brief 将node添加到给定的list的结尾(也就是当前节点的前面)
  91. * @param entry 列表的入口
  92. * @param node 待添加的节点
  93. */
  94. struct List *tail = entry->prev;
  95. list_add(tail, node);
  96. }
  97. static inline void list_del(struct List *entry)
  98. {
  99. /**
  100. * @brief 从列表中删除节点
  101. * @param entry 待删除的节点
  102. */
  103. entry->next->prev = entry->prev;
  104. entry->prev->next = entry->next;
  105. }
  106. static inline bool list_empty(struct List *entry)
  107. {
  108. /**
  109. * @brief 判断循环链表是否为空
  110. * @param entry 入口
  111. */
  112. if (entry->prev == entry->next)
  113. return true;
  114. else
  115. return false;
  116. }
  117. /**
  118. * @brief 获取链表的上一个元素
  119. *
  120. * @param entry
  121. * @return 链表的上一个元素
  122. */
  123. static inline struct List *list_prev(struct List *entry)
  124. {
  125. if (entry->prev != NULL)
  126. return entry->prev;
  127. else
  128. return NULL;
  129. }
  130. /**
  131. * @brief 获取链表的下一个元素
  132. *
  133. * @param entry
  134. * @return 链表的下一个元素
  135. */
  136. static inline struct List *list_next(struct List *entry)
  137. {
  138. if (entry->next != NULL)
  139. return entry->next;
  140. else
  141. return NULL;
  142. }
  143. //计算字符串的长度(经过测试,该版本比采用repne/scasb汇编的运行速度快16.8%左右)
  144. static inline int strlen(char *s)
  145. {
  146. register int __res = 0;
  147. while (s[__res] != '\0')
  148. {
  149. ++__res;
  150. }
  151. return __res;
  152. }
  153. void *memset(void *dst, unsigned char C, ul size)
  154. {
  155. int d0, d1;
  156. unsigned long tmp = C * 0x0101010101010101UL;
  157. __asm__ __volatile__("cld \n\t"
  158. "rep \n\t"
  159. "stosq \n\t"
  160. "testb $4, %b3 \n\t"
  161. "je 1f \n\t"
  162. "stosl \n\t"
  163. "1:\ttestb $2, %b3 \n\t"
  164. "je 2f\n\t"
  165. "stosw \n\t"
  166. "2:\ttestb $1, %b3 \n\t"
  167. "je 3f \n\t"
  168. "stosb \n\t"
  169. "3: \n\t"
  170. : "=&c"(d0), "=&D"(d1)
  171. : "a"(tmp), "q"(size), "0"(size / 8), "1"(dst)
  172. : "memory");
  173. return dst;
  174. }
  175. /**
  176. * @brief 内存拷贝函数
  177. *
  178. * @param dst 目标数组
  179. * @param src 源数组
  180. * @param Num 字节数
  181. * @return void*
  182. */
  183. void *memcpy(void *dst, void *src, long Num)
  184. {
  185. int d0, d1, d2;
  186. __asm__ __volatile__("cld \n\t"
  187. "rep \n\t"
  188. "movsq \n\t"
  189. "testb $4,%b4 \n\t"
  190. "je 1f \n\t"
  191. "movsl \n\t"
  192. "1:\ttestb $2,%b4 \n\t"
  193. "je 2f \n\t"
  194. "movsw \n\t"
  195. "2:\ttestb $1,%b4 \n\t"
  196. "je 3f \n\t"
  197. "movsb \n\t"
  198. "3: \n\t"
  199. : "=&c"(d0), "=&D"(d1), "=&S"(d2)
  200. : "0"(Num / 8), "q"(Num), "1"(dst), "2"(src)
  201. : "memory");
  202. return dst;
  203. }
  204. void *memset_c(void *dst, unsigned char c, ul n)
  205. {
  206. unsigned char *s = (unsigned char *)dst;
  207. for (int i = 0; i < n; ++i)
  208. s[i] = c;
  209. return dst;
  210. }
  211. // 从io口读入8个bit
  212. unsigned char io_in8(unsigned short port)
  213. {
  214. unsigned char ret = 0;
  215. __asm__ __volatile__("inb %%dx, %0 \n\t"
  216. "mfence \n\t"
  217. : "=a"(ret)
  218. : "d"(port)
  219. : "memory");
  220. return ret;
  221. }
  222. // 从io口读入32个bit
  223. unsigned int io_in32(unsigned short port)
  224. {
  225. unsigned int ret = 0;
  226. __asm__ __volatile__("inl %%dx, %0 \n\t"
  227. "mfence \n\t"
  228. : "=a"(ret)
  229. : "d"(port)
  230. : "memory");
  231. return ret;
  232. }
  233. // 输出8个bit到输出端口
  234. void io_out8(unsigned short port, unsigned char value)
  235. {
  236. __asm__ __volatile__("outb %0, %%dx \n\t"
  237. "mfence \n\t"
  238. :
  239. : "a"(value), "d"(port)
  240. : "memory");
  241. }
  242. // 输出32个bit到输出端口
  243. void io_out32(unsigned short port, unsigned int value)
  244. {
  245. __asm__ __volatile__("outl %0, %%dx \n\t"
  246. "mfence \n\t"
  247. :
  248. : "a"(value), "d"(port)
  249. : "memory");
  250. }
  251. /**
  252. * @brief 从端口读入n个word到buffer
  253. *
  254. */
  255. #define io_insw(port,buffer,nr) \
  256. __asm__ __volatile__("cld;rep;insw;mfence;"::"d"(port),"D"(buffer),"c"(nr):"memory")
  257. /**
  258. * @brief 从输出buffer中的n个word到端口
  259. *
  260. */
  261. #define io_outsw(port,buffer,nr) \
  262. __asm__ __volatile__("cld;rep;outsw;mfence;"::"d"(port),"S"(buffer),"c"(nr):"memory")
  263. /**
  264. * @brief 读取rsp寄存器的值(存储了页目录的基地址)
  265. *
  266. * @return unsigned* rsp的值的指针
  267. */
  268. unsigned long *get_rsp()
  269. {
  270. ul *tmp;
  271. __asm__ __volatile__(
  272. "movq %%rsp, %0\n\t"
  273. : "=r"(tmp)::"memory");
  274. return tmp;
  275. }
  276. /**
  277. * @brief 读取rbp寄存器的值(存储了页目录的基地址)
  278. *
  279. * @return unsigned* rbp的值的指针
  280. */
  281. unsigned long *get_rbp()
  282. {
  283. ul *tmp;
  284. __asm__ __volatile__(
  285. "movq %%rbp, %0\n\t"
  286. : "=r"(tmp)::"memory");
  287. return tmp;
  288. }
  289. /**
  290. * @brief 读取ds寄存器的值(存储了页目录的基地址)
  291. *
  292. * @return unsigned* ds的值的指针
  293. */
  294. unsigned long *get_ds()
  295. {
  296. ul *tmp;
  297. __asm__ __volatile__(
  298. "movq %%ds, %0\n\t"
  299. : "=r"(tmp)::"memory");
  300. return tmp;
  301. }
  302. /**
  303. * @brief 读取rax寄存器的值(存储了页目录的基地址)
  304. *
  305. * @return unsigned* rax的值的指针
  306. */
  307. unsigned long *get_rax()
  308. {
  309. ul *tmp;
  310. __asm__ __volatile__(
  311. "movq %%rax, %0\n\t"
  312. : "=r"(tmp)::"memory");
  313. return tmp;
  314. }
  315. /**
  316. * @brief 读取rbx寄存器的值(存储了页目录的基地址)
  317. *
  318. * @return unsigned* rbx的值的指针
  319. */
  320. unsigned long *get_rbx()
  321. {
  322. ul *tmp;
  323. __asm__ __volatile__(
  324. "movq %%rbx, %0\n\t"
  325. : "=r"(tmp)::"memory");
  326. return tmp;
  327. }
  328. // ========= MSR寄存器组操作 =============
  329. /**
  330. * @brief 向msr寄存器组的address处的寄存器写入值value
  331. *
  332. * @param address 地址
  333. * @param value 要写入的值
  334. */
  335. void wrmsr(ul address, ul value)
  336. {
  337. __asm__ __volatile__("wrmsr \n\t" ::"d"(value >> 32), "a"(value & 0xffffffff), "c"(address)
  338. : "memory");
  339. }
  340. /**
  341. * @brief 从msr寄存器组的address地址处读取值
  342. * rdmsr返回高32bits在edx,低32bits在eax
  343. * @param address 地址
  344. * @return ul address处的寄存器的值
  345. */
  346. ul rdmsr(ul address)
  347. {
  348. unsigned int tmp0, tmp1;
  349. __asm__ __volatile__("rdmsr \n\t"
  350. : "=d"(tmp0), "=a"(tmp1)
  351. : "c"(address)
  352. : "memory");
  353. return ((ul)tmp0 << 32) | tmp1;
  354. }