diff options
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.S | 297 |
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 + |