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 *c_memmove(void *dst, const void *src, uint64_t size);