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)40ul 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)49static __always_inline ul ALIGN(const ul addr, const ul _align) { 50 return (ul)((addr + _align - 1) & (~(_align - 1))); 51 } 52