aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-09-14 12:57:19 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-09-14 12:57:19 +0000
commit061c8328506ee40d5d52e31c39f385754a8cc57d (patch)
tree644f996781035f2ee74fb256cfe8334485038c30
parentf4b73385582f468882abe2e49c02b8fd689b9f81 (diff)
downloadChibiOS-061c8328506ee40d5d52e31c39f385754a8cc57d.tar.gz
ChibiOS-061c8328506ee40d5d52e31c39f385754a8cc57d.tar.bz2
ChibiOS-061c8328506ee40d5d52e31c39f385754a8cc57d.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4656 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--demos/PPC-SPC563-GCC/Makefile2
-rw-r--r--os/ports/GCC/PPC/SPC560Pxx/ivor.s219
-rw-r--r--os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld173
-rw-r--r--os/ports/GCC/PPC/SPC560Pxx/port.mk11
-rw-r--r--os/ports/GCC/PPC/SPC560Pxx/ppcparams.h57
-rw-r--r--os/ports/GCC/PPC/SPC560Pxx/vectors.s1109
-rw-r--r--os/ports/GCC/PPC/SPC563Mxx/ivor.s20
-rw-r--r--os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld20
-rw-r--r--os/ports/GCC/PPC/SPC563Mxx/ppcparams.h5
9 files changed, 1611 insertions, 5 deletions
diff --git a/demos/PPC-SPC563-GCC/Makefile b/demos/PPC-SPC563-GCC/Makefile
index 51e1b2645..cb8505a02 100644
--- a/demos/PPC-SPC563-GCC/Makefile
+++ b/demos/PPC-SPC563-GCC/Makefile
@@ -18,7 +18,7 @@ ifeq ($(USE_CPPOPT),)
USE_CPPOPT = -fno-rtti
endif
-# Enable this if you want the linker to remove unused code and data
+# Enable this if you want the linker to remove unused code and data.
ifeq ($(USE_LINK_GC),)
USE_LINK_GC = no
endif
diff --git a/os/ports/GCC/PPC/SPC560Pxx/ivor.s b/os/ports/GCC/PPC/SPC560Pxx/ivor.s
new file mode 100644
index 000000000..c57899b9a
--- /dev/null
+++ b/os/ports/GCC/PPC/SPC560Pxx/ivor.s
@@ -0,0 +1,219 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file SPC560Pxx/ivor.s
+ * @brief SPC560Pxx IVORx handlers.
+ *
+ * @addtogroup PPC_CORE
+ * @{
+ */
+
+/*
+ * Imports the PPC configuration headers.
+ */
+#define _FROM_ASM_
+#include "chconf.h"
+#include "chcore.h"
+
+#if !defined(__DOXYGEN__)
+ /*
+ * INTC registers address.
+ */
+ .equ INTC_IACKR, 0xfff48010
+ .equ INTC_EOIR, 0xfff48018
+
+ .section .handlers, "ax"
+
+ /*
+ * IVOR10 handler (Book-E decrementer).
+ */
+ .align 4
+ .globl IVOR10
+IVOR10:
+ /* Creation of the external stack frame (extctx structure).*/
+ stwu %sp, -80(%sp) /* Size of the extctx structure.*/
+#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) */
+
+ /* Reset DIE bit in TSR register.*/
+ lis %r3, 0x0800 /* DIS bit mask. */
+ mtspr 336, %r3 /* TSR register. */
+
+#if CH_DBG_SYSTEM_STATE_CHECK
+ bl dbg_check_enter_isr
+ bl dbg_check_lock_from_isr
+#endif
+ bl chSysTimerHandlerI
+#if CH_DBG_SYSTEM_STATE_CHECK
+ bl dbg_check_unlock_from_isr
+ bl dbg_check_leave_isr
+#endif
+
+ /* System tick handler invocation.*/
+#if CH_DBG_SYSTEM_STATE_CHECK
+ bl dbg_check_lock
+#endif
+ bl chSchIsPreemptionRequired
+ cmpli cr0, %r3, 0
+ beq cr0, .ctxrestore
+ bl chSchDoReschedule
+ b .ctxrestore
+
+ /*
+ * IVOR4 handler (Book-E external interrupt).
+ */
+ .align 4
+ .globl IVOR4
+IVOR4:
+ /* Creation of the external stack frame (extctx structure).*/
+ stwu %sp, -80(%sp) /* Size of the extctx structure.*/
+#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) */
+
+ /* 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. */
+
+ /* Verifies if a reschedule is required.*/
+#if CH_DBG_SYSTEM_STATE_CHECK
+ bl dbg_check_lock
+#endif
+ bl chSchIsPreemptionRequired
+ cmpli cr0, %r3, 0
+ beq cr0, .ctxrestore
+ bl chSchDoReschedule
+
+ /* Context restore.*/
+.ctxrestore:
+#if CH_DBG_SYSTEM_STATE_CHECK
+ bl dbg_check_unlock
+#endif
+#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/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld b/os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld
new file mode 100644
index 000000000..c70a20194
--- /dev/null
+++ b/os/ports/GCC/PPC/SPC560Pxx/ld/SPC560P44.ld
@@ -0,0 +1,173 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 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 <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * SPC560P44 memory setup.
+ */
+__irq_stack_size__ = 0x0000; /* Not yet used.*/
+__process_stack_size__ = 0x0800;
+
+MEMORY
+{
+ flash : org = 0x00000000, len = 512k
+ dataflash : org = 0x00800000, len = 64k
+ ram : org = 0x40000000, len = 40k
+}
+
+/*
+ * Derived constants.
+ */
+__flash_size__ = LENGTH(flash);
+__flash_start__ = ORIGIN(flash);
+__flash_end__ = ORIGIN(flash) + LENGTH(flash);
+
+__ram_size__ = LENGTH(ram);
+__ram_start__ = ORIGIN(ram);
+__ram_end__ = ORIGIN(ram) + LENGTH(ram);
+
+SECTIONS
+{
+ . = ORIGIN(flash);
+ .boot : ALIGN(16) SUBALIGN(16)
+ {
+ __ivpr_base__ = .;
+ KEEP(*(.bam))
+ KEEP(*(.crt0))
+ KEEP(*(.handlers))
+ . = ALIGN(0x800);
+ KEEP(*(.vectors))
+ } > flash
+
+ constructors : ALIGN(4) SUBALIGN(4)
+ {
+ PROVIDE(__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE(__init_array_end = .);
+ } > flash
+
+ destructors : ALIGN(4) SUBALIGN(4)
+ {
+ PROVIDE(__fini_array_start = .);
+ KEEP(*(.fini_array))
+ KEEP(*(SORT(.fini_array.*)))
+ PROVIDE(__fini_array_end = .);
+ } > flash
+
+ .text_vle : ALIGN(16) SUBALIGN(16)
+ {
+ *(.text_vle)
+ *(.text_vle.*)
+ *(.gnu.linkonce.t_vle.*)
+ } > flash
+
+ .text : ALIGN(16) SUBALIGN(16)
+ {
+ *(.text)
+ *(.text.*)
+ *(.gnu.linkonce.t.*)
+ } > flash
+
+ .rodata : ALIGN(16) SUBALIGN(16)
+ {
+ *(.glue_7t)
+ *(.glue_7)
+ *(.gcc*)
+ *(.rodata)
+ *(.rodata.*)
+ *(.rodata1)
+ } > flash
+
+ .sdata2 : ALIGN(16) SUBALIGN(16)
+ {
+ __sdata2_start__ = . + 0x8000;
+ *(.sdata2)
+ *(.sdata2.*)
+ *(.gnu.linkonce.s2.*)
+ *(.sbss2)
+ *(.sbss2.*)
+ *(.gnu.linkonce.sb2.*)
+ } > flash
+
+ .eh_frame_hdr :
+ {
+ *(.eh_frame_hdr)
+ } > flash
+
+ .eh_frame : ONLY_IF_RO
+ {
+ *(.eh_frame)
+ } > flash
+
+ .romdata : ALIGN(16) SUBALIGN(16)
+ {
+ __romdata_start__ = .;
+ } > flash
+
+ .stacks :
+ {
+ . = ALIGN(8);
+ __irq_stack_base__ = .;
+ . += __irq_stack_size__;
+ . = ALIGN(8);
+ __irq_stack_end__ = .;
+ __process_stack_base__ = .;
+ __main_thread_stack_base__ = .;
+ . += __process_stack_size__;
+ . = ALIGN(8);
+ __process_stack_end__ = .;
+ __main_thread_stack_end__ = .;
+ } > ram
+
+ .data : AT(__romdata_start__)
+ {
+ . = ALIGN(4);
+ __data_start__ = .;
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ __sdata_start__ = . + 0x8000;
+ *(.sdata)
+ *(.sdata.*)
+ *(.gnu.linkonce.s.*)
+ __data_end__ = .;
+ } > ram
+
+ .sbss :
+ {
+ __bss_start__ = .;
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ } > ram
+
+ .bss :
+ {
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ __bss_end__ = .;
+ } > ram
+
+ __heap_base__ = __bss_end__;
+ __heap_end__ = __ram_end__;
+}
diff --git a/os/ports/GCC/PPC/SPC560Pxx/port.mk b/os/ports/GCC/PPC/SPC560Pxx/port.mk
new file mode 100644
index 000000000..460d4e1f9
--- /dev/null
+++ b/os/ports/GCC/PPC/SPC560Pxx/port.mk
@@ -0,0 +1,11 @@
+# List of the ChibiOS/RT SPC563Mxx port files.
+PORTSRC = ${CHIBIOS}/os/ports/GCC/PPC/chcore.c
+
+PORTASM = ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/vectors.s \
+ ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/ivor.s \
+ ${CHIBIOS}/os/ports/GCC/PPC/crt0.s
+
+PORTINC = ${CHIBIOS}/os/ports/GCC/PPC \
+ ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx
+
+PORTLD = ${CHIBIOS}/os/ports/GCC/PPC/SPC563Mxx/ld
diff --git a/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h b/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h
new file mode 100644
index 000000000..1d3d34a45
--- /dev/null
+++ b/os/ports/GCC/PPC/SPC560Pxx/ppcparams.h
@@ -0,0 +1,57 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file SPC560Pxx/ppcparams.h
+ * @brief PowerPC parameters for the SPC560Pxx.
+ *
+ * @defgroup PPC_SPC560Pxx SPC560Pxx/MPC560x Specific Parameters
+ * @ingroup PPC_SPECIFIC
+ * @details This file contains the PowerPC specific parameters for the
+ * SPC560Pxx/MPC560x platform.
+ * @{
+ */
+
+#ifndef _PPCPARAMS_H_
+#define _PPCPARAMS_H_
+
+/**
+ * @brief PPC core model.
+ */
+#define PPC_VARIANT PPC_VARIANT_e200z0
+
+/**
+ * @brief Book E instruction set support.
+ */
+#define PPC_SUPPORTS_BOOKE FALSE
+
+/**
+ * @brief VLE instruction set support.
+ */
+#define PPC_SUPPORTS_VLE TRUE
+
+/**
+ * @brief Supports VLS Load/Store Multiple Volatile instructions.
+ */
+#define PPC_SUPPORTS_VLE_MULTI TRUE
+
+#endif /* _PPCPARAMS_H_ */
+
+/** @} */
diff --git a/os/ports/GCC/PPC/SPC560Pxx/vectors.s b/os/ports/GCC/PPC/SPC560Pxx/vectors.s
new file mode 100644
index 000000000..52b2b1369
--- /dev/null
+++ b/os/ports/GCC/PPC/SPC560Pxx/vectors.s
@@ -0,0 +1,1109 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 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 <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file SPC560Pxx/vectors.s
+ * @brief SPC560Pxx vectors table.
+ *
+ * @addtogroup PPC_CORE
+ * @{
+ */
+
+/*
+ * Imports the PPC configuration headers.
+ */
+#define _FROM_ASM_
+#include "chconf.h"
+#include "chcore.h"
+
+#if !defined(__DOXYGEN__)
+
+ /* BAM info, SWT off, WTE off, VLE from settings.*/
+ .section .bam, "ax"
+#if PPC_USE_VLE
+ .long 0x015A0000
+#else
+ .long 0x005A0000
+#endif
+ .long _boot_address
+
+ /* Software vectors table. The vectors are accessed from the IVOR4
+ handler only. In order to declare an interrupt handler just create
+ a function withe the same name of a vector, the symbol will
+ override the weak symbol declared here.*/
+ .section .vectors, "ax"
+ .align 4
+ .globl _vectors
+_vectors:
+ .long vector0
+ .long vector1
+ .long vector2
+ .long vector3
+ .long vector4
+ .long vector5
+ .long vector6
+ .long vector7
+ .long vector8
+ .long vector9
+ .long vector10
+ .long vector11
+ .long vector12
+ .long vector13
+ .long vector14
+ .long vector15
+ .long vector16
+ .long vector17
+ .long vector18
+ .long vector19
+ .long vector20
+ .long vector21
+ .long vector22
+ .long vector23
+ .long vector24
+ .long vector25
+ .long vector26
+ .long vector27
+ .long vector28
+ .long vector29
+ .long vector30
+ .long vector31
+ .long vector32
+ .long vector33
+ .long vector34
+ .long vector35
+ .long vector36
+ .long vector37
+ .long vector38
+ .long vector39
+ .long vector40
+ .long vector41
+ .long vector42
+ .long vector43
+ .long vector44
+ .long vector45
+ .long vector46
+ .long vector47
+ .long vector48
+ .long vector49
+ .long vector50
+ .long vector51
+ .long vector52
+ .long vector53
+ .long vector54
+ .long vector55
+ .long vector56
+ .long vector57
+ .long vector58
+ .long vector59
+ .long vector60
+ .long vector61
+ .long vector62
+ .long vector63
+ .long vector64
+ .long vector65
+ .long vector66
+ .long vector67
+ .long vector68
+ .long vector69
+ .long vector70
+ .long vector71
+ .long vector72
+ .long vector73
+ .long vector74
+ .long vector75
+ .long vector76
+ .long vector77
+ .long vector78
+ .long vector79
+ .long vector80
+ .long vector81
+ .long vector82
+ .long vector83
+ .long vector84
+ .long vector85
+ .long vector86
+ .long vector87
+ .long vector88
+ .long vector89
+ .long vector90
+ .long vector91
+ .long vector92
+ .long vector93
+ .long vector94
+ .long vector95
+ .long vector96
+ .long vector97
+ .long vector98
+ .long vector99
+ .long vector100
+ .long vector101
+ .long vector102
+ .long vector103
+ .long vector104
+ .long vector105
+ .long vector106
+ .long vector107
+ .long vector108
+ .long vector109
+ .long vector110
+ .long vector111
+ .long vector112
+ .long vector113
+ .long vector114
+ .long vector115
+ .long vector116
+ .long vector117
+ .long vector118
+ .long vector119
+ .long vector120
+ .long vector121
+ .long vector122
+ .long vector123
+ .long vector124
+ .long vector125
+ .long vector126
+ .long vector127
+ .long vector128
+ .long vector129
+ .long vector130
+ .long vector131
+ .long vector132
+ .long vector133
+ .long vector134
+ .long vector135
+ .long vector136
+ .long vector137
+ .long vector138
+ .long vector139
+ .long vector140
+ .long vector141
+ .long vector142
+ .long vector143
+ .long vector144
+ .long vector145
+ .long vector146
+ .long vector147
+ .long vector148
+ .long vector149
+ .long vector150
+ .long vector151
+ .long vector152
+ .long vector153
+ .long vector154
+ .long vector155
+ .long vector156
+ .long vector157
+ .long vector158
+ .long vector159
+ .long vector160
+ .long vector161
+ .long vector162
+ .long vector163
+ .long vector164
+ .long vector165
+ .long vector166
+ .long vector167
+ .long vector168
+ .long vector169
+ .long vector170
+ .long vector171
+ .long vector172
+ .long vector173
+ .long vector174
+ .long vector175
+ .long vector176
+ .long vector177
+ .long vector178
+ .long vector179
+ .long vector180
+ .long vector181
+ .long vector182
+ .long vector183
+ .long vector184
+ .long vector185
+ .long vector186
+ .long vector187
+ .long vector188
+ .long vector189
+ .long vector190
+ .long vector191
+ .long vector192
+ .long vector193
+ .long vector194
+ .long vector195
+ .long vector196
+ .long vector197
+ .long vector198
+ .long vector199
+ .long vector200
+ .long vector201
+ .long vector202
+ .long vector203
+ .long vector204
+ .long vector205
+ .long vector206
+ .long vector207
+ .long vector208
+ .long vector209
+ .long vector210
+ .long vector211
+ .long vector212
+ .long vector213
+ .long vector214
+ .long vector215
+ .long vector216
+ .long vector217
+ .long vector218
+ .long vector219
+ .long vector220
+ .long vector221
+ .long vector222
+ .long vector223
+ .long vector224
+ .long vector225
+ .long vector226
+ .long vector227
+ .long vector228
+ .long vector229
+ .long vector230
+ .long vector231
+ .long vector232
+ .long vector233
+ .long vector234
+ .long vector235
+ .long vector236
+ .long vector237
+ .long vector238
+ .long vector239
+ .long vector240
+ .long vector241
+ .long vector242
+ .long vector243
+ .long vector244
+ .long vector245
+ .long vector246
+ .long vector247
+ .long vector248
+ .long vector249
+ .long vector250
+ .long vector251
+ .long vector252
+ .long vector253
+ .long vector254
+ .long vector255
+ .long vector256
+ .long vector257
+ .long vector258
+ .long vector259
+ .long vector260
+
+ .text
+ .align 2
+ .weak vector0
+vector0:
+
+ .weak vector1
+vector1:
+
+ .weak vector2
+vector2:
+
+ .weak vector3
+vector3:
+
+ .weak vector4
+vector4:
+
+ .weak vector5
+vector5:
+
+ .weak vector6
+vector6:
+
+ .weak vector7
+vector7:
+
+ .weak vector8
+vector8:
+
+ .weak vector9
+vector9:
+
+ .weak vector10
+vector10:
+
+ .weak vector11
+vector11:
+
+ .weak vector12
+vector12:
+
+ .weak vector13
+vector13:
+
+ .weak vector14
+vector14:
+
+ .weak vector15
+vector15:
+
+ .weak vector16
+vector16:
+
+ .weak vector17
+vector17:
+
+ .weak vector18
+vector18:
+
+ .weak vector19
+vector19:
+
+ .weak vector20
+vector20:
+
+ .weak vector21
+vector21:
+
+ .weak vector22
+vector22:
+
+ .weak vector23
+vector23:
+
+ .weak vector24
+vector24:
+
+ .weak vector25
+vector25:
+
+ .weak vector26
+vector26:
+
+ .weak vector27
+vector27:
+
+ .weak vector28
+vector28:
+
+ .weak vector29
+vector29:
+
+ .weak vector30
+vector30:
+
+ .weak vector31
+vector31:
+
+ .weak vector32
+vector32:
+
+ .weak vector33
+vector33:
+
+ .weak vector34
+vector34:
+
+ .weak vector35
+vector35:
+
+ .weak vector36
+vector36:
+
+ .weak vector37
+vector37:
+
+ .weak vector38
+vector38:
+
+ .weak vector39
+vector39:
+
+ .weak vector40
+vector40:
+
+ .weak vector41
+vector41:
+
+ .weak vector42
+vector42:
+
+ .weak vector43
+vector43:
+
+ .weak vector44
+vector44:
+
+ .weak vector45
+vector45:
+
+ .weak vector46
+vector46:
+
+ .weak vector47
+vector47:
+
+ .weak vector48
+vector48:
+
+ .weak vector49
+vector49:
+
+ .weak vector50
+vector50:
+
+ .weak vector51
+vector51:
+
+ .weak vector52
+vector52:
+
+ .weak vector53
+vector53:
+
+ .weak vector54
+vector54:
+
+ .weak vector55
+vector55:
+
+ .weak vector56
+vector56:
+
+ .weak vector57
+vector57:
+
+ .weak vector58
+vector58:
+
+ .weak vector59
+vector59:
+
+ .weak vector60
+vector60:
+
+ .weak vector61
+vector61:
+
+ .weak vector62
+vector62:
+
+ .weak vector63
+vector63:
+
+ .weak vector64
+vector64:
+
+ .weak vector65
+vector65:
+
+ .weak vector66
+vector66:
+
+ .weak vector67
+vector67:
+
+ .weak vector68
+vector68:
+
+ .weak vector69
+vector69:
+
+ .weak vector70
+vector70:
+
+ .weak vector71
+vector71:
+
+ .weak vector72
+vector72:
+
+ .weak vector73
+vector73:
+
+ .weak vector74
+vector74:
+
+ .weak vector75
+vector75:
+
+ .weak vector76
+vector76:
+
+ .weak vector77
+vector77:
+
+ .weak vector78
+vector78:
+
+ .weak vector79
+vector79:
+
+ .weak vector80
+vector80:
+
+ .weak vector81
+vector81:
+
+ .weak vector82
+vector82:
+
+ .weak vector83
+vector83:
+
+ .weak vector84
+vector84:
+
+ .weak vector85
+vector85:
+
+ .weak vector86
+vector86:
+
+ .weak vector87
+vector87:
+
+ .weak vector88
+vector88:
+
+ .weak vector89
+vector89:
+
+ .weak vector90
+vector90:
+
+ .weak vector91
+vector91:
+
+ .weak vector92
+vector92:
+
+ .weak vector93
+vector93:
+
+ .weak vector94
+vector94:
+
+ .weak vector95
+vector95:
+
+ .weak vector96
+vector96:
+
+ .weak vector97
+vector97:
+
+ .weak vector98
+vector98:
+
+ .weak vector99
+vector99:
+
+ .weak vector100
+vector100:
+
+ .weak vector101
+vector101:
+
+ .weak vector102
+vector102:
+
+ .weak vector103
+vector103:
+
+ .weak vector104
+vector104:
+
+ .weak vector105
+vector105:
+
+ .weak vector106
+vector106:
+
+ .weak vector107
+vector107:
+
+ .weak vector108
+vector108:
+
+ .weak vector109
+vector109:
+
+ .weak vector110
+vector110:
+
+ .weak vector111
+vector111:
+
+ .weak vector112
+vector112:
+
+ .weak vector113
+vector113:
+
+ .weak vector114
+vector114:
+
+ .weak vector115
+vector115:
+
+ .weak vector116
+vector116:
+
+ .weak vector117
+vector117:
+
+ .weak vector118
+vector118:
+
+ .weak vector119
+vector119:
+
+ .weak vector120
+vector120:
+
+ .weak vector121
+vector121:
+
+ .weak vector122
+vector122:
+
+ .weak vector123
+vector123:
+
+ .weak vector124
+vector124:
+
+ .weak vector125
+vector125:
+
+ .weak vector126
+vector126:
+
+ .weak vector127
+vector127:
+
+ .weak vector128
+vector128:
+
+ .weak vector129
+vector129:
+
+ .weak vector130
+vector130:
+
+ .weak vector131
+vector131:
+
+ .weak vector132
+vector132:
+
+ .weak vector133
+vector133:
+
+ .weak vector134
+vector134:
+
+ .weak vector135
+vector135:
+
+ .weak vector136
+vector136:
+
+ .weak vector137
+vector137:
+
+ .weak vector138
+vector138:
+
+ .weak vector139
+vector139:
+
+ .weak vector140
+vector140:
+
+ .weak vector141
+vector141:
+
+ .weak vector142
+vector142:
+
+ .weak vector143
+vector143:
+
+ .weak vector144
+vector144:
+
+ .weak vector145
+vector145:
+
+ .weak vector146
+vector146:
+
+ .weak vector147
+vector147:
+
+ .weak vector148
+vector148:
+
+ .weak vector149
+vector149:
+
+ .weak vector150
+vector150:
+
+ .weak vector151
+vector151:
+
+ .weak vector152
+vector152:
+
+ .weak vector153
+vector153:
+
+ .weak vector154
+vector154:
+
+ .weak vector155
+vector155:
+
+ .weak vector156
+vector156:
+
+ .weak vector157
+vector157:
+
+ .weak vector158
+vector158:
+
+ .weak vector159
+vector159:
+
+ .weak vector160
+vector160:
+
+ .weak vector161
+vector161:
+
+ .weak vector162
+vector162:
+
+ .weak vector163
+vector163:
+
+ .weak vector164
+vector164:
+
+ .weak vector165
+vector165:
+
+ .weak vector166
+vector166:
+
+ .weak vector167
+vector167:
+
+ .weak vector168
+vector168:
+
+ .weak vector169
+vector169:
+
+ .weak vector170
+vector170:
+
+ .weak vector171
+vector171:
+
+ .weak vector172
+vector172:
+
+ .weak vector173
+vector173:
+
+ .weak vector174
+vector174:
+
+ .weak vector175
+vector175:
+
+ .weak vector176
+vector176:
+
+ .weak vector177
+vector177:
+
+ .weak vector178
+vector178:
+
+ .weak vector179
+vector179:
+
+ .weak vector180
+vector180:
+
+ .weak vector181
+vector181:
+
+ .weak vector182
+vector182:
+
+ .weak vector183
+vector183:
+
+ .weak vector184
+vector184:
+
+ .weak vector185
+vector185:
+
+ .weak vector186
+vector186:
+
+ .weak vector187
+vector187:
+
+ .weak vector188
+vector188:
+
+ .weak vector189
+vector189:
+
+ .weak vector190
+vector190:
+
+ .weak vector191
+vector191:
+
+ .weak vector192
+vector192:
+
+ .weak vector193
+vector193:
+
+ .weak vector194
+vector194:
+
+ .weak vector195
+vector195:
+
+ .weak vector196
+vector196:
+
+ .weak vector197
+vector197:
+
+ .weak vector198
+vector198:
+
+ .weak vector199
+vector199:
+
+ .weak vector200
+vector200:
+
+ .weak vector201
+vector201:
+
+ .weak vector202
+vector202:
+
+ .weak vector203
+vector203:
+
+ .weak vector204
+vector204:
+
+ .weak vector205
+vector205:
+
+ .weak vector206
+vector206:
+
+ .weak vector207
+vector207:
+
+ .weak vector208
+vector208:
+
+ .weak vector209
+vector209:
+
+ .weak vector210
+vector210:
+
+ .weak vector211
+vector211:
+
+ .weak vector212
+vector212:
+
+ .weak vector213
+vector213:
+
+ .weak vector214
+vector214:
+
+ .weak vector215
+vector215:
+
+ .weak vector216
+vector216:
+
+ .weak vector217
+vector217:
+
+ .weak vector218
+vector218:
+
+ .weak vector219
+vector219:
+
+ .weak vector220
+vector220:
+
+ .weak vector221
+vector221:
+
+ .weak vector222
+vector222:
+
+ .weak vector223
+vector223:
+
+ .weak vector224
+vector224:
+
+ .weak vector225
+vector225:
+
+ .weak vector226
+vector226:
+
+ .weak vector227
+vector227:
+
+ .weak vector228
+vector228:
+
+ .weak vector229
+vector229:
+
+ .weak vector230
+vector230:
+
+ .weak vector231
+vector231:
+
+ .weak vector232
+vector232:
+
+ .weak vector233
+vector233:
+
+ .weak vector234
+vector234:
+
+ .weak vector235
+vector235:
+
+ .weak vector236
+vector236:
+
+ .weak vector237
+vector237:
+
+ .weak vector238
+vector238:
+
+ .weak vector239
+vector239:
+
+ .weak vector240
+vector240:
+
+ .weak vector241
+vector241:
+
+ .weak vector242
+vector242:
+
+ .weak vector243
+vector243:
+
+ .weak vector244
+vector244:
+
+ .weak vector245
+vector245:
+
+ .weak vector246
+vector246:
+
+ .weak vector247
+vector247:
+
+ .weak vector248
+vector248:
+
+ .weak vector249
+vector249:
+
+ .weak vector250
+vector250:
+
+ .weak vector251
+vector251:
+
+ .weak vector252
+vector252:
+
+ .weak vector253
+vector253:
+
+ .weak vector254
+vector254:
+
+ .weak vector255
+vector255:
+
+ .weak vector256
+vector256:
+
+ .weak vector257
+vector257:
+
+ .weak vector258
+vector258:
+
+ .weak vector259
+vector259:
+
+ .weak vector260
+vector260:
+
+ .globl _unhandled_irq
+ .type _unhandled_irq, @function
+_unhandled_irq:
+ b _unhandled_irq
+
+#endif /* !defined(__DOXYGEN__) */
+
+/** @} */
diff --git a/os/ports/GCC/PPC/SPC563Mxx/ivor.s b/os/ports/GCC/PPC/SPC563Mxx/ivor.s
index de937ef17..19a8efd4e 100644
--- a/os/ports/GCC/PPC/SPC563Mxx/ivor.s
+++ b/os/ports/GCC/PPC/SPC563Mxx/ivor.s
@@ -20,7 +20,7 @@
/**
* @file SPC563Mxx/ivor.s
- * @brief PowerPC IVORx handlers.
+ * @brief SPC563Mxx IVORx handlers.
*
* @addtogroup PPC_CORE
* @{
@@ -50,6 +50,11 @@
IVOR10:
/* Creation of the external stack frame (extctx structure).*/
stwu %sp, -80(%sp) /* Size of the extctx structure.*/
+#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. */
@@ -73,6 +78,7 @@ IVOR10:
stw %r10, 64(%sp)
stw %r11, 68(%sp)
stw %r12, 72(%sp)
+#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */
/* Reset DIE bit in TSR register.*/
lis %r3, 0x0800 /* DIS bit mask. */
@@ -106,6 +112,11 @@ IVOR10:
IVOR4:
/* Creation of the external stack frame (extctx structure).*/
stwu %sp, -80(%sp) /* Size of the extctx structure.*/
+#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. */
@@ -129,6 +140,7 @@ IVOR4:
stw %r10, 64(%sp)
stw %r11, 68(%sp)
stw %r12, 72(%sp)
+#endif /* !(PPC_USE_VLE && PPC_SUPPORTS_VLE_MULTI) */
/* Software vector address from the INTC register.*/
lis %r3, INTC_IACKR@h
@@ -170,6 +182,11 @@ IVOR4:
#if CH_DBG_SYSTEM_STATE_CHECK
bl dbg_check_unlock
#endif
+#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)
@@ -193,6 +210,7 @@ IVOR4:
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
diff --git a/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld b/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld
index 9ae052e72..0d4475fd7 100644
--- a/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld
+++ b/os/ports/GCC/PPC/SPC563Mxx/ld/SPC563M64.ld
@@ -21,9 +21,8 @@
/*
* SPC563M64 memory setup.
*/
-__irq_stack_size__ = 0x0400;
+__irq_stack_size__ = 0x0000; /* Not yet used.*/
__process_stack_size__ = 0x0800;
-__stacks_total_size__ = __irq_stack_size__ + __process_stack_size__;
MEMORY
{
@@ -121,6 +120,21 @@ SECTIONS
__romdata_start__ = .;
} > flash
+ .stacks :
+ {
+ . = ALIGN(8);
+ __irq_stack_base__ = .;
+ . += __irq_stack_size__;
+ . = ALIGN(8);
+ __irq_stack_end__ = .;
+ __process_stack_base__ = .;
+ __main_thread_stack_base__ = .;
+ . += __process_stack_size__;
+ . = ALIGN(8);
+ __process_stack_end__ = .;
+ __main_thread_stack_end__ = .;
+ } > ram
+
.data : AT(__romdata_start__)
{
. = ALIGN(4);
@@ -154,5 +168,5 @@ SECTIONS
} > ram
__heap_base__ = __bss_end__;
- __heap_end__ = __ram_end__ - __stacks_total_size__;
+ __heap_end__ = __ram_end__;
}
diff --git a/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h b/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h
index eaecd2ed7..75823f629 100644
--- a/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h
+++ b/os/ports/GCC/PPC/SPC563Mxx/ppcparams.h
@@ -47,6 +47,11 @@
*/
#define PPC_SUPPORTS_VLE TRUE
+/**
+ * @brief Supports VLS Load/Store Multiple Volatile instructions.
+ */
+#define PPC_SUPPORTS_VLE_MULTI TRUE
+
#endif /* _PPCPARAMS_H_ */
/** @} */