Browse Source
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5486 42af7a65-404d-4744-a932-0658087f49c3sbg
19 changed files with 389 additions and 52 deletions
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
/************************************************************************************ |
||||
* arch/arm/src/arm/up_vfork.S |
||||
* |
||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved. |
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
* |
||||
* 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 <nuttx/config.h> |
||||
|
||||
/************************************************************************************ |
||||
* Pre-processor Definitions |
||||
************************************************************************************/ |
||||
|
||||
/************************************************************************************ |
||||
* Global Symbols |
||||
************************************************************************************/ |
||||
|
||||
.file "up_vfork.S" |
||||
.globl __vfork
|
||||
|
||||
/************************************************************************************ |
||||
* Public Functions |
||||
************************************************************************************/ |
||||
|
||||
/************************************************************************************ |
||||
* Name: vfork |
||||
* |
||||
* Description: |
||||
* The vfork() function has the same effect as fork(), except that the behavior is |
||||
* undefined if the process created by vfork() either modifies any data other than |
||||
* a variable of type pid_t used to store the return value from vfork(), or returns |
||||
* from the function in which vfork() was called, or calls any other function before |
||||
* successfully calling _exit() or one of the exec family of functions.
|
||||
* |
||||
* This thin layer implements vfork by simply calling __vfork() with the vfork() |
||||
* return address as an argument. |
||||
* |
||||
* Input Paremeters: |
||||
* None |
||||
* |
||||
* Return: |
||||
* Upon successful completion, vfork() returns 0 to the child process and returns |
||||
* the process ID of the child process to the parent process. Otherwise, -1 is |
||||
* returned to the parent, no child process is created, and errno is set to |
||||
* indicate the error.
|
||||
* |
||||
************************************************************************************/ |
||||
|
||||
.globl vfork
|
||||
.type vfork, function |
||||
vfork: |
||||
|
||||
/* I know, I could have used the GCC's return address builtin and done this all |
||||
* in C. But this works even if there is no builtin. |
||||
*/ |
||||
|
||||
mov r0, lr |
||||
b __vfork |
||||
.size vfork, .-vfork |
||||
.end |
@ -0,0 +1,96 @@
@@ -0,0 +1,96 @@
|
||||
/************************************************************************************ |
||||
* arch/arm/src/armv7-m/up_vfork.S |
||||
* |
||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved. |
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
* |
||||
* 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 <nuttx/config.h> |
||||
|
||||
/************************************************************************************ |
||||
* Pre-processor Definitions |
||||
************************************************************************************/ |
||||
|
||||
/************************************************************************************ |
||||
* Global Symbols |
||||
************************************************************************************/ |
||||
|
||||
.syntax unified
|
||||
.thumb |
||||
.file "up_vfork.S" |
||||
.globl __vfork
|
||||
|
||||
/************************************************************************************ |
||||
* Public Functions |
||||
************************************************************************************/ |
||||
|
||||
/************************************************************************************ |
||||
* Name: vfork |
||||
* |
||||
* Description: |
||||
* The vfork() function has the same effect as fork(), except that the behavior is |
||||
* undefined if the process created by vfork() either modifies any data other than |
||||
* a variable of type pid_t used to store the return value from vfork(), or returns |
||||
* from the function in which vfork() was called, or calls any other function before |
||||
* successfully calling _exit() or one of the exec family of functions.
|
||||
* |
||||
* This thin layer implements vfork by simply calling __vfork() with the vfork() |
||||
* return address as an argument. |
||||
* |
||||
* Input Paremeters: |
||||
* None |
||||
* |
||||
* Return: |
||||
* Upon successful completion, vfork() returns 0 to the child process and returns |
||||
* the process ID of the child process to the parent process. Otherwise, -1 is |
||||
* returned to the parent, no child process is created, and errno is set to |
||||
* indicate the error.
|
||||
* |
||||
************************************************************************************/ |
||||
|
||||
.thumb_func |
||||
.globl vfork
|
||||
.type vfork, function |
||||
vfork: |
||||
|
||||
/* I know, I could have used the GCC's return address builtin and done this all |
||||
* in C. But this works even if there is no builtin. |
||||
*/ |
||||
|
||||
mov r0, lr |
||||
b __vfork |
||||
.size vfork, .-vfork |
||||
.end |
||||
|
@ -0,0 +1,134 @@
@@ -0,0 +1,134 @@
|
||||
/****************************************************************************
|
||||
* arch/arm/src/common/up__vfork |
||||
* |
||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved. |
||||
* Author: Gregory Nutt <gnutt@nuttx.org> |
||||
* |
||||
* 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 <nuttx/config.h> |
||||
|
||||
#include <sched.h> |
||||
|
||||
#include <nuttx/sched.h> |
||||
|
||||
#include "os_internal.h" |
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions |
||||
****************************************************************************/ |
||||
|
||||
/* ARM requires at least a 4-byte stack alignment. For use with EABI and
|
||||
* floating point, the stack must be aligned to 8-byte addresses. |
||||
*/ |
||||
|
||||
#ifndef CONFIG_STACK_ALIGNMENT |
||||
|
||||
/* The symbol __ARM_EABI__ is defined by GCC if EABI is being used. If you
|
||||
* are not using GCC, make sure that CONFIG_STACK_ALIGNMENT is set correctly! |
||||
*/ |
||||
|
||||
# ifdef __ARM_EABI__ |
||||
# define CONFIG_STACK_ALIGNMENT 8 |
||||
# else |
||||
# define CONFIG_STACK_ALIGNMENT 4 |
||||
# endif |
||||
#endif |
||||
|
||||
/****************************************************************************
|
||||
* Private Functions |
||||
****************************************************************************/ |
||||
|
||||
/****************************************************************************
|
||||
* Public Functions |
||||
****************************************************************************/ |
||||
|
||||
/****************************************************************************
|
||||
* Name: __vfork |
||||
* |
||||
* Description: |
||||
* The vfork() function has the same effect as fork(), except that the |
||||
* behavior is undefined if the process created by vfork() either modifies |
||||
* any data other than a variable of type pid_t used to store the return |
||||
* value from vfork(), or returns from the function in which vfork() was |
||||
* called, or calls any other function before successfully calling _exit() |
||||
* or one of the exec family of functions.
|
||||
* |
||||
* This thin layer starts the vfork child by simply spawning a new thread |
||||
* that begins at the return address of vfork(). |
||||
* |
||||
* Input Paremeters: |
||||
* retaddr - The return address of vfork() |
||||
* |
||||
* Return: |
||||
* Upon successful completion, vfork() returns 0 to the child process and |
||||
* returns the process ID of the child process to the parent process. |
||||
* Otherwise, -1 is returned to the parent, no child process is created, |
||||
* and errno is set to indicate the error.
|
||||
* |
||||
****************************************************************************/ |
||||
|
||||
pid_t __vfork(uint32_t retaddr) |
||||
{ |
||||
FAR _TCB *parent = (FAR _TCB *)g_readytorun.head; |
||||
size_t stacksize; |
||||
int priority; |
||||
|
||||
/* Get the size of the parent task's stack. Due to alignment operations,
|
||||
* the adjusted stack size may be smaller than the stack size originally |
||||
* requrested. |
||||
*/ |
||||
|
||||
stacksize = parent->adj_stack_size + CONFIG_STACK_ALIGNMENT - 1; |
||||
|
||||
/* Get the current priority of the parent task */ |
||||
|
||||
#ifdef CONFIG_PRIORITY_INHERITANCE |
||||
priority = parent->base_priority; /* "Normal," unboosted priority */ |
||||
#else |
||||
priority = parent->sched_priority; /* Current priority */ |
||||
#endif |
||||
|
||||
/* Start the child thread at the vfork return address. TASK_CREATE will
|
||||
* return the PID of the new thread. Otherwise a negative value will be |
||||
* returned and the errno will be set appropriately. |
||||
* |
||||
* When the registers are initialized, the return value in R0 should be |
||||
* cleared to zero, providing the indication to the newly started child |
||||
* thread. |
||||
*/ |
||||
|
||||
return TASK_CREATE("init", priority, stacksize, (main_t)retaddr, |
||||
(const char **)NULL); |
||||
} |
Loading…
Reference in new issue