Ver Fonte

[lwP] Add ARCH_MM_MMU

BernardXiong há 4 anos atrás
pai
commit
2907318a9d

+ 1 - 1
components/lwp/Kconfig

@@ -29,7 +29,7 @@ if RT_USING_LWP
         int "The maximum number of lwp thread id"
         default 64
 
-    if ARCH_ARM_MMU
+    if ARCH_MM_MMU
         config RT_LWP_SHM_MAX_NR
             int "The maximum number of shared memory"
             default 64

+ 1 - 1
components/lwp/SConscript

@@ -31,7 +31,7 @@ if platform in platform_file.keys(): # support platforms
     if arch in support_arch.keys() and cpu in support_arch[arch]:
         asm_path = 'arch/' + arch + '/' + cpu + '/*_' + platform_file[platform]
         arch_common = 'arch/' + arch + '/' + 'common/*.c'
-        if not GetDepend('ARCH_ARM_MMU'):
+        if not GetDepend('ARCH_MM_MMU'):
             excluded_files = ['ioremap.c', 'lwp_futex.c', 'lwp_mm_area.c', 'lwp_pmutex.c', 'lwp_shm.c', 'lwp_user_mm.c']
             src += [f for f in Glob('*.c') if os.path.basename(str(f)) not in excluded_files] + Glob(asm_path) + Glob(arch_common)
         else:

+ 18 - 18
components/lwp/lwp.c

@@ -227,12 +227,12 @@ struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char
 #else
 static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv, char **envp)
 {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     int size = sizeof(int) * 5; /* store argc, argv, envp, aux, NULL */
     struct process_aux *aux;
 #else
     int size = sizeof(int) * 4; /* store argc, argv, envp, NULL */
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
     int *args;
     char *str;
     char **new_argve;
@@ -256,7 +256,7 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg
         }
     }
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     /* for aux */
     size += sizeof(struct process_aux);
 
@@ -275,7 +275,7 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg
         return RT_NULL;
     }
     str = (char*)((int)args + (argc + 2 + i + 1) * sizeof(int));
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
     new_argve = (char **)&args[1];
     args[0] = argc;
@@ -304,7 +304,7 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg
         }
         new_argve[i] = 0;
     }
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     /* aux */
     aux = (struct process_aux *)(new_argve + i);
     aux->item[0].key = AT_EXECFN;
@@ -320,11 +320,11 @@ static struct process_aux *lwp_argscopy(struct rt_lwp *lwp, int argc, char **arg
     lwp->args_length = size;
 
     return (struct process_aux *)(new_argve + i);
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 }
 #endif
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
 #define check_off(voff, vlen)           \
     do                                  \
     {                                   \
@@ -952,7 +952,7 @@ _exit:
     }
     return result;
 }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
 int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size, struct process_aux *aux);
 
@@ -1076,11 +1076,11 @@ static void lwp_thread_entry(void *parameter)
     }
 #endif
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     lwp_user_entry(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, tid->stack_addr + tid->stack_size);
 #else
     lwp_user_entry(lwp->args, lwp->text_entry, lwp->data_entry, (void *)((uint32_t)lwp->data_entry + lwp->data_size));
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 }
 
 struct rt_lwp *lwp_self(void)
@@ -1153,14 +1153,14 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
     }
 
     result = lwp_load(filename, lwp, RT_NULL, 0, aux);
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     if (result == 1)
     {
         /* dynmaic */
         lwp_unmap_user(lwp, (void *)(USER_VADDR_TOP - ARCH_PAGE_SIZE));
         result = load_ldso(lwp, filename, argv, envp);
     }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
     if (result == RT_EOK)
     {
         rt_thread_t thread = RT_NULL;
@@ -1171,7 +1171,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
         /* obtain the base name */
         thread_name = strrchr(filename, '/');
         thread_name = thread_name ? thread_name + 1 : filename;
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
         struct lwp_app_head *app_head = lwp->text_entry;
         if (app_head->priority)
         {
@@ -1181,7 +1181,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
         {
             tick = app_head->tick;
         }
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
         thread = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL,
                 LWP_TASK_STACK_SIZE, priority, tick);
         if (thread != RT_NULL)
@@ -1202,7 +1202,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
                 lwp->parent = self_lwp;
             }
             thread->lwp = lwp;
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
             struct lwp_app_head *app_head = (struct lwp_app_head*)lwp->text_entry;
             thread->user_stack = app_head->stack_offset ?
                               (void *)(app_head->stack_offset -
@@ -1213,7 +1213,7 @@ pid_t lwp_execve(char *filename, int argc, char **argv, char **envp)
             rt_memset(lwp->data_entry, 0, lwp->data_size);
             /* init user stack */
             rt_memset(thread->user_stack, '#', thread->user_stack_size);
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
             rt_list_insert_after(&lwp->t_grp, &thread->sibling);
 
 #ifdef RT_USING_GDBSERVER
@@ -1252,7 +1252,7 @@ pid_t exec(char *filename, int argc, char **argv)
 }
 #endif
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
 void lwp_user_setting_save(rt_thread_t thread)
 {
     if (thread)
@@ -1292,4 +1292,4 @@ void lwp_user_setting_restore(rt_thread_t thread)
     }
 #endif
 }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */

+ 7 - 7
components/lwp/lwp_pid.c

@@ -365,7 +365,7 @@ void lwp_free(struct rt_lwp* lwp)
 #ifndef ARCH_MM_MPU
         rt_free(lwp->args);
 #endif /* not defined ARCH_MM_MPU */
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
         lwp->args = RT_NULL;
     }
 
@@ -383,7 +383,7 @@ void lwp_free(struct rt_lwp* lwp)
     /* free data section */
     if (lwp->data_entry != RT_NULL)
     {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
         rt_free_align(lwp->data_entry);
 #else
 #ifdef ARCH_MM_MPU
@@ -392,7 +392,7 @@ void lwp_free(struct rt_lwp* lwp)
 #else
         rt_free_align(lwp->data_entry);
 #endif /* ARCH_MM_MPU */
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
         lwp->data_entry = RT_NULL;
     }
 
@@ -402,9 +402,9 @@ void lwp_free(struct rt_lwp* lwp)
         if (lwp->text_entry)
         {
             LOG_D("lwp text free: %p", lwp->text_entry);
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
             rt_free((void*)lwp->text_entry);
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
             lwp->text_entry = RT_NULL;
         }
     }
@@ -503,11 +503,11 @@ void lwp_ref_dec(struct rt_lwp *lwp)
             }
 #endif /* RT_USING_GDBSERVER */
 
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
 #ifdef RT_LWP_USING_SHM
             lwp_shm_lwp_free(lwp);
 #endif /* RT_LWP_USING_SHM */
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
             lwp_free(lwp);
         }
     }

+ 2 - 2
components/lwp/lwp_signal.c

@@ -286,7 +286,7 @@ lwp_sighandler_t lwp_sighandler_get(int sig)
     }
     level = rt_hw_interrupt_disable();
     thread = rt_thread_self();
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
     if (thread->signal_in_process)
     {
         func = thread->signal_handler[sig - 1];
@@ -331,7 +331,7 @@ void lwp_sighandler_set(int sig, lwp_sighandler_t func)
     rt_hw_interrupt_enable(level);
 }
 
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
 void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func)
 {
     rt_base_t level;

+ 1 - 1
components/lwp/lwp_signal.h

@@ -22,7 +22,7 @@ int lwp_signal_backup(void *user_sp, void *user_pc, void* user_flag);
 struct rt_user_context *lwp_signal_restore(void);
 lwp_sighandler_t lwp_sighandler_get(int sig);
 void lwp_sighandler_set(int sig, lwp_sighandler_t func);
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
 void lwp_thread_sighandler_set(int sig, lwp_sighandler_t func);
 #endif
 int lwp_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *oset);

+ 32 - 32
components/lwp/lwp_syscall.c

@@ -69,7 +69,7 @@ int sys_dup(int oldfd);
 int sys_dup2(int oldfd, int new);
 void lwp_cleanup(struct rt_thread *tid);
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
 #define ALLOC_KERNEL_STACK_SIZE 5120
 
 extern void lwp_user_thread_entry(void *args, const void *text, void *ustack, void *user_stack);
@@ -92,7 +92,7 @@ static void kmem_put(void *kptr)
 
 extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack);
 extern void set_user_context(void *stack);
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
 /* The same socket option is defined differently in the user interfaces and the
  * implementation. The options should be converted in the kernel. */
@@ -362,12 +362,12 @@ static void lwp_user_thread(void *parameter)
     user_stack = (rt_size_t)tid->user_stack + tid->user_stack_size;
     user_stack &= ~7; //align 8
 
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     lwp_user_thread_entry(parameter, tid->user_entry, (void *)user_stack, tid->stack_addr + tid->stack_size);
 #else
     set_user_context((void*)user_stack);
     lwp_user_entry(parameter, tid->user_entry, ((struct rt_lwp *)tid->lwp)->data_entry, (void*)user_stack);
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 }
 
 /* thread/process */
@@ -383,7 +383,7 @@ void sys_exit(int value)
     lwp = (struct rt_lwp *)tid->lwp;
 
     level = rt_hw_interrupt_disable();
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     if (tid->clear_child_tid)
     {
         int t = 0;
@@ -418,7 +418,7 @@ void sys_exit(int value)
         }
         lwp->lwp_ret = value;
     }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
     rt_thread_delete(tid);
     rt_schedule();
@@ -1382,7 +1382,7 @@ fail:
     }
     return RT_NULL;
 }
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
 #define CLONE_VM    0x00000100
 #define CLONE_FS    0x00000200
 #define CLONE_FILES 0x00000400
@@ -2336,11 +2336,11 @@ quit:
     }
     return (ret < 0 ? GET_ERRNO() : ret);
 }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
 rt_err_t sys_thread_delete(rt_thread_t thread)
 {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     return rt_thread_delete(thread);
 #else
     rt_err_t ret = 0;
@@ -3046,7 +3046,7 @@ int sys_sigaction(int sig, const struct k_sigaction *act,
     }
 
     ret = lwp_sigaction(sig, pkact, pkoact, sigsetsize);
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     if (ret == 0 && oact)
     {
         lwp_put_to_user(&oact->handler, &pkoact->__sa_handler._sa_handler, sizeof(void (*)(int)));
@@ -3054,7 +3054,7 @@ int sys_sigaction(int sig, const struct k_sigaction *act,
         lwp_put_to_user(&oact->flags, &pkoact->sa_flags, sizeof(int));
         lwp_put_to_user(&oact->restorer, &pkoact->sa_restorer, sizeof(void (*)(void)));
     }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 out:
     return (ret < 0 ? GET_ERRNO() : ret);
 }
@@ -3063,9 +3063,9 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
 {
     int ret = -1;
     lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL;
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     lwp_sigset_t newset, oldset;
-#endif /* ARCH_ARM_MMU*/
+#endif /* ARCH_MM_MMU*/
 
     if (!size)
     {
@@ -3081,7 +3081,7 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
     }
     if (oset)
     {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
         if (!lwp_user_accessable((void *)oset, size))
         {
             return -EFAULT;
@@ -3097,7 +3097,7 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
     }
     if (sigset)
     {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
         if (!lwp_user_accessable((void *)sigset, size))
         {
             return -EFAULT;
@@ -3110,10 +3110,10 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
             return -EFAULT;
         }
         pnewset = (lwp_sigset_t *)sigset;
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
     }
     ret = lwp_sigprocmask(how, pnewset, poldset);
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     if (ret < 0)
     {
         return ret;
@@ -3122,13 +3122,13 @@ int sys_sigprocmask(int how, const sigset_t *sigset, sigset_t *oset, size_t size
     {
         lwp_put_to_user(oset, poldset, size);
     }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
     return (ret < 0 ? -EFAULT: ret);
 }
 
 int sys_tkill(int tid, int sig)
 {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     rt_base_t level;
     rt_thread_t thread;
     int ret;
@@ -3147,9 +3147,9 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
 {
     int ret = -1;
     lwp_sigset_t *pnewset = RT_NULL, *poldset = RT_NULL;
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     lwp_sigset_t newset, oldset;
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
     if (!size)
     {
@@ -3165,7 +3165,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
     }
     if (oset)
     {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
         if (!lwp_user_accessable((void *)oset, size))
         {
             return -EFAULT;
@@ -3181,7 +3181,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
     }
     if (sigset)
     {
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
         if (!lwp_user_accessable((void *)sigset, size))
         {
             return -EFAULT;
@@ -3201,7 +3201,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
     {
         return ret;
     }
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     if (oset)
     {
         lwp_put_to_user(oset, poldset, sizeof(lwp_sigset_t));
@@ -3210,7 +3210,7 @@ int sys_thread_sigprocmask(int how, const lwp_sigset_t *sigset, lwp_sigset_t *os
     return (ret < 0 ? -EFAULT: ret);
 }
 
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
 int sys_lwp_sighandler_set(int sig, lwp_sighandler_t func)
 {
     if (!lwp_user_accessable((void *)func, sizeof(lwp_sighandler_t)))
@@ -3232,7 +3232,7 @@ int sys_thread_sighandler_set(int sig, lwp_sighandler_t func)
     lwp_thread_sighandler_set(sig, func);
     return 0;
 }
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
 
 int32_t sys_waitpid(int32_t pid, int *status, int options)
 {
@@ -3624,7 +3624,7 @@ rt_err_t sys_get_errno(void)
 {
     return rt_get_errno();
 }
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
 int sys_set_thread_area(void *p)
 {
     rt_thread_t thread;
@@ -3650,7 +3650,7 @@ int sys_set_tid_address(int *tidptr)
     thread->clear_child_tid = tidptr;
     return thread->tid;
 }
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
 
 int sys_gettid(void)
 {
@@ -3954,7 +3954,7 @@ const static void* func_table[] =
     SYSCALL_USPACE(sys_brk),
     SYSCALL_USPACE(sys_mmap2),
     SYSCALL_USPACE(sys_munmap),
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     SYSCALL_USPACE(sys_shmget), /* 55 */
     SYSCALL_USPACE(sys_shmrm),
     SYSCALL_USPACE(sys_shmat),
@@ -3971,7 +3971,7 @@ const static void* func_table[] =
     (void *)sys_notimpl,
     (void *)sys_notimpl,
 #endif /* RT_LWP_USING_SHM */
-#endif /* ARCH_ARM_MMU */
+#endif /* ARCH_MM_MMU */
     (void *)sys_device_init,
     (void *)sys_device_register, /* 60 */
     (void *)sys_device_control,
@@ -4032,7 +4032,7 @@ const static void* func_table[] =
     (void *)sys_sigprocmask,
     (void *)sys_tkill,             /* 105 */
     (void *)sys_thread_sigprocmask,
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     (void *)sys_cacheflush,
     (void *)sys_notimpl,
     (void *)sys_notimpl,
@@ -4055,7 +4055,7 @@ const static void* func_table[] =
     (void *)sys_rmdir,          /* 120 */
     (void *)sys_getdents,
     (void *)sys_get_errno,
-#ifdef ARCH_ARM_MMU
+#ifdef ARCH_MM_MMU
     (void *)sys_set_thread_area,
     (void *)sys_set_tid_address,
 #else

+ 1 - 1
include/rtdef.h

@@ -737,7 +737,7 @@ struct rt_thread
     lwp_sigset_t signal_mask;
     int signal_mask_bak;
     rt_uint32_t signal_in_process;
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
     lwp_sighandler_t signal_handler[32];
 #endif
     struct rt_user_context user_ctx;

+ 10 - 5
libcpu/Kconfig

@@ -13,6 +13,12 @@ config ARCH_CPU_STACK_GROWS_UPWARD
     bool
     default n
 
+config ARCH_MM_MMU
+    bool
+
+config ARCH_MM_MPU
+    bool
+
 config ARCH_ARM
     bool
 
@@ -35,10 +41,7 @@ config ARCH_ARM_CORTEX_M3
 config ARCH_ARM_MPU
     bool
     depends on ARCH_ARM
-
-config ARCH_MM_MPU
-    bool
-    depends on ARCH_ARM_MPU
+    select ARCH_MM_MPU
 
 config ARCH_ARM_CORTEX_M4
     bool
@@ -57,12 +60,13 @@ config ARCH_ARM_CORTEX_R
 config ARCH_ARM_MMU
     bool
     select RT_USING_CACHE
+    select ARCH_MM_MMU
     depends on ARCH_ARM
 
 config RT_USING_USERSPACE
     bool "Isolated user space"
     default n
-    depends on ARCH_ARM_MMU
+    depends on ARCH_MM_MMU
 
 config KERNEL_VADDR_START
     hex "The virtural address of kernel start"
@@ -119,6 +123,7 @@ config RT_BACKTRACE_FUNCTION_NAME
 
 config ARCH_ARMV8
     bool
+    select ARCH_ARM
 
 config ARCH_MIPS
     bool

+ 2 - 2
src/scheduler.c

@@ -87,7 +87,7 @@ static void _rt_scheduler_stack_check(struct rt_thread *thread)
     RT_ASSERT(thread != RT_NULL);
 
 #ifdef RT_USING_LWP
-#ifndef ARCH_ARM_MMU
+#ifndef ARCH_MM_MMU
     struct rt_lwp *lwp = thread ? (struct rt_lwp *)thread->lwp : 0;
 
     /* if stack pointer locate in user data section skip stack check. */
@@ -96,7 +96,7 @@ static void _rt_scheduler_stack_check(struct rt_thread *thread)
     {
         return;
     }
-#endif /* not defined ARCH_ARM_MMU */
+#endif /* not defined ARCH_MM_MMU */
 #endif /* RT_USING_LWP */
 
 #if defined(ARCH_CPU_STACK_GROWS_UPWARD)