summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S')
-rw-r--r--c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S297
1 files changed, 297 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S b/c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S
new file mode 100644
index 0000000000..787dbf1eb9
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/ppcn_60x/vectors/vectors.S
@@ -0,0 +1,297 @@
+/*
+ * (c) 1998, Radstone Technology plc.
+ *
+ *
+ * This is an unpublished work the copyright in which vests
+ * in Radstone Technology plc. All rights reserved.
+ *
+ * The information contained herein is the property of Radstone
+ * Technology plc. and is supplied without liability for
+ * errors or omissions and no part may be reproduced, used or
+ * disclosed except as authorized by contract or other written
+ * permission. The copyright and the foregoing
+ * restriction on reproduction, use and disclosure extend to
+ * all the media in which this information may be
+ * embodied.
+ *
+ */
+/* vectors.s 1.1 - 95/12/04
+ *
+ * This file contains the assembly code for the PowerPC
+ * interrupt veneers for RTEMS.
+ *
+ */
+
+/*
+ * The issue with this file is getting it loaded at the right place.
+ * The first vector MUST be at address 0x????0100.
+ * How this is achieved is dependant on the tool chain.
+ *
+ * However the basic mechanism for ELF assemblers is to create a
+ * section called ".vectors", which will be loaded to an address
+ * between 0x????0000 and 0x????0100 (inclusive) via a link script.
+ *
+ * The basic mechanism for XCOFF assemblers is to place it in the
+ * normal text section, and arrange for this file to be located
+ * at an appropriate position on the linker command line.
+ *
+ * The variable 'PPC_VECTOR_FILE_BASE' must be defined to be the
+ * offset from 0x????0000 to the first location in the file. This
+ * will usually be 0x0000 or 0x0100.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+#include "bsp.h"
+
+#ifndef PPC_VECTOR_FILE_BASE
+#error "PPC_VECTOR_FILE_BASE is not defined."
+#endif
+
+ .set IP_LINK, 0
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ .set IP_0, (IP_LINK + 56)
+#else
+ .set IP_0, (IP_LINK + 8)
+#endif
+ .set IP_2, (IP_0 + 4)
+
+ .set IP_3, (IP_2 + 4)
+ .set IP_4, (IP_3 + 4)
+ .set IP_5, (IP_4 + 4)
+ .set IP_6, (IP_5 + 4)
+
+ .set IP_7, (IP_6 + 4)
+ .set IP_8, (IP_7 + 4)
+ .set IP_9, (IP_8 + 4)
+ .set IP_10, (IP_9 + 4)
+
+ .set IP_11, (IP_10 + 4)
+ .set IP_12, (IP_11 + 4)
+ .set IP_13, (IP_12 + 4)
+ .set IP_28, (IP_13 + 4)
+
+ .set IP_29, (IP_28 + 4)
+ .set IP_30, (IP_29 + 4)
+ .set IP_31, (IP_30 + 4)
+ .set IP_CR, (IP_31 + 4)
+
+ .set IP_CTR, (IP_CR + 4)
+ .set IP_XER, (IP_CTR + 4)
+ .set IP_LR, (IP_XER + 4)
+ .set IP_PC, (IP_LR + 4)
+
+ .set IP_MSR, (IP_PC + 4)
+
+ .set IP_END, (IP_MSR + 16)
+
+ /* Where this file will be loaded */
+ .set file_base, PPC_VECTOR_FILE_BASE
+
+ /* Vector offsets */
+ .set reset_vector,0x0100
+ .set mach_vector,0x0200
+ .set prot_vector,0x0300
+ .set isi_vector,0x0400
+ .set ext_vector,0x0500
+ .set align_vector,0x0600
+ .set prog_vector,0x0700
+ .set float_vector,0x0800
+ .set dec_vector,0x0900
+ .set sys_vector,0x00C00
+ .set trace_vector, 0x0d00
+ .set itm_vector,0x01000
+ .set dltm_vector,0x1100
+ .set dstm_vector,0x1200
+ .set addr_vector,0x1300
+ .set sysmgmt_vector,0x1400
+
+/* Go to the right section */
+#if PPC_ASM == PPC_ASM_ELF
+ .section .vectors,"awx",@progbits
+#elif PPC_ASM == PPC_ASM_XCOFF
+ .csect .text[PR]
+#endif
+
+ PUBLIC_VAR (__vectors)
+SYM (__vectors):
+
+#if PPCN_60X_USE_DINK
+ .org reset_vector - file_base
+ /* This is where the DINK soft reset handler is located */
+ ba 0xfff00180
+
+ .org mach_vector - file_base
+ ba 0xfff00200
+
+ .org prot_vector - file_base
+ ba 0xfff00300
+
+ .org isi_vector - file_base
+ ba 0xfff00400
+
+ .org ext_vector - file_base
+ rfi
+
+ .org align_vector - file_base
+ ba 0xfff00600
+
+ .org prog_vector - file_base
+ ba 0xfff00700
+
+ .org float_vector - file_base
+ ba 0xfff00800
+
+ .org dec_vector - file_base
+ rfi
+
+ .org sys_vector - file_base
+ ba 0xfff00C00
+
+ .org trace_vector - file_base
+ ba 0xfff00d00
+
+ .org itm_vector - file_base
+ ba 0xfff01000
+
+ .org dltm_vector - file_base
+ ba 0xfff01100
+
+ .org dstm_vector - file_base
+ ba 0xfff01200
+
+ .org addr_vector - file_base
+ ba 0xfff01300
+
+ .org sysmgmt_vector - file_base
+ ba 0xfff01400
+#else
+ .org reset_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,1
+display_exc:
+ stw r3,IP_3(r1)
+ stw r5,IP_5(r1)
+ /*
+ * Enable data and instruction address translation
+ */
+ li r3,MSR_IR | MSR_DR
+ mtmsr r3
+ lis r3,0x8000
+ stb r4,0x860(r3)
+ addi r4,r4,0x30
+waitfortx:
+ lbz r5,0x3fd(r3)
+ andi. r5,r5,0x20
+ beq waitfortx
+ stb r4,0x3f8(r3)
+ li r5,0
+ stw r4,0x00(r5)
+ mfsrr0 r4
+ stw r4,0x04(r5)
+ mfsrr1 r4
+ stw r4,0x08(r5)
+ lwz r4,IP_4(r1)
+ lwz r5,IP_5(r1)
+ lwz r3,IP_3(r1)
+ addi r1,r1,IP_END
+ rfi
+
+ .org mach_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ stw r3,IP_3(r1)
+ lis r4,0
+ mfspr r3,srr0
+ stw r3,0x00(r4)
+ mfspr r3,srr1
+ stw r3,0x04(r4)
+ stw r5,0x08(r4)
+ stw r2,0x0c(r4)
+ stw r11,0x10(r4)
+ stw r12,0x14(r4)
+ dcbst 0,r4
+ li r4,0x02
+ b display_exc
+
+ .org prot_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x03
+ b display_exc
+
+ .org isi_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x04
+ b display_exc
+
+ .org ext_vector - file_base
+ rfi
+
+ .org align_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x06
+ b display_exc
+
+ .org prog_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x07
+ b display_exc
+
+ .org float_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x08
+ b display_exc
+
+ .org dec_vector - file_base
+ rfi
+
+ .org sys_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0a
+ b display_exc
+
+ .org trace_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0b
+ b display_exc
+
+ .org itm_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0c
+ b display_exc
+
+ .org dltm_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0d
+ b display_exc
+
+ .org dstm_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0e
+ b display_exc
+
+ .org addr_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x0f
+ b display_exc
+
+ .org sysmgmt_vector - file_base
+ stwu r1, -(IP_END)(r1)
+ stw r4,IP_4(r1)
+ li r4,0x00
+ b display_exc
+#endif
+