/**************************************************************************** * configs/sam3u-ek/kernel/up_userspace.c * * Copyright (C) 2013 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. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #if defined(CONFIG_NUTTX_KERNEL) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* Configuration ************************************************************/ #ifndef CONFIG_NUTTX_USERSPACE # error "CONFIG_NUTTX_USERSPACE not defined" #endif #if CONFIG_NUTTX_USERSPACE != 0x00090000 # error "CONFIG_NUTTX_USERSPACE must be 0x00090000 to match user-space.ld" #endif /**************************************************************************** * Public Data ****************************************************************************/ /* These 'addresses' of these values are setup by the linker script. They are * not actual uint32_t storage locations! They are only used meaningfully in the * following way: * * - The linker script defines, for example, the symbol_sdata. * - The declareion extern uint32_t _sdata; makes C happy. C will believe * that the value _sdata is the address of a uint32_t variable _data (it is * not!). * - We can recoved the linker value then by simply taking the address of * of _data. like: uint32_t *pdata = &_sdata; */ extern uint32_t _stext; /* Start of .text */ extern uint32_t _etext; /* End_1 of .text + .rodata */ extern const uint32_t _eronly; /* End+1 of read only section (.text + .rodata) */ extern uint32_t _sdata; /* Start of .data */ extern uint32_t _edata; /* End+1 of .data */ extern uint32_t _sbss; /* Start of .bss */ extern uint32_t _ebss; /* End+1 of .bss */ /* This is the user space entry point */ int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]); const struct userspace_s userspace __attribute__ ((section (".userspace"))) = { /* General memory map */ .us_entrypoint = (main_t)CONFIG_USER_ENTRYPOINT, .us_textstart = (uintptr_t)&_stext, .us_textend = (uintptr_t)&_etext, .us_datasource = (uintptr_t)&_eronly, .us_datastart = (uintptr_t)&_sdata, .us_dataend = (uintptr_t)&_edata, .us_bssstart = (uintptr_t)&_sbss, .us_bssend = (uintptr_t)&_ebss, /* Task/thread startup routines */ .task_startup = task_startup, #ifndef CONFIG_DISABLE_PTHREAD .pthread_startup = pthread_startup, #endif /* Signal handler trampoline */ #ifndef CONFIG_DISABLE_SIGNALS .signal_handler = up_signal_handler, #endif /* Memory manager entry points (declared in include/nuttx/mm.h) */ .mm_initialize = umm_initialize, .mm_addregion = umm_addregion, .mm_trysemaphore = umm_trysemaphore, .mm_givesemaphore = umm_givesemaphore, /* Memory manager entry points (declared in include/stdlib.h) */ .mm_malloc = malloc, .mm_realloc = realloc, .mm_zalloc = zalloc, .mm_free = free, /* User-space work queue support (declared in include/nuttx/wqueue.h) */ #if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) .work_usrstart = work_usrstart; #endif }; /**************************************************************************** * Public Functions ****************************************************************************/ #endif /* CONFIG_NUTTX_KERNEL && !__KERNEL__ */