URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [or1ksim/] [testsuite/] [test-code-or1k/] [mmu/] [mmu-asm.S] - Rev 90
Go to most recent revision | Compare with Previous | Blame | View Log
/* mmu-asm.S. Machine code to support Or1ksim MMU testCopyright (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.--------------------------------------------------------------------------*/#include "spr-defs.h"#define PAGE_SIZE 8192#define DTLB_PR_NOLIMIT (SPR_DTLBTR_URE | \SPR_DTLBTR_UWE | \SPR_DTLBTR_SRE | \SPR_DTLBTR_SWE )#define ITLB_PR_NOLIMIT (SPR_ITLBTR_SXE | \SPR_ITLBTR_UXE ).global _lo_dmmu_en.global _lo_immu_en.global _lo_dtlb_ci_test.global _lo_itlb_ci_test.global _testjump.global _ic_enable.global _ic_disable.global _dc_enable.global _dc_disable_lo_dmmu_en:l.mfspr r11,r0,SPR_SRl.ori r11,r11,SPR_SR_DMEl.mtspr r0,r11,SPR_ESR_BASEl.mtspr r0,r9,SPR_EPCR_BASEl.rfel.nop_lo_dmmu_dis:l.addi r13,r0,-1l.xori r13,r13,SPR_SR_DMEl.mfspr r11,r0,SPR_SRl.and r11,r11,r13l.mtspr r0,r11,SPR_SRl.jr r9l.nop_lo_immu_en:l.mfspr r11,r0,SPR_SRl.ori r11,r11,SPR_SR_IMEl.mtspr r0,r11,SPR_ESR_BASEl.mtspr r0,r9,SPR_EPCR_BASEl.rfel.nop_lo_immu_dis:l.addi r13,r0,-1l.xori r13,r13,SPR_SR_IMEl.mfspr r11,r0,SPR_SRl.and r11,r11,r13l.mtspr r0,r11,SPR_SRl.jr r9l.nop_testjump:l.movhi r5,0x4800l.ori r5,r5,0x4800l.sw 0x0(r3),r5l.movhi r5,0x1500l.ori r5,r5,0x0000l.sw 0x4(r3),r5l.or r5,r0,r9l.jalr r4l.nopl.or r9,r0,r5l.jr r9l.nop_ic_enable:/* Disable IC */l.mfspr r13,r0,SPR_SRl.addi r11,r0,-1l.xori r11,r11,SPR_SR_ICEl.and r11,r13,r11l.mtspr r0,r11,SPR_SR/* Invalidate IC */l.addi r13,r0,0l.addi r11,r0,81921:l.mtspr r0,r13,SPR_ICBIRl.sfne r13,r11l.bf 1bl.addi r13,r13,16/* Enable IC */l.mfspr r13,r0,SPR_SRl.ori r13,r13,SPR_SR_ICEl.mtspr r0,r13,SPR_SRl.nopl.nopl.nopl.nopl.nopl.jr r9l.nop_ic_disable:/* Disable IC */l.mfspr r13,r0,SPR_SRl.addi r11,r0,-1l.xori r11,r11,SPR_SR_ICEl.and r11,r13,r11l.mtspr r0,r11,SPR_SRl.jr r9l.nop_dc_enable:/* Disable DC */l.mfspr r13,r0,SPR_SRl.addi r11,r0,-1l.xori r11,r11,SPR_SR_DCEl.and r11,r13,r11l.mtspr r0,r11,SPR_SR/* Flush DC */l.addi r13,r0,0l.addi r11,r0,81921:l.mtspr r0,r13,SPR_DCBIRl.sfne r13,r11l.bf 1bl.addi r13,r13,16/* Enable DC */l.mfspr r13,r0,SPR_SRl.ori r13,r13,SPR_SR_DCEl.mtspr r0,r13,SPR_SRl.jr r9l.nop_dc_disable:/* Disable DC */l.mfspr r13,r0,SPR_SRl.addi r11,r0,-1l.xori r11,r11,SPR_SR_DCEl.and r11,r13,r11l.mtspr r0,r11,SPR_SRl.jr r9l.nop/* dtlb_ic_test(unsigned long add, unsigned long set) */_lo_dtlb_ci_test:l.addi r1,r1,-4l.sw 0(r1),r9l.addi r8,r0,0l.movhi r5,hi(0x01234567)l.ori r5,r5,lo(0x01234567)l.sw 0(r3),r5l.movhi r5,hi(0x89abcdef)l.ori r5,r5,lo(0x89abcdef)l.sw (PAGE_SIZE - 4)(r3),r5l.ori r5,r3,SPR_DTLBMR_Vl.mtspr r4,r5,SPR_DTLBMR_BASE(0)l.ori r5,r3,(DTLB_PR_NOLIMIT | SPR_DTLBTR_CI)l.mtspr r4,r5,SPR_DTLBTR_BASE(0)l.addi r5,r3,PAGE_SIZEl.ori r5,r5,SPR_DTLBMR_Vl.addi r6,r4,1l.mtspr r6,r5,SPR_DTLBMR_BASE(0)l.addi r5,r3,PAGE_SIZEl.ori r5,r5,(DTLB_PR_NOLIMIT | SPR_DTLBTR_CI)l.addi r6,r4,1l.mtspr r6,r5,SPR_DTLBTR_BASE(0)l.jal _lo_dmmu_enl.nopl.jal _dc_enablel.nopl.movhi r6,hi(0x01234567)l.ori r6,r6,lo(0x01234567)l.lwz r5,0(r3)l.sfeq r6,r5l.bnf 11fl.nopl.movhi r6,hi(0x89abcdef)l.ori r6,r6,lo(0x89abcdef)l.lwz r5,(PAGE_SIZE - 4)(r3)l.sfeq r6,r5l.bnf 12fl.nopl.movhi r5,hi(0x76543210)l.ori r5,r5,lo(0x76543210)l.sw 0(r3),r5l.movhi r5,hi(0xfedcba9)l.ori r5,r5,lo(0xfedcba9)l.sw (PAGE_SIZE - 4)(r3),r5l.jal _lo_dmmu_disl.nopl.ori r5,r3,(DTLB_PR_NOLIMIT)l.mtspr r4,r5,SPR_DTLBTR_BASE(0)l.jal _lo_dmmu_enl.nopl.movhi r6,hi(0x76543210)l.ori r6,r6,lo(0x76543210)l.lwz r5,0(r3)l.sfeq r6,r5l.bnf 13fl.nopl.movhi r6,hi(0xfedcba9)l.ori r6,r6,lo(0xfedcba9)l.lwz r5,(PAGE_SIZE - 4)(r3)l.sfeq r6,r5l.bnf 14fl.nopl.jal _lo_dmmu_disl.nopl.ori r5,r3,(DTLB_PR_NOLIMIT | SPR_DTLBTR_CI)l.mtspr r4,r5,SPR_DTLBTR_BASE(0)l.jal _lo_dmmu_enl.nopl.movhi r5,hi(0x00112233)l.ori r5,r5,lo(0x00112233)l.sw 0(r3),r5#if 1l.movhi r5,hi(0x44556677)l.ori r5,r5,lo(0x44556677)l.sw 4(r3),r5l.movhi r5,hi(0x8899aabb)l.ori r5,r5,lo(0x8899aabb)l.sw 8(r3),r5l.movhi r5,hi(0xccddeeff)l.ori r5,r5,lo(0xccddeeff)l.sw 12(r3),r5#endifl.movhi r5,hi(0x44556677)l.ori r5,r5,lo(0x44556677)l.sw (PAGE_SIZE - 4)(r3),r5l.movhi r6,hi(0x00112233)l.ori r6,r6,lo(0x00112233)l.lwz r5,0(r3)l.sfeq r6,r5l.bnf 15fl.nopl.movhi r6,hi(0x44556677)l.ori r6,r6,lo(0x44556677)l.lwz r5,(PAGE_SIZE - 4)(r3)l.sfeq r6,r5l.bnf 16fl.nopl.jal _lo_dmmu_disl.nopl.ori r5,r3,(DTLB_PR_NOLIMIT)l.mtspr r4,r5,SPR_DTLBTR_BASE(0)l.jal _lo_dmmu_enl.nopl.movhi r6,hi(0x76543210)l.ori r6,r6,lo(0x76543210)l.lwz r5,0(r3)l.sfeq r6,r5l.bnf 17fl.nopl.movhi r6,hi(0xfedcba9)l.ori r6,r6,lo(0xfedcba9)l.lwz r5,(PAGE_SIZE - 4)(r3)l.sfeq r6,r5l.bnf 18fl.nop/* Invalidate cache */l.jal _dc_disablel.nopl.movhi r5,hi(0x00112233)l.ori r5,r5,lo(0x00112233)l.sw 12(r3),r5l.movhi r5,hi(0x44556677)l.ori r5,r5,lo(0x44556677)l.sw 8(r3),r5l.movhi r5,hi(0x8899aabb)l.ori r5,r5,lo(0x8899aabb)l.sw 4(r3),r5l.movhi r5,hi(0xccddeeff)l.ori r5,r5,lo(0xccddeeff)l.sw 0(r3),r5l.movhi r5,hi(0x44556677)l.ori r5,r5,lo(0x44556677)l.sw (PAGE_SIZE - 4)(r3),r5l.jal _dc_enablel.nop/* I want this part to execute as fast as possible */l.jal _ic_enablel.nopl.addi r5,r3,PAGE_SIZE/* This jump is just to be shure that the followinginstructions will get into IC */l.j 1fl.nop/* This shuld trigger cahe line refill */2: l.lwz r6,0(r3)l.j 2f/* This load is from non cached area and may cause some problemsin previuos refill, which is probably still in progress */l.lwz r6,0(r5)1: l.j 2bl.nop2:/* Check the line that was previosly refilled */l.movhi r6,hi(0x00112233)l.ori r6,r6,lo(0x00112233)l.lwz r5,12(r3)l.sfeq r6,r5l.bnf 19fl.nopl.movhi r6,hi(0x44556677)l.ori r6,r6,lo(0x44556677)l.lwz r5,8(r3)l.sfeq r6,r5l.bnf 19fl.nopl.movhi r6,hi(0x8899aabb)l.ori r6,r6,lo(0x8899aabb)l.lwz r5,4(r3)l.sfeq r6,r5l.bnf 19fl.nopl.movhi r6,hi(0xccddeeff)l.ori r6,r6,lo(0xccddeeff)l.lwz r5,0(r3)l.sfeq r6,r5l.bnf 19fl.nopl.jal _dc_disablel.nopl.jal _lo_dmmu_disl.nopl.j 10fl.nop19: l.addi r8,r8,118: l.addi r8,r8,117: l.addi r8,r8,116: l.addi r8,r8,115: l.addi r8,r8,114: l.addi r8,r8,113: l.addi r8,r8,112: l.addi r8,r8,111: l.addi r8,r8,110: l.jal _dc_disablel.nopl.jal _ic_disablel.nopl.jal _lo_dmmu_disl.nopl.addi r11,r8,0l.sw 0(r0),r8l.sw 4(r0),r5l.lwz r9,0(r1)l.jr r9l.addi r1,r1,4/* itlb_ic_test(unsigned long add, unsigned long set) */_lo_itlb_ci_test:l.addi r1,r1,-4l.sw 0(r1),r9l.addi r8,r0,0/* Copy the code to the prepeared location */l.addi r7,r0,88l.movhi r5,hi(_ci_test)l.ori r5,r5,lo(_ci_test)l.addi r6,r3,01: l.lwz r11,0(r5)l.sw 0(r6),r11l.addi r5,r5,4l.addi r6,r6,4l.addi r7,r7,-4l.sfeqi r7,0l.bnf 1bl.nopl.ori r5,r3,SPR_ITLBMR_Vl.mtspr r4,r5,SPR_ITLBMR_BASE(0)l.ori r5,r3,ITLB_PR_NOLIMITl.mtspr r4,r5,SPR_ITLBTR_BASE(0)l.jal _lo_immu_enl.nopl.jal _ic_enablel.nopl.addi r5,r0,0l.addi r6,r0,0l.jalr r3l.nopl.sfeqi r5,5l.bnf 11fl.nop/* Copy the code to the prepeared location */l.addi r7,r0,20l.movhi r5,hi(_ic_refill_test)l.ori r5,r5,lo(_ic_refill_test)l.addi r6,r3,121: l.lwz r11,0(r5)l.sw 0(r6),r11l.addi r5,r5,4l.addi r6,r6,4l.addi r7,r7,-4l.sfeqi r7,0l.bnf 1bl.nopl.jal _ic_disablel.nopl.jal _ic_enablel.nopl.addi r5,r0,0l.addi r6,r3,12l.jalr r6l.nopl.addi r6,r3,16l.jalr r6l.nopl.sfeqi r5,4l.bnf 12fl.nopl.j 10fl.nop12: l.addi r8,r8,111: l.addi r8,r8,110: l.jal _ic_disablel.nopl.jal _lo_dmmu_disl.nopl.addi r11,r8,0l.sw 0(r0),r11l.sw 4(r0),r5l.lwz r9,0(r1)l.jr r9l.addi r1,r1,4_ci_test:3: l.addi r5,r5,1l.sfeqi r6,0x01l.bnf 1fl.nopl.addi r13,r0,-1l.xori r13,r13,SPR_SR_IMEl.mfspr r11,r0,SPR_SRl.and r13,r11,r13l.mtspr r0,r13,SPR_SRl.ori r7,r3,(ITLB_PR_NOLIMIT | SPR_ITLBTR_CI)l.mtspr r4,r7,SPR_ITLBTR_BASE(0)l.mtspr r0,r11,SPR_SR1: l.lwz r7,0(r3)l.addi r7,r7,1l.sw 0(r3),r72: l.addi r6,r6,1l.sfeqi r6,3l.bnf 3bl.nopl.jr r9l.nop_ic_refill_test:l.jr r9l.addi r5,r5,1l.addi r5,r5,1l.jr r9l.addi r5,r5,1
Go to most recent revision | Compare with Previous | Blame | View Log
