tlb-mn10300.S revision 8f19e3daf3fffee9e18a8812067a6a4b538ae6c8
1############################################################################### 2# 3# TLB loading functions 4# 5# Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. 6# Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 7# Modified by David Howells (dhowells@redhat.com) 8# 9# This program is free software; you can redistribute it and/or 10# modify it under the terms of the GNU General Public Licence 11# as published by the Free Software Foundation; either version 12# 2 of the Licence, or (at your option) any later version. 13# 14############################################################################### 15#include <linux/sys.h> 16#include <linux/linkage.h> 17#include <asm/smp.h> 18#include <asm/intctl-regs.h> 19#include <asm/frame.inc> 20#include <asm/page.h> 21#include <asm/pgtable.h> 22 23############################################################################### 24# 25# Instruction TLB Miss handler entry point 26# 27############################################################################### 28 .type itlb_miss,@function 29ENTRY(itlb_miss) 30#ifdef CONFIG_GDBSTUB 31 movm [d2,d3,a2],(sp) 32#else 33 or EPSW_nAR,epsw # switch D0-D3 & A0-A3 to the alternate 34 # register bank 35 nop 36 nop 37 nop 38#endif 39 40#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) 41 mov (MMUCTR),d2 42 mov d2,(MMUCTR) 43#endif 44 45 and ~EPSW_NMID,epsw 46 mov (IPTEU),d3 47 mov (PTBR),a2 48 mov d3,d2 49 and 0xffc00000,d2 50 lsr 20,d2 51 mov (a2,d2),a2 # PTD *ptd = PGD[addr 31..22] 52 btst _PAGE_VALID,a2 53 beq itlb_miss_fault # jump if doesn't point anywhere 54 55 and ~(PAGE_SIZE-1),a2 56 mov d3,d2 57 and 0x003ff000,d2 58 lsr 10,d2 59 add d2,a2 60 mov (a2),d2 # get pte from PTD[addr 21..12] 61 btst _PAGE_VALID,d2 62 beq itlb_miss_fault # jump if doesn't point to a page 63 # (might be a swap id) 64 bset _PAGE_ACCESSED,(0,a2) 65 and ~(xPTEL_UNUSED1|xPTEL_UNUSED2),d2 66itlb_miss_set: 67 mov d2,(IPTEL) # change the TLB 68#ifdef CONFIG_GDBSTUB 69 movm (sp),[d2,d3,a2] 70#endif 71 rti 72 73itlb_miss_fault: 74 mov _PAGE_VALID,d2 # force address error handler to be 75 # invoked 76 bra itlb_miss_set 77 78 .size itlb_miss, . - itlb_miss 79 80############################################################################### 81# 82# Data TLB Miss handler entry point 83# 84############################################################################### 85 .type dtlb_miss,@function 86ENTRY(dtlb_miss) 87#ifdef CONFIG_GDBSTUB 88 movm [d2,d3,a2],(sp) 89#else 90 or EPSW_nAR,epsw # switch D0-D3 & A0-A3 to the alternate 91 # register bank 92 nop 93 nop 94 nop 95#endif 96 97#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) 98 mov (MMUCTR),d2 99 mov d2,(MMUCTR) 100#endif 101 102 and ~EPSW_NMID,epsw 103 mov (DPTEU),d3 104 mov (PTBR),a2 105 mov d3,d2 106 and 0xffc00000,d2 107 lsr 20,d2 108 mov (a2,d2),a2 # PTD *ptd = PGD[addr 31..22] 109 btst _PAGE_VALID,a2 110 beq dtlb_miss_fault # jump if doesn't point anywhere 111 112 and ~(PAGE_SIZE-1),a2 113 mov d3,d2 114 and 0x003ff000,d2 115 lsr 10,d2 116 add d2,a2 117 mov (a2),d2 # get pte from PTD[addr 21..12] 118 btst _PAGE_VALID,d2 119 beq dtlb_miss_fault # jump if doesn't point to a page 120 # (might be a swap id) 121 bset _PAGE_ACCESSED,(0,a2) 122 and ~(xPTEL_UNUSED1|xPTEL_UNUSED2),d2 123dtlb_miss_set: 124 mov d2,(DPTEL) # change the TLB 125#ifdef CONFIG_GDBSTUB 126 movm (sp),[d2,d3,a2] 127#endif 128 rti 129 130dtlb_miss_fault: 131 mov _PAGE_VALID,d2 # force address error handler to be 132 # invoked 133 bra dtlb_miss_set 134 .size dtlb_miss, . - dtlb_miss 135 136############################################################################### 137# 138# Instruction TLB Address Error handler entry point 139# 140############################################################################### 141 .type itlb_aerror,@function 142ENTRY(itlb_aerror) 143 add -4,sp 144 SAVE_ALL 145 146#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) 147 mov (MMUCTR),d1 148 mov d1,(MMUCTR) 149#endif 150 151 and ~EPSW_NMID,epsw 152 add -4,sp # need to pass three params 153 154 # calculate the fault code 155 movhu (MMUFCR_IFC),d1 156 or 0x00010000,d1 # it's an instruction fetch 157 158 # determine the page address 159 mov (IPTEU),a2 160 mov a2,d0 161 and PAGE_MASK,d0 162 mov d0,(12,sp) 163 164 clr d0 165 mov d0,(IPTEL) 166 167 or EPSW_IE,epsw 168 mov fp,d0 169 call do_page_fault[],0 # do_page_fault(regs,code,addr 170 171 jmp ret_from_exception 172 .size itlb_aerror, . - itlb_aerror 173 174############################################################################### 175# 176# Data TLB Address Error handler entry point 177# 178############################################################################### 179 .type dtlb_aerror,@function 180ENTRY(dtlb_aerror) 181 add -4,sp 182 SAVE_ALL 183 184#if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) 185 mov (MMUCTR),d1 186 mov d1,(MMUCTR) 187#endif 188 189 add -4,sp # need to pass three params 190 and ~EPSW_NMID,epsw 191 192 # calculate the fault code 193 movhu (MMUFCR_DFC),d1 194 195 # determine the page address 196 mov (DPTEU),a2 197 mov a2,d0 198 and PAGE_MASK,d0 199 mov d0,(12,sp) 200 201 clr d0 202 mov d0,(DPTEL) 203 204 or EPSW_IE,epsw 205 mov fp,d0 206 call do_page_fault[],0 # do_page_fault(regs,code,addr 207 208 jmp ret_from_exception 209 .size dtlb_aerror, . - dtlb_aerror 210