tlb-mn10300.S revision fd4f683d045e053abb093f80d81afce30ceadad2
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	and	~EPSW_NMID,epsw
31#ifdef CONFIG_GDBSTUB
32	movm	[d2,d3,a2],(sp)
33#else
34	or	EPSW_nAR,epsw		# switch D0-D3 & A0-A3 to the alternate
35					# register bank
36	nop
37	nop
38	nop
39#endif
40
41	mov	(IPTEU),d3
42	mov	(PTBR),a2
43	mov	d3,d2
44	and	0xffc00000,d2
45	lsr	20,d2
46	mov	(a2,d2),a2		# PTD *ptd = PGD[addr 31..22]
47	btst	_PAGE_VALID,a2
48	beq	itlb_miss_fault		# jump if doesn't point anywhere
49
50	and	~(PAGE_SIZE-1),a2
51	mov	d3,d2
52	and	0x003ff000,d2
53	lsr	10,d2
54	add	d2,a2
55	mov	(a2),d2			# get pte from PTD[addr 21..12]
56	btst	_PAGE_VALID,d2
57	beq	itlb_miss_fault		# jump if doesn't point to a page
58					# (might be a swap id)
59	bset	_PAGE_ACCESSED,(0,a2)
60	and	~(xPTEL_UNUSED1|xPTEL_UNUSED2),d2
61itlb_miss_set:
62	mov	d2,(IPTEL)		# change the TLB
63#ifdef CONFIG_GDBSTUB
64	movm	(sp),[d2,d3,a2]
65#endif
66	rti
67
68itlb_miss_fault:
69	mov	_PAGE_VALID,d2		# force address error handler to be
70					# invoked
71	bra	itlb_miss_set
72
73	.size	itlb_miss, . - itlb_miss
74
75###############################################################################
76#
77# Data TLB Miss handler entry point
78#
79###############################################################################
80	.type	dtlb_miss,@function
81ENTRY(dtlb_miss)
82	and	~EPSW_NMID,epsw
83#ifdef CONFIG_GDBSTUB
84	movm	[d2,d3,a2],(sp)
85#else
86	or	EPSW_nAR,epsw		# switch D0-D3 & A0-A3 to the alternate
87					# register bank
88	nop
89	nop
90	nop
91#endif
92
93	mov	(DPTEU),d3
94	mov	(PTBR),a2
95	mov	d3,d2
96	and	0xffc00000,d2
97	lsr	20,d2
98	mov	(a2,d2),a2		# PTD *ptd = PGD[addr 31..22]
99	btst	_PAGE_VALID,a2
100	beq	dtlb_miss_fault		# jump if doesn't point anywhere
101
102	and	~(PAGE_SIZE-1),a2
103	mov	d3,d2
104	and	0x003ff000,d2
105	lsr	10,d2
106	add	d2,a2
107	mov	(a2),d2			# get pte from PTD[addr 21..12]
108	btst	_PAGE_VALID,d2
109	beq	dtlb_miss_fault		# jump if doesn't point to a page
110					# (might be a swap id)
111	bset	_PAGE_ACCESSED,(0,a2)
112	and	~(xPTEL_UNUSED1|xPTEL_UNUSED2),d2
113dtlb_miss_set:
114	mov	d2,(DPTEL)		# change the TLB
115#ifdef CONFIG_GDBSTUB
116	movm	(sp),[d2,d3,a2]
117#endif
118	rti
119
120dtlb_miss_fault:
121	mov	_PAGE_VALID,d2		# force address error handler to be
122					# invoked
123	bra	dtlb_miss_set
124	.size	dtlb_miss, . - dtlb_miss
125
126###############################################################################
127#
128# Instruction TLB Address Error handler entry point
129#
130###############################################################################
131	.type	itlb_aerror,@function
132ENTRY(itlb_aerror)
133	and	~EPSW_NMID,epsw
134	add	-4,sp
135	SAVE_ALL
136	add	-4,sp				# need to pass three params
137
138	# calculate the fault code
139	movhu	(MMUFCR_IFC),d1
140	or	0x00010000,d1			# it's an instruction fetch
141
142	# determine the page address
143	mov	(IPTEU),a2
144	mov	a2,d0
145	and	PAGE_MASK,d0
146	mov	d0,(12,sp)
147
148	clr	d0
149	mov	d0,(IPTEL)
150
151	and	~EPSW_NMID,epsw
152	or	EPSW_IE,epsw
153	mov	fp,d0
154	call	do_page_fault[],0		# do_page_fault(regs,code,addr
155
156	jmp	ret_from_exception
157	.size	itlb_aerror, . - itlb_aerror
158
159###############################################################################
160#
161# Data TLB Address Error handler entry point
162#
163###############################################################################
164	.type	dtlb_aerror,@function
165ENTRY(dtlb_aerror)
166	and	~EPSW_NMID,epsw
167	add	-4,sp
168	SAVE_ALL
169	add	-4,sp				# need to pass three params
170
171	# calculate the fault code
172	movhu	(MMUFCR_DFC),d1
173
174	# determine the page address
175	mov	(DPTEU),a2
176	mov	a2,d0
177	and	PAGE_MASK,d0
178	mov	d0,(12,sp)
179
180	clr	d0
181	mov	d0,(DPTEL)
182
183	and	~EPSW_NMID,epsw
184	or	EPSW_IE,epsw
185	mov	fp,d0
186	call	do_page_fault[],0		# do_page_fault(regs,code,addr
187
188	jmp	ret_from_exception
189	.size	dtlb_aerror, . - dtlb_aerror
190