mm_page.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-11-01 Jesven The first version
  9. * 2022-12-13 WangXiaoyao Hot-pluggable, extensible
  10. * page management algorithm
  11. */
  12. #ifndef __MM_PAGE_H__
  13. #define __MM_PAGE_H__
  14. #include <rthw.h>
  15. #include <rtthread.h>
  16. #include <stdint.h>
  17. #define GET_FLOOR(type) \
  18. (1ul << (8 * sizeof(rt_size_t) - __builtin_clzl(2 * sizeof(type) - 1) - 1))
  19. #define DEF_PAGE_T(fields) \
  20. typedef struct rt_page {\
  21. union {struct {fields}; char _padding[GET_FLOOR(struct {fields})];};\
  22. } *rt_page_t
  23. DEF_PAGE_T(
  24. struct rt_page *next; /* same level next */
  25. struct rt_page *pre; /* same level pre */
  26. rt_uint32_t size_bits; /* if is ARCH_ADDRESS_WIDTH_BITS, means not free */
  27. rt_uint32_t ref_cnt; /* page group ref count */
  28. );
  29. #undef GET_FLOOR
  30. #undef DEF_PAGE_T
  31. typedef struct tag_region
  32. {
  33. rt_size_t start;
  34. rt_size_t end;
  35. } rt_region_t;
  36. extern const rt_size_t rt_mpr_size;
  37. extern void *rt_mpr_start;
  38. void rt_page_init(rt_region_t reg);
  39. void rt_page_cleanup(void);
  40. void *rt_pages_alloc(rt_uint32_t size_bits);
  41. void rt_page_ref_inc(void *addr, rt_uint32_t size_bits);
  42. int rt_page_ref_get(void *addr, rt_uint32_t size_bits);
  43. int rt_pages_free(void *addr, rt_uint32_t size_bits);
  44. void rt_page_list(void);
  45. rt_size_t rt_page_bits(rt_size_t size);
  46. void rt_page_get_info(rt_size_t *total_nr, rt_size_t *free_nr);
  47. void *rt_page_page2addr(struct rt_page *p);
  48. struct rt_page *rt_page_addr2page(void *addr);
  49. /**
  50. * @brief Install page frames at run-time
  51. * Region size must be aligned to 2^(RT_PAGE_MAX_ORDER + ARCH_PAGE_SHIFT - 1)
  52. * bytes currently (typically 2 MB).
  53. *
  54. * !WARNING this API will NOT check whether region is valid or not in list
  55. *
  56. * @param region region.start as first page frame(inclusive),
  57. * region.end as first page frame after free region
  58. * @return int 0 on success
  59. */
  60. int rt_page_install(rt_region_t region);
  61. #endif /* __MM_PAGE_H__ */