lwp_arch.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-05-18 Jesven first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #ifdef ARCH_MM_MMU
  13. #define DBG_TAG "lwp.arch"
  14. #define DBG_LVL DBG_INFO
  15. #include <rtdbg.h>
  16. #include <lwp_arch.h>
  17. #include <lwp_user_mm.h>
  18. extern size_t MMUTable[];
  19. int arch_user_space_init(struct rt_lwp *lwp)
  20. {
  21. size_t *mmu_table;
  22. mmu_table = (size_t *)rt_pages_alloc(0);
  23. if (!mmu_table)
  24. {
  25. return -RT_ENOMEM;
  26. }
  27. lwp->end_heap = USER_HEAP_VADDR;
  28. memset(mmu_table, 0, ARCH_PAGE_SIZE);
  29. rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, mmu_table, ARCH_PAGE_SIZE);
  30. lwp->aspace = rt_aspace_create(
  31. (void *)USER_VADDR_START, USER_VADDR_TOP - USER_VADDR_START, mmu_table);
  32. if (!lwp->aspace)
  33. {
  34. return -RT_ERROR;
  35. }
  36. return 0;
  37. }
  38. void *arch_kernel_mmu_table_get(void)
  39. {
  40. return (void *)NULL;
  41. }
  42. void arch_user_space_free(struct rt_lwp *lwp)
  43. {
  44. if (lwp)
  45. {
  46. RT_ASSERT(lwp->aspace);
  47. void *pgtbl = lwp->aspace->page_table;
  48. rt_aspace_delete(lwp->aspace);
  49. /* must be freed after aspace delete, pgtbl is required for unmap */
  50. rt_pages_free(pgtbl, 0);
  51. lwp->aspace = NULL;
  52. }
  53. else
  54. {
  55. LOG_W("%s: NULL lwp as parameter", __func__);
  56. RT_ASSERT(0);
  57. }
  58. }
  59. int arch_expand_user_stack(void *addr)
  60. {
  61. int ret = 0;
  62. size_t stack_addr = (size_t)addr;
  63. stack_addr &= ~ARCH_PAGE_MASK;
  64. if ((stack_addr >= (size_t)USER_STACK_VSTART) &&
  65. (stack_addr < (size_t)USER_STACK_VEND))
  66. {
  67. void *map =
  68. lwp_map_user(lwp_self(), (void *)stack_addr, ARCH_PAGE_SIZE, 0);
  69. if (map || lwp_user_accessable(addr, 1))
  70. {
  71. ret = 1;
  72. }
  73. }
  74. return ret;
  75. }
  76. #endif