summaryrefslogtreecommitdiff
path: root/nuttx/include
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-12-19 17:54:26 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-12-19 17:54:26 +0000
commit913f876fac94f21a683809d9f648e4793f61e237 (patch)
tree1587afb37a0e1b5a87f007f452e147ff3c2dcc04 /nuttx/include
parentbbef9f93daeb6a3565c4c28572d73130dfb6ac85 (diff)
downloadpx4-nuttx-913f876fac94f21a683809d9f648e4793f61e237.tar.gz
px4-nuttx-913f876fac94f21a683809d9f648e4793f61e237.tar.bz2
px4-nuttx-913f876fac94f21a683809d9f648e4793f61e237.zip
Incorporate address environment interfaces in binfmt/ logic
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5443 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/include')
-rw-r--r--nuttx/include/nuttx/binfmt/binfmt.h17
-rw-r--r--nuttx/include/nuttx/binfmt/elf.h46
-rw-r--r--nuttx/include/nuttx/binfmt/nxflat.h39
-rw-r--r--nuttx/include/nuttx/sched.h32
4 files changed, 114 insertions, 20 deletions
diff --git a/nuttx/include/nuttx/binfmt/binfmt.h b/nuttx/include/nuttx/binfmt/binfmt.h
index 2e2c6dda8..6df5190d2 100644
--- a/nuttx/include/nuttx/binfmt/binfmt.h
+++ b/nuttx/include/nuttx/binfmt/binfmt.h
@@ -41,8 +41,11 @@
****************************************************************************/
#include <nuttx/config.h>
+
#include <sys/types.h>
#include <nxflat.h>
+
+#include <nuttx/arch.h>
#include <nuttx/sched.h>
/****************************************************************************
@@ -93,12 +96,26 @@ struct binary_s
main_t entrypt; /* Entry point into a program module */
FAR void *mapped; /* Memory-mapped, address space */
FAR void *alloc[BINFMT_NALLOC]; /* Allocated address spaces */
+
+ /* Constructors/destructors */
+
#ifdef CONFIG_BINFMT_CONSTRUCTORS
FAR binfmt_ctor_t *ctors; /* Pointer to a list of constructors */
FAR binfmt_dtor_t *dtors; /* Pointer to a list of destructors */
uint16_t nctors; /* Number of constructors in the list */
uint16_t ndtors; /* Number of destructors in the list */
#endif
+
+ /* Address environment.
+ *
+ * addrenv - This is the handle created by up_addrenv_create() that can be
+ * used to manage the tasks address space.
+ */
+
+#ifdef CONFIG_ADDRENV
+ task_addrenv_t addrenv; /* Task address environment */
+#endif
+
size_t mapsize; /* Size of the mapped address region (needed for munmap) */
size_t stacksize; /* Size of the stack in bytes (unallocated) */
};
diff --git a/nuttx/include/nuttx/binfmt/elf.h b/nuttx/include/nuttx/binfmt/elf.h
index 432e57f0f..6b6851934 100644
--- a/nuttx/include/nuttx/binfmt/elf.h
+++ b/nuttx/include/nuttx/binfmt/elf.h
@@ -59,6 +59,18 @@
# define CONFIG_ELF_ALIGN_LOG2 2
#endif
+#ifndef CONFIG_ELF_STACKSIZE
+# define CONFIG_ELF_STACKSIZE 2048
+#endif
+
+#ifndef CONFIG_ELF_BUFFERSIZE
+# define CONFIG_ELF_BUFFERSIZE 128
+#endif
+
+#ifndef CONFIG_ELF_BUFFERINCR
+# define CONFIG_ELF_BUFFERINCR 32
+#endif
+
/* Allocation array size and indices */
#define LIBELF_ELF_ALLOC 0
@@ -80,8 +92,16 @@
struct elf_loadinfo_s
{
- /* The alloc[] array holds memory that persists after the ELF module has
- * been loaded.
+ /* elfalloc is the base address of the memory that is allocated to hold the
+ * ELF program image.
+ *
+ * If CONFIG_ADDRENV=n, elfalloc will be allocated using kmalloc() (or
+ * kzalloc()). If CONFIG_ADDRENV-y, then elfalloc will be allocated using
+ * up_addrenv_create(). In either case, there will be a unique instance
+ * of elfalloc (and stack) for each instance of a process.
+ *
+ * The alloc[] array in struct binary_s will hold memory that persists after
+ * the ELF module has been loaded.
*/
uintptr_t elfalloc; /* Memory allocated when ELF file was loaded */
@@ -90,6 +110,9 @@ struct elf_loadinfo_s
Elf32_Ehdr ehdr; /* Buffered ELF file header */
FAR Elf32_Shdr *shdr; /* Buffered ELF section headers */
uint8_t *iobuffer; /* File I/O buffer */
+
+ /* Constructors and destructors */
+
#ifdef CONFIG_BINFMT_CONSTRUCTORS
FAR void *ctoralloc; /* Memory allocated for ctors */
FAR void *dtoralloc; /* Memory allocated dtors */
@@ -98,6 +121,20 @@ struct elf_loadinfo_s
uint16_t nctors; /* Number of constructors */
uint16_t ndtors; /* Number of destructors */
#endif
+
+ /* Address environment.
+ *
+ * addrenv - This is the handle created by up_addrenv_create() that can be
+ * used to manage the tasks address space.
+ * oldenv - This is a value returned by up_addrenv_select() that must be
+ * used to restore the current hardware address environment.
+ */
+
+#ifdef CONFIG_ADDRENV
+ task_addrenv_t addrenv; /* Task address environment */
+ hw_addrenv_t oldenv; /* Saved hardware address environment */
+#endif
+
uint16_t symtabidx; /* Symbol table section index */
uint16_t strtabidx; /* String table section index */
uint16_t buflen; /* size of iobuffer[] */
@@ -187,8 +224,9 @@ EXTERN int elf_bind(FAR struct elf_loadinfo_s *loadinfo,
* Name: elf_unload
*
* Description:
- * This function unloads the object from memory. This essentially
- * undoes the actions of elf_load.
+ * This function unloads the object from memory. This essentially undoes
+ * the actions of elf_load. It is called only under certain error
+ * conditions after the the module has been loaded but not yet started.
*
* Returned Value:
* 0 (OK) is returned on success and a negated errno is returned on
diff --git a/nuttx/include/nuttx/binfmt/nxflat.h b/nuttx/include/nuttx/binfmt/nxflat.h
index 89e28fbcc..db396771b 100644
--- a/nuttx/include/nuttx/binfmt/nxflat.h
+++ b/nuttx/include/nuttx/binfmt/nxflat.h
@@ -44,7 +44,9 @@
#include <stdint.h>
#include <nxflat.h>
+
#include <nuttx/sched.h>
+#include <nuttx/arch.h>
/****************************************************************************
* Pre-processor Definitions
@@ -61,17 +63,24 @@
struct nxflat_loadinfo_s
{
/* Instruction Space (ISpace): This region contains the nxflat file header
- * plus everything from the text section. Ideally, will have only one mmap'ed
- * text section instance in the system for each module.
+ * plus everything from the text section.
+ *
+ * The ISpace region is allocated using mmap() and, thus, can be shared by
+ * multiple tasks. Ideally, will have only one mmap'ed text section
+ * instance in the system for each module.
*/
- uint32_t ispace; /* Address where hdr/text is loaded */
+ uintptr_t ispace; /* Address where hdr/text is loaded */
uint32_t entryoffs; /* Offset from ispace to entry point */
uint32_t isize; /* Size of ispace. */
- /* Data Space (DSpace): This region contains all information that in referenced
- * as data (other than the stack which is separately allocated). There will be
- * a unique instance of DSpace (and stack) for each instance of a process.
+ /* Data Space (DSpace): This region contains all information that is
+ * referenced as data (other than the stack which is separately allocated).
+ *
+ * If CONFIG_ADDRENV=n, DSpace will be allocated using kmalloc() (or
+ * kzalloc()). If CONFIG_ADDRENV-y, then DSpace will be allocated using
+ * up_addrenv_create(). In either case, there will be a unique instance
+ * of DSpace (and stack) for each instance of a process.
*/
struct dspace_s *dspace; /* Allocated D-Space (data/bss/etc) */
@@ -85,6 +94,19 @@ struct nxflat_loadinfo_s
uint32_t relocstart; /* Start of array of struct flat_reloc */
uint16_t reloccount; /* Number of elements in reloc array */
+ /* Address environment.
+ *
+ * addrenv - This is the handle created by up_addrenv_create() that can be
+ * used to manage the tasks address space.
+ * oldenv - This is a value returned by up_addrenv_select() that must be
+ * used to restore the current hardware address environment.
+ */
+
+#ifdef CONFIG_ADDRENV
+ task_addrenv_t addrenv; /* Task address environment */
+ hw_addrenv_t oldenv; /* Saved hardware address environment */
+#endif
+
/* File descriptors */
int filfd; /* Descriptor for the file being loaded */
@@ -212,8 +234,9 @@ EXTERN int nxflat_bind(FAR struct nxflat_loadinfo_s *loadinfo,
* Name: nxflat_unload
*
* Description:
- * This function unloads the object from memory. This essentially
- * undoes the actions of nxflat_load.
+ * This function unloads the object from memory. This essentially undoes
+ * the actions of nxflat_load. It is called only under certain error
+ * conditions after the the module has been loaded but not yet started.
*
* Returned Value:
* 0 (OK) is returned on success and a negated errno is returned on
diff --git a/nuttx/include/nuttx/sched.h b/nuttx/include/nuttx/sched.h
index 172f46901..6eaba6e9c 100644
--- a/nuttx/include/nuttx/sched.h
+++ b/nuttx/include/nuttx/sched.h
@@ -163,24 +163,40 @@ typedef struct environ_s environ_t;
# define SIZEOF_ENVIRON_T(alloc) (sizeof(environ_t) + alloc - 1)
#endif
-/* This structure describes a reference counted D-Space region */
+/* This structure describes a reference counted D-Space region. This must be a
+ * separately allocated "break-away" structure that can be owned by a task and
+ * any pthreads created by the task.
+ */
+#ifdef CONFIG_PIC
struct dspace_s
{
- uint32_t crefs; /* This is the number of pthreads that shared the
- * the same D-Space */
- uint8_t region[1]; /* Beginning of the allocated region */
-};
+ /* The life of the structure allocation is determined by this reference
+ * count. This count is number of threads that shared the the same D-Space.
+ * This includes the parent task as well as any pthreads created by the
+ * parent task or any of its child threads.
+ */
+
+ uint16_t crefs;
-#define SIZEOF_DSPACE_S(n) (sizeof(struct dspace_s) - 1 + (n))
+ /* This is the allocated D-Space memory region. This may be a physical
+ * address allocated with kmalloc(), or it may be virtual address associated
+ * with an address environment (if CONFIG_ADDRENV=y).
+ */
-/* This is the task control block (TCB) */
+ FAR uint8_t *region;
+};
+#endif
+
+/* This is the task control block (TCB). Each task or thread is represented by
+ * a TCB. The TCB is the heart of the NuttX task-control logic.
+ */
struct _TCB
{
/* Fields used to support list management *************************************/
- FAR struct _TCB *flink; /* link in DQ of TCBs */
+ FAR struct _TCB *flink; /* Doubly linked list */
FAR struct _TCB *blink;
/* Task Management Fields *****************************************************/