diff --git a/Documentation/NuttxPortingGuide.html b/Documentation/NuttxPortingGuide.html
index eb5a9509d3..e76b2ce0a5 100644
--- a/Documentation/NuttxPortingGuide.html
+++ b/Documentation/NuttxPortingGuide.html
@@ -2541,7 +2541,7 @@ config ARCH_SIM
Since timers are a limited resource, the use of two timers could be an issue on some systems.
- The job could be done with a single timer if, for example, the single timer were kept in a free-running at all times. Some timer/counters have the capability to generate a compare interrupt when the timer matches a comparison value but also to continue counting without stopping. If your hardware supports such counters, one might used the CONFIG_SCHED_TICKLESS_ALARM
option and be able to simply set the comparison count at the value of the free running timer PLUS the desired delay. Then you could have both with a single timer: An alarm and a free-running counter with the same timer!
+ The job could be done with a single timer if, for example, the single timer were kept in a free-running at all times. Some timer/counters have the capability to generate a compare interrupt when the timer matches a comparison value but also to continue counting without stopping. If your hardware supports such counters, one might used the CONFIG_SCHED_TICKLESS_ALARM
option and be able to simply set the comparison count at the value of the free running timer PLUS the desired delay. Then you could have both with a single timer: An alarm and a free-running counter with the same timer!
In addition to these imported interfaces, the RTOS will export the following interfaces for use by the platform-specific interval timer implementation:
@@ -3041,7 +3041,7 @@ VxWorks provides the following comparable interface:
Function Prototype:
- int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv);
+ int up_addrenv_select(group_addrenv_t addrenv, save_addrenv_t *oldenv);
Description:
@@ -3054,7 +3054,7 @@ VxWorks provides the following comparable interface:
oldenv
:
The address environment that was in place before up_addrenv_select()
was called.
This may be used with up_addrenv_restore()
to restore the original address environment that was in place before up_addrenv_select()
was called.
- Note that this may be a task agnostic, hardware representation that is different from group_addrenv_t
.
+ Note that this may be a task agnostic, platform-specific representation that may or may not be different from group_addrenv_t
.
Returned Value:
@@ -3065,7 +3065,7 @@ VxWorks provides the following comparable interface:
Function Prototype:
- int up_addrenv_restore(hw_addrenv_t oldenv);
+ int up_addrenv_restore(save_addrenv_t oldenv);
Description:
@@ -3074,7 +3074,7 @@ VxWorks provides the following comparable interface:
Input Parameters:
- oldenv
: The hardware representation of the address environment previously returned by up_addrenv_select()
.
+ oldenv
: The platform-specific representation of the address environment previously returned by up_addrenv_select()
.
Returned Value:
diff --git a/arch/Kconfig b/arch/Kconfig
index 92bdb83429..4db654dd01 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -154,7 +154,7 @@ config ARCH_HAVE_EXTCLK
bool
default n
-config ARCH_ADDRENV
+menuconfig ARCH_ADDRENV
bool "Address environments"
default n
depends on ARCH_HAVE_ADDRENV
@@ -162,6 +162,62 @@ config ARCH_ADDRENV
Support per-task address environments using the MMU... i.e., support
"processes"
+if ARCH_ADDRENV && ARCH_HAVE_MMU
+
+config ARCH_TEXT_VBASE
+ hex "Virtual .text base"
+ ---help---
+ The virtual address of the beginning the .text region
+
+config ARCH_DATA_VBASE
+ hex "Virtual .bss/.data base"
+ ---help---
+ The virtual address of the beginning of the .bss/.data region.
+
+config ARCH_HEAP_VBASE
+ hex "Virtual heap base"
+ ---help---
+ The virtual address of the beginning of the heap region.
+
+config ARCH_STACK_VBASE
+ hex "Virtual stack base"
+ ---help---
+ The virtual address of the beginning the stack region
+
+config ARCH_TEXT_NPAGES
+ int "Max .text pages"
+ default 1
+ ---help---
+ The maximum number of pages that can allocated for the .text region.
+ This, along with knowledge of the page size, determines the size of
+ the .text virtual address space. Default is 1.
+
+config ARCH_DATA_NPAGES
+ int "Max .bss/.data pages"
+ default 1
+ ---help---
+ The maximum number of pages that can allocated for the .bss/.data
+ region. This, along with knowledge of the page size, determines the
+ size of the .bss/.data virtual address space. Default is 1.
+
+config ARCH_HEAP_NPAGES
+ int "Max heap pages"
+ default 1
+ ---help---
+ The maximum number of pages that can allocated for the heap region.
+ This, along with knowledge of the page size, determines the size of
+ the heap virtual address space. Default is 1.
+
+config ARCH_STACK_NPAGES
+ int "Max. stack pages"
+ default 1
+ ---help---
+ The maximum number of pages that can allocated for the stack region.
+ This, along with knowledge of the page size, determines the size of
+ the stack virtual address space. Default is 1.
+
+endif # ARCH_ADDRENV && ARCH_HAVE_MMU
+
menuconfig PAGING
bool "On-demand paging"
default n
diff --git a/arch/arm/include/arch.h b/arch/arm/include/arch.h
index d0b2602eba..6495c52304 100644
--- a/arch/arm/include/arch.h
+++ b/arch/arm/include/arch.h
@@ -50,7 +50,7 @@
#endif
/****************************************************************************
- * Definitions
+ * Pre-processor Definitions
****************************************************************************/
#ifdef CONFIG_PIC
@@ -99,6 +99,36 @@ do { \
* Public Types
****************************************************************************/
+#ifdef CONFIG_ARCH_ADDRENV
+/* The task group resources are retained in a single structure, task_group_s
+ * that is defined in the header file nuttx/include/nuttx/sched.h. The type
+ * group_addrenv_t must be defined by platform specific logic in
+ * nuttx/arch//include/arch.h.
+ *
+ * These tables would hold the physical address of the level 2 page tables.
+ * All would be initially NULL and would not be backed up with physical memory
+ * until mappings in the level 2 page table are required.
+ */
+
+struct group_addrenv_s
+{
+ FAR uint32_t *text[CONFIG_ARCH_TEXT_NPAGES];
+ FAR uint32_t *data[CONFIG_ARCH_DATA_NPAGES];
+ FAR uint32_t *heap[CONFIG_ARCH_HEAP_NPAGES];
+};
+
+typedef struct group_addrenv_s group_addrenv_t;
+
+/* This type is used when the OS needs to temporarily instantiate a
+ * different address environment. Used in the implementation of
+ *
+ * int up_addrenv_select(group_addrenv_t addrenv, save_addrenv_t *oldenv);
+ * int up_addrenv_restore(save_addrenv_t oldenv);
+ */
+
+typedef group_addrenv_t *save_addrenv_t;
+#endif
+
/****************************************************************************
* Public Variables
****************************************************************************/
diff --git a/arch/arm/include/armv7-a/irq.h b/arch/arm/include/armv7-a/irq.h
index 0b7b0589ed..98fd8b154d 100755
--- a/arch/arm/include/armv7-a/irq.h
+++ b/arch/arm/include/armv7-a/irq.h
@@ -240,6 +240,16 @@ struct xcptcontext
#ifdef CONFIG_PAGING
uintptr_t far;
#endif
+
+#ifdef CONFIG_ARCH_ADDRENV
+ /* This table holds the physical address of the level 2 page table used
+ * to map the thread's stack memory. This array will be initially of
+ * zeroed and would be back-up up with pages during page fault exception
+ * handling to support dynamically sized stacks for each thread.
+ */
+
+ FAR uint32_t *stack[CONFIG_ARCH_STACK_NPAGES];
+#endif
};
#endif
diff --git a/arch/arm/src/armv7-a/arm_addrenv.c b/arch/arm/src/armv7-a/arm_addrenv.c
index 335ab205a0..5aa21aa6c5 100644
--- a/arch/arm/src/armv7-a/arm_addrenv.c
+++ b/arch/arm/src/armv7-a/arm_addrenv.c
@@ -70,6 +70,7 @@
#include
#include
+#include
#include
#ifdef CONFIG_ARCH_ADDRENV
@@ -77,6 +78,7 @@
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
+/* Configuration ************************************************************/
/****************************************************************************
* Private Data
@@ -95,7 +97,7 @@
*
* Description:
* This function is called when a new task is created in order to
- * instantiate an address environment for the new task group.
+ * instantiate an address environment for the new task group.
* up_addrenv_create() is essentially the allocator of the physical
* memory for the new task.
*
@@ -187,7 +189,7 @@ int up_addrenv_vaddr(FAR group_addrenv_t addrenv, FAR void **vaddr)
*
****************************************************************************/
-int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv)
+int up_addrenv_select(group_addrenv_t addrenv, save_addrenv_t *oldenv)
{
#warning Missing logic
return -ENOSYS;
@@ -210,7 +212,7 @@ int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv)
*
****************************************************************************/
-int up_addrenv_restore(hw_addrenv_t oldenv)
+int up_addrenv_restore(save_addrenv_t oldenv)
{
#warning Missing logic
return -ENOSYS;
diff --git a/arch/z80/include/z180/arch.h b/arch/z80/include/z180/arch.h
index 85422fdca2..64e1112f52 100644
--- a/arch/z80/include/z180/arch.h
+++ b/arch/z80/include/z180/arch.h
@@ -65,7 +65,7 @@
*/
#ifdef CONFIG_ARCH_ADDRENV
-typedef uint8_t hw_addrenv_t;
+typedef uint8_t save_addrenv_t;
/* At the task-level, the z180 address environment is represented as struct
* z180_cbr_s which is defined in irq.h.
diff --git a/arch/z80/src/z180/z180_mmu.c b/arch/z80/src/z180/z180_mmu.c
index 3289026f96..5f788859f1 100644
--- a/arch/z80/src/z180/z180_mmu.c
+++ b/arch/z80/src/z180/z180_mmu.c
@@ -378,7 +378,7 @@ int up_addrenv_vaddr(FAR group_addrenv_t addrenv, FAR void **vaddr)
*
****************************************************************************/
-int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv)
+int up_addrenv_select(group_addrenv_t addrenv, save_addrenv_t *oldenv)
{
FAR struct z180_cbr_s *cbr = (FAR struct z180_cbr_s *)addrenv;
irqstate_t flags;
@@ -388,7 +388,7 @@ int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv)
/* Return the current CBR value from the CBR register */
flags = irqsave();
- *oldenv = (hw_addrenv_t)inp(Z180_MMU_CBR);
+ *oldenv = (save_addrenv_t)inp(Z180_MMU_CBR);
/* Write the new CBR value into CBR register */
@@ -414,7 +414,7 @@ int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv)
*
****************************************************************************/
-int up_addrenv_restore(hw_addrenv_t oldenv)
+int up_addrenv_restore(save_addrenv_t oldenv)
{
outp(Z180_MMU_CBR, (uint8_t)oldenv);
return OK;
diff --git a/binfmt/binfmt_unloadmodule.c b/binfmt/binfmt_unloadmodule.c
index 1387e79ac5..20de9d50a7 100644
--- a/binfmt/binfmt_unloadmodule.c
+++ b/binfmt/binfmt_unloadmodule.c
@@ -88,7 +88,7 @@ static inline int exec_dtors(FAR struct binary_s *binp)
{
binfmt_dtor_t *dtor = binp->dtors;
#ifdef CONFIG_ARCH_ADDRENV
- hw_addrenv_t oldenv;
+ save_addrenv_t oldenv;
int ret;
#endif
int i;
diff --git a/binfmt/libnxflat/libnxflat_addrenv.c b/binfmt/libnxflat/libnxflat_addrenv.c
index 049c033827..7f3e351766 100644
--- a/binfmt/libnxflat/libnxflat_addrenv.c
+++ b/binfmt/libnxflat/libnxflat_addrenv.c
@@ -89,7 +89,7 @@ int nxflat_addrenv_alloc(FAR struct nxflat_loadinfo_s *loadinfo, size_t envsize)
FAR struct dspace_s *dspace;
#ifdef CONFIG_ARCH_ADDRENV
FAR void *vaddr;
- hw_addrenv_t oldenv;
+ save_addrenv_t oldenv;
int ret;
#endif
diff --git a/include/nuttx/addrenv.h b/include/nuttx/addrenv.h
new file mode 100644
index 0000000000..6460e22138
--- /dev/null
+++ b/include/nuttx/addrenv.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+ * include/nuttx/addrenv.h
+ *
+ * Copyright (C) 2014 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_NUTTX_ADDRENV_H
+#define __INCLUDE_NUTTX_ADDRENV_H 1
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include
+
+#ifdef CONFIG_ARCH_ADDRENV
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+/* Configuration ************************************************************/
+/* Pre-requisites */
+
+#ifndef CONFIG_MM_PGALLOC
+# error CONFIG_MM_PGALLOC not defined
+#endif
+
+#ifndef CONFIG_MM_PGSIZE
+# error CONFIG_MM_PGSIZE not defined
+#endif
+
+/* .text region */
+
+#ifndef CONFIG_ARCH_TEXT_VBASE
+# error CONFIG_ARCH_TEXT_VBASE not defined
+# define CONFIG_ARCH_TEXT_VBASE 0
+#endif
+
+#if (CONFIG_ARCH_TEXT_VBASE & CONFIG_MM_MASK) != 0
+# error CONFIG_ARCH_TEXT_VBASE not aligned to page boundary
+#endif
+
+#ifndef CONFIG_ARCH_TEXT_NPAGES
+# warning CONFIG_ARCH_TEXT_NPAGES not defined
+# define CONFIG_ARCH_TEXT_NPAGES 1
+#endif
+
+#define CONFIG_ARCH_TEXT_SIZE (CONFIG_ARCH_TEXT_NPAGES * CONFIG_MM_PGSIZE)
+
+/* .bss/.data region */
+
+#ifndef CONFIG_ARCH_DATA_VBASE
+# error CONFIG_ARCH_DATA_VBASE not defined
+# define CONFIG_ARCH_DATA_VBASE (CONFIG_ARCH_TEXT_VBASE + CONFIG_ARCH_TEXT_SIZE)
+#endif
+
+#if (CONFIG_ARCH_DATA_VBASE & CONFIG_MM_MASK) != 0
+# error CONFIG_ARCH_DATA_VBASE not aligned to page boundary
+#endif
+
+#ifndef CONFIG_ARCH_DATA_NPAGES
+# warning CONFIG_ARCH_DATA_NPAGES not defined
+# define CONFIG_ARCH_DATA_NPAGES 1
+#endif
+
+#define CONFIG_ARCH_DATA_SIZE (CONFIG_ARCH_DATA_NPAGES * CONFIG_MM_PGSIZE)
+
+/* Heap region */
+
+#ifndef CONFIG_ARCH_HEAP_VBASE
+# error CONFIG_ARCH_HEAP_VBASE not defined
+# define CONFIG_ARCH_HEAP_VBASE (CONFIG_ARCH_DATA_VBASE + CONFIG_ARCH_DATA_SIZE)
+#endif
+
+#if (CONFIG_ARCH_HEAP_VBASE & CONFIG_MM_MASK) != 0
+# error CONFIG_ARCH_HEAP_VBASE not aligned to page boundary
+#endif
+
+#ifndef CONFIG_ARCH_HEAP_NPAGES
+# warning CONFIG_ARCH_HEAP_NPAGES not defined
+# define CONFIG_ARCH_HEAP_NPAGES 1
+#endif
+
+#define CONFIG_ARCH_HEAP_SIZE (CONFIG_ARCH_HEAP_NPAGES * CONFIG_MM_PGSIZE)
+
+/* Stack region */
+
+#ifndef CONFIG_ARCH_STACK_VBASE
+# error CONFIG_ARCH_STACK_VBASE not defined
+# define CONFIG_ARCH_STACK_VBASE (CONFIG_ARCH_HEAP_VBASE + CONFIG_ARCH_HEAP_SIZE)
+#endif
+
+#if (CONFIG_ARCH_STACK_VBASE & CONFIG_MM_MASK) != 0
+# error CONFIG_ARCH_STACK_VBASE not aligned to page boundary
+#endif
+
+#ifndef CONFIG_ARCH_STACK_NPAGES
+# warning CONFIG_ARCH_STACK_NPAGES not defined
+# define CONFIG_ARCH_STACK_NPAGES 1
+#endif
+
+#define CONFIG_ARCH_STACK_SIZE (CONFIG_ARCH_STACK_NPAGES * CONFIG_MM_PGSIZE)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Address Environment Interfaces
+ *
+ * Low-level interfaces used in binfmt/ to instantiate tasks with address
+ * environments. These interfaces all operate on type group_addrenv_t which
+ * is an abstract representation of a task group's address environment and
+ * must be defined in arch/arch.h if CONFIG_ARCH_ADDRENV is defined.
+ *
+ * up_addrenv_create - Create an address environment
+ * up_addrenv_destroy - Destroy an address environment.
+ * up_addrenv_vaddr - Returns the virtual base address of the address
+ * environment
+ * up_addrenv_select - Instantiate an address environment
+ * up_addrenv_restore - Restore an address environment
+ * up_addrenv_assign - Assign an address environment to a group
+ *
+ * Higher-level interfaces used by the tasking logic. These interfaces are
+ * used by the functions in sched/ and all operate on the thread which whose
+ * group been assigned an address environment by up_addrenv_assign().
+ *
+ * up_addrenv_attach - Clone the address environment assigned to one TCB
+ * to another. This operation is done when a pthread
+ * is created that share's the same address
+ * environment.
+ * up_addrenv_detach - Release the threads reference to an address
+ * environment when a task/thread exits.
+ *
+ ****************************************************************************/
+
+/* Prototyped in include/nuttx/arch.h as part of the OS/platform interface */
+
+#endif /* CONFIG_ARCH_ADDRENV */
+#endif /* __INCLUDE_NUTTX_ADDRENV_H */
diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h
index 5ff80a5eae..951d959fe1 100644
--- a/include/nuttx/arch.h
+++ b/include/nuttx/arch.h
@@ -698,7 +698,7 @@ void up_allocate_kheap(FAR void **heap_start, size_t *heap_size);
*
* Description:
* This function is called when a new task is created in order to
- * instantiate an address environment for the new task group.
+ * instantiate an address environment for the new task group.
* up_addrenv_create() is essentially the allocator of the physical
* memory for the new task.
*
@@ -776,8 +776,8 @@ int up_addrenv_vaddr(FAR group_addrenv_t addrenv, FAR void **vaddr);
* The address environment that was in place before up_addrenv_select().
* This may be used with up_addrenv_restore() to restore the original
* address environment that was in place before up_addrenv_select() was
- * called. Note that this may be a task agnostic, hardware
- * representation that is different from group_addrenv_t.
+ * called. Note that this may be a task agnostic, platform-specific
+ * representation that may or may not be different from group_addrenv_t.
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
@@ -785,7 +785,7 @@ int up_addrenv_vaddr(FAR group_addrenv_t addrenv, FAR void **vaddr);
****************************************************************************/
#ifdef CONFIG_ARCH_ADDRENV
-int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv);
+int up_addrenv_select(group_addrenv_t addrenv, save_addrenv_t *oldenv);
#endif
/****************************************************************************
@@ -797,7 +797,7 @@ int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv);
* original address environment.
*
* Input Parameters:
- * oldenv - The hardware representation of the address environment
+ * oldenv - The platform-specific representation of the address environment
* previously returned by up_addrenv_select.
*
* Returned Value:
@@ -806,7 +806,7 @@ int up_addrenv_select(group_addrenv_t addrenv, hw_addrenv_t *oldenv);
****************************************************************************/
#ifdef CONFIG_ARCH_ADDRENV
-int up_addrenv_restore(hw_addrenv_t oldenv);
+int up_addrenv_restore(save_addrenv_t oldenv);
#endif
/****************************************************************************
diff --git a/include/nuttx/binfmt/elf.h b/include/nuttx/binfmt/elf.h
index 1b944eeafa..ec79ffb48f 100644
--- a/include/nuttx/binfmt/elf.h
+++ b/include/nuttx/binfmt/elf.h
@@ -132,7 +132,7 @@ struct elf_loadinfo_s
#ifdef CONFIG_ARCH_ADDRENV
group_addrenv_t addrenv; /* Task group address environment */
- hw_addrenv_t oldenv; /* Saved hardware address environment */
+ save_addrenv_t oldenv; /* Saved hardware address environment */
#endif
uint16_t symtabidx; /* Symbol table section index */
diff --git a/include/nuttx/binfmt/nxflat.h b/include/nuttx/binfmt/nxflat.h
index 52fd0a4166..f44f4c77bd 100644
--- a/include/nuttx/binfmt/nxflat.h
+++ b/include/nuttx/binfmt/nxflat.h
@@ -104,7 +104,7 @@ struct nxflat_loadinfo_s
#ifdef CONFIG_ARCH_ADDRENV
group_addrenv_t addrenv; /* Task group address environment */
- hw_addrenv_t oldenv; /* Saved hardware address environment */
+ save_addrenv_t oldenv; /* Saved hardware address environment */
#endif
/* File descriptors */
diff --git a/include/nuttx/pgalloc.h b/include/nuttx/pgalloc.h
index ebaa06d12e..1db59dee57 100644
--- a/include/nuttx/pgalloc.h
+++ b/include/nuttx/pgalloc.h
@@ -66,7 +66,7 @@
*
* Dependencies: CONFIG_ARCH_HAVE_MMU and CONFIG_GRAN
*/
-
+
#ifndef CONFIG_MM_PGALLOC_PGSIZE
# define CONFIG_MM_PGALLOC_PGSIZE 4096
#endif