xref: /DragonOS/kernel/src/common/glib.h (revision d8e29bffeee4fe4fe76ead3c761dd03f5395e6c2)
1 //
2 // 内核全局通用库
3 // Created by longjin on 2022/1/22.
4 //
5 
6 #pragma once
7 
8 // 引入对bool类型的支持
9 #include <stdbool.h>
10 #include <DragonOS/stdint.h>
11 #include <common/stddef.h>
12 #include <arch/arch.h>
13 #include <common/compiler.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 
32 
33 #define ABS(x) ((x) > 0 ? (x) : -(x)) // 绝对值
34 // 最大最小值
35 #define max(x, y) ((x > y) ? (x) : (y))
36 #define min(x, y) ((x < y) ? (x) : (y))
37 
38 // 遮罩高32bit
39 #define MASK_HIGH_32bit(x) (x & (0x00000000ffffffffUL))
40 
41 // 四舍五入成整数
42 ul round(double x)
43 {
44     return (ul)(x + 0.5);
45 }
46 
47 /**
48  * @brief 地址按照align进行对齐
49  *
50  * @param addr
51  * @param _align
52  * @return ul 对齐后的地址
53  */
54 static __always_inline ul ALIGN(const ul addr, const ul _align)
55 {
56     return (ul)((addr + _align - 1) & (~(_align - 1)));
57 }
58 
59 
60 /**
61  * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
62  *
63  * @param dst 目标地址指针
64  * @param src 源地址指针
65  * @param size 大小
66  * @return void* 指向目标地址的指针
67  */
68 void *memmove(void *dst, const void *src, uint64_t size);