URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
[/] [openrisc/] [trunk/] [or1ksim/] [testsuite/] [test-code-or1k/] [int-test/] [int-test.S] - Rev 234
Go to most recent revision | Compare with Previous | Blame | View Log
/* int-test.S. Test of Or1ksim interrupt handlingCopyright (C) 1999-2006 OpenCoresCopyright (C) 2010 Embecosm LimitedContributors various OpenCores participantsContributor Jeremy Bennett <jeremy.bennett@embecosm.com>This file is part of OpenRISC 1000 Architectural Simulator.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 3 of the License, or (at your option)any later version.This program is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License formore details.You should have received a copy of the GNU General Public License alongwith this program. If not, see <http: www.gnu.org/licenses/>. *//* ----------------------------------------------------------------------------This code is commented throughout for use with Doxygen.--------------------------------------------------------------------------*//* NOTE. This is not a test of the Programmable Interrupt Controller.Within the test we'll use following global variables:r16 interrupt counterr17 current tick timer comparison counterr18 sanity counterr19 loop counterr20 temp value of SR regr21 temp value of TTMR reg.r23 RAM_STARTr25-r31 used by int handlerThe test do the following:We set up the tick timer to trigger once and then we trigger interruptsincrementally on every cycle in the specified test program; on interrupthandler we check if data computed so far exactly matches precalculatedvalues. If interrupt has returned incorreclty, we can detect this usingassertion routine at the end.*/#include "spr-defs.h"#include "board.h"#define RAM_START 0x00000000#define MC_CSR (0x00)#define MC_POC (0x04)#define MC_BA_MASK (0x08)#define MC_CSC(i) (0x10 + (i) * 8)#define MC_TMS(i) (0x14 + (i) * 8).section .reset, "ax".org 0x100_reset_vector:l.addi r2,r0,0x0l.addi r3,r0,0x0l.addi r4,r0,0x0l.addi r5,r0,0x0l.addi r6,r0,0x0l.addi r7,r0,0x0l.addi r8,r0,0x0l.addi r9,r0,0x0l.addi r10,r0,0x0l.addi r11,r0,0x0l.addi r12,r0,0x0l.addi r13,r0,0x0l.addi r14,r0,0x0l.addi r15,r0,0x0l.addi r16,r0,0x0l.addi r17,r0,0x0l.addi r18,r0,0x0l.addi r19,r0,0x0l.addi r20,r0,0x0l.addi r21,r0,0x0l.addi r22,r0,0x0l.addi r23,r0,0x0l.addi r24,r0,0x0l.addi r25,r0,0x0l.addi r26,r0,0x0l.addi r27,r0,0x0l.addi r28,r0,0x0l.addi r29,r0,0x0l.addi r30,r0,0x0l.addi r31,r0,0x0l.movhi r3,hi(start)l.ori r3,r3,lo(start)l.jr r3l.nopstart:l.jal _init_mcl.nop/* Setup exception wrapper */l.movhi r3,hi(_src_beg)l.ori r3,r3,lo(_src_beg)l.movhi r4,hi(_dst_beg)l.ori r4,r4,lo(_dst_beg)l.movhi r5,hi(_dst_end)l.ori r5,r5,lo(_dst_end)l.sub r5,r5,r4l.sfeqi r5,0l.bf 2fl.nop1:l.lwz r6,0(r3)l.sw 0(r4),r6l.addi r3,r3,4l.addi r4,r4,4l.addi r5,r5,-4l.sfgtsi r5,0l.bf 1bl.nop2:l.movhi r2,hi(_main)l.ori r2,r2,lo(_main)l.jr r2l.nop_init_mc:l.movhi r3,hi(MC_BASE_ADDR)l.ori r3,r3,lo(MC_BASE_ADDR)l.addi r4,r3,MC_CSC(0)l.movhi r5,hi(FLASH_BASE_ADDR)l.srai r5,r5,6l.ori r5,r5,0x0025l.sw 0(r4),r5l.addi r4,r3,MC_TMS(0)l.movhi r5,hi(FLASH_TMS_VAL)l.ori r5,r5,lo(FLASH_TMS_VAL)l.sw 0(r4),r5l.addi r4,r3,MC_BA_MASKl.addi r5,r0,MC_MASK_VALl.sw 0(r4),r5l.addi r4,r3,MC_CSRl.movhi r5,hi(MC_CSR_VAL)l.ori r5,r5,lo(MC_CSR_VAL)l.sw 0(r4),r5l.addi r4,r3,MC_TMS(1)l.movhi r5,hi(SDRAM_TMS_VAL)l.ori r5,r5,lo(SDRAM_TMS_VAL)l.sw 0(r4),r5l.addi r4,r3,MC_CSC(1)l.movhi r5,hi(SDRAM_BASE_ADDR)l.srai r5,r5,6l.ori r5,r5,0x0411l.sw 0(r4),r5l.jr r9l.nop.section .text## Tick timer exception handler#l.addi r31,r3,0# get interrupted program pcl.mfspr r25,r0,SPR_EPCR_BASE# calculate instruction addressl.movhi r26,hi(_ie_start)l.ori r26,r26,lo(_ie_start)l.addi r3,r25,0 #print insn indexl.nop 2l.sub r25,r25,r26l.addi r3,r25,0 #print insn indexl.nop 2l.addi r3,r31,0 # restore r3l.sfeqi r25, 0x00l.bf _i00l.sfeqi r25, 0x04l.bf _i04l.sfeqi r25, 0x08l.bf _i08l.sfeqi r25, 0x0cl.bf _i0cl.sfeqi r25, 0x10l.bf _i10l.sfeqi r25, 0x14l.bf _i14l.sfeqi r25, 0x18l.bf _i18l.sfeqi r25, 0x1cl.bf _i1cl.sfeqi r25, 0x20l.bf _i20l.sfeqi r25, 0x24l.bf _i24l.sfeqi r25, 0x28l.bf _i28l.sfeqi r25, 0x2cl.bf _i2cl.sfeqi r25, 0x30l.bf _i30l.sfeqi r25, 0x34l.bf _i34l.sfeqi r25, 0x38l.bf _i38l.nop# value not defined_die:l.nop 2 #print r3l.addi r3,r0,0xeeeel.nop 2l.addi r3,r0,1l.nop 11:l.j 1bl.nop_main:l.nopl.addi r3,r0,SPR_SR_SMl.mtspr r0,r3,SPR_SRl.nop## set tick counter to initial 3 cycles#l.addi r16,r0,0l.addi r17,r0,1l.addi r18,r0,0l.addi r19,r0,0l.addi r22,r0,0l.movhi r23,hi(RAM_START)l.ori r23,r23,lo(RAM_START)# Set r20 to hold enable tick exceptionl.mfspr r20,r0,SPR_SRl.ori r20,r20,SPR_SR_SM|SPR_SR_TEE|SPR_SR_F# Set r21 to hold value of TTMRl.movhi r5,hi(SPR_TTMR_SR | SPR_TTMR_IE)l.add r21,r5,r17## MAIN LOOP#_main_loop:# reinitialize memory and registersl.addi r3,r0,0xaaaal.addi r9,r0,0xbbbbl.sw 0(r23),r3l.sw 4(r23),r9l.sw 8(r23),r3# Reinitializes tick timerl.addi r17,r17,1l.mtspr r0,r0,SPR_TTCR # set TTCRl.mtspr r0,r21,SPR_TTMR # set TTMRl.mtspr r0,r0,SPR_TTCR # set TTCRl.addi r21,r21,1# Enable exceptions and interruptsl.mtspr r0,r20,SPR_SR # set SR##### TEST CODE #####_ie_start:l.movhi r3,0x1234 #00l.sw 0(r23),r3 #04l.movhi r3,hi(RAM_START) #08l.lwz r3,0(r3) #0cl.movhi r3,hi(RAM_START) #10l.addi r3,r3,4 #14l.j 1f #18l.lwz r3,0(r3) #1cl.addi r3,r3,1 #201:l.sfeqi r3,0xdead #24l.jal 2f #28l.addi r3,r0,0x5678 #2c_return_addr:2:l.bf _die #30l.sw 8(r23),r3 #34_ie_end:l.nop #38##### END OF TEST CODE ###### do some testingl.j _main_loopl.nop_i00:l.sfeqi r3,0xaaaal.bnf _diel.nopl.j _resumel.nop_i04:l.movhi r26,0x1234l.sfeq r3,r26l.bnf _diel.nopl.lwz r26,0(r23)l.sfeqi r26,0xaaaal.bnf _diel.nopl.j _resumel.nop_i08:l.movhi r26,0x1234l.sfeq r3,r26l.bnf _diel.nopl.lwz r27,0(r23)l.sfeq r27,r26l.bnf _diel.nopl.j _resumel.nop_i0c:l.sfeq r3,r23l.bnf _diel.nopl.j _resumel.nop_i10:l.movhi r26,0x1234l.sfeq r26,r3l.bnf _diel.nopl.j _resumel.nop_i14:l.sfeq r3,r23l.bnf _diel.nopl.j _resumel.nop_i18:l.addi r26,r23,4l.sfeq r3,r26l.bnf _diel.nopl.j _resumel.nop_i1c:l.j _diel.nop_i20:l.j _diel.nop_i24:l.mfspr r26,r0,SPR_ESR_BASEl.addi r30,r3,0l.addi r3,r26,0l.nop 2l.addi r3,r30,0l.andi r26,r26,SPR_SR_Fl.sfeq r26,r0/* l.bnf _die */l.nopl.sfeqi r3,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i28:l.mfspr r26,r0,SPR_ESR_BASEl.addi r30,r3,0l.addi r3,r26,0l.nop 2l.addi r3,r30,0l.andi r26,r26,SPR_SR_Fl.sfeq r26,r0l.bnf _diel.nopl.sfeqi r22,1l.bf _resumel.addi r22,r0,1l.sfeqi r9,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i2c:l.movhi r26,hi(_return_addr)l.ori r26,r26,lo(_return_addr)l.sfeq r9,r26l.bnf _diel.nopl.sfeqi r3,0xbbbbl.bnf _diel.nopl.j _resumel.nop_i30:l.sfeqi r3,0x5678l.bnf _diel.nopl.j _resumel.nop_i34:l.sfeqi r3,0x5678l.bnf _diel.nopl.lwz r26,8(r23)l.sfeqi r26,0xaaaal.bnf _diel.nopl.j _resumel.nop_i38:l.lwz r26,8(r23)l.sfeqi r26,0x5678l.bnf _diel.nop## mark finished ok#l.movhi r3,hi(0xdeaddead)l.ori r3,r3,lo(0xdeaddead)l.nop 2l.addi r3,r0,0l.nop 1_ok:l.j _okl.nop_resume:l.mfspr r27,r0,SPR_ESR_BASEl.addi r26,r0,SPR_SR_TEEl.addi r28,r0,-1l.xor r26,r26,r28l.and r26,r26,r27l.mtspr r0,r26,SPR_ESR_BASEl.rfel.addi r3,r3,5 # should not be executed
Go to most recent revision | Compare with Previous | Blame | View Log
