Move ARM and Cortex files to separate directories
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1795 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
e9f0d1db68
commit
da29bce964
@ -1,7 +1,7 @@
|
|||||||
############################################################################
|
############################################################################
|
||||||
# arch/arm/src/Makefile
|
# arch/arm/src/Makefile
|
||||||
#
|
#
|
||||||
# Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
# Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@ -37,7 +37,14 @@
|
|||||||
-include chip/Make.defs
|
-include chip/Make.defs
|
||||||
|
|
||||||
ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
|
ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
|
||||||
CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(TOPDIR)/sched
|
ifeq ($(CONFIG_ARCH_CORTEXM3),y)
|
||||||
|
ARCH_SUBDIR = cortexm3
|
||||||
|
else
|
||||||
|
ARCH_SUBDIR = arm
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common \
|
||||||
|
-I$(ARCH_SRCDIR)/$(ARCH_SUBDIR) -I$(TOPDIR)/sched
|
||||||
|
|
||||||
HEAD_AOBJ = $(HEAD_ASRC:.S=$(OBJEXT))
|
HEAD_AOBJ = $(HEAD_ASRC:.S=$(OBJEXT))
|
||||||
|
|
||||||
@ -61,7 +68,7 @@ BOARDDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src/board
|
|||||||
|
|
||||||
LIBGCC = ${shell $(CC) -print-libgcc-file-name}
|
LIBGCC = ${shell $(CC) -print-libgcc-file-name}
|
||||||
|
|
||||||
VPATH = chip:common
|
VPATH = chip:common:$(ARCH_SUBDIR)
|
||||||
|
|
||||||
all: $(HEAD_OBJ) libarch$(LIBEXT)
|
all: $(HEAD_OBJ) libarch$(LIBEXT)
|
||||||
|
|
||||||
@ -101,7 +108,8 @@ endif
|
|||||||
@if [ -e board/Makefile ]; then \
|
@if [ -e board/Makefile ]; then \
|
||||||
$(MAKE) -C board TOPDIR="$(TOPDIR)" depend ; \
|
$(MAKE) -C board TOPDIR="$(TOPDIR)" depend ; \
|
||||||
fi
|
fi
|
||||||
@$(MKDEP) --dep-path chip --dep-path common $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
|
@$(MKDEP) --dep-path chip --dep-path common --dep-path $(ARCH_SUBDIR) \
|
||||||
|
$(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
depend: .depend
|
depend: .depend
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/common/arm.h
|
* arch/arm/src/arm/arm.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
310
arch/arm/src/arm/up_assert.c
Normal file
310
arch/arm/src/arm/up_assert.c
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/arm/up_assert.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Output debug info if stack dump is selected -- even if
|
||||||
|
* debug is not selected.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
# undef lldbg
|
||||||
|
# define lldbg lib_lowprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_getsp
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* I don't know if the builtin to get SP is enabled */
|
||||||
|
|
||||||
|
static inline uint32 up_getsp(void)
|
||||||
|
{
|
||||||
|
uint32 sp;
|
||||||
|
__asm__
|
||||||
|
(
|
||||||
|
"\tmov %0, sp\n\t"
|
||||||
|
: "=r"(sp)
|
||||||
|
);
|
||||||
|
return sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_stackdump
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static void up_stackdump(uint32 sp, uint32 stack_base)
|
||||||
|
{
|
||||||
|
uint32 stack ;
|
||||||
|
|
||||||
|
for (stack = sp & ~0x1f; stack < stack_base; stack += 32)
|
||||||
|
{
|
||||||
|
uint32 *ptr = (uint32*)stack;
|
||||||
|
lldbg("%08x: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||||
|
stack, ptr[0], ptr[1], ptr[2], ptr[3],
|
||||||
|
ptr[4], ptr[5], ptr[6], ptr[7]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_stackdump()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_registerdump
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static inline void up_registerdump(void)
|
||||||
|
{
|
||||||
|
/* Are user registers available from interrupt processing? */
|
||||||
|
|
||||||
|
if (current_regs)
|
||||||
|
{
|
||||||
|
int regs;
|
||||||
|
|
||||||
|
/* Yes.. dump the interrupt registers */
|
||||||
|
|
||||||
|
for (regs = REG_R0; regs <= REG_R15; regs += 8)
|
||||||
|
{
|
||||||
|
uint32 *ptr = (uint32*)¤t_regs[regs];
|
||||||
|
lldbg("R%d: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||||
|
regs, ptr[0], ptr[1], ptr[2], ptr[3],
|
||||||
|
ptr[4], ptr[5], ptr[6], ptr[7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
lldbg("CPSR: %08x\n", current_regs[REG_CPSR]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_registerdump()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_dumpstate
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_STACKDUMP
|
||||||
|
static void up_dumpstate(void)
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
uint32 sp = up_getsp();
|
||||||
|
uint32 ustackbase;
|
||||||
|
uint32 ustacksize;
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
|
uint32 istackbase;
|
||||||
|
uint32 istacksize;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get the limits on the user stack memory */
|
||||||
|
|
||||||
|
if (rtcb->pid == 0)
|
||||||
|
{
|
||||||
|
ustackbase = g_heapbase - 4;
|
||||||
|
ustacksize = CONFIG_IDLETHREAD_STACKSIZE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ustackbase = (uint32)rtcb->adj_stack_ptr;
|
||||||
|
ustacksize = (uint32)rtcb->adj_stack_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the limits on the interrupt stack memory */
|
||||||
|
|
||||||
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
|
istackbase = (uint32)&g_userstack;
|
||||||
|
istacksize = (CONFIG_ARCH_INTERRUPTSTACK & ~3) - 4;
|
||||||
|
|
||||||
|
/* Show interrupt stack info */
|
||||||
|
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
lldbg("IRQ stack:\n");
|
||||||
|
lldbg(" base: %08x\n", istackbase);
|
||||||
|
lldbg(" size: %08x\n", istacksize);
|
||||||
|
|
||||||
|
/* Does the current stack pointer lie within the interrupt
|
||||||
|
* stack?
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (sp <= istackbase && sp > istackbase - istacksize)
|
||||||
|
{
|
||||||
|
/* Yes.. dump the interrupt stack */
|
||||||
|
|
||||||
|
up_stackdump(sp, istackbase);
|
||||||
|
|
||||||
|
/* Extract the user stack pointer which should lie
|
||||||
|
* at the base of the interrupt stack.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sp = g_userstack;
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show user stack info */
|
||||||
|
|
||||||
|
lldbg("User stack:\n");
|
||||||
|
lldbg(" base: %08x\n", ustackbase);
|
||||||
|
lldbg(" size: %08x\n", ustacksize);
|
||||||
|
#else
|
||||||
|
lldbg("sp: %08x\n", sp);
|
||||||
|
lldbg("stack base: %08x\n", ustackbase);
|
||||||
|
lldbg("stack size: %08x\n", ustacksize);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Dump the user stack if the stack pointer lies within the allocated user
|
||||||
|
* stack memory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (sp > ustackbase || sp <= ustackbase - ustacksize)
|
||||||
|
{
|
||||||
|
#if !defined(CONFIG_ARCH_INTERRUPTSTACK) || CONFIG_ARCH_INTERRUPTSTACK < 4
|
||||||
|
lldbg("ERROR: Stack pointer is not within allocated stack\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
up_stackdump(sp, ustackbase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then dump the registers (if available) */
|
||||||
|
|
||||||
|
up_registerdump();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define up_dumpstate()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: _up_assert
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void _up_assert(int errorcode) /* __attribute__ ((noreturn)) */
|
||||||
|
{
|
||||||
|
/* Are we in an interrupt handler or the idle task? */
|
||||||
|
|
||||||
|
if (current_regs || ((_TCB*)g_readytorun.head)->pid == 0)
|
||||||
|
{
|
||||||
|
(void)irqsave();
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
|
up_ledon(LED_PANIC);
|
||||||
|
up_mdelay(250);
|
||||||
|
up_ledoff(LED_PANIC);
|
||||||
|
up_mdelay(250);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exit(errorcode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_assert
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_assert(const ubyte *filename, int lineno)
|
||||||
|
{
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0 && defined(CONFIG_DEBUG)
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
up_ledon(LED_ASSERTION);
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
|
lldbg("Assertion failed at file:%s line: %d task: %s\n",
|
||||||
|
filename, lineno, rtcb->name);
|
||||||
|
#else
|
||||||
|
lldbg("Assertion failed at file:%s line: %d\n",
|
||||||
|
filename, lineno);
|
||||||
|
#endif
|
||||||
|
up_dumpstate();
|
||||||
|
_up_assert(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_assert_code
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_assert_code(const ubyte *filename, int lineno, int errorcode)
|
||||||
|
{
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0 && defined(CONFIG_DEBUG)
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
up_ledon(LED_ASSERTION);
|
||||||
|
#if CONFIG_TASK_NAME_SIZE > 0
|
||||||
|
lldbg("Assertion failed at file:%s line: %d task: %s error code: %d\n",
|
||||||
|
filename, lineno, rtcb->name, errorcode);
|
||||||
|
#else
|
||||||
|
lldbg("Assertion failed at file:%s line: %d error code: %d\n",
|
||||||
|
filename, lineno, errorcode);
|
||||||
|
#endif
|
||||||
|
up_dumpstate();
|
||||||
|
_up_assert(errorcode);
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_cache.S
|
* arch/arm/src/arm/up_cache.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_copystate.c
|
* arch/arm/src/arm/up_copystate.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
@ -71,20 +71,12 @@ void up_copystate(uint32 *dest, uint32 *src)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* In the current ARM model, the state is always copied to and from the
|
/* In the current ARM model, the state is always copied to and from the
|
||||||
* stack and TCB. In the Cortex-M3 model, the state is copied from the
|
* stack and TCB.
|
||||||
* stack to the TCB, but only a referenced is passed to get the the state
|
|
||||||
* from the TCB. So the following check makes sense only for the Cortex-M3
|
|
||||||
* model:
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __thumb2__
|
for (i = 0; i < XCPTCONTEXT_REGS; i++)
|
||||||
if (src != dest)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
for (i = 0; i < XCPTCONTEXT_REGS; i++)
|
*dest++ = *src++;
|
||||||
{
|
|
||||||
*dest++ = *src++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_dataabort.c
|
* arch/arm/src/arm/up_dataabort.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
104
arch/arm/src/arm/up_doirq.c
Normal file
104
arch/arm/src/arm/up_doirq.c
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/arm/up_doirq.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_doirq(int irq, uint32 *regs)
|
||||||
|
{
|
||||||
|
up_ledon(LED_INIRQ);
|
||||||
|
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
|
PANIC(OSERR_ERREXCEPTION);
|
||||||
|
#else
|
||||||
|
if ((unsigned)irq < NR_IRQS)
|
||||||
|
{
|
||||||
|
/* Current regs non-zero indicates that we are processing
|
||||||
|
* an interrupt; current_regs is also used to manage
|
||||||
|
* interrupt level context switches.
|
||||||
|
*/
|
||||||
|
|
||||||
|
current_regs = regs;
|
||||||
|
|
||||||
|
/* Mask and acknowledge the interrupt */
|
||||||
|
|
||||||
|
up_maskack_irq(irq);
|
||||||
|
|
||||||
|
/* Deliver the IRQ */
|
||||||
|
|
||||||
|
irq_dispatch(irq, regs);
|
||||||
|
|
||||||
|
/* Indicate that we are no long in an interrupt handler */
|
||||||
|
|
||||||
|
current_regs = NULL;
|
||||||
|
|
||||||
|
/* Unmask the last interrupt (global interrupts are still
|
||||||
|
* disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_enable_irq(irq);
|
||||||
|
}
|
||||||
|
up_ledoff(LED_INIRQ);
|
||||||
|
#endif
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* common/up_fullcontextrestore.S
|
* arch/arm/src/arm/up_fullcontextrestore.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_head.S
|
* arch/arm/src/arm/up_head.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_initialstate.c
|
* arch/arm/src/arm/up_initialstate.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
@ -46,10 +46,6 @@
|
|||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
|
|
||||||
#ifdef __thumb2__
|
|
||||||
# include "cortexm3_psr.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Definitions
|
* Private Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -88,25 +84,10 @@ void up_initial_state(_TCB *tcb)
|
|||||||
|
|
||||||
memset(xcp, 0, sizeof(struct xcptcontext));
|
memset(xcp, 0, sizeof(struct xcptcontext));
|
||||||
|
|
||||||
/* Save the initial stack point */
|
/* Save the initial stack pointer */
|
||||||
|
|
||||||
xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
|
xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
|
||||||
|
|
||||||
#ifdef __thumb2__
|
|
||||||
/* Save the task entry point (stripping off the thumb bit) */
|
|
||||||
|
|
||||||
xcp->regs[REG_PC] = (uint32)tcb->start & ~1;
|
|
||||||
|
|
||||||
/* Specify thumb mode */
|
|
||||||
|
|
||||||
xcp->regs[REG_XPSR] = CORTEXM3_XPSR_T;
|
|
||||||
|
|
||||||
/* Enable or disable interrupts, based on user configuration */
|
|
||||||
|
|
||||||
# ifdef CONFIG_SUPPRESS_INTERRUPTS
|
|
||||||
xcp->regs[REG_PRIMASK] = 1;
|
|
||||||
# endif
|
|
||||||
#else /* __thumb2__ */
|
|
||||||
/* Save the task entry point */
|
/* Save the task entry point */
|
||||||
|
|
||||||
xcp->regs[REG_PC] = (uint32)tcb->start;
|
xcp->regs[REG_PC] = (uint32)tcb->start;
|
||||||
@ -118,5 +99,5 @@ void up_initial_state(_TCB *tcb)
|
|||||||
# else
|
# else
|
||||||
xcp->regs[REG_CPSR] = SVC_MODE | PSR_F_BIT;
|
xcp->regs[REG_CPSR] = SVC_MODE | PSR_F_BIT;
|
||||||
# endif
|
# endif
|
||||||
#endif /* __thumb2__ */
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_nommuhead.S
|
* arch/arm/src/arm/up_nommuhead.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_prefetchabort.c
|
* arch/arm/src/src/up_prefetchabort.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
@ -1,5 +1,5 @@
|
|||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* common/up_saveusercontext.S
|
* arch/arm/src/arm/up_saveusercontext.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
203
arch/arm/src/arm/up_schedulesigaction.c
Normal file
203
arch/arm/src/arm/up_schedulesigaction.c
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/arm/up_schedulesigaction.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_schedule_sigaction
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function is called by the OS when one or more
|
||||||
|
* signal handling actions have been queued for execution.
|
||||||
|
* The architecture specific code must configure things so
|
||||||
|
* that the 'igdeliver' callback is executed on the thread
|
||||||
|
* specified by 'tcb' as soon as possible.
|
||||||
|
*
|
||||||
|
* This function may be called from interrupt handling logic.
|
||||||
|
*
|
||||||
|
* This operation should not cause the task to be unblocked
|
||||||
|
* nor should it cause any immediate execution of sigdeliver.
|
||||||
|
* Typically, a few cases need to be considered:
|
||||||
|
*
|
||||||
|
* (1) This function may be called from an interrupt handler
|
||||||
|
* During interrupt processing, all xcptcontext structures
|
||||||
|
* should be valid for all tasks. That structure should
|
||||||
|
* be modified to invoke sigdeliver() either on return
|
||||||
|
* from (this) interrupt or on some subsequent context
|
||||||
|
* switch to the recipient task.
|
||||||
|
* (2) If not in an interrupt handler and the tcb is NOT
|
||||||
|
* the currently executing task, then again just modify
|
||||||
|
* the saved xcptcontext structure for the recipient
|
||||||
|
* task so it will invoke sigdeliver when that task is
|
||||||
|
* later resumed.
|
||||||
|
* (3) If not in an interrupt handler and the tcb IS the
|
||||||
|
* currently executing task -- just call the signal
|
||||||
|
* handler now.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
||||||
|
{
|
||||||
|
/* Refuse to handle nested signal actions */
|
||||||
|
|
||||||
|
sdbg("tcb=0x%p sigdeliver=0x%p\n", tcb, sigdeliver);
|
||||||
|
|
||||||
|
if (!tcb->xcp.sigdeliver)
|
||||||
|
{
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
/* Make sure that interrupts are disabled */
|
||||||
|
|
||||||
|
flags = irqsave();
|
||||||
|
|
||||||
|
/* First, handle some special cases when the signal is
|
||||||
|
* being delivered to the currently executing task.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sdbg("rtcb=0x%p current_regs=0x%p\n", g_readytorun.head, current_regs);
|
||||||
|
|
||||||
|
if (tcb == (_TCB*)g_readytorun.head)
|
||||||
|
{
|
||||||
|
/* CASE 1: We are not in an interrupt handler and
|
||||||
|
* a task is signalling itself for some reason.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!current_regs)
|
||||||
|
{
|
||||||
|
/* In this case just deliver the signal now. */
|
||||||
|
|
||||||
|
sigdeliver(tcb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CASE 2: We are in an interrupt handler AND the
|
||||||
|
* interrupted task is the same as the one that
|
||||||
|
* must receive the signal, then we will have to modify
|
||||||
|
* the return state as well as the state in the TCB.
|
||||||
|
*
|
||||||
|
* Hmmm... there looks like a latent bug here: The following
|
||||||
|
* logic would fail in the strange case where we are in an
|
||||||
|
* interrupt handler, the thread is signalling itself, but
|
||||||
|
* a context switch to another task has occurred so that
|
||||||
|
* current_regs does not refer to the thread at g_readytorun.head!
|
||||||
|
*/
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Save the return lr and cpsr and one scratch register
|
||||||
|
* These will be restored by the signal trampoline after
|
||||||
|
* the signals have been delivered.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
|
tcb->xcp.saved_pc = current_regs[REG_PC];
|
||||||
|
tcb->xcp.saved_cpsr = current_regs[REG_CPSR];
|
||||||
|
|
||||||
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
|
* disabled
|
||||||
|
*/
|
||||||
|
|
||||||
|
current_regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
|
current_regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
|
||||||
|
|
||||||
|
/* And make sure that the saved context in the TCB
|
||||||
|
* is the same as the interrupt return context.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_savestate(tcb->xcp.regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, we are (1) signaling a task is not running
|
||||||
|
* from an interrupt handler or (2) we are not in an
|
||||||
|
* interrupt handler and the running task is signalling
|
||||||
|
* some non-running task.
|
||||||
|
*/
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Save the return lr and cpsr and one scratch register
|
||||||
|
* These will be restored by the signal trampoline after
|
||||||
|
* the signals have been delivered.
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
|
tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
|
||||||
|
tcb->xcp.saved_cpsr = tcb->xcp.regs[REG_CPSR];
|
||||||
|
|
||||||
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
|
* disabled
|
||||||
|
*/
|
||||||
|
|
||||||
|
tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
|
tcb->xcp.regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
irqrestore(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_DISABLE_SIGNALS */
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_sigdeliver.c
|
* arch/arm/src/arm/up_sigdeliver.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
@ -81,7 +81,6 @@
|
|||||||
|
|
||||||
void up_sigdeliver(void)
|
void up_sigdeliver(void)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_DISABLE_SIGNALS
|
|
||||||
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
uint32 regs[XCPTCONTEXT_REGS];
|
uint32 regs[XCPTCONTEXT_REGS];
|
||||||
sig_deliver_t sigdeliver;
|
sig_deliver_t sigdeliver;
|
||||||
@ -103,12 +102,7 @@ void up_sigdeliver(void)
|
|||||||
|
|
||||||
up_copystate(regs, rtcb->xcp.regs);
|
up_copystate(regs, rtcb->xcp.regs);
|
||||||
regs[REG_PC] = rtcb->xcp.saved_pc;
|
regs[REG_PC] = rtcb->xcp.saved_pc;
|
||||||
#ifdef __thumb2__
|
|
||||||
regs[REG_PRIMASK] = rtcb->xcp.saved_primask;
|
|
||||||
regs[REG_XPSR] = rtcb->xcp.saved_xpsr;
|
|
||||||
#else
|
|
||||||
regs[REG_CPSR] = rtcb->xcp.saved_cpsr;
|
regs[REG_CPSR] = rtcb->xcp.saved_cpsr;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get a local copy of the sigdeliver function pointer.
|
/* Get a local copy of the sigdeliver function pointer.
|
||||||
* we do this so that we can nullify the sigdeliver
|
* we do this so that we can nullify the sigdeliver
|
||||||
@ -122,11 +116,7 @@ void up_sigdeliver(void)
|
|||||||
|
|
||||||
/* Then restore the task interrupt statat. */
|
/* Then restore the task interrupt statat. */
|
||||||
|
|
||||||
#ifdef __thumb2__
|
|
||||||
irqrestore((uint16)regs[REG_PRIMASK]);
|
|
||||||
#else
|
|
||||||
irqrestore(regs[REG_CPSR]);
|
irqrestore(regs[REG_CPSR]);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Deliver the signals */
|
/* Deliver the signals */
|
||||||
|
|
||||||
@ -147,8 +137,7 @@ void up_sigdeliver(void)
|
|||||||
|
|
||||||
up_ledoff(LED_SIGNAL);
|
up_ledoff(LED_SIGNAL);
|
||||||
up_fullcontextrestore(regs);
|
up_fullcontextrestore(regs);
|
||||||
#endif
|
\}
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* !CONFIG_DISABLE_SIGNALS */
|
#endif /* !CONFIG_DISABLE_SIGNALS */
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_syscall.c
|
* arch/arm/src/arm/up_syscall.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_undefinedinsn.c
|
* arch/arm/src/arm/up_undefinedinsn.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
@ -1,7 +1,7 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/common/up_vectoraddrexceptn.S
|
* arch/arm/src/src/up_vectoraddrexceptn.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
@ -1,5 +1,5 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/common/up_vectors.S
|
* arch/arm/src/arm/up_vectors.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_vectortab.S
|
* arch/arm/src/arm/up_vectortab.S
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -45,7 +45,6 @@
|
|||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "arm.h"
|
|
||||||
#include <arch/board/board.h>
|
#include <arch/board/board.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
* a referenced is passed to get the the state from the TCB.
|
* a referenced is passed to get the the state from the TCB.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __thumb2__
|
#ifdef CONFIG_ARCH_CORTEXM3
|
||||||
# define up_savestate(regs) up_copystate(regs, current_regs)
|
# define up_savestate(regs) up_copystate(regs, current_regs)
|
||||||
# define up_restorestate(regs) (current_regs = regs)
|
# define up_restorestate(regs) (current_regs = regs)
|
||||||
#else
|
#else
|
||||||
@ -136,7 +136,7 @@ extern void up_boot(void);
|
|||||||
extern void up_copystate(uint32 *dest, uint32 *src);
|
extern void up_copystate(uint32 *dest, uint32 *src);
|
||||||
extern void up_dataabort(uint32 *regs);
|
extern void up_dataabort(uint32 *regs);
|
||||||
extern void up_decodeirq(uint32 *regs);
|
extern void up_decodeirq(uint32 *regs);
|
||||||
#ifdef __thumb2__
|
#ifdef CONFIG_ARCH_CORTEXM3
|
||||||
extern uint32 *up_doirq(int irq, uint32 *regs);
|
extern uint32 *up_doirq(int irq, uint32 *regs);
|
||||||
#else
|
#else
|
||||||
extern void up_doirq(int irq, uint32 *regs);
|
extern void up_doirq(int irq, uint32 *regs);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/common/cortexm3_nvic.h
|
* arch/arm/src/cortexm3/nvic.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,5 +1,5 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* arch/arm/src/common/cortexm3_psr.h
|
* arch/arm/src/cortexm3/psr.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_assert.c
|
* arch/arm/src/cortexm3/up_assert.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -121,7 +121,6 @@ static inline void up_registerdump(void)
|
|||||||
|
|
||||||
if (current_regs)
|
if (current_regs)
|
||||||
{
|
{
|
||||||
#ifdef __thumb2__
|
|
||||||
/* Yes.. dump the interrupt registers */
|
/* Yes.. dump the interrupt registers */
|
||||||
|
|
||||||
lldbg("R0: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
lldbg("R0: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||||
@ -136,21 +135,6 @@ static inline void up_registerdump(void)
|
|||||||
current_regs[REG_R14], current_regs[REG_R15]);
|
current_regs[REG_R14], current_regs[REG_R15]);
|
||||||
lldbg("xPSR: %08x PRIMASK: %08x\n",
|
lldbg("xPSR: %08x PRIMASK: %08x\n",
|
||||||
current_regs[REG_XPSR], current_regs[REG_PRIMASK]);
|
current_regs[REG_XPSR], current_regs[REG_PRIMASK]);
|
||||||
#else
|
|
||||||
int regs;
|
|
||||||
|
|
||||||
/* Yes.. dump the interrupt registers */
|
|
||||||
|
|
||||||
for (regs = REG_R0; regs <= REG_R15; regs += 8)
|
|
||||||
{
|
|
||||||
uint32 *ptr = (uint32*)¤t_regs[regs];
|
|
||||||
lldbg("R%d: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
|
||||||
regs, ptr[0], ptr[1], ptr[2], ptr[3],
|
|
||||||
ptr[4], ptr[5], ptr[6], ptr[7]);
|
|
||||||
}
|
|
||||||
|
|
||||||
lldbg("CPSR: %08x\n", current_regs[REG_CPSR]);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
86
arch/arm/src/cortexm3/up_copystate.c
Normal file
86
arch/arm/src/cortexm3/up_copystate.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/cortexm3/up_copystate.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_undefinedinsn
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* A little faster than most memcpy's */
|
||||||
|
|
||||||
|
void up_copystate(uint32 *dest, uint32 *src)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* In the Cortex-M3 model, the state is copied from the stack to the TCB,
|
||||||
|
* but only a reference is passed to get the state from the TCB. So the
|
||||||
|
* following check avoids copying the TCB save area onto itself:
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (src != dest)
|
||||||
|
{
|
||||||
|
for (i = 0; i < XCPTCONTEXT_REGS; i++)
|
||||||
|
{
|
||||||
|
*dest++ = *src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/common/up_doirq.c
|
* arch/arm/src/cortexm3/up_doirq.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -66,11 +66,7 @@
|
|||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef __thumb2__
|
|
||||||
uint32 *up_doirq(int irq, uint32 *regs)
|
uint32 *up_doirq(int irq, uint32 *regs)
|
||||||
#else
|
|
||||||
void up_doirq(int irq, uint32 *regs)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
up_ledon(LED_INIRQ);
|
up_ledon(LED_INIRQ);
|
||||||
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
#ifdef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
@ -94,13 +90,13 @@ void up_doirq(int irq, uint32 *regs)
|
|||||||
irq_dispatch(irq, regs);
|
irq_dispatch(irq, regs);
|
||||||
|
|
||||||
/* If a context switch occurred while processing the interrupt
|
/* If a context switch occurred while processing the interrupt
|
||||||
* then current_regs may have value (depending upon the implementaton
|
* then current_regs may have change value. If we return any value
|
||||||
* of context switching for te particular chip.
|
* different from the input regs, then the lower level will know
|
||||||
|
* that a context switch occurred during interrupt processing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __thumb2__
|
|
||||||
regs = current_regs;
|
regs = current_regs;
|
||||||
#endif
|
|
||||||
/* Indicate that we are no long in an interrupt handler */
|
/* Indicate that we are no long in an interrupt handler */
|
||||||
|
|
||||||
current_regs = NULL;
|
current_regs = NULL;
|
||||||
@ -113,7 +109,5 @@ void up_doirq(int irq, uint32 *regs)
|
|||||||
}
|
}
|
||||||
up_ledoff(LED_INIRQ);
|
up_ledoff(LED_INIRQ);
|
||||||
#endif
|
#endif
|
||||||
#ifdef __thumb2__
|
|
||||||
return regs;
|
return regs;
|
||||||
#endif
|
|
||||||
}
|
}
|
106
arch/arm/src/cortexm3/up_initialstate.c
Normal file
106
arch/arm/src/cortexm3/up_initialstate.c
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/cortexm3/up_initialstate.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "psr.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_initial_state
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* A new thread is being started and a new TCB
|
||||||
|
* has been created. This function is called to initialize
|
||||||
|
* the processor specific portions of the new TCB.
|
||||||
|
*
|
||||||
|
* This function must setup the intial architecture registers
|
||||||
|
* and/or stack so that execution will begin at tcb->start
|
||||||
|
* on the next context switch.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_initial_state(_TCB *tcb)
|
||||||
|
{
|
||||||
|
struct xcptcontext *xcp = &tcb->xcp;
|
||||||
|
|
||||||
|
/* Initialize the initial exception register context structure */
|
||||||
|
|
||||||
|
memset(xcp, 0, sizeof(struct xcptcontext));
|
||||||
|
|
||||||
|
/* Save the initial stack pointer */
|
||||||
|
|
||||||
|
xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
|
||||||
|
|
||||||
|
/* Save the task entry point (stripping off the thumb bit) */
|
||||||
|
|
||||||
|
xcp->regs[REG_PC] = (uint32)tcb->start & ~1;
|
||||||
|
|
||||||
|
/* Specify thumb mode */
|
||||||
|
|
||||||
|
xcp->regs[REG_XPSR] = CORTEXM3_XPSR_T;
|
||||||
|
|
||||||
|
/* Enable or disable interrupts, based on user configuration */
|
||||||
|
|
||||||
|
# ifdef CONFIG_SUPPRESS_INTERRUPTS
|
||||||
|
xcp->regs[REG_PRIMASK] = 1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* common/up_schedulesigaction.c
|
* arch/arm/src/cortexm3/up_schedulesigaction.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "psr.h"
|
||||||
#include "os_internal.h"
|
#include "os_internal.h"
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
@ -154,24 +155,16 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
|
|
||||||
tcb->xcp.sigdeliver = sigdeliver;
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
tcb->xcp.saved_pc = current_regs[REG_PC];
|
tcb->xcp.saved_pc = current_regs[REG_PC];
|
||||||
#ifdef __thumb2__
|
|
||||||
tcb->xcp.saved_primask = current_regs[REG_PRIMASK];
|
tcb->xcp.saved_primask = current_regs[REG_PRIMASK];
|
||||||
tcb->xcp.saved_xpsr = current_regs[REG_XPSR];
|
tcb->xcp.saved_xpsr = current_regs[REG_XPSR];
|
||||||
#else
|
|
||||||
tcb->xcp.saved_cpsr = current_regs[REG_CPSR];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Then set up to vector to the trampoline with interrupts
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
* disabled
|
* disabled
|
||||||
*/
|
*/
|
||||||
|
|
||||||
current_regs[REG_PC] = (uint32)up_sigdeliver;
|
current_regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
#ifdef __thumb2__
|
|
||||||
current_regs[REG_PRIMASK] = 1;
|
current_regs[REG_PRIMASK] = 1;
|
||||||
current_regs[REG_XPSR] = 0;
|
current_regs[REG_XPSR] = CORTEXM3_XPSR_T;
|
||||||
#else
|
|
||||||
current_regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* And make sure that the saved context in the TCB
|
/* And make sure that the saved context in the TCB
|
||||||
* is the same as the interrupt return context.
|
* is the same as the interrupt return context.
|
||||||
@ -196,24 +189,16 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
|
|||||||
|
|
||||||
tcb->xcp.sigdeliver = sigdeliver;
|
tcb->xcp.sigdeliver = sigdeliver;
|
||||||
tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
|
tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
|
||||||
#ifdef __thumb2__
|
|
||||||
tcb->xcp.saved_primask = tcb->xcp.regs[REG_PRIMASK];
|
tcb->xcp.saved_primask = tcb->xcp.regs[REG_PRIMASK];
|
||||||
tcb->xcp.saved_xpsr = tcb->xcp.regs[REG_XPSR];
|
tcb->xcp.saved_xpsr = tcb->xcp.regs[REG_XPSR];
|
||||||
#else
|
|
||||||
tcb->xcp.saved_cpsr = tcb->xcp.regs[REG_CPSR];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Then set up to vector to the trampoline with interrupts
|
/* Then set up to vector to the trampoline with interrupts
|
||||||
* disabled
|
* disabled
|
||||||
*/
|
*/
|
||||||
|
|
||||||
tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
|
tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
|
||||||
#ifdef __thumb2__
|
|
||||||
tcb->xcp.regs[REG_PRIMASK] = 1;
|
tcb->xcp.regs[REG_PRIMASK] = 1;
|
||||||
tcb->xcp.regs[REG_XPSR] = 0;
|
tcb->xcp.regs[REG_XPSR] = CORTEXM3_XPSR_T;
|
||||||
#else
|
|
||||||
tcb->xcp.regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
irqrestore(flags);
|
irqrestore(flags);
|
144
arch/arm/src/cortexm3/up_sigdeliver.c
Normal file
144
arch/arm/src/cortexm3/up_sigdeliver.c
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/cortexm3/up_sigdeliver.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
|
||||||
|
#include "os_internal.h"
|
||||||
|
#include "up_internal.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: up_sigdeliver
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This is the a signal handling trampoline. When a
|
||||||
|
* signal action was posted. The task context was mucked
|
||||||
|
* with and forced to branch to this location with interrupts
|
||||||
|
* disabled.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void up_sigdeliver(void)
|
||||||
|
{
|
||||||
|
_TCB *rtcb = (_TCB*)g_readytorun.head;
|
||||||
|
uint32 regs[XCPTCONTEXT_REGS];
|
||||||
|
sig_deliver_t sigdeliver;
|
||||||
|
|
||||||
|
/* Save the errno. This must be preserved throughout the
|
||||||
|
* signal handling so that the the user code final gets
|
||||||
|
* the correct errno value (probably EINTR).
|
||||||
|
*/
|
||||||
|
|
||||||
|
int saved_errno = rtcb->pterrno;
|
||||||
|
|
||||||
|
up_ledon(LED_SIGNAL);
|
||||||
|
|
||||||
|
sdbg("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n",
|
||||||
|
rtcb, rtcb->xcp.sigdeliver, rtcb->sigpendactionq.head);
|
||||||
|
ASSERT(rtcb->xcp.sigdeliver != NULL);
|
||||||
|
|
||||||
|
/* Save the real return state on the stack. */
|
||||||
|
|
||||||
|
up_copystate(regs, rtcb->xcp.regs);
|
||||||
|
regs[REG_PC] = rtcb->xcp.saved_pc;
|
||||||
|
regs[REG_PRIMASK] = rtcb->xcp.saved_primask;
|
||||||
|
regs[REG_XPSR] = rtcb->xcp.saved_xpsr;
|
||||||
|
|
||||||
|
/* Get a local copy of the sigdeliver function pointer.
|
||||||
|
* we do this so that we can nullify the sigdeliver
|
||||||
|
* function point in the TCB and accept more signal
|
||||||
|
* deliveries while processing the current pending
|
||||||
|
* signals.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sigdeliver = rtcb->xcp.sigdeliver;
|
||||||
|
rtcb->xcp.sigdeliver = NULL;
|
||||||
|
|
||||||
|
/* Then restore the task interrupt statat. */
|
||||||
|
|
||||||
|
irqrestore((uint16)regs[REG_PRIMASK]);
|
||||||
|
|
||||||
|
/* Deliver the signals */
|
||||||
|
|
||||||
|
sigdeliver(rtcb);
|
||||||
|
|
||||||
|
/* Output any debug messaged BEFORE restoreing errno
|
||||||
|
* (becuase they may alter errno), then restore the
|
||||||
|
* original errno that is needed by the user logic
|
||||||
|
* (it is probably EINTR).
|
||||||
|
*/
|
||||||
|
|
||||||
|
sdbg("Resuming\n");
|
||||||
|
rtcb->pterrno = saved_errno;
|
||||||
|
|
||||||
|
/* Then restore the correct state for this thread of
|
||||||
|
* execution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
up_ledoff(LED_SIGNAL);
|
||||||
|
up_fullcontextrestore(regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_DISABLE_SIGNALS */
|
||||||
|
|
@ -37,13 +37,12 @@ HEAD_ASRC = lm3s_vectors.S
|
|||||||
|
|
||||||
CMN_ASRCS =
|
CMN_ASRCS =
|
||||||
CMN_CSRCS = up_allocateheap.c up_assert.c up_blocktask.c up_copystate.c \
|
CMN_CSRCS = up_allocateheap.c up_assert.c up_blocktask.c up_copystate.c \
|
||||||
up_createstack.c up_dataabort.c up_mdelay.c up_udelay.c up_exit.c \
|
up_createstack.c up_mdelay.c up_udelay.c up_exit.c \
|
||||||
up_idle.c up_initialize.c up_initialstate.c up_interruptcontext.c \
|
up_idle.c up_initialize.c up_initialstate.c up_interruptcontext.c \
|
||||||
up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c \
|
up_modifyreg8.c up_modifyreg16.c up_modifyreg32.c \
|
||||||
up_prefetchabort.c up_releasepending.c up_releasestack.c \
|
up_releasepending.c up_releasestack.c up_reprioritizertr.c \
|
||||||
up_reprioritizertr.c up_schedulesigaction.c \
|
up_schedulesigaction.c up_sigdeliver.c up_unblocktask.c \
|
||||||
up_sigdeliver.c up_syscall.c up_unblocktask.c \
|
up_usestack.c up_doirq.c
|
||||||
up_undefinedinsn.c up_usestack.c up_doirq.c
|
|
||||||
|
|
||||||
CHIP_ASRCS = lm3s_context.S
|
CHIP_ASRCS = lm3s_context.S
|
||||||
CHIP_CSRCS = lm3s_start.c lm3s_syscontrol.c lm3s_irq.c lm3s_svcall.c \
|
CHIP_CSRCS = lm3s_start.c lm3s_syscontrol.c lm3s_irq.c lm3s_svcall.c \
|
||||||
|
@ -47,7 +47,6 @@
|
|||||||
#include "lm3s_syscontrol.h" /* System control module */
|
#include "lm3s_syscontrol.h" /* System control module */
|
||||||
#include "lm3s_gpio.h" /* GPIO module */
|
#include "lm3s_gpio.h" /* GPIO module */
|
||||||
#include "lm3s_uart.h" /* UART peripherals */
|
#include "lm3s_uart.h" /* UART peripherals */
|
||||||
#include "cortexm3_nvic.h" /* Nested, vectored interrupt controller */
|
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Definitions
|
* Definitions
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
#include "cortexm3_nvic.h"
|
#include "nvic.h"
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Preprocessor Definitions
|
* Preprocessor Definitions
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
#include "os_internal.h"
|
#include "os_internal.h"
|
||||||
#include "cortexm3_nvic.h"
|
#include "nvic.h"
|
||||||
#include "lm3s_internal.h"
|
#include "lm3s_internal.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include "nvic.h"
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
#include "os_internal.h"
|
#include "os_internal.h"
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
#include <arch/board/board.h>
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "nvic.h"
|
||||||
#include "clock_internal.h"
|
#include "clock_internal.h"
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user