From 1272fdce1e9e8d55e5fddf3ae79019ca7836c770 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 17 Jul 2014 08:52:22 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7038 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/nil/ports/e200/compilers/GCC/ivor.s | 234 +++++++++++++++++++++ .../ports/e200/compilers/GCC/mk/port_spc560bcxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc560bxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc560dxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc560pxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc563mxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc564axx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc56ecxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc56elxx.mk | 4 +- .../ports/e200/compilers/GCC/mk/port_spc57emxx.mk | 4 +- 10 files changed, 252 insertions(+), 18 deletions(-) create mode 100644 os/nil/ports/e200/compilers/GCC/ivor.s (limited to 'os/nil/ports/e200') diff --git a/os/nil/ports/e200/compilers/GCC/ivor.s b/os/nil/ports/e200/compilers/GCC/ivor.s new file mode 100644 index 000000000..6b2fc3bba --- /dev/null +++ b/os/nil/ports/e200/compilers/GCC/ivor.s @@ -0,0 +1,234 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012,2013 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file ivor.s + * @brief Kernel ISRs. + * + * @addtogroup PPC_GCC_CORE + * @{ + */ + +#if !defined(FALSE) || defined(__DOXYGEN__) +#define FALSE 0 +#endif + +#if !defined(TRUE) || defined(__DOXYGEN__) +#define TRUE 1 +#endif + +/* + * Imports the PPC configuration headers. + */ +#define _FROM_ASM_ +#include "nilconf.h" +#include "nilcore.h" + +#if !defined(__DOXYGEN__) + /* + * INTC registers address. + */ + .equ INTC_IACKR, 0xfff48010 + .equ INTC_EOIR, 0xfff48018 + + .section .handlers, "ax" + +#if PPC_SUPPORTS_DECREMENTER + /* + * _IVOR10 handler (Book-E decrementer). + */ + .align 4 + .globl _IVOR10 + .type _IVOR10, @function +_IVOR10: + /* Saving the external context (port_extctx structure).*/ + stwu %sp, -80(%sp) +#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI + e_stmvsrrw 8(%sp) /* Saves PC, MSR. */ + e_stmvsprw 16(%sp) /* Saves CR, LR, CTR, XER. */ + e_stmvgprw 32(%sp) /* Saves GPR0, GPR3...GPR12. */ +#else /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + stw %r0, 32(%sp) /* Saves GPR0. */ + mfSRR0 %r0 + stw %r0, 8(%sp) /* Saves PC. */ + mfSRR1 %r0 + stw %r0, 12(%sp) /* Saves MSR. */ + mfCR %r0 + stw %r0, 16(%sp) /* Saves CR. */ + mfLR %r0 + stw %r0, 20(%sp) /* Saves LR. */ + mfCTR %r0 + stw %r0, 24(%sp) /* Saves CTR. */ + mfXER %r0 + stw %r0, 28(%sp) /* Saves XER. */ + stw %r3, 36(%sp) /* Saves GPR3...GPR12. */ + stw %r4, 40(%sp) + stw %r5, 44(%sp) + stw %r6, 48(%sp) + stw %r7, 52(%sp) + stw %r8, 56(%sp) + stw %r9, 60(%sp) + stw %r10, 64(%sp) + stw %r11, 68(%sp) + stw %r12, 72(%sp) +#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + + /* Increasing the SPGR0 register.*/ + mfspr %r0, 272 + eaddi %r0, %r0, 1 + mtspr 272, %r0 + + /* Reset DIE bit in TSR register.*/ + lis %r3, 0x0800 /* DIS bit mask. */ + mtspr 336, %r3 /* TSR register. */ + +#if PPC_USE_IRQ_PREEMPTION + /* Allows preemption while executing the software handler.*/ + wrteei 1 +#endif + + /* System tick handler invocation.*/ + bl chSysTimerHandlerI + +#if PPC_USE_IRQ_PREEMPTION + /* Prevents preemption again.*/ + wrteei 0 +#endif + + /* Jumps to the common IVOR epilogue code.*/ + b _ivor_exit +#endif /* PPC_SUPPORTS_DECREMENTER */ + + /* + * _IVOR4 handler (Book-E external interrupt). + */ + .align 4 + .globl _IVOR4 + .type _IVOR4, @function +_IVOR4: + /* Saving the external context (port_extctx structure).*/ + stwu %sp, -80(%sp) +#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI + e_stmvsrrw 8(%sp) /* Saves PC, MSR. */ + e_stmvsprw 16(%sp) /* Saves CR, LR, CTR, XER. */ + e_stmvgprw 32(%sp) /* Saves GPR0, GPR3...GPR12. */ +#else /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + stw %r0, 32(%sp) /* Saves GPR0. */ + mfSRR0 %r0 + stw %r0, 8(%sp) /* Saves PC. */ + mfSRR1 %r0 + stw %r0, 12(%sp) /* Saves MSR. */ + mfCR %r0 + stw %r0, 16(%sp) /* Saves CR. */ + mfLR %r0 + stw %r0, 20(%sp) /* Saves LR. */ + mfCTR %r0 + stw %r0, 24(%sp) /* Saves CTR. */ + mfXER %r0 + stw %r0, 28(%sp) /* Saves XER. */ + stw %r3, 36(%sp) /* Saves GPR3...GPR12. */ + stw %r4, 40(%sp) + stw %r5, 44(%sp) + stw %r6, 48(%sp) + stw %r7, 52(%sp) + stw %r8, 56(%sp) + stw %r9, 60(%sp) + stw %r10, 64(%sp) + stw %r11, 68(%sp) + stw %r12, 72(%sp) +#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + + /* Increasing the SPGR0 register.*/ + mfspr %r0, 272 + eaddi %r0, %r0, 1 + mtspr 272, %r0 + + /* Software vector address from the INTC register.*/ + lis %r3, INTC_IACKR@h + ori %r3, %r3, INTC_IACKR@l /* IACKR register address. */ + lwz %r3, 0(%r3) /* IACKR register value. */ + lwz %r3, 0(%r3) + mtCTR %r3 /* Software handler address. */ + +#if PPC_USE_IRQ_PREEMPTION + /* Allows preemption while executing the software handler.*/ + wrteei 1 +#endif + + /* Exectes the software handler.*/ + bctrl + +#if PPC_USE_IRQ_PREEMPTION + /* Prevents preemption again.*/ + wrteei 0 +#endif + + /* Informs the INTC that the interrupt has been served.*/ + mbar 0 + lis %r3, INTC_EOIR@h + ori %r3, %r3, INTC_EOIR@l + stw %r3, 0(%r3) /* Writing any value should do. */ + + /* Common IVOR epilogue code, context restore.*/ + .globl _ivor_exit +_ivor_exit: + /* Decreasing the SPGR0 register.*/ + mfspr %r0, 272 + eaddi %r0, %r0, -1 + mtspr 272, %r0 + + bl chSchRescheduleS + + /* Restoring the external context.*/ +#if PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI + e_lmvgprw 32(%sp) /* Restores GPR0, GPR3...GPR12. */ + e_lmvsprw 16(%sp) /* Restores CR, LR, CTR, XER. */ + e_lmvsrrw 8(%sp) /* Restores PC, MSR. */ +#else /*!(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + lwz %r3, 36(%sp) /* Restores GPR3...GPR12. */ + lwz %r4, 40(%sp) + lwz %r5, 44(%sp) + lwz %r6, 48(%sp) + lwz %r7, 52(%sp) + lwz %r8, 56(%sp) + lwz %r9, 60(%sp) + lwz %r10, 64(%sp) + lwz %r11, 68(%sp) + lwz %r12, 72(%sp) + lwz %r0, 8(%sp) + mtSRR0 %r0 /* Restores PC. */ + lwz %r0, 12(%sp) + mtSRR1 %r0 /* Restores MSR. */ + lwz %r0, 16(%sp) + mtCR %r0 /* Restores CR. */ + lwz %r0, 20(%sp) + mtLR %r0 /* Restores LR. */ + lwz %r0, 24(%sp) + mtCTR %r0 /* Restores CTR. */ + lwz %r0, 28(%sp) + mtXER %r0 /* Restores XER. */ + lwz %r0, 32(%sp) /* Restores GPR0. */ +#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */ + addi %sp, %sp, 80 /* Back to the previous frame. */ + rfi + +#endif /* !defined(__DOXYGEN__) */ + +/** @} */ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc560bcxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc560bcxx.mk index 1e411c35b..050076219 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc560bcxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc560bcxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z0 SPC560BCxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z0 SPC560BCxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC560BCxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc560bxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc560bxx.mk index 86e4625a8..6089f4743 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc560bxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc560bxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z0 SPC560Bxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z0 SPC560Bxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC560Bxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc560dxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc560dxx.mk index 80fb723be..91176f87b 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc560dxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc560dxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z0 SPC560Dxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z0 SPC560Dxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC560Dxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc560pxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc560pxx.mk index 539d3a846..9342310aa 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc560pxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc560pxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z0 SPC560Pxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z0 SPC560Pxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC560Pxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc563mxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc563mxx.mk index fe52357b2..febbf22a8 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc563mxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc563mxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z3 SPC563Mxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z3 SPC563Mxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC563Mxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc564axx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc564axx.mk index ae2c5ef3d..31b25c692 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc564axx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc564axx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z4 SPC564Axx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z4 SPC564Axx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC564Axx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc56ecxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc56ecxx.mk index d8b20f071..84ada33e1 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc56ecxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc56ecxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z4 SPC56ECxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z4 SPC56ECxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC56ECxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc56elxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc56elxx.mk index 0ef3765c0..a913240e3 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc56elxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc56elxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z4 SPC56ELxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z4 SPC56ELxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC56ELxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ diff --git a/os/nil/ports/e200/compilers/GCC/mk/port_spc57emxx.mk b/os/nil/ports/e200/compilers/GCC/mk/port_spc57emxx.mk index 82dd7f5fc..669d371ea 100644 --- a/os/nil/ports/e200/compilers/GCC/mk/port_spc57emxx.mk +++ b/os/nil/ports/e200/compilers/GCC/mk/port_spc57emxx.mk @@ -1,5 +1,5 @@ -# List of the ChibiOS/RT e200z4 SPC57EMxx port files. -PORTSRC = ${CHIBIOS}/os/nil/ports/e200/chcore.c +# List of the ChibiOS/NIL e200z4 SPC57EMxx port files. +PORTSRC = ${CHIBIOS}/os/nil/ports/e200/nilcore.c PORTASM = $(CHIBIOS)/os/common/ports/e200/devices/SPC57EMxx/boot.s \ $(CHIBIOS)/os/common/ports/e200/compilers/GCC/vectors.s \ -- cgit v1.2.3