You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/11/17 01:17:01 UTC
[incubator-nuttx] 02/04: riscv/addrenv: Make private function get_pgtable into a public one
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 85470adcc3283113ca35e922631e474f5ce3cda7
Author: Ville Juven <vi...@unikie.com>
AuthorDate: Wed Nov 16 14:32:07 2022 +0200
riscv/addrenv: Make private function get_pgtable into a public one
The utility function can be used from other places
---
arch/risc-v/src/common/Make.defs | 1 +
arch/risc-v/src/common/addrenv.h | 19 ++++++
arch/risc-v/src/common/riscv_addrenv_utils.c | 94 ++++++++++++++++++++++++++++
arch/risc-v/src/common/riscv_pgalloc.c | 45 +------------
4 files changed, 116 insertions(+), 43 deletions(-)
diff --git a/arch/risc-v/src/common/Make.defs b/arch/risc-v/src/common/Make.defs
index e7d7940e69..54fae2ae52 100644
--- a/arch/risc-v/src/common/Make.defs
+++ b/arch/risc-v/src/common/Make.defs
@@ -103,4 +103,5 @@ endif
ifeq ($(CONFIG_ARCH_ADDRENV),y)
CMN_CSRCS += riscv_addrenv.c riscv_pgalloc.c riscv_addrenv_perms.c
+CMN_CSRCS += riscv_addrenv_utils.c
endif
diff --git a/arch/risc-v/src/common/addrenv.h b/arch/risc-v/src/common/addrenv.h
index fc89138984..9c709d11d4 100644
--- a/arch/risc-v/src/common/addrenv.h
+++ b/arch/risc-v/src/common/addrenv.h
@@ -48,5 +48,24 @@
* Public Function Prototypes
****************************************************************************/
+/****************************************************************************
+ * Name: riscv_get_pgtable
+ *
+ * Description:
+ * Get the physical address of the final level page table corresponding to
+ * 'vaddr'. If one does not exist, it will be allocated.
+ *
+ * Input Parameters:
+ * addrenv - Pointer to a structure describing the address environment
+ * vaddr - Virtual address to query for
+ *
+ * Returned Value:
+ * The physical address of the corresponding final level page table, or
+ * NULL if one does not exist, and there is no free memory to allocate one
+ *
+ ****************************************************************************/
+
+uintptr_t riscv_get_pgtable(group_addrenv_t *addrenv, uintptr_t vaddr);
+
#endif /* CONFIG_ARCH_ADDRENV */
#endif /* __ARCH_RISC_V_SRC_COMMON_ADDRENV_H */
diff --git a/arch/risc-v/src/common/riscv_addrenv_utils.c b/arch/risc-v/src/common/riscv_addrenv_utils.c
new file mode 100644
index 0000000000..23d1f09f87
--- /dev/null
+++ b/arch/risc-v/src/common/riscv_addrenv_utils.c
@@ -0,0 +1,94 @@
+/****************************************************************************
+ * arch/risc-v/src/common/riscv_addrenv_utils.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/addrenv.h>
+#include <nuttx/irq.h>
+#include <nuttx/pgalloc.h>
+#include <nuttx/sched.h>
+
+#include <arch/barriers.h>
+
+#include "pgalloc.h"
+#include "riscv_mmu.h"
+
+#ifdef CONFIG_BUILD_KERNEL
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: riscv_get_pgtable
+ *
+ * Description:
+ * Get the physical address of the final level page table corresponding to
+ * 'vaddr'. If one does not exist, it will be allocated.
+ *
+ * Input Parameters:
+ * addrenv - Pointer to a structure describing the address environment
+ * vaddr - Virtual address to query for
+ *
+ * Returned Value:
+ * The physical address of the corresponding final level page table, or
+ * NULL if one does not exist, and there is no free memory to allocate one
+ *
+ ****************************************************************************/
+
+uintptr_t riscv_get_pgtable(group_addrenv_t *addrenv, uintptr_t vaddr)
+{
+ uintptr_t paddr;
+ uintptr_t ptprev;
+ uint32_t ptlevel;
+
+ /* Get the current level MAX_LEVELS-1 entry corresponding to this vaddr */
+
+ ptlevel = ARCH_SPGTS;
+ ptprev = riscv_pgvaddr(addrenv->spgtables[ARCH_SPGTS - 1]);
+ paddr = mmu_pte_to_paddr(mmu_ln_getentry(ptlevel, ptprev, vaddr));
+
+ if (!paddr)
+ {
+ /* No page table has been allocated... allocate one now */
+
+ paddr = mm_pgalloc(1);
+ if (paddr)
+ {
+ /* Wipe the page and assign it */
+
+ riscv_pgwipe(paddr);
+ mmu_ln_setentry(ptlevel, ptprev, paddr, vaddr, MMU_UPGT_FLAGS);
+ }
+ }
+
+ /* Flush the data cache, so the changes are committed to memory */
+
+ __DMB();
+
+ return paddr;
+}
+
+#endif /* CONFIG_BUILD_KERNEL */
diff --git a/arch/risc-v/src/common/riscv_pgalloc.c b/arch/risc-v/src/common/riscv_pgalloc.c
index 643d77dcd8..e66939c8ed 100644
--- a/arch/risc-v/src/common/riscv_pgalloc.c
+++ b/arch/risc-v/src/common/riscv_pgalloc.c
@@ -37,6 +37,7 @@
#include <arch/barriers.h>
+#include "addrenv.h"
#include "pgalloc.h"
#include "riscv_mmu.h"
@@ -54,48 +55,6 @@
* Private Functions
****************************************************************************/
-/****************************************************************************
- * Name: get_pgtable
- *
- * Description:
- * Get the physical address of the last page table level corresponding to
- * 'vaddr'
- *
- ****************************************************************************/
-
-static uintptr_t get_pgtable(group_addrenv_t *addrenv, uintptr_t vaddr)
-{
- uintptr_t paddr;
- uintptr_t ptprev;
- uint32_t ptlevel;
-
- /* Get the current level MAX_LEVELS-1 entry corresponding to this vaddr */
-
- ptlevel = ARCH_SPGTS;
- ptprev = riscv_pgvaddr(addrenv->spgtables[ARCH_SPGTS - 1]);
- paddr = mmu_pte_to_paddr(mmu_ln_getentry(ptlevel, ptprev, vaddr));
-
- if (!paddr)
- {
- /* No page table has been allocated... allocate one now */
-
- paddr = mm_pgalloc(1);
- if (paddr)
- {
- /* Wipe the page and assign it */
-
- riscv_pgwipe(paddr);
- mmu_ln_setentry(ptlevel, ptprev, paddr, vaddr, MMU_UPGT_FLAGS);
- }
- }
-
- /* Flush the data cache, so the changes are committed to memory */
-
- __DMB();
-
- return paddr;
-}
-
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -172,7 +131,7 @@ uintptr_t pgalloc(uintptr_t brkaddr, unsigned int npages)
{
/* Get the address of the last level page table */
- ptlast = riscv_pgvaddr(get_pgtable(&group->tg_addrenv, vaddr));
+ ptlast = riscv_pgvaddr(riscv_get_pgtable(&group->tg_addrenv, vaddr));
if (!ptlast)
{
return 0;