mm_object.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-11-30 WangXiaoyao the first version
  9. * 2023-08-19 Shell Support varea modification handler
  10. * 2023-10-13 Shell Replace the page management algorithm of pgmgr
  11. */
  12. #define DBG_TAG "mm.object"
  13. #define DBG_LVL DBG_INFO
  14. #include <rtdbg.h>
  15. #include <rtthread.h>
  16. #include "mm_aspace.h"
  17. #include "mm_fault.h"
  18. #include "mm_page.h"
  19. #include <mmu.h>
  20. #include <string.h>
  21. #include <stdlib.h>
  22. /** varea based dummy memory object whose data comes directly from page frame */
  23. static const char *get_name(rt_varea_t varea)
  24. {
  25. return "dummy-mapper";
  26. }
  27. static void on_page_fault(struct rt_varea *varea, struct rt_aspace_fault_msg *msg)
  28. {
  29. void *page;
  30. page = rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE);
  31. if (!page)
  32. {
  33. LOG_W("%s: page alloc failed", __func__);
  34. return;
  35. }
  36. msg->response.status = MM_FAULT_STATUS_OK;
  37. msg->response.size = ARCH_PAGE_SIZE;
  38. msg->response.vaddr = page;
  39. }
  40. static void on_varea_open(struct rt_varea *varea)
  41. {
  42. varea->data = NULL;
  43. }
  44. static void on_varea_close(struct rt_varea *varea)
  45. {
  46. }
  47. static rt_err_t on_varea_expand(struct rt_varea *varea, void *new_vaddr, rt_size_t size)
  48. {
  49. return RT_EOK;
  50. }
  51. static rt_err_t on_varea_shrink(rt_varea_t varea, void *new_start, rt_size_t size)
  52. {
  53. return RT_EOK;
  54. }
  55. static rt_err_t on_varea_split(struct rt_varea *existed, void *unmap_start, rt_size_t unmap_len, struct rt_varea *subset)
  56. {
  57. return RT_EOK;
  58. }
  59. static rt_err_t on_varea_merge(struct rt_varea *merge_to, struct rt_varea *merge_from)
  60. {
  61. return RT_EOK;
  62. }
  63. static void page_read(struct rt_varea *varea, struct rt_aspace_io_msg *msg)
  64. {
  65. char *dst_k;
  66. rt_aspace_t aspace = varea->aspace;
  67. dst_k = rt_hw_mmu_v2p(aspace, msg->fault_vaddr);
  68. if (dst_k != ARCH_MAP_FAILED)
  69. {
  70. RT_ASSERT(!((long)dst_k & ARCH_PAGE_MASK));
  71. dst_k = (void *)((char *)dst_k - PV_OFFSET);
  72. memcpy(msg->buffer_vaddr, dst_k, ARCH_PAGE_SIZE);
  73. msg->response.status = MM_FAULT_STATUS_OK;
  74. }
  75. }
  76. static void page_write(struct rt_varea *varea, struct rt_aspace_io_msg *msg)
  77. {
  78. void *dst_k;
  79. rt_aspace_t aspace = varea->aspace;
  80. dst_k = rt_hw_mmu_v2p(aspace, msg->fault_vaddr);
  81. if (dst_k != ARCH_MAP_FAILED)
  82. {
  83. RT_ASSERT(!((long)dst_k & ARCH_PAGE_MASK));
  84. dst_k = (void *)((char *)dst_k - PV_OFFSET);
  85. memcpy(dst_k, msg->buffer_vaddr, ARCH_PAGE_SIZE);
  86. msg->response.status = MM_FAULT_STATUS_OK;
  87. }
  88. }
  89. struct rt_mem_obj rt_mm_dummy_mapper = {
  90. .get_name = get_name,
  91. .on_page_fault = on_page_fault,
  92. .hint_free = NULL,
  93. .on_varea_open = on_varea_open,
  94. .on_varea_close = on_varea_close,
  95. .on_varea_shrink = on_varea_shrink,
  96. .on_varea_split = on_varea_split,
  97. .on_varea_expand = on_varea_expand,
  98. .on_varea_merge = on_varea_merge,
  99. .page_write = page_write,
  100. .page_read = page_read,
  101. };