diff options
| author | Bernard Xiong <[email protected]> | 2018-09-01 12:03:32 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2018-09-01 12:03:32 +0800 |
| commit | ab1a220eae0cac577d6d7e0cb63d892620e1cd49 (patch) | |
| tree | fc6491781a0a037146bb4f2597555a754823add6 /components/lwp/lwp.c | |
| parent | 52761fb9c89efb3fe57b849b484d92b5a388ee65 (diff) | |
[components] Remove lwP from v3.1.0
Diffstat (limited to 'components/lwp/lwp.c')
| -rw-r--r-- | components/lwp/lwp.c | 398 |
1 files changed, 0 insertions, 398 deletions
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c deleted file mode 100644 index 0bfeb4b103..0000000000 --- a/components/lwp/lwp.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * File : clock.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Change Logs: - * Date Author Notes - */ - -#include <rtthread.h> -#include <rthw.h> -#include <dfs_posix.h> - -#ifndef RT_USING_DFS - #error "lwp need file system(RT_USING_DFS)" -#endif - -#include "lwp.h" - -#define DBG_ENABLE -#define DBG_SECTION_NAME "LWP" -#define DBG_COLOR -#define DBG_LEVEL DBG_WARNING -#include <rtdbg.h> - -extern rt_thread_t rt_current_thread; -extern void lwp_user_entry(void *args, const void *text, void *data); - -/** - * RT-Thread light-weight process - */ -void lwp_set_kernel_sp(uint32_t *sp) -{ - struct rt_lwp *user_data; - user_data = (struct rt_lwp *)rt_current_thread->lwp; - user_data->kernel_sp = sp; -} - -uint32_t *lwp_get_kernel_sp(void) -{ - struct rt_lwp *user_data; - user_data = (struct rt_lwp *)rt_current_thread->lwp; - - return user_data->kernel_sp; -} - -static int lwp_argscopy(struct rt_lwp *lwp, int argc, char **argv) -{ - int size = sizeof(int)*3; /* store argc, argv, NULL */ - int *args; - char *str; - char **new_argv; - int i; - int len; - - for (i = 0; i < argc; i ++) - { - size += (rt_strlen(argv[i]) + 1); - } - size += (sizeof(int) * argc); - - args = (int*)rt_malloc(size); - if (args == RT_NULL) - return -1; - - str = (char*)((int)args + (argc + 3) * sizeof(int)); - new_argv = (char**)&args[2]; - args[0] = argc; - args[1] = (int)new_argv; - - for (i = 0; i < argc; i ++) - { - len = rt_strlen(argv[i]) + 1; - new_argv[i] = str; - rt_memcpy(str, argv[i], len); - str += len; - } - new_argv[i] = 0; - lwp->args = args; - - return 0; -} - -static int lwp_load(const char *filename, struct rt_lwp *lwp, uint8_t *load_addr, size_t addr_size) -{ - int fd; - uint8_t *ptr; - int result = RT_EOK; - int nbytes; - struct lwp_header header; - struct lwp_chunk chunk; - - /* check file name */ - RT_ASSERT(filename != RT_NULL); - /* check lwp control block */ - RT_ASSERT(lwp != RT_NULL); - - if (load_addr != RT_NULL) - { - lwp->lwp_type = LWP_TYPE_FIX_ADDR; - ptr = load_addr; - } - else - { - lwp->lwp_type = LWP_TYPE_DYN_ADDR; - ptr = RT_NULL; - } - - /* open lwp */ - fd = open(filename, 0, O_RDONLY); - if (fd < 0) - { - dbg_log(DBG_ERROR, "open file:%s failed!\n", filename); - result = -RT_ENOSYS; - goto _exit; - } - - /* read lwp header */ - nbytes = read(fd, &header, sizeof(struct lwp_header)); - if (nbytes != sizeof(struct lwp_header)) - { - dbg_log(DBG_ERROR, "read lwp header return error size: %d!\n", nbytes); - result = -RT_EIO; - goto _exit; - } - - /* check file header */ - if (header.magic != LWP_MAGIC) - { - dbg_log(DBG_ERROR, "erro header magic number: 0x%02X\n", header.magic); - result = -RT_EINVAL; - goto _exit; - } - - /* read text chunk info */ - nbytes = read(fd, &chunk, sizeof(struct lwp_chunk)); - if (nbytes != sizeof(struct lwp_chunk)) - { - dbg_log(DBG_ERROR, "read text chunk info failed!\n"); - result = -RT_EIO; - goto _exit; - } - - dbg_log(DBG_LOG, "chunk name: %s, total len %d, data %d, need space %d!\n", - "text", /*chunk.name*/ chunk.total_len, chunk.data_len, chunk.data_len_space); - - /* load text */ - { - lwp->text_size = RT_ALIGN(chunk.data_len_space, 4); - if (load_addr) - lwp->text_entry = ptr; - else - { -#ifdef RT_USING_CACHE - lwp->text_entry = (rt_uint8_t *)rt_malloc_align(lwp->text_size, RT_CPU_CACHE_LINE_SZ); -#else - lwp->text_entry = (rt_uint8_t *)rt_malloc(lwp->text_size); -#endif - - if (lwp->text_entry == RT_NULL) - { - dbg_log(DBG_ERROR, "alloc text memory faild!\n"); - result = -RT_ENOMEM; - goto _exit; - } - else - { - dbg_log(DBG_LOG, "lwp text malloc : %p, size: %d!\n", lwp->text_entry, lwp->text_size); - } - } - dbg_log(DBG_INFO, "load text %d => (0x%08x, 0x%08x)\n", lwp->text_size, (uint32_t)lwp->text_entry, (uint32_t)lwp->text_entry + lwp->text_size); - - nbytes = read(fd, lwp->text_entry, chunk.data_len); - if (nbytes != chunk.data_len) - { - dbg_log(DBG_ERROR, "read text region from file failed!\n"); - result = -RT_EIO; - goto _exit; - } -#ifdef RT_USING_CACHE - else - { - rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, lwp->text_entry, lwp->text_size); - rt_hw_cpu_icache_ops(RT_HW_CACHE_INVALIDATE, lwp->text_entry, lwp->text_size); - } -#endif - - if (ptr != RT_NULL) ptr += nbytes; - - /* skip text hole */ - if ((chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len)) - { - dbg_log(DBG_LOG, "skip text hole %d!\n", (chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len)); - lseek(fd, (chunk.total_len - sizeof(struct lwp_chunk) - chunk.data_len), SEEK_CUR); - } - } - - /* load data */ - nbytes = read(fd, &chunk, sizeof(struct lwp_chunk)); - if (nbytes != sizeof(struct lwp_chunk)) - { - dbg_log(DBG_ERROR, "read data chunk info failed!\n"); - result = -RT_EIO; - goto _exit; - } - - dbg_log(DBG_LOG, "chunk name: %s, total len %d, data %d, need space %d!\n", - chunk.name, chunk.total_len, chunk.data_len, chunk.data_len_space); - - { - lwp->data_size = RT_ALIGN(chunk.data_len_space, 4); - if (load_addr) - lwp->data = ptr; - else - { - lwp->data = rt_malloc(lwp->data_size); - if (lwp->data == RT_NULL) - { - dbg_log(DBG_ERROR, "alloc data memory faild!\n"); - result = -RT_ENOMEM; - goto _exit; - } - else - { - dbg_log(DBG_LOG, "lwp data malloc : %p, size: %d!\n", lwp->data, lwp->data_size); - rt_memset(lwp->data, 0, lwp->data_size); - } - } - - dbg_log(DBG_INFO, "load data %d => (0x%08x, 0x%08x)\n", lwp->data_size, (uint32_t)lwp->data, (uint32_t)lwp->data + lwp->data_size); - nbytes = read(fd, lwp->data, chunk.data_len); - if (nbytes != chunk.data_len) - { - dbg_log(DBG_ERROR, "read data region from file failed!\n"); - result = -RT_ERROR; - goto _exit; - } - } - -_exit: - if (fd >= 0) - close(fd); - - if (result != RT_EOK) - { - if (lwp->lwp_type == LWP_TYPE_DYN_ADDR) - { - dbg_log(DBG_ERROR, "lwp dynamic load faild, %d\n", result); - if (lwp->text_entry) - { - dbg_log(DBG_LOG, "lwp text free: %p\n", lwp->text_entry); -#ifdef RT_USING_CACHE - rt_free_align(lwp->text_entry); -#else - rt_free(lwp->text_entry); -#endif - } - if (lwp->data) - { - dbg_log(DBG_LOG, "lwp data free: %p\n", lwp->data); - rt_free(lwp->data); - } - } - } - - return result; -} - -static void lwp_cleanup(struct rt_thread *tid) -{ - struct rt_lwp *lwp; - - dbg_log(DBG_INFO, "thread: %s, stack_addr: %08X\n", tid->name, tid->stack_addr); - - lwp = (struct rt_lwp *)tid->lwp; - - if (lwp->lwp_type == LWP_TYPE_DYN_ADDR) - { - dbg_log(DBG_INFO, "dynamic lwp\n"); - if (lwp->text_entry) - { - dbg_log(DBG_LOG, "lwp text free: %p\n", lwp->text_entry); -#ifdef RT_USING_CACHE - rt_free_align(lwp->text_entry); -#else - rt_free(lwp->text_entry); -#endif - } - if (lwp->data) - { - dbg_log(DBG_LOG, "lwp data free: %p\n", lwp->data); - rt_free(lwp->data); - } - } - - dbg_log(DBG_LOG, "lwp free memory pages\n"); - rt_lwp_mem_deinit(lwp); - - /* cleanup fd table */ - while (lwp->fdt.maxfd > 0) - { - lwp->fdt.maxfd --; - close(lwp->fdt.maxfd); - } - rt_free(lwp->fdt.fds); - rt_free(lwp->args); - - dbg_log(DBG_LOG, "lwp free: %p\n", lwp); - rt_free(lwp); - - /* TODO: cleanup fd table */ -} - -static void lwp_thread(void *parameter) -{ - rt_thread_t tid; - struct rt_lwp *lwp; - - lwp = (struct rt_lwp *)parameter; - rt_lwp_mem_init(lwp); - tid = rt_thread_self(); - tid->lwp = lwp; - tid->cleanup = lwp_cleanup; - - lwp_user_entry(lwp->args, lwp->text_entry, lwp->data); -} - -struct rt_lwp *rt_lwp_self(void) -{ - return (struct rt_lwp *)rt_thread_self()->lwp; -} - -int exec(char *filename, int argc, char **argv) -{ - struct rt_lwp *lwp; - int result; - - if (filename == RT_NULL) - return -RT_ERROR; - - lwp = (struct rt_lwp *)rt_malloc(sizeof(struct rt_lwp)); - if (lwp == RT_NULL) - { - dbg_log(DBG_ERROR, "lwp struct out of memory!\n"); - return -RT_ENOMEM; - } - dbg_log(DBG_INFO, "lwp malloc : %p, size: %d!\n", lwp, sizeof(struct rt_lwp)); - - rt_memset(lwp, 0, sizeof(*lwp)); - if (lwp_argscopy(lwp, argc, argv) != 0) - { - rt_free(lwp); - return -ENOMEM; - } - - result = lwp_load(filename, lwp, RT_NULL, 0); - if (result == RT_EOK) - { - rt_thread_t tid; - - tid = rt_thread_create("user", lwp_thread, (void *)lwp, - 1024 * 4, 2, 200); - if (tid != RT_NULL) - { - dbg_log(DBG_LOG, "lwp kernel => (0x%08x, 0x%08x)\n", (rt_uint32_t)tid->stack_addr, (rt_uint32_t)tid->stack_addr + tid->stack_size); - rt_thread_startup(tid); - return RT_EOK; - } - else - { -#ifdef RT_USING_CACHE - rt_free_align(lwp->text_entry); -#else - rt_free(lwp->text_entry); -#endif - rt_free(lwp->data); - } - } - - rt_free(lwp->args); - rt_free(lwp); - - return -RT_ERROR; -} |
