diff --git a/arch/sh/include/limits.h b/arch/sh/include/limits.h index 16e63f55106eebb2f5208971378c2998bf8504f1..18860b96ee9c848ea25491ee7a2cf06772fdf6e1 100644 --- a/arch/sh/include/limits.h +++ b/arch/sh/include/limits.h @@ -1,7 +1,7 @@ /**************************************************************************** * arch/sh/include/limits.h * - * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2008, 2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <spudmonkey@racsa.co.cr> * * Redistribution and use in source and binary forms, with or without @@ -40,36 +40,10 @@ * Included Files ****************************************************************************/ +#include <arch/chip/limits.h> + /**************************************************************************** * Definitions ****************************************************************************/ -#define CHAR_BIT 8 -#define SCHAR_MIN 0x80 -#define SCHAR_MAX 0x7f -#define UCHAR_MAX 0xff - -/* These could be different on machines where char is unsigned */ - -#define CHAR_MIN SCHAR_MIN -#define CHAR_MAX SCHAR_MAX - -#define SHRT_MIN 0x8000 -#define SHRT_MAX 0x7fff -#define USHRT_MAX 0xffff - -#define INT_MIN 0x80000000 -#define INT_MAX 0x7fffffff -#define UINT_MAX 0xffffffff - -/* These change on 32-bit and 64-bit platforms */ - -#define LONG_MAX 0x80000000 -#define LONG_MIN 0x7fffffff -#define ULONG_MAX 0xffffffff - -#define LLONG_MAX 0x8000000000000000 -#define LLONG_MIN 0x7fffffffffffffff -#define ULLONG_MAX 0xffffffffffffffff - #endif /* __ARCH_SH_INCLUDE_LIMITS_H */ diff --git a/arch/sh/include/m16c/irq.h b/arch/sh/include/m16c/irq.h index 64ec0725fa8a04e3da026e9017aff1f9f6150328..30ffaf87bc0c34fe4afe6b8327aafa28d0c8c42f 100644 --- a/arch/sh/include/m16c/irq.h +++ b/arch/sh/include/m16c/irq.h @@ -64,13 +64,11 @@ # define M16C_WDOG_IRQ 5 /* ffff0: Watchdog timer */ # define M16C_DBC_IRQ 6 /* ffff4: DBC */ # define M16C_NMI_IRQ 7 /* ffff8: NMI */ -# define M16C_RESET_IRQ 8 /* ffffc: Reset */ -# define _LAST_FIXED 8 +# define _LAST_FIXED 7 #else # define M16C_WDOG_IRQ 4 /* ffff0: Watchdog timer */ # define M16C_NMI_IRQ 5 /* ffff8: NMI */ -# define M16C_RESET_IRQ 6 /* ffffc: Reset */ -# define _LAST_FIXED 6 +# define _LAST_FIXED 5 #endif /* Variable vector table (fixed at address 0xffd00) */ @@ -80,7 +78,8 @@ # define M16C_SWINT0_IRQ M16C_BRK_IRQ /* S/W interrupt 0 */ # define M16C_INT3_IRQ (_LAST_FIXED+2) /* ffd10: INT3 */ # define M16C_SWINT4_IRQ M16C_INT3_IRQ /* S/W interrupt 4 */ -# define M16C_SWINT5_IRQ (_LAST_FIXED+3) /* ffd14: Reserved / S/W interrupt 5 */ +# define M16C_CTXSV_SWINT (_LAST_FIXED+3) /* ffd14: Reserved -- used by NuttX */ +# define M16C_SWINT5_IRQ M16C_CTXSV_SWINT /* S/W interrupt 5 */ # define M16C_SWINT6_IRQ (_LAST_FIXED+4) /* ffd18: Reserved / S/W interrupt 6 */ # define M16C_SWINT7_IRQ (_LAST_FIXED+5) /* ffd1c: Reserved / S/W interrupt 7 */ # define M16C_INT5_IRQ (_LAST_FIXED+6) /* ffd20: INT5 */ @@ -130,7 +129,8 @@ # define M16C_INT1_IRQ (_LAST_FIXED+28) /* ffd78: INT1 */ # define M16C_SWINT30_IRQ M16C_INT1_IRQ /* S/W interrupt 30 */ # define M16C_SWINT31_IRQ (_LAST_FIXED+29) /* ffd7c: Reserved / S/W interrupt 31 */ -# define M16C_SWINT32_IRQ (_LAST_FIXED+30) /* ffd80: S/W interrupt 32 */ +# define M16C_CTXRSTR_SWINT (_LAST_FIXED+30) /* ffd80: Used by NuttX */ +# define M16C_SWINT32IRQ M16C_CTXRSTR_SWINT /* S/W interrupt 32 */ # define M16C_SWINT33_IRQ (_LAST_FIXED+31) /* ffd84: S/W interrupt 33 */ # define M16C_SWINT34_IRQ (_LAST_FIXED+32) /* ffd88: S/W interrupt 34 */ # define M16C_SWINT35_IRQ (_LAST_FIXED+33) /* ffd8c: S/W interrupt 35 */ @@ -167,31 +167,33 @@ #else # define M16C_BRK_IRQ (_LAST_FIXED+1) /* ffd00: BRK instruction */ # define M16C_INT3_IRQ (_LAST_FIXED+2) /* ffd10: INT3 */ -# define M16C_INT5_IRQ (_LAST_FIXED+3) /* ffd20: INT5 */ -# define M16C_INT4_IRQ (_LAST_FIXED+4) /* ffd24: INT4 */ -# define M16C_UART2BCD_IRQ (_LAST_FIXED+5) /* ffd28: UART2 bus collision detection */ -# define M16C_DMA0_IRQ (_LAST_FIXED+6) /* ffd2c: DMA0 */ -# define M16C_DMA1_IRQ (_LAST_FIXED+7) /* ffd30: DMA1 */ -# define M16C_KEYINP_IRQ (_LAST_FIXED+8) /* ffd34: Key input interrupt */ -# define M16C_ADC_IRQ (_LAST_FIXED+9) /* ffd38: A-D */ -# define M16C_UARTXNAK_IRQ (_LAST_FIXED+10) /* ffd3c UART2 transmit/NACK2 */ -# define M16C_UARTRACK_IRQ (_LAST_FIXED+11) /* ffd40: UART2 receive/ACK2 */ -# define M16C_UART0XMT_IRQ (_LAST_FIXED+12) /* ffd44: UART0 transmit */ -# define M16C_UART0RCV_IRQ (_LAST_FIXED+13) /* ffd48: UART0 receive */ -# define M16C_UART1XMT_IRQ (_LAST_FIXED+14) /* ffd4c: UART1 transmit */ -# define M16C_UART1RCV_IRQ (_LAST_FIXED+15) /* ffd50: UART1 receive */ -# define M16C_TMRA0_IRQ (_LAST_FIXED+16) /* ffd54: Timer A0 */ -# define M16C_TMRA1_IRQ (_LAST_FIXED+17) /* ffd58: Timer A1 */ -# define M16C_TMRA2_IRQ (_LAST_FIXED+18) /* ffd5c: Timer A2 */ -# define M16C_TMRA3_IRQ (_LAST_FIXED+19) /* ffd60: Timer A3 */ -# define M16C_TMRA4_IRQ (_LAST_FIXED+20) /* ffd64: Timer A4 */ -# define M16C_TMRB0_IRQ (_LAST_FIXED+21) /* ffd68: Timer B0 */ -# define M16C_TMRB1_IRQ (_LAST_FIXED+22) /* ffd6c: Timer B1 */ -# define M16C_TMRB2_IRQ (_LAST_FIXED+23) /* ffd70: Timer B2 */ -# define M16C_INT0_IRQ (_LAST_FIXED+24) /* ffd74: INT0 */ -# define M16C_INT1_IRQ (_LAST_FIXED+25) /* ffd78: INT1 */ - -# define NR_IRQS (_LAST_FIXED+26) /* Total number of supported IRQs */ +# define M16C_CTXSV_SWINT (_LAST_FIXED+3) /* ffd14: Reserved -- SWINT5 used by NuttX */ +# define M16C_INT5_IRQ (_LAST_FIXED+5) /* ffd20: INT5 */ +# define M16C_INT4_IRQ (_LAST_FIXED+6) /* ffd24: INT4 */ +# define M16C_UART2BCD_IRQ (_LAST_FIXED+7) /* ffd28: UART2 bus collision detection */ +# define M16C_DMA0_IRQ (_LAST_FIXED+8) /* ffd2c: DMA0 */ +# define M16C_DMA1_IRQ (_LAST_FIXED+9) /* ffd30: DMA1 */ +# define M16C_KEYINP_IRQ (_LAST_FIXED+10) /* ffd34: Key input interrupt */ +# define M16C_ADC_IRQ (_LAST_FIXED+11) /* ffd38: A-D */ +# define M16C_UARTXNAK_IRQ (_LAST_FIXED+12) /* ffd3c UART2 transmit/NACK2 */ +# define M16C_UARTRACK_IRQ (_LAST_FIXED+13) /* ffd40: UART2 receive/ACK2 */ +# define M16C_UART0XMT_IRQ (_LAST_FIXED+14) /* ffd44: UART0 transmit */ +# define M16C_UART0RCV_IRQ (_LAST_FIXED+15) /* ffd48: UART0 receive */ +# define M16C_UART1XMT_IRQ (_LAST_FIXED+16) /* ffd4c: UART1 transmit */ +# define M16C_UART1RCV_IRQ (_LAST_FIXED+17) /* ffd50: UART1 receive */ +# define M16C_TMRA0_IRQ (_LAST_FIXED+18) /* ffd54: Timer A0 */ +# define M16C_TMRA1_IRQ (_LAST_FIXED+19) /* ffd58: Timer A1 */ +# define M16C_TMRA2_IRQ (_LAST_FIXED+20) /* ffd5c: Timer A2 */ +# define M16C_TMRA3_IRQ (_LAST_FIXED+21) /* ffd60: Timer A3 */ +# define M16C_TMRA4_IRQ (_LAST_FIXED+22) /* ffd64: Timer A4 */ +# define M16C_TMRB0_IRQ (_LAST_FIXED+23) /* ffd68: Timer B0 */ +# define M16C_TMRB1_IRQ (_LAST_FIXED+24) /* ffd6c: Timer B1 */ +# define M16C_TMRB2_IRQ (_LAST_FIXED+25) /* ffd70: Timer B2 */ +# define M16C_INT0_IRQ (_LAST_FIXED+26) /* ffd74: INT0 */ +# define M16C_INT1_IRQ (_LAST_FIXED+27) /* ffd78: INT1 */ +# define M16C_CTXRSTR_SWINT (_LAST_FIXED+4) /* ffd80: S/W interrupt 32, used by NuttX */ + +# define NR_IRQS (_LAST_FIXED+28) /* Total number of supported IRQs */ #endif #define M16C_SYSTIMER_IRQ M16C_TMRA0_IRQ @@ -199,7 +201,7 @@ /* IRQ Stack Frame Format. The M16C has a push down stack. The CPU performs * the following actions when an interrupt is taken: * - * - Save FLG regsiter + * - Save FLG register * - Clear I, D, and U flags in FLG register * - Builds stack frame like: * @@ -212,20 +214,20 @@ * - Vectors to interrupt handler */ -#define REG_PC20 0 /* 20-bit PC [0]:bits 16-19 [1]:bits 8-15 [2]: bits 0-7 */ -#define REG_FLGPCHI 3 /* 8-bit FLG (bits 12-14) PC (bits 16-19) as would be +#define REG_FLGPCHI 0 /* 8-bit FLG (bits 12-14) + PC (bits 16-19) as would be * presented by an interrupt */ -#define REG_FLG 4 /* 8-bit FLG register (bits 0-7) */ -#define REG_PC16 5 /* 16-bit PC [0]:bits8-15 [1]:bits 0-7 */ -#define REG_FB 7 /* 16-bit FB register */ -#define REG_SB 9 /* 16-bit SB register */ -#define REG_A1 11 /* 16-bit A1 register */ -#define REG_R3 13 /* 16-bit R3 register */ -#define REG_R2 15 /* 16-bit R2 register */ -#define REG_R1 17 /* 16-bit R1 register */ -#define REG_R0 19 /* 16-bit R0 register */ - -#define XCPTCONTEXT_SIZE 21 +#define REG_FLG 1 /* 8-bit FLG register (bits 0-7) */ +#define REG_PC16 2 /* 16-bit PC [0]:bits8-15 [1]:bits 0-7 */ +#define REG_FB 4 /* 16-bit FB register */ +#define REG_SB 6 /* 16-bit SB register */ +#define REG_A1 8 /* 16-bit A1 register */ +#define REG_R3 10 /* 16-bit R3 register */ +#define REG_R2 12 /* 16-bit R2 register */ +#define REG_R1 14 /* 16-bit R1 register */ +#define REG_R0 16 /* 16-bit R0 register */ +#define REG_SP 18 /* 16-bit user stack pointer */ + +#define XCPTCONTEXT_SIZE 20 /************************************************************************************ * Public Types @@ -240,7 +242,7 @@ struct xcptcontext */ #ifndef CONFIG_DISABLE_SIGNALS - FAR void *sigdeliver; /* Actual type is sig_deliver_t */ + void *sigdeliver; /* Actual type is sig_deliver_t */ /* These are saved copies of LR and SR used during signal processing. */ diff --git a/arch/sh/src/m16c/Make.defs b/arch/sh/src/m16c/Make.defs index 39da7460b3b57776ea872a42ced161ffc475515b..fe28a2dfda874ed077d0d8f8eb9a5fc2344e85a3 100644 --- a/arch/sh/src/m16c/Make.defs +++ b/arch/sh/src/m16c/Make.defs @@ -42,7 +42,6 @@ CMN_CSRCS = up_allocateheap.c up_assert.c up_blocktask.c \ up_releasepending.c up_releasestack.c up_reprioritizertr.c \ up_udelay.c up_unblocktask.c up_usestack.c -#CHIP_ASRCS = m16c_vectors.S m16c_saveusercontext.S m16c_restorecontext.S CHIP_ASRCS = m16c_vectors.S #CHIP_CSRCS = m16c_initialstate.c m16c_copystate.c m16c_lowputc.c m16c_irq.c \ # m16c_timerisr.c m16c_serial.c diff --git a/arch/sh/src/m16c/m16c_copystate.c b/arch/sh/src/m16c/m16c_copystate.c index e66637ab990c777e25d4f11306abb6039ae519aa..c74b576752cea116fc727abefdfaabf86b17c0ba 100644 --- a/arch/sh/src/m16c/m16c_copystate.c +++ b/arch/sh/src/m16c/m16c_copystate.c @@ -40,6 +40,7 @@ #include <nuttx/config.h> #include <sys/types.h> +#include <string.h> #include "os_internal.h" #include "up_internal.h" diff --git a/arch/sh/src/m16c/m16c_head.S b/arch/sh/src/m16c/m16c_head.S index 52b9fdb7f26693e47070aafc37902e216070b69a..919dcf2d2e6c32b7d3e5220faab45ef3e2e35f75 100644 --- a/arch/sh/src/m16c/m16c_head.S +++ b/arch/sh/src/m16c/m16c_head.S @@ -145,7 +145,7 @@ __start: /* Set the interrupt and user stack pointers */ mov.w #_enbss, R0 - ldc R0, isp /* Set interrupt thread stack pointer to the end of BSS */ + ldc R0, isp /* Set the interrupt stack pointer to the end of BSS */ add.w #CONFIG_IDLETHREAD_STACKSIZE, R0 fset U /* Set bit 7 (U) to select the user stack pointer */ ldc R0, sp /* Set the user stack pointer */ @@ -190,8 +190,8 @@ __start: /* Initialize near .data sections (.rodata is not moved) */ - mov.w _g_enronly, a0 /* a0: Low 16 bits of source */ - mov.b _g_enronly+2, r1h /* r1h: 4 order bits of source */ + mov.w _g_enronly, a0 /* a0: Low 16 bits of source address */ + mov.b _g_enronly+2, r1h /* 4 MS of 20-bit source address */ mov.w _g_sndata, a1 /* a1: start of near .data */ mov.w _g_endata, r3 /* r3: end of near .data */ sub.w a1, r3 /* r3: size of near .data */ @@ -212,4 +212,5 @@ __start: _os_exit: jmp.s _os_exit + .size __start, .-__start .end diff --git a/arch/sh/src/m16c/m16c_initialstate.c b/arch/sh/src/m16c/m16c_initialstate.c index 10dbd2d880a05a8e402342e86026c23b4b5e1a14..e4c5567885842db4e8d0c891689805c55765ccbe 100644 --- a/arch/sh/src/m16c/m16c_initialstate.c +++ b/arch/sh/src/m16c/m16c_initialstate.c @@ -48,7 +48,7 @@ * Preprocessor Definitions ****************************************************************************/ -#define M16C_DEFAULT_IPL 0 /* Global M16C Interrupt priority level */ +#define M16C_DEFAULT_IPL 0 /* Default M16C Interrupt priority level */ /**************************************************************************** * Private Data @@ -58,24 +58,6 @@ * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: up_getsr - ****************************************************************************/ - -static inline irqstate_t up_getsr(void) -{ - irqstate_t flags; - - __asm__ __volatile__ - ( - "stc sr, %0\n\t" - : "=&z" (flags) - : - : "memory" - ); - return flags; -} - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -102,22 +84,26 @@ void up_initial_state(FAR _TCB *tcb) memset(xcp, 0, sizeof(struct xcptcontext)); - /* Offset 0-2: 20-bit PC [0]:bits 16-19 [1]:bits 8-15 [2]: bits 0-7 */ - - *regs++ = (uint32)tcb->start >> 16; /* Bits 16-19 of PC */ - *regs++ = (uint32)tcb->start >> 8; /* Bits 8-15 of PC */ - *regs++ = (uint32)tcb->start; /* Bits 0-7 of PC */ - - /* Offset 3: FLG (bits 12-14) PC (bits 16-19) as would be present by an interrupt */ + /* Offset 0: FLG (bits 12-14) PC (bits 16-19) as would be present by an interrupt */ *regs++ = ((M16C_DEFAULT_IPL << 4) | ((uint32)tcb->start >> 16)); - /* Offset 4: FLG (bits 0-7) */ + /* Offset 1: FLG (bits 0-7) */ +#ifdef CONFIG_SUPPRESS_INTERRUPTS + *regs++ = M16C_FLG_U; +#else *regs++ = M16C_FLG_U | M16C_FLG_I; +#endif - /* Offset 5-6: 16-bit PC [0]:bits8-15 [1]:bits 0-7 */ + /* Offset 2-3: 16-bit PC [0]:bits8-15 [1]:bits 0-7 */ *regs++ = (uint32)tcb->start >> 8; /* Bits 8-15 of PC */ *regs++ = (uint32)tcb->start; /* Bits 0-7 of PC */ + + /* Offset 18-20: User stack pointer */ + + regs = &xcp->regs[REG_SP]; + *regs++ = (uint32)tcb->adj_stack_ptr >> 8; /* Bits 8-15 of SP */ + *regs = (uint32)tcb->adj_stack_ptr; /* Bits 0-7 of SP */ } diff --git a/arch/sh/src/m16c/m16c_vectors.S b/arch/sh/src/m16c/m16c_vectors.S index 2aec1ab8d79dcd3545e9ffe36ee702e8bd22b32d..2ffa50154d9d46accb0e8eb414a21821e663865f 100644 --- a/arch/sh/src/m16c/m16c_vectors.S +++ b/arch/sh/src/m16c/m16c_vectors.S @@ -38,6 +38,7 @@ ************************************************************************************/ #include <nuttx/config.h> +#include <arch/irq.h> #include "chip.h" /************************************************************************************ @@ -48,6 +49,15 @@ * Macro Definitions ************************************************************************************/ +/* Select register bank 1, and pass the IRQ number to _m16c_commonvector */ + + .macro m16c_vector, label, irqno +\label: + fset b + mov.w #\irqno, r1 + jmp.w _m16c_commonvector + .endm + /* Special page vectors. This macro puts the jump address of * functions defined as special page into the special page vector table. * See example calls below and see the M16C Software Manual or NC30 @@ -72,142 +82,79 @@ /* Variable vector section */ .section varvects /* Variable vector table */ - .globl _m16c_unexpected_isr - .globl _m16c_brk_isr .long _m16c_brk_isr /* ffd00: BRK instruction */ .long 0xffffffff /* ffd04 */ .long 0xffffffff /* ffd08 */ .long 0xffffffff /* ffd0c */ - .globl _m16c_int3_isr .long _m16c_int3_isr /* ffd10: INT3 */ + .long _m16c_contextsave /* ffd14: Reserved -- SWINT5 used by NuttX */ #ifdef CONFIG_M16C_SWINTS - .globl _m16c_swint5_isr - .long _m16c_swint5_isr /* ffd14: S/W interrupt 5 */ - .globl _m16c_swint6_isr - .long _m16c_swint6_isr /* ffd18: S/W interrupt 6 */ - .globl _m16c_swint7_isr + .long _m16c_swint6_isr /* ffd18: S/W interrupt 7 */ .long _m16c_swint7_isr /* ffd1c: S/W interrupt 7 */ #else - .long _m16c_unexpected_isr /* ffd14: Reserved */ - .long _m16c_unexpected_isr /* ffd18: Reserved */ + .long _m16c_unexpected_isr /* ffd1c: Reserved */ .long _m16c_unexpected_isr /* ffd1c: Reserved */ #endif - .globl _m16c_int5_isr .long _m16c_int5_isr /* ffd20: INT5 */ - .globl _m16c_int4_isr .long _m16c_int4_isr /* ffd24: INT4 */ - .globl _m16c_uart2bcd_isr .long _m16c_uart2bcd_isr /* ffd28: UART2 bus collision detection */ - .globl _m16c_dma0_isr .long _m16c_dma0_isr /* ffd2c: DMA0 */ - .globl _m16c_dma1_isr .long _m16c_dma1_isr /* ffd30: DMA1 */ - .globl _m16c_keyinp_isr .long _m16c_keyinp_isr /* ffd34: Key input interrupt */ - .globl _m16c_adc_isr .long _m16c_adc_isr /* ffd38: A-D */ - .globl _m16c_uart2xmitnack2_isr .long _m16c_uart2xmitnack2_isr /* ffd3c UART2 transmit/NACK2 */ - .globl _m16c_uart2rcvack2_isr .long _m16c_uart2rcvack2_isr /* ffd40: UART2 receive/ACK2 */ - .globl _m16c_uart0xmit_isr .long _m16c_uart0xmit_isr /* ffd44: UART0 transmit */ - .globl _m16c_uart0rcv_isr .long _m16c_uart0rcv_isr /* ffd48: UART0 receive */ - .globl _m16c_uart1xmit_isr .long _m16c_uart1xmit_isr /* ffd4c: UART1 transmit */ - .globl _m16c_uart1rcv_isr .long _m16c_uart1rcv_isr /* ffd50: UART1 receive */ - .globl _m16c_tmra0_isr .long _m16c_tmra0_isr /* ffd54: Timer A0 */ - .globl _m16c_tmra1_isr .long _m16c_tmra1_isr /* ffd58: Timer A1 */ - .globl _m16c_tmra2_isr .long _m16c_tmra2_isr /* ffd5c: Timer A2 */ - .globl _m16c_tmra3_isr .long _m16c_tmra3_isr /* ffd60: Timer A3 */ - .globl _m16c_tmra4_isr .long _m16c_tmra4_isr /* ffd64: Timer A4 */ - .globl _m16c_tmrb0_isr .long _m16c_tmrb0_isr /* ffd68: Timer B0 */ - .globl _m16c_tmrb1_isr .long _m16c_tmrb1_isr /* ffd6c: Timer B1 */ - .globl _m16c_tmrb2_isr .long _m16c_tmrb2_isr /* ffd70: Timer B2 */ - .globl _m16c_int0_isr .long _m16c_int0_isr /* ffd74: INT0 */ - .globl _m16c_int1_isr .long _m16c_int1_isr /* ffd78: INT1 */ #ifdef CONFIG_M16C_SWINTS - .globl _m16c_swint31_isr .long _m16c_swint31_isr /* ffd7c: S/W interrupt 31 */ - .globl _m16c_swint32_isr - .long _m16c_swint32_isr /* ffd80: S/W interrupt 32 */ - .globl _m16c_swint33_isr + .long _m16c_contextrestore /* ffd80: S/W interrupt 32 by NuttX */ .long _m16c_swint33_isr /* ffd84: S/W interrupt 33 */ - .globl _m16c_swint34_isr .long _m16c_swint34_isr /* ffd88: S/W interrupt 34 */ - .globl _m16c_swint35_isr .long _m16c_swint35_isr /* ffd8c: S/W interrupt 35 */ - .globl _m16c_swint36_isr .long _m16c_swint36_isr /* ffd90: S/W interrupt 36 */ - .globl _m16c_swint37_isr .long _m16c_swint37_isr /* ffd94: S/W interrupt 37 */ - .globl _m16c_swint38_isr .long _m16c_swint38_isr /* ffd98: S/W interrupt 38 */ - .globl _m16c_swint39_isr .long _m16c_swint39_isr /* ffd9c: S/W interrupt 39 */ - .globl _m16c_swint40_isr .long _m16c_swint40_isr /* ffda0: S/W interrupt 40 */ - .globl _m16c_swint41_isr .long _m16c_swint41_isr /* ffda4: S/W interrupt 41 */ - .globl _m16c_swint42_isr .long _m16c_swint42_isr /* ffda8: S/W interrupt 42 */ - .globl _m16c_swint43_isr .long _m16c_swint43_isr /* ffdac: S/W interrupt 43 */ - .globl _m16c_swint44_isr .long _m16c_swint44_isr /* ffdb0: S/W interrupt 44 */ - .globl _m16c_swint45_isr .long _m16c_swint45_isr /* ffdb4: S/W interrupt 45 */ - .globl _m16c_swint46_isr .long _m16c_swint46_isr /* ffdb8: S/W interrupt 46 */ - .globl _m16c_swint47_isr .long _m16c_swint47_isr /* ffdbc: S/W interrupt 47 */ - .globl _m16c_swint48_isr .long _m16c_swint48_isr /* ffdc0: S/W interrupt 48 */ - .globl _m16c_swint49_isr .long _m16c_swint49_isr /* ffdc4: S/W interrupt 49 */ - .globl _m16c_swint50_isr .long _m16c_swint50_isr /* ffdc8: S/W interrupt 50 */ - .globl _m16c_swint51_isr .long _m16c_swint51_isr /* ffdcc: S/W interrupt 51 */ - .globl _m16c_swint52_isr .long _m16c_swint52_isr /* ffdd0: S/W interrupt 52 */ - .globl _m16c_swint53_isr .long _m16c_swint53_isr /* ffdd4: S/W interrupt 53 */ - .globl _m16c_swint54_isr .long _m16c_swint54_isr /* ffdd8: S/W interrupt 54 */ - .globl _m16c_swint55_isr .long _m16c_swint55_isr /* ffddc: S/W interrupt 55 */ - .globl _m16c_swint56_isr .long _m16c_swint56_isr /* ffde0: S/W interrupt 56 */ - .globl _m16c_swint57_isr .long _m16c_swint57_isr /* ffde4: S/W interrupt 57 */ - .globl _m16c_swint58_isr .long _m16c_swint58_isr /* ffde8: S/W interrupt 58 */ - .globl _m16c_swint59_isr .long _m16c_swint59_isr /* ffdec: S/W interrupt 59 */ - .globl _m16c_swint60_isr .long _m16c_swint60_isr /* ffdf0: S/W interrupt 60 */ - .globl _m16c_swint61_isr .long _m16c_swint61_isr /* ffdf4: S/W interrupt 61 */ - .globl _m16c_swint62_isr .long _m16c_swint62_isr /* ffdf8: S/W interrupt 62 */ - .globl _m16c_swint63_isr .long _m16c_swint63_isr /* ffdfc: S/W interrupt 63 */ #else .long _m16c_unexpected_isr /* ffd7c: Reserved */ - .long _m16c_unexpected_isr /* ffd80: Not supported */ + .long _m16c_contextrestore /* ffd80: S/W interrupt 32 by NuttX */ .long _m16c_unexpected_isr /* ffd84: Not supported */ .long _m16c_unexpected_isr /* ffd88: Not supported */ .long _m16c_unexpected_isr /* ffd8c: Not supported */ @@ -248,31 +195,23 @@ * is not currently used. */ .section specpg /* Special page table */ - + /* Nothing */ .section fixvects /* Fixed vector table */ - .globl _m16c_undefinst_irq .long _m16c_undefinst_irq /* fffdc: Undefined instruction */ - .globl _m16c_overflow_irq .long _m16c_overflow_irq /* fffe0: Overflow */ - .globl _m16c_brkinst_irq .long _m16c_brkinst_irq /* fffe4: BRK instruction */ - .globl _m16c_addrmatch_irq .long _m16c_addrmatch_irq /* fffe8: Address match */ #ifdef CONFIG_M16C_DEBUGGER - .globl _m16c_sstep_irq .long _m16c_sstep_irq /* fffec: Single step */ #else .long _m16c_unexpected_isr /* fffec: Not supported */ #endif - .globl _m16c_wdog_irq .long _m16c_wdog_irq /* ffff0: Watchdog timer */ #ifdef CONFIG_M16C_DEBUGGER - .globl _m16c_dbc_irq .long _m16c_dbc_irq /* ffff4: DBC */ #else .long _m16c_unexpected_isr /* ffff4: Not supported */ #endif - .globl _m16c_nmi_irq .long _m16c_nmi_irq /* ffff8: NMI */ .long __start /* ffffc: Reset */ @@ -280,15 +219,15 @@ * Code ************************************************************************************/ /************************************************************************************ - * Name: + * Name: m16c_*isr * * Description: - * The M16C has a push down stack. The CPU performs the following actions when an + * Handler interrupt events. The CPU performs the following actions when an * interrupt is taken: * - * - Save FLG regsiter + * - Save FLG register * - Clear I, D, and U flags in FLG register - * - Builds stack frame like: + * - Builds stack frame like (on the push-down, interrupt stack): * * sp -> PC bits 0-7 * sp+1 -> PC bits 8-15 @@ -301,4 +240,273 @@ ************************************************************************************/ .text +/* The unexpected interrupt vector */ + + m16c_vector _m16c_unexpected_isr, NR_IRQS + + /* Variable vectors */ + + m16c_vector _m16c_brk_isr, M16C_BRK_IRQ + m16c_vector _m16c_int3_isr, M16C_INT3_IRQ + m16c_vector _m16c_int5_isr, M16C_INT5_IRQ + m16c_vector _m16c_int4_isr, M16C_INT4_IRQ + m16c_vector _m16c_uart2bcd_isr, M16C_UART2BCD_IRQ + m16c_vector _m16c_dma0_isr, M16C_DMA0_IRQ + m16c_vector _m16c_dma1_isr, M16C_DMA1_IRQ + m16c_vector _m16c_keyinp_isr, M16C_KEYINP_IRQ + m16c_vector _m16c_adc_isr, M16C_ADC_IRQ + m16c_vector _m16c_uart2xmitnack2_isr, M16C_UARTXNAK_IRQ + m16c_vector _m16c_uart2rcvack2_isr, M16C_UARTRACK_IRQ + m16c_vector _m16c_uart0xmit_isr, M16C_UART0XMT_IRQ + m16c_vector _m16c_uart0rcv_isr, M16C_UART0RCV_IRQ + m16c_vector _m16c_uart1xmit_isr, M16C_UART1XMT_IRQ + m16c_vector _m16c_uart1rcv_isr, M16C_UART1RCV_IRQ + m16c_vector _m16c_tmra0_isr, M16C_TMRA0_IRQ + m16c_vector _m16c_tmra1_isr, M16C_TMRA1_IRQ + m16c_vector _m16c_tmra2_isr, M16C_TMRA2_IRQ + m16c_vector _m16c_tmra3_isr, M16C_TMRA3_IRQ + m16c_vector _m16c_tmra4_isr, M16C_TMRA4_IRQ + m16c_vector _m16c_tmrb0_isr, M16C_TMRB0_IRQ + m16c_vector _m16c_tmrb1_isr, M16C_TMRB1_IRQ + m16c_vector _m16c_tmrb2_isr, M16C_TMRB2_IRQ + m16c_vector _m16c_int0_isr, M16C_INT0_IRQ + m16c_vector _m16c_int1_isr, M16C_INT1_IRQ + +#ifdef CONFIG_M16C_SWINTS + m16c_vector _m16c_swint5_isr, M16C_SWINT5_IRQ + m16c_vector _m16c_swint6_isr, M16C_SWINT6_IRQ + m16c_vector _m16c_swint7_isr, M16C_SWINT7_IRQ + m16c_vector _m16c_swint31_isr, M16C_SWINT31_IRQ + m16c_vector _m16c_swint32_isr, M16C_SWINT32_IRQ + m16c_vector _m16c_swint33_isr, M16C_SWINT33_IRQ + m16c_vector _m16c_swint34_isr, M16C_SWINT34_IRQ + m16c_vector _m16c_swint35_isr, M16C_SWINT35_IRQ + m16c_vector _m16c_swint36_isr, M16C_SWINT36_IRQ + m16c_vector _m16c_swint37_isr, M16C_SWINT37_IRQ + m16c_vector _m16c_swint38_isr, M16C_SWINT38_IRQ + m16c_vector _m16c_swint39_isr, M16C_SWINT39_IRQ + m16c_vector _m16c_swint40_isr, M16C_SWINT40_IRQ + m16c_vector _m16c_swint41_isr, M16C_SWINT41_IRQ + m16c_vector _m16c_swint42_isr, M16C_SWINT42_IRQ + m16c_vector _m16c_swint43_isr, M16C_SWINT43_IRQ + m16c_vector _m16c_swint44_isr, M16C_SWINT44_IRQ + m16c_vector _m16c_swint45_isr, M16C_SWINT45_IRQ + m16c_vector _m16c_swint46_isr, M16C_SWINT46_IRQ + m16c_vector _m16c_swint47_isr, M16C_SWINT47_IRQ + m16c_vector _m16c_swint48_isr, M16C_SWINT48_IRQ + m16c_vector _m16c_swint49_isr, M16C_SWINT49_IRQ + m16c_vector _m16c_swint50_isr, M16C_SWINT50_IRQ + m16c_vector _m16c_swint51_isr, M16C_SWINT51_IRQ + m16c_vector _m16c_swint52_isr, M16C_SWINT52_IRQ + m16c_vector _m16c_swint53_isr, M16C_SWINT53_IRQ + m16c_vector _m16c_swint54_isr, M16C_SWINT54_IRQ + m16c_vector _m16c_swint55_isr, M16C_SWINT55_IRQ + m16c_vector _m16c_swint56_isr, M16C_SWINT56_IRQ + m16c_vector _m16c_swint57_isr, M16C_SWINT57_IRQ + m16c_vector _m16c_swint58_isr, M16C_SWINT58_IRQ + m16c_vector _m16c_swint59_isr, M16C_SWINT59_IRQ + m16c_vector _m16c_swint60_isr, M16C_SWINT60_IRQ + m16c_vector _m16c_swint61_isr, M16C_SWINT61_IRQ + m16c_vector _m16c_swint62_isr, M16C_SWINT62_IRQ + m16c_vector _m16c_swint63_isr, M16C_SWINT63_IRQ +#endif + +/* Fixed vectors */ + + m16c_vector _m16c_undefinst_irq, M16C_UNDEFINST_IRQ + m16c_vector _m16c_overflow_irq, M16C_OVERFLOW_IRQ + m16c_vector _m16c_brkinst_irq, M16C_BRK_IRQ + m16c_vector _m16c_addrmatch_irq, M16C_ADDRMATCH_IRQ + m16c_vector _m16c_wdog_irq, M16C_WDOG_IRQ + m16c_vector _m16c_nmi_irq, M16C_NMI_IRQ +#ifdef CONFIG_M16C_DEBUGGER + m16c_vector _m16c_sstep_irq, M16C_SSTEP_IRQ + m16c_vector _m16c_dbc_irq, M16C_DBC_IRQ +#endif + +/* At this point, the stack remains as it was on interrupt. The interrupt + * stack is selected, register bank 1 is selected and r1 holds the IRQ + * number. + */ + +_m16c_commonvector: + +/* At this point, the interrupt stack has 4 bytes of info on it. */ + +/* Save all registers on the interrupt stack */ + + fclr b /* Switch back to Bank 0 */ + pushm fb,sb,a1,a0,r3,r2,r1,r0 /* Save on interrupt stack */ + fset b /* Bank to bank 1 */ + +/* Save the user stack pointer on the interrupt stack */ + + fset u /* Switch to User stack */ + stc sp, r0 /* R0 = user stack pointer */ + fclr u /* Back to interrupt stack */ + push.w r0 /* Save user sp on isp */ + +/* Then call _up_doirq with r1=IRQ number, r2=address of context info. At this + * point, the interrupt stack holds the address of the last byte of the context + * info array + */ + + stc isp, r2 /* R2 = address of base of context info */ + jsr.a _up_doirq + +/* Upon return, r0 will hold address of the base of the new context info structure + * use for return. Most of the time this will be the same as the address passed to + * to _up_doirg above, but will differ if a context switch occurs during interrupt + * processing. + * + * Of the ISP to the end of the context array: + */ + + ldc r0, isp /* ISP = address of base of new context info */ + + /* Restore the user stack pointer */ + + pop.w r0 /* R0 = saved user stack pointer */ + fset u /* Switch to User stack */ + ldc r0, sp /* Restore the user stack pointer */ + fclr u /* Back to interrupt stack */ + +/* Recover all registers and return */ + + fclr b /* Switch back to Bank 0 */ + popm fb,sb,a1,a0,r3,r2,r1,r0 /* Recover registers */ + reit /* Return from interrupt */ + +/************************************************************************************ + * Name: int up_saveusercontext(uint32 *regs) + * + * Description: + * Save the context of the calling function at the point of the return from the + * call. This basically a setjmp. + * + * Input Parameters: + * R1 = Address of register save array + * + * Returned Value: + * R0 = 0 on normal call; 1 on context switch + * + ************************************************************************************/ + + .globl _up_saveusercontext + .type _up_saveusercontext, #function + +_up_saveusercontext: + int #5 /* Execute S/W interrupt 5 */ + rts /* Then return with the correct value in r0 */ + +/* This the logic executes in response to S/W interrupt 5. The 'int 5' instruction + * will cause the following actions: + * + * - Save FLG register + * - Clear I, D, and U flags in FLG register + * - Builds stack frame like (on the push-down, interrupt stack): + * + * sp -> PC bits 0-7 + * sp+1 -> PC bits 8-15 + * sp+2 -> FLG bits 0-7 + * sp+3 -> FLG (Bits 12-14) + PC (bits 16-19) + * + * - Set IPL + * - Vectors to this S/W interrupt handler: + */ + +_m16c_contextsave: + +/* Save all registers on the interrupt stack */ + + mov.w #1, r0 /* Return 1 on context switch */ + pushm fb,sb,a1,a0,r3,r2,r1,r0 /* Save on interrupt stack */ + +/* Save the user stack pointer on the interrupt stack */ + + fset u /* Switch to User stack */ + stc sp, r0 /* R0 = user stack pointer */ + fclr u /* Back to interrupt stack */ + push.w r0 /* Save user sp on isp */ + +/* Then copy the stack content to the register context array pointed to by r1 */ + + stc isp, a0 /* A0 = address of base of context info */ + mov.w r1, a1 /* A1 = address of register context array */ + mov.b #0, r1h /* R1H = 4 MS of 20-bit source address */ + mov.w #XCPTCONTEXT_SIZE, r3 /* R3 = Number of bytes to transfer */ + smovf.b /* Copy ISP to near context array */ + +/* Then return zero to indicate a normal function call return */ + + add.w #(XCPTCONTEXT_SIZE - 4), sp /* Remove stuff from stack */ + mov.w #0, r0 /* Return zero */ + reit /* Return from interrupt */ + .size _up_saveusercontext, .-_up_saveusercontext + +/************************************************************************************ + * Name: void up_fullcontextrestore(uint32 *regs) + * + * Description: + * Restore the context of the using the provided register save array. + * + * Input Parameters: + * R1 = Address of register save array + * + * Returned Value: + * None + * + ************************************************************************************/ + + .globl _up_fullcontextrestore + .type _up_fullcontextrestore, #function + +_up_fullcontextrestore: + int #32 /* Execute S/W interrupt 32 */ + rts /* and return */ + +/* This the logic executes in response to S/W interrupt 32. The 'int 32' instruction + * will cause the following actions: + * + * - Save FLG register + * - Clear I and D flags in FLG register (U is preserved) + * - Builds stack frame like (on the push-down, interrupt stack): + * + * sp -> PC bits 0-7 + * sp+1 -> PC bits 8-15 + * sp+2 -> FLG bits 0-7 + * sp+3 -> FLG (Bits 12-14) + PC (bits 16-19) + * + * - Set IPL + * - Vectors to this S/W interrupt handler: + */ + +_m16c_contextrestore: + +/* Set the USP to the beginning of the context save area */ + + ldc r1, sp /* USP = address of base of new context info */ + + /* Restore the user stack pointer */ + + fset b /* Switch to bank 1 */ + pop.w r0 /* R0 = saved user stack pointer */ + fclr b /* Back to bank 0 */ + +/* Recover all registers */ + + popm fb,sb,a1,a0,r3,r2,r1,r0 /* Restore from registers from user stack */ + +/* Set the USP and return */ + + fset b /* Switch to bank 1 */ + popm r1,r0 /* Recover the PC and flags */ + stc sp, r0 /* Set the correct USP */ + pushm r1,r0 /* Put the PC and flags */ + fclr b /* Back to bank 0 */ + +/* The return from interrupt */ + + reit /* Return from interrupt */ + .size _up_fullcontextrestore, .-_up_fullcontextrestore .end diff --git a/arch/sh/src/sh1/sh1_saveusercontext.S b/arch/sh/src/sh1/sh1_saveusercontext.S index ee6952f460f2b55164e83a2ee96913299a12da3d..1514b9399258a2a701f712d209ee8148cbdab344 100644 --- a/arch/sh/src/sh1/sh1_saveusercontext.S +++ b/arch/sh/src/sh1/sh1_saveusercontext.S @@ -1,7 +1,7 @@ /************************************************************************** * arch/sh/src/sh1/sh1_saveusercontext.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> * * Redistribution and use in source and binary forms, with or without