xref: /DragonOS/kernel/src/common/glib.h (revision 415e46ea470ba1dd33e4368c3684c700a75f3be8)
1 //
2 // 内核全局通用库
3 // Created by longjin on 2022/1/22.
4 //
5 
6 #pragma once
7 
8 // 引入对bool类型的支持
9 #include <DragonOS/stdint.h>
10 #include <arch/arch.h>
11 #include <common/compiler.h>
12 #include <common/stddef.h>
13 #include <stdbool.h>
14 
15 #include <asm/asm.h>
16 
17 /**
18  * @brief 根据结构体变量内某个成员变量member的基地址,计算出该结构体变量的基地址
19  * @param ptr 指向结构体变量内的成员变量member的指针
20  * @param type 成员变量所在的结构体
21  * @param member 成员变量名
22  *
23  * 方法:使用ptr减去结构体内的偏移,得到结构体变量的基地址
24  */
25 #define container_of(ptr, type, member)                                        \
26   ({                                                                           \
27     typeof(((type *)0)->member) *p = (ptr);                                    \
28     (type *)((unsigned long)p - (unsigned long)&(((type *)0)->member));        \
29   })
30 
31 #define ABS(x) ((x) > 0 ? (x) : -(x)) // 绝对值
32 // 最大最小值
33 #define max(x, y) ((x > y) ? (x) : (y))
34 #define min(x, y) ((x < y) ? (x) : (y))
35 
36 // 遮罩高32bit
37 #define MASK_HIGH_32bit(x) (x & (0x00000000ffffffffUL))
38 
39 // 四舍五入成整数
round(double x)40 ul round(double x) { return (ul)(x + 0.5); }
41 
42 /**
43  * @brief 地址按照align进行对齐
44  *
45  * @param addr
46  * @param _align
47  * @return ul 对齐后的地址
48  */
ALIGN(const ul addr,const ul _align)49 static __always_inline ul ALIGN(const ul addr, const ul _align) {
50   return (ul)((addr + _align - 1) & (~(_align - 1)));
51 }
52