Blame view

arch/powerpc/kernel/head_fsl_booke.S 27.4 KB
14cf11af6   Paul Mackerras   powerpc: Merge en...
1
  /*
14cf11af6   Paul Mackerras   powerpc: Merge en...
2
3
4
   * Kernel execution entry point code.
   *
   *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
5
   *	Initial PowerPC version.
14cf11af6   Paul Mackerras   powerpc: Merge en...
6
   *    Copyright (c) 1996 Cort Dougan <cort@cs.nmt.edu>
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
7
   *	Rewritten for PReP
14cf11af6   Paul Mackerras   powerpc: Merge en...
8
   *    Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
9
   *	Low-level exception handers, MMU support, and rewrite.
14cf11af6   Paul Mackerras   powerpc: Merge en...
10
   *    Copyright (c) 1997 Dan Malek <dmalek@jlc.net>
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
11
   *	PowerPC 8xx modifications.
14cf11af6   Paul Mackerras   powerpc: Merge en...
12
   *    Copyright (c) 1998-1999 TiVo, Inc.
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
13
   *	PowerPC 403GCX modifications.
14cf11af6   Paul Mackerras   powerpc: Merge en...
14
   *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
15
   *	PowerPC 403GCX/405GP modifications.
14cf11af6   Paul Mackerras   powerpc: Merge en...
16
17
   *    Copyright 2000 MontaVista Software Inc.
   *	PPC405 modifications
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
18
19
20
21
   *	PowerPC 403GCX/405GP modifications.
   *	Author: MontaVista Software, Inc.
   *		frank_rowand@mvista.com or source@mvista.com
   *		debbie_chu@mvista.com
14cf11af6   Paul Mackerras   powerpc: Merge en...
22
   *    Copyright 2002-2004 MontaVista Software, Inc.
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
23
   *	PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
14cf11af6   Paul Mackerras   powerpc: Merge en...
24
   *    Copyright 2004 Freescale Semiconductor, Inc
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
25
   *	PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
14cf11af6   Paul Mackerras   powerpc: Merge en...
26
27
28
29
30
31
   *
   * This program is free software; you can redistribute  it and/or modify it
   * under  the terms of  the GNU General  Public License as published by the
   * Free Software Foundation;  either version 2 of the  License, or (at your
   * option) any later version.
   */
e70398458   Tim Abbott   powerpc: convert ...
32
  #include <linux/init.h>
14cf11af6   Paul Mackerras   powerpc: Merge en...
33
34
35
36
37
38
39
40
41
  #include <linux/threads.h>
  #include <asm/processor.h>
  #include <asm/page.h>
  #include <asm/mmu.h>
  #include <asm/pgtable.h>
  #include <asm/cputable.h>
  #include <asm/thread_info.h>
  #include <asm/ppc_asm.h>
  #include <asm/asm-offsets.h>
fc4033b2f   Kumar Gala   powerpc/85xx: add...
42
  #include <asm/cache.h>
46f522104   Stephen Rothwell   powerpc: Remove s...
43
  #include <asm/ptrace.h>
14cf11af6   Paul Mackerras   powerpc: Merge en...
44
45
46
47
48
49
50
51
52
53
54
55
56
  #include "head_booke.h"
  
  /* As with the other PowerPC ports, it is expected that when code
   * execution begins here, the following registers contain valid, yet
   * optional, information:
   *
   *   r3 - Board info structure pointer (DRAM, frequency, MAC address, etc.)
   *   r4 - Starting address of the init RAM disk
   *   r5 - Ending address of the init RAM disk
   *   r6 - Start of kernel command line string (e.g. "mem=128")
   *   r7 - End of kernel command line string
   *
   */
e70398458   Tim Abbott   powerpc: convert ...
57
  	__HEAD
748a76838   Kumar Gala   [POWERPC] Fix mod...
58
59
  _ENTRY(_stext);
  _ENTRY(_start);
14cf11af6   Paul Mackerras   powerpc: Merge en...
60
61
62
63
64
  	/*
  	 * Reserve a word at a fixed location to store the address
  	 * of abatron_pteptrs
  	 */
  	nop
6dece0eb6   Scott Wood   powerpc/32: Pass ...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  
  	/* Translate device tree address to physical, save in r30/r31 */
  	mfmsr	r16
  	mfspr	r17,SPRN_PID
  	rlwinm	r17,r17,16,0x3fff0000	/* turn PID into MAS6[SPID] */
  	rlwimi	r17,r16,28,0x00000001	/* turn MSR[DS] into MAS6[SAS] */
  	mtspr	SPRN_MAS6,r17
  
  	tlbsx	0,r3			/* must succeed */
  
  	mfspr	r16,SPRN_MAS1
  	mfspr	r20,SPRN_MAS3
  	rlwinm	r17,r16,25,0x1f		/* r17 = log2(page size) */
  	li	r18,1024
  	slw	r18,r18,r17		/* r18 = page size */
  	addi	r18,r18,-1
  	and	r19,r3,r18		/* r19 = page offset */
7d0d3ad5e   Matthew McClintock   powerpc/fsl_booke...
82
83
  	andc	r31,r20,r18		/* r31 = page base */
  	or	r31,r31,r19		/* r31 = devtree phys addr */
6dece0eb6   Scott Wood   powerpc/32: Pass ...
84
85
86
87
88
  	mfspr	r30,SPRN_MAS7
  
  	li	r25,0			/* phys kernel start (low) */
  	li	r24,0			/* CPU number */
  	li	r23,0			/* phys kernel start (high) */
14cf11af6   Paul Mackerras   powerpc: Merge en...
89
90
91
92
  
  /* We try to not make any assumptions about how the boot loader
   * setup or used the TLBs.  We invalidate all mappings from the
   * boot loader and load a single entry in TLB1[0] to map the
e8b637615   Dale Farnsworth   [POWERPC] 85xx: R...
93
94
   * first 64M of kernel memory.  Any boot info passed from the
   * bootloader needs to live in this first 64M.
14cf11af6   Paul Mackerras   powerpc: Merge en...
95
96
97
98
99
100
101
102
103
104
105
106
107
   *
   * Requirement on bootloader:
   *  - The page we're executing in needs to reside in TLB1 and
   *    have IPROT=1.  If not an invalidate broadcast could
   *    evict the entry we're currently executing in.
   *
   *  r3 = Index of TLB1 were executing in
   *  r4 = Current MSR[IS]
   *  r5 = Index of TLB1 temp mapping
   *
   * Later in mapin_ram we will correctly map lowmem, and resize TLB1[0]
   * if needed
   */
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
108
  _ENTRY(__early_start)
105c31df6   Kumar Gala   powerpc/fsl-booke...
109

b3df895ae   Sebastian Andrzej Siewior   powerpc/kexec: Ad...
110
  #define ENTRY_MAPPING_BOOT_SETUP
7c08ce718   Sebastian Andrzej Siewior   powerpc/fsl-booke...
111
  #include "fsl_booke_entry_mapping.S"
b3df895ae   Sebastian Andrzej Siewior   powerpc/kexec: Ad...
112
  #undef ENTRY_MAPPING_BOOT_SETUP
14cf11af6   Paul Mackerras   powerpc: Merge en...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  
  	/* Establish the interrupt vector offsets */
  	SET_IVOR(0,  CriticalInput);
  	SET_IVOR(1,  MachineCheck);
  	SET_IVOR(2,  DataStorage);
  	SET_IVOR(3,  InstructionStorage);
  	SET_IVOR(4,  ExternalInput);
  	SET_IVOR(5,  Alignment);
  	SET_IVOR(6,  Program);
  	SET_IVOR(7,  FloatingPointUnavailable);
  	SET_IVOR(8,  SystemCall);
  	SET_IVOR(9,  AuxillaryProcessorUnavailable);
  	SET_IVOR(10, Decrementer);
  	SET_IVOR(11, FixedIntervalTimer);
  	SET_IVOR(12, WatchdogTimer);
  	SET_IVOR(13, DataTLBError);
  	SET_IVOR(14, InstructionTLBError);
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
130
  	SET_IVOR(15, DebugCrit);
14cf11af6   Paul Mackerras   powerpc: Merge en...
131
132
133
134
135
136
  
  	/* Establish the interrupt vector base */
  	lis	r4,interrupt_base@h	/* IVPR only uses the high 16-bits */
  	mtspr	SPRN_IVPR,r4
  
  	/* Setup the defaults for TLB entries */
d66c82ea4   Kumar Gala   powerpc/fsl-booke...
137
  	li	r2,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l
14cf11af6   Paul Mackerras   powerpc: Merge en...
138
139
140
  #ifdef CONFIG_E200
  	oris	r2,r2,MAS4_TLBSELD(1)@h
  #endif
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
141
  	mtspr	SPRN_MAS4, r2
14cf11af6   Paul Mackerras   powerpc: Merge en...
142
143
144
145
146
147
148
  
  #if 0
  	/* Enable DOZE */
  	mfspr	r2,SPRN_HID0
  	oris	r2,r2,HID0_DOZE@h
  	mtspr	SPRN_HID0, r2
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
149
150
151
152
153
154
155
156
  
  #if !defined(CONFIG_BDI_SWITCH)
  	/*
  	 * The Abatron BDI JTAG debugger does not tolerate others
  	 * mucking with the debug registers.
  	 */
  	lis	r2,DBCR0_IDM@h
  	mtspr	SPRN_DBCR0,r2
a7cb03375   Becky Bruce   [PATCH] powerpc/p...
157
  	isync
14cf11af6   Paul Mackerras   powerpc: Merge en...
158
159
160
161
  	/* clear any residual debug events */
  	li	r2,-1
  	mtspr	SPRN_DBSR,r2
  #endif
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
162
163
164
165
  #ifdef CONFIG_SMP
  	/* Check to see if we're the second processor, and jump
  	 * to the secondary_start code if so
  	 */
2ed38b235   Matthew McClintock   powerpc/fsl_booke...
166
167
168
169
170
  	lis	r24, boot_cpuid@h
  	ori	r24, r24, boot_cpuid@l
  	lwz	r24, 0(r24)
  	cmpwi	r24, -1
  	mfspr   r24,SPRN_PIR
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
171
172
  	bne	__secondary_start
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
173
174
175
176
177
178
179
180
181
182
  	/*
  	 * This is where the main kernel code starts.
  	 */
  
  	/* ptr to current */
  	lis	r2,init_task@h
  	ori	r2,r2,init_task@l
  
  	/* ptr to current thread */
  	addi	r4,r2,THREAD	/* init task's THREAD */
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
183
  	mtspr	SPRN_SPRG_THREAD,r4
14cf11af6   Paul Mackerras   powerpc: Merge en...
184
185
186
187
188
189
  
  	/* stack */
  	lis	r1,init_thread_union@h
  	ori	r1,r1,init_thread_union@l
  	li	r0,0
  	stwu	r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
2ed38b235   Matthew McClintock   powerpc/fsl_booke...
190
191
  	rlwinm  r22,r1,0,0,31-THREAD_SHIFT      /* current thread_info */
  	stw	r24, TI_CPU(r22)
14cf11af6   Paul Mackerras   powerpc: Merge en...
192
  	bl	early_init
0f890c8d2   Suzuki Poulose   powerpc: Rename m...
193
  #ifdef CONFIG_DYNAMIC_MEMSTART
37dd2badc   Kumar Gala   [POWERPC] 85xx: A...
194
195
196
197
198
199
200
201
202
  	lis	r3,kernstart_addr@ha
  	la	r3,kernstart_addr@l(r3)
  #ifdef CONFIG_PHYS_64BIT
  	stw	r23,0(r3)
  	stw	r25,4(r3)
  #else
  	stw	r25,0(r3)
  #endif
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
203
204
205
  /*
   * Decide what sort of machine this is and initialize the MMU.
   */
6dece0eb6   Scott Wood   powerpc/32: Pass ...
206
207
  	mr	r3,r30
  	mr	r4,r31
14cf11af6   Paul Mackerras   powerpc: Merge en...
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  	bl	machine_init
  	bl	MMU_init
  
  	/* Setup PTE pointers for the Abatron bdiGDB */
  	lis	r6, swapper_pg_dir@h
  	ori	r6, r6, swapper_pg_dir@l
  	lis	r5, abatron_pteptrs@h
  	ori	r5, r5, abatron_pteptrs@l
  	lis	r4, KERNELBASE@h
  	ori	r4, r4, KERNELBASE@l
  	stw	r5, 0(r4)	/* Save abatron_pteptrs at a fixed location */
  	stw	r6, 0(r5)
  
  	/* Let's move on */
  	lis	r4,start_kernel@h
  	ori	r4,r4,start_kernel@l
  	lis	r3,MSR_KERNEL@h
  	ori	r3,r3,MSR_KERNEL@l
  	mtspr	SPRN_SRR0,r4
  	mtspr	SPRN_SRR1,r3
  	rfi			/* change context and jump to start_kernel */
  
  /* Macros to hide the PTE size differences
   *
   * FIND_PTE -- walks the page tables given EA & pgdir pointer
   *   r10 -- EA of fault
   *   r11 -- PGDIR pointer
   *   r12 -- free
   *   label 2: is the bailout case
   *
   * if we find the pte (fall through):
   *   r11 is low pte word
   *   r12 is pointer to the pte
41151e77a   Becky Bruce   powerpc: Hugetlb ...
241
   *   r10 is the pshift from the PGD, if we're a hugepage
14cf11af6   Paul Mackerras   powerpc: Merge en...
242
243
   */
  #ifdef CONFIG_PTE_64BIT
41151e77a   Becky Bruce   powerpc: Hugetlb ...
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
  #ifdef CONFIG_HUGETLB_PAGE
  #define FIND_PTE	\
  	rlwinm	r12, r10, 13, 19, 29;	/* Compute pgdir/pmd offset */	\
  	lwzx	r11, r12, r11;		/* Get pgd/pmd entry */		\
  	rlwinm.	r12, r11, 0, 0, 20;	/* Extract pt base address */	\
  	blt	1000f;			/* Normal non-huge page */	\
  	beq	2f;			/* Bail if no table */		\
  	oris	r11, r11, PD_HUGE@h;	/* Put back address bit */	\
  	andi.	r10, r11, HUGEPD_SHIFT_MASK@l; /* extract size field */	\
  	xor	r12, r10, r11;		/* drop size bits from pointer */ \
  	b	1001f;							\
  1000:	rlwimi	r12, r10, 23, 20, 28;	/* Compute pte address */	\
  	li	r10, 0;			/* clear r10 */			\
  1001:	lwz	r11, 4(r12);		/* Get pte entry */
  #else
14cf11af6   Paul Mackerras   powerpc: Merge en...
259
  #define FIND_PTE	\
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
260
  	rlwinm	r12, r10, 13, 19, 29;	/* Compute pgdir/pmd offset */	\
14cf11af6   Paul Mackerras   powerpc: Merge en...
261
262
263
264
265
  	lwzx	r11, r12, r11;		/* Get pgd/pmd entry */		\
  	rlwinm.	r12, r11, 0, 0, 20;	/* Extract pt base address */	\
  	beq	2f;			/* Bail if no table */		\
  	rlwimi	r12, r10, 23, 20, 28;	/* Compute pte address */	\
  	lwz	r11, 4(r12);		/* Get pte entry */
41151e77a   Becky Bruce   powerpc: Hugetlb ...
266
267
  #endif /* HUGEPAGE */
  #else /* !PTE_64BIT */
14cf11af6   Paul Mackerras   powerpc: Merge en...
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
  #define FIND_PTE	\
  	rlwimi	r11, r10, 12, 20, 29;	/* Create L1 (pgdir/pmd) address */	\
  	lwz	r11, 0(r11);		/* Get L1 entry */			\
  	rlwinm.	r12, r11, 0, 0, 19;	/* Extract L2 (pte) base address */	\
  	beq	2f;			/* Bail if no table */			\
  	rlwimi	r12, r10, 22, 20, 29;	/* Compute PTE address */		\
  	lwz	r11, 0(r12);		/* Get Linux PTE */
  #endif
  
  /*
   * Interrupt vector entry code
   *
   * The Book E MMUs are always on so we don't need to handle
   * interrupts in real mode as with previous PPC processors. In
   * this case we handle interrupts in the kernel virtual address
   * space.
   *
   * Interrupt vectors are dynamically placed relative to the
   * interrupt prefix as determined by the address of interrupt_base.
   * The interrupt vectors offsets are programmed using the labels
   * for each interrupt vector entry.
   *
   * Interrupt vectors must be aligned on a 16 byte boundary.
   * We align on a 32 byte cache line boundary for good measure.
   */
  
  interrupt_base:
  	/* Critical Input Interrupt */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
296
  	CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
14cf11af6   Paul Mackerras   powerpc: Merge en...
297
298
299
300
  
  	/* Machine Check Interrupt */
  #ifdef CONFIG_E200
  	/* no RFMCI, MCSRRs on E200 */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
301
  	CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
14cf11af6   Paul Mackerras   powerpc: Merge en...
302
  #else
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
303
  	MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
14cf11af6   Paul Mackerras   powerpc: Merge en...
304
305
306
307
  #endif
  
  	/* Data Storage Interrupt */
  	START_EXCEPTION(DataStorage)
6cfd8990e   Kumar Gala   powerpc: rework F...
308
309
310
311
312
313
314
315
316
317
  	NORMAL_EXCEPTION_PROLOG
  	mfspr	r5,SPRN_ESR		/* Grab the ESR, save it, pass arg3 */
  	stw	r5,_ESR(r11)
  	mfspr	r4,SPRN_DEAR		/* Grab the DEAR, save it, pass arg2 */
  	andis.	r10,r5,(ESR_ILK|ESR_DLK)@h
  	bne	1f
  	EXC_XFER_EE_LITE(0x0300, handle_page_fault)
  1:
  	addi	r3,r1,STACK_FRAME_OVERHEAD
  	EXC_XFER_EE_LITE(0x0300, CacheLockingException)
14cf11af6   Paul Mackerras   powerpc: Merge en...
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
  
  	/* Instruction Storage Interrupt */
  	INSTRUCTION_STORAGE_EXCEPTION
  
  	/* External Input Interrupt */
  	EXCEPTION(0x0500, ExternalInput, do_IRQ, EXC_XFER_LITE)
  
  	/* Alignment Interrupt */
  	ALIGNMENT_EXCEPTION
  
  	/* Program Interrupt */
  	PROGRAM_EXCEPTION
  
  	/* Floating Point Unavailable Interrupt */
  #ifdef CONFIG_PPC_FPU
  	FP_UNAVAILABLE_EXCEPTION
  #else
  #ifdef CONFIG_E200
  	/* E200 treats 'normal' floating point instructions as FP Unavail exception */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
337
  	EXCEPTION(0x0800, FloatingPointUnavailable, program_check_exception, EXC_XFER_EE)
14cf11af6   Paul Mackerras   powerpc: Merge en...
338
  #else
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
339
  	EXCEPTION(0x0800, FloatingPointUnavailable, unknown_exception, EXC_XFER_EE)
14cf11af6   Paul Mackerras   powerpc: Merge en...
340
341
342
343
344
345
346
  #endif
  #endif
  
  	/* System Call Interrupt */
  	START_EXCEPTION(SystemCall)
  	NORMAL_EXCEPTION_PROLOG
  	EXC_XFER_EE_LITE(0x0c00, DoSyscall)
25985edce   Lucas De Marchi   Fix common misspe...
347
  	/* Auxiliary Processor Unavailable Interrupt */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
348
  	EXCEPTION(0x2900, AuxillaryProcessorUnavailable, unknown_exception, EXC_XFER_EE)
14cf11af6   Paul Mackerras   powerpc: Merge en...
349
350
351
352
353
354
  
  	/* Decrementer Interrupt */
  	DECREMENTER_EXCEPTION
  
  	/* Fixed Internal Timer Interrupt */
  	/* TODO: Add FIT support */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
355
  	EXCEPTION(0x3100, FixedIntervalTimer, unknown_exception, EXC_XFER_EE)
14cf11af6   Paul Mackerras   powerpc: Merge en...
356
357
358
359
360
  
  	/* Watchdog Timer Interrupt */
  #ifdef CONFIG_BOOKE_WDT
  	CRITICAL_EXCEPTION(0x3200, WatchdogTimer, WatchdogException)
  #else
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
361
  	CRITICAL_EXCEPTION(0x3200, WatchdogTimer, unknown_exception)
14cf11af6   Paul Mackerras   powerpc: Merge en...
362
363
364
365
  #endif
  
  	/* Data TLB Error Interrupt */
  	START_EXCEPTION(DataTLBError)
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
366
  	mtspr	SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
367
368
369
370
371
372
  	mfspr	r10, SPRN_SPRG_THREAD
  	stw	r11, THREAD_NORMSAVE(0)(r10)
  	stw	r12, THREAD_NORMSAVE(1)(r10)
  	stw	r13, THREAD_NORMSAVE(2)(r10)
  	mfcr	r13
  	stw	r13, THREAD_NORMSAVE(3)(r10)
14cf11af6   Paul Mackerras   powerpc: Merge en...
373
374
375
376
377
  	mfspr	r10, SPRN_DEAR		/* Get faulting address */
  
  	/* If we are faulting a kernel address, we have to use the
  	 * kernel page tables.
  	 */
8a13c4f97   Kumar Gala   [POWERPC] Use PAG...
378
  	lis	r11, PAGE_OFFSET@h
14cf11af6   Paul Mackerras   powerpc: Merge en...
379
380
381
382
383
384
385
386
387
388
389
390
391
  	cmplw	5, r10, r11
  	blt	5, 3f
  	lis	r11, swapper_pg_dir@h
  	ori	r11, r11, swapper_pg_dir@l
  
  	mfspr	r12,SPRN_MAS1		/* Set TID to 0 */
  	rlwinm	r12,r12,0,16,1
  	mtspr	SPRN_MAS1,r12
  
  	b	4f
  
  	/* Get the PGD for the current thread */
  3:
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
392
  	mfspr	r11,SPRN_SPRG_THREAD
14cf11af6   Paul Mackerras   powerpc: Merge en...
393
394
395
  	lwz	r11,PGDIR(r11)
  
  4:
6cfd8990e   Kumar Gala   powerpc: rework F...
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  	/* Mask of required permission bits. Note that while we
  	 * do copy ESR:ST to _PAGE_RW position as trying to write
  	 * to an RO page is pretty common, we don't do it with
  	 * _PAGE_DIRTY. We could do it, but it's a fairly rare
  	 * event so I'd rather take the overhead when it happens
  	 * rather than adding an instruction here. We should measure
  	 * whether the whole thing is worth it in the first place
  	 * as we could avoid loading SPRN_ESR completely in the first
  	 * place...
  	 *
  	 * TODO: Is it worth doing that mfspr & rlwimi in the first
  	 *       place or can we save a couple of instructions here ?
  	 */
  	mfspr	r12,SPRN_ESR
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
410
411
412
413
  #ifdef CONFIG_PTE_64BIT
  	li	r13,_PAGE_PRESENT
  	oris	r13,r13,_PAGE_ACCESSED@h
  #else
6cfd8990e   Kumar Gala   powerpc: rework F...
414
  	li	r13,_PAGE_PRESENT|_PAGE_ACCESSED
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
415
  #endif
6cfd8990e   Kumar Gala   powerpc: rework F...
416
  	rlwimi	r13,r12,11,29,29
14cf11af6   Paul Mackerras   powerpc: Merge en...
417
  	FIND_PTE
6cfd8990e   Kumar Gala   powerpc: rework F...
418
  	andc.	r13,r13,r11		/* Check permission */
14cf11af6   Paul Mackerras   powerpc: Merge en...
419
420
  
  #ifdef CONFIG_PTE_64BIT
b38fd42ff   Kumar Gala   powerpc/fsl-booke...
421
  #ifdef CONFIG_SMP
41151e77a   Becky Bruce   powerpc: Hugetlb ...
422
423
  	subf	r13,r11,r12		/* create false data dep */
  	lwzx	r13,r11,r13		/* Get upper pte bits */
b38fd42ff   Kumar Gala   powerpc/fsl-booke...
424
425
426
  #else
  	lwz	r13,0(r12)		/* Get upper pte bits */
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
427
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
428

b38fd42ff   Kumar Gala   powerpc/fsl-booke...
429
430
431
  	bne	2f			/* Bail if permission/valid mismach */
  
  	/* Jump to common tlb load */
14cf11af6   Paul Mackerras   powerpc: Merge en...
432
433
434
435
436
  	b	finish_tlb_load
  2:
  	/* The bailout.  Restore registers to pre-exception conditions
  	 * and call the heavyweights to help us out.
  	 */
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
437
438
  	mfspr	r10, SPRN_SPRG_THREAD
  	lwz	r11, THREAD_NORMSAVE(3)(r10)
14cf11af6   Paul Mackerras   powerpc: Merge en...
439
  	mtcr	r11
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
440
441
442
  	lwz	r13, THREAD_NORMSAVE(2)(r10)
  	lwz	r12, THREAD_NORMSAVE(1)(r10)
  	lwz	r11, THREAD_NORMSAVE(0)(r10)
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
443
  	mfspr	r10, SPRN_SPRG_RSCRATCH0
6cfd8990e   Kumar Gala   powerpc: rework F...
444
  	b	DataStorage
14cf11af6   Paul Mackerras   powerpc: Merge en...
445
446
447
448
449
450
451
452
  
  	/* Instruction TLB Error Interrupt */
  	/*
  	 * Nearly the same as above, except we get our
  	 * information from different registers and bailout
  	 * to a different point.
  	 */
  	START_EXCEPTION(InstructionTLBError)
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
453
  	mtspr	SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
454
455
456
457
458
459
  	mfspr	r10, SPRN_SPRG_THREAD
  	stw	r11, THREAD_NORMSAVE(0)(r10)
  	stw	r12, THREAD_NORMSAVE(1)(r10)
  	stw	r13, THREAD_NORMSAVE(2)(r10)
  	mfcr	r13
  	stw	r13, THREAD_NORMSAVE(3)(r10)
14cf11af6   Paul Mackerras   powerpc: Merge en...
460
461
462
463
464
  	mfspr	r10, SPRN_SRR0		/* Get faulting address */
  
  	/* If we are faulting a kernel address, we have to use the
  	 * kernel page tables.
  	 */
8a13c4f97   Kumar Gala   [POWERPC] Use PAG...
465
  	lis	r11, PAGE_OFFSET@h
14cf11af6   Paul Mackerras   powerpc: Merge en...
466
467
468
469
470
471
472
473
  	cmplw	5, r10, r11
  	blt	5, 3f
  	lis	r11, swapper_pg_dir@h
  	ori	r11, r11, swapper_pg_dir@l
  
  	mfspr	r12,SPRN_MAS1		/* Set TID to 0 */
  	rlwinm	r12,r12,0,16,1
  	mtspr	SPRN_MAS1,r12
78e2e68a2   Li Yang   powerpc/fsl-booke...
474
475
476
477
478
479
480
  	/* Make up the required permissions for kernel code */
  #ifdef CONFIG_PTE_64BIT
  	li	r13,_PAGE_PRESENT | _PAGE_BAP_SX
  	oris	r13,r13,_PAGE_ACCESSED@h
  #else
  	li	r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
481
482
483
484
  	b	4f
  
  	/* Get the PGD for the current thread */
  3:
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
485
  	mfspr	r11,SPRN_SPRG_THREAD
14cf11af6   Paul Mackerras   powerpc: Merge en...
486
  	lwz	r11,PGDIR(r11)
78e2e68a2   Li Yang   powerpc/fsl-booke...
487
  	/* Make up the required permissions for user code */
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
488
  #ifdef CONFIG_PTE_64BIT
78e2e68a2   Li Yang   powerpc/fsl-booke...
489
  	li	r13,_PAGE_PRESENT | _PAGE_BAP_UX
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
490
491
  	oris	r13,r13,_PAGE_ACCESSED@h
  #else
ea3cc330a   Benjamin Herrenschmidt   powerpc/mm: Clean...
492
  	li	r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
493
  #endif
6cfd8990e   Kumar Gala   powerpc: rework F...
494

78e2e68a2   Li Yang   powerpc/fsl-booke...
495
  4:
14cf11af6   Paul Mackerras   powerpc: Merge en...
496
  	FIND_PTE
6cfd8990e   Kumar Gala   powerpc: rework F...
497
  	andc.	r13,r13,r11		/* Check permission */
b38fd42ff   Kumar Gala   powerpc/fsl-booke...
498
499
500
  
  #ifdef CONFIG_PTE_64BIT
  #ifdef CONFIG_SMP
41151e77a   Becky Bruce   powerpc: Hugetlb ...
501
502
  	subf	r13,r11,r12		/* create false data dep */
  	lwzx	r13,r11,r13		/* Get upper pte bits */
b38fd42ff   Kumar Gala   powerpc/fsl-booke...
503
504
505
506
  #else
  	lwz	r13,0(r12)		/* Get upper pte bits */
  #endif
  #endif
6cfd8990e   Kumar Gala   powerpc: rework F...
507
  	bne	2f			/* Bail if permission mismach */
14cf11af6   Paul Mackerras   powerpc: Merge en...
508

14cf11af6   Paul Mackerras   powerpc: Merge en...
509
510
511
512
513
514
515
  	/* Jump to common TLB load point */
  	b	finish_tlb_load
  
  2:
  	/* The bailout.  Restore registers to pre-exception conditions
  	 * and call the heavyweights to help us out.
  	 */
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
516
517
  	mfspr	r10, SPRN_SPRG_THREAD
  	lwz	r11, THREAD_NORMSAVE(3)(r10)
14cf11af6   Paul Mackerras   powerpc: Merge en...
518
  	mtcr	r11
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
519
520
521
  	lwz	r13, THREAD_NORMSAVE(2)(r10)
  	lwz	r12, THREAD_NORMSAVE(1)(r10)
  	lwz	r11, THREAD_NORMSAVE(0)(r10)
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
522
  	mfspr	r10, SPRN_SPRG_RSCRATCH0
14cf11af6   Paul Mackerras   powerpc: Merge en...
523
524
525
526
527
528
529
  	b	InstructionStorage
  
  #ifdef CONFIG_SPE
  	/* SPE Unavailable */
  	START_EXCEPTION(SPEUnavailable)
  	NORMAL_EXCEPTION_PROLOG
  	bne	load_up_spe
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
530
  	addi	r3,r1,STACK_FRAME_OVERHEAD
14cf11af6   Paul Mackerras   powerpc: Merge en...
531
532
  	EXC_XFER_EE_LITE(0x2010, KernelSPE)
  #else
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
533
  	EXCEPTION(0x2020, SPEUnavailable, unknown_exception, EXC_XFER_EE)
14cf11af6   Paul Mackerras   powerpc: Merge en...
534
535
536
537
538
  #endif /* CONFIG_SPE */
  
  	/* SPE Floating Point Data */
  #ifdef CONFIG_SPE
  	EXCEPTION(0x2030, SPEFloatingPointData, SPEFloatingPointException, EXC_XFER_EE);
14cf11af6   Paul Mackerras   powerpc: Merge en...
539
540
  
  	/* SPE Floating Point Round */
6a800f36a   Liu Yu   powerpc: Add SPE/...
541
542
543
  	EXCEPTION(0x2050, SPEFloatingPointRound, SPEFloatingPointRoundException, EXC_XFER_EE)
  #else
  	EXCEPTION(0x2040, SPEFloatingPointData, unknown_exception, EXC_XFER_EE)
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
544
  	EXCEPTION(0x2050, SPEFloatingPointRound, unknown_exception, EXC_XFER_EE)
6a800f36a   Liu Yu   powerpc: Add SPE/...
545
  #endif /* CONFIG_SPE */
14cf11af6   Paul Mackerras   powerpc: Merge en...
546
547
  
  	/* Performance Monitor */
dc1c1ca3d   Stephen Rothwell   powerpc: merge id...
548
  	EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD)
14cf11af6   Paul Mackerras   powerpc: Merge en...
549

620165f97   Kumar Gala   powerpc: Add supp...
550
551
552
  	EXCEPTION(0x2070, Doorbell, doorbell_exception, EXC_XFER_STD)
  
  	CRITICAL_EXCEPTION(0x2080, CriticalDoorbell, unknown_exception)
14cf11af6   Paul Mackerras   powerpc: Merge en...
553
554
  
  	/* Debug Interrupt */
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
555
  	DEBUG_DEBUG_EXCEPTION
eb0cd5fd2   Kumar Gala   [POWERPC] Rework ...
556
  	DEBUG_CRIT_EXCEPTION
14cf11af6   Paul Mackerras   powerpc: Merge en...
557
558
559
560
  
  /*
   * Local functions
   */
14cf11af6   Paul Mackerras   powerpc: Merge en...
561
  /*
14cf11af6   Paul Mackerras   powerpc: Merge en...
562
563
   * Both the instruction and data TLB miss get to this
   * point to load the TLB.
41151e77a   Becky Bruce   powerpc: Hugetlb ...
564
   *	r10 - tsize encoding (if HUGETLB_PAGE) or available to use
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
565
   *	r11 - TLB (info from Linux PTE)
6cfd8990e   Kumar Gala   powerpc: rework F...
566
567
   *	r12 - available to use
   *	r13 - upper bits of PTE (if PTE_64BIT) or available to use
8a13c4f97   Kumar Gala   [POWERPC] Use PAG...
568
   *	CR5 - results of addr >= PAGE_OFFSET
14cf11af6   Paul Mackerras   powerpc: Merge en...
569
570
571
572
573
   *	MAS0, MAS1 - loaded with proper value when we get here
   *	MAS2, MAS3 - will need additional info from Linux PTE
   *	Upon exit, we reload everything and RFI.
   */
  finish_tlb_load:
41151e77a   Becky Bruce   powerpc: Hugetlb ...
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
  #ifdef CONFIG_HUGETLB_PAGE
  	cmpwi	6, r10, 0			/* check for huge page */
  	beq	6, finish_tlb_load_cont    	/* !huge */
  
  	/* Alas, we need more scratch registers for hugepages */
  	mfspr	r12, SPRN_SPRG_THREAD
  	stw	r14, THREAD_NORMSAVE(4)(r12)
  	stw	r15, THREAD_NORMSAVE(5)(r12)
  	stw	r16, THREAD_NORMSAVE(6)(r12)
  	stw	r17, THREAD_NORMSAVE(7)(r12)
  
  	/* Get the next_tlbcam_idx percpu var */
  #ifdef CONFIG_SMP
  	lwz	r12, THREAD_INFO-THREAD(r12)
  	lwz	r15, TI_CPU(r12)
  	lis     r14, __per_cpu_offset@h
  	ori     r14, r14, __per_cpu_offset@l
  	rlwinm  r15, r15, 2, 0, 29
  	lwzx    r16, r14, r15
  #else
  	li	r16, 0
  #endif
  	lis     r17, next_tlbcam_idx@h
  	ori	r17, r17, next_tlbcam_idx@l
  	add	r17, r17, r16			/* r17 = *next_tlbcam_idx */
  	lwz     r15, 0(r17)			/* r15 = next_tlbcam_idx */
  
  	lis	r14, MAS0_TLBSEL(1)@h		/* select TLB1 (TLBCAM) */
  	rlwimi	r14, r15, 16, 4, 15		/* next_tlbcam_idx entry */
  	mtspr	SPRN_MAS0, r14
  
  	/* Extract TLB1CFG(NENTRY) */
  	mfspr	r16, SPRN_TLB1CFG
  	andi.	r16, r16, 0xfff
  
  	/* Update next_tlbcam_idx, wrapping when necessary */
  	addi	r15, r15, 1
  	cmpw	r15, r16
  	blt 	100f
  	lis	r14, tlbcam_index@h
  	ori	r14, r14, tlbcam_index@l
  	lwz	r15, 0(r14)
  100:	stw	r15, 0(r17)
  
  	/*
  	 * Calc MAS1_TSIZE from r10 (which has pshift encoded)
  	 * tlb_enc = (pshift - 10).
  	 */
  	subi	r15, r10, 10
  	mfspr	r16, SPRN_MAS1
  	rlwimi	r16, r15, 7, 20, 24
  	mtspr	SPRN_MAS1, r16
  
  	/* copy the pshift for use later */
  	mr	r14, r10
  
  	/* fall through */
  
  #endif /* CONFIG_HUGETLB_PAGE */
14cf11af6   Paul Mackerras   powerpc: Merge en...
633
634
635
636
637
638
  	/*
  	 * We set execute, because we don't have the granularity to
  	 * properly set this at the page level (Linux problem).
  	 * Many of these bits are software only.  Bits we don't set
  	 * here we (properly should) assume have the appropriate value.
  	 */
41151e77a   Becky Bruce   powerpc: Hugetlb ...
639
  finish_tlb_load_cont:
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
640
641
642
643
644
645
646
647
  #ifdef CONFIG_PTE_64BIT
  	rlwinm	r12, r11, 32-2, 26, 31	/* Move in perm bits */
  	andi.	r10, r11, _PAGE_DIRTY
  	bne	1f
  	li	r10, MAS3_SW | MAS3_UW
  	andc	r12, r12, r10
  1:	rlwimi	r12, r13, 20, 0, 11	/* grab RPN[32:43] */
  	rlwimi	r12, r11, 20, 12, 19	/* grab RPN[44:51] */
41151e77a   Becky Bruce   powerpc: Hugetlb ...
648
  2:	mtspr	SPRN_MAS3, r12
76acc2c1a   Kumar Gala   powerpc/fsl-booke...
649
650
651
652
653
  BEGIN_MMU_FTR_SECTION
  	srwi	r10, r13, 12		/* grab RPN[12:31] */
  	mtspr	SPRN_MAS7, r10
  END_MMU_FTR_SECTION_IFSET(MMU_FTR_BIG_PHYS)
  #else
ea3cc330a   Benjamin Herrenschmidt   powerpc/mm: Clean...
654
  	li	r10, (_PAGE_EXEC | _PAGE_PRESENT)
41151e77a   Becky Bruce   powerpc: Hugetlb ...
655
  	mr	r13, r11
6cfd8990e   Kumar Gala   powerpc: rework F...
656
657
  	rlwimi	r10, r11, 31, 29, 29	/* extract _PAGE_DIRTY into SW */
  	and	r12, r11, r10
14cf11af6   Paul Mackerras   powerpc: Merge en...
658
  	andi.	r10, r11, _PAGE_USER	/* Test for _PAGE_USER */
6cfd8990e   Kumar Gala   powerpc: rework F...
659
660
661
  	slwi	r10, r12, 1
  	or	r10, r10, r12
  	iseleq	r12, r12, r10
41151e77a   Becky Bruce   powerpc: Hugetlb ...
662
663
  	rlwimi	r13, r12, 0, 20, 31	/* Get RPN from PTE, merge w/ perms */
  	mtspr	SPRN_MAS3, r13
14cf11af6   Paul Mackerras   powerpc: Merge en...
664
  #endif
41151e77a   Becky Bruce   powerpc: Hugetlb ...
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
  
  	mfspr	r12, SPRN_MAS2
  #ifdef CONFIG_PTE_64BIT
  	rlwimi	r12, r11, 32-19, 27, 31	/* extract WIMGE from pte */
  #else
  	rlwimi	r12, r11, 26, 27, 31	/* extract WIMGE from pte */
  #endif
  #ifdef CONFIG_HUGETLB_PAGE
  	beq	6, 3f			/* don't mask if page isn't huge */
  	li	r13, 1
  	slw	r13, r13, r14
  	subi	r13, r13, 1
  	rlwinm	r13, r13, 0, 0, 19	/* bottom bits used for WIMGE/etc */
  	andc	r12, r12, r13		/* mask off ea bits within the page */
  #endif
  3:	mtspr	SPRN_MAS2, r12
14cf11af6   Paul Mackerras   powerpc: Merge en...
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
  #ifdef CONFIG_E200
  	/* Round robin TLB1 entries assignment */
  	mfspr	r12, SPRN_MAS0
  
  	/* Extract TLB1CFG(NENTRY) */
  	mfspr	r11, SPRN_TLB1CFG
  	andi.	r11, r11, 0xfff
  
  	/* Extract MAS0(NV) */
  	andi.	r13, r12, 0xfff
  	addi	r13, r13, 1
  	cmpw	0, r13, r11
  	addi	r12, r12, 1
  
  	/* check if we need to wrap */
  	blt	7f
  
  	/* wrap back to first free tlbcam entry */
  	lis	r13, tlbcam_index@ha
  	lwz	r13, tlbcam_index@l(r13)
  	rlwimi	r12, r13, 0, 20, 31
  7:
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
703
  	mtspr	SPRN_MAS0,r12
14cf11af6   Paul Mackerras   powerpc: Merge en...
704
  #endif /* CONFIG_E200 */
41151e77a   Becky Bruce   powerpc: Hugetlb ...
705
  tlb_write_entry:
14cf11af6   Paul Mackerras   powerpc: Merge en...
706
707
708
  	tlbwe
  
  	/* Done...restore registers and get out of here.  */
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
709
  	mfspr	r10, SPRN_SPRG_THREAD
41151e77a   Becky Bruce   powerpc: Hugetlb ...
710
711
712
713
714
715
716
717
  #ifdef CONFIG_HUGETLB_PAGE
  	beq	6, 8f /* skip restore for 4k page faults */
  	lwz	r14, THREAD_NORMSAVE(4)(r10)
  	lwz	r15, THREAD_NORMSAVE(5)(r10)
  	lwz	r16, THREAD_NORMSAVE(6)(r10)
  	lwz	r17, THREAD_NORMSAVE(7)(r10)
  #endif
  8:	lwz	r11, THREAD_NORMSAVE(3)(r10)
14cf11af6   Paul Mackerras   powerpc: Merge en...
718
  	mtcr	r11
1325a684b   Ashish Kalra   powerpc/85xx: Sav...
719
720
721
  	lwz	r13, THREAD_NORMSAVE(2)(r10)
  	lwz	r12, THREAD_NORMSAVE(1)(r10)
  	lwz	r11, THREAD_NORMSAVE(0)(r10)
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
722
  	mfspr	r10, SPRN_SPRG_RSCRATCH0
14cf11af6   Paul Mackerras   powerpc: Merge en...
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
  	rfi					/* Force context change */
  
  #ifdef CONFIG_SPE
  /* Note that the SPE support is closely modeled after the AltiVec
   * support.  Changes to one are likely to be applicable to the
   * other!  */
  load_up_spe:
  /*
   * Disable SPE for the task which had SPE previously,
   * and save its SPE registers in its thread_struct.
   * Enables SPE for use in the kernel on return.
   * On SMP we know the SPE units are free, since we give it up every
   * switch.  -- Kumar
   */
  	mfmsr	r5
  	oris	r5,r5,MSR_SPE@h
  	mtmsr	r5			/* enable use of SPE now */
  	isync
  /*
   * For SMP, we don't do lazy SPE switching because it just gets too
   * horrendously complex, especially when a task switches from one CPU
   * to another.  Instead we call giveup_spe in switch_to.
   */
  #ifndef CONFIG_SMP
  	lis	r3,last_task_used_spe@ha
  	lwz	r4,last_task_used_spe@l(r3)
  	cmpi	0,r4,0
  	beq	1f
  	addi	r4,r4,THREAD	/* want THREAD of last_task_used_spe */
c51584d52   Scott Wood   powerpc/e500: SPE...
752
  	SAVE_32EVRS(0,r10,r4,THREAD_EVR0)
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
753
  	evxor	evr10, evr10, evr10	/* clear out evr10 */
14cf11af6   Paul Mackerras   powerpc: Merge en...
754
755
  	evmwumiaa evr10, evr10, evr10	/* evr10 <- ACC = 0 * 0 + ACC */
  	li	r5,THREAD_ACC
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
756
  	evstddx	evr10, r4, r5		/* save off accumulator */
14cf11af6   Paul Mackerras   powerpc: Merge en...
757
758
759
760
761
762
  	lwz	r5,PT_REGS(r4)
  	lwz	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
  	lis	r10,MSR_SPE@h
  	andc	r4,r4,r10	/* disable SPE for previous task */
  	stw	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
  1:
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
763
  #endif /* !CONFIG_SMP */
14cf11af6   Paul Mackerras   powerpc: Merge en...
764
765
  	/* enable use of SPE after return */
  	oris	r9,r9,MSR_SPE@h
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
766
  	mfspr	r5,SPRN_SPRG_THREAD	/* current task's THREAD (phys) */
14cf11af6   Paul Mackerras   powerpc: Merge en...
767
768
769
770
771
  	li	r4,1
  	li	r10,THREAD_ACC
  	stw	r4,THREAD_USED_SPE(r5)
  	evlddx	evr4,r10,r5
  	evmra	evr4,evr4
c51584d52   Scott Wood   powerpc/e500: SPE...
772
  	REST_32EVRS(0,r10,r5,THREAD_EVR0)
14cf11af6   Paul Mackerras   powerpc: Merge en...
773
774
775
  #ifndef CONFIG_SMP
  	subi	r4,r5,THREAD
  	stw	r4,last_task_used_spe@l(r3)
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
776
  #endif /* !CONFIG_SMP */
14cf11af6   Paul Mackerras   powerpc: Merge en...
777
778
779
780
781
782
783
784
785
786
787
788
789
  	/* restore registers and return */
  2:	REST_4GPRS(3, r11)
  	lwz	r10,_CCR(r11)
  	REST_GPR(1, r11)
  	mtcr	r10
  	lwz	r10,_LINK(r11)
  	mtlr	r10
  	REST_GPR(10, r11)
  	mtspr	SPRN_SRR1,r9
  	mtspr	SPRN_SRR0,r12
  	REST_GPR(9, r11)
  	REST_GPR(12, r11)
  	lwz	r11,GPR11(r11)
14cf11af6   Paul Mackerras   powerpc: Merge en...
790
791
792
793
794
795
796
797
798
799
  	rfi
  
  /*
   * SPE unavailable trap from kernel - print a message, but let
   * the task use SPE in the kernel until it returns to user mode.
   */
  KernelSPE:
  	lwz	r3,_MSR(r1)
  	oris	r3,r3,MSR_SPE@h
  	stw	r3,_MSR(r1)	/* enable use of SPE after return */
09156a7a4   Márton Németh   powerpc: Do not c...
800
  #ifdef CONFIG_PRINTK
14cf11af6   Paul Mackerras   powerpc: Merge en...
801
802
803
804
805
  	lis	r3,87f@h
  	ori	r3,r3,87f@l
  	mr	r4,r2		/* current */
  	lwz	r5,_NIP(r1)
  	bl	printk
09156a7a4   Márton Németh   powerpc: Do not c...
806
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
807
  	b	ret_from_except
09156a7a4   Márton Németh   powerpc: Do not c...
808
  #ifdef CONFIG_PRINTK
14cf11af6   Paul Mackerras   powerpc: Merge en...
809
810
  87:	.string	"SPE used in kernel  (task=%p, pc=%x)  
  "
09156a7a4   Márton Németh   powerpc: Do not c...
811
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
812
813
814
815
816
817
818
  	.align	4,0
  
  #endif /* CONFIG_SPE */
  
  /*
   * Global functions
   */
105c31df6   Kumar Gala   powerpc/fsl-booke...
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
  /* Adjust or setup IVORs for e200 */
  _GLOBAL(__setup_e200_ivors)
  	li	r3,DebugDebug@l
  	mtspr	SPRN_IVOR15,r3
  	li	r3,SPEUnavailable@l
  	mtspr	SPRN_IVOR32,r3
  	li	r3,SPEFloatingPointData@l
  	mtspr	SPRN_IVOR33,r3
  	li	r3,SPEFloatingPointRound@l
  	mtspr	SPRN_IVOR34,r3
  	sync
  	blr
  
  /* Adjust or setup IVORs for e500v1/v2 */
  _GLOBAL(__setup_e500_ivors)
  	li	r3,DebugCrit@l
  	mtspr	SPRN_IVOR15,r3
  	li	r3,SPEUnavailable@l
  	mtspr	SPRN_IVOR32,r3
  	li	r3,SPEFloatingPointData@l
  	mtspr	SPRN_IVOR33,r3
  	li	r3,SPEFloatingPointRound@l
  	mtspr	SPRN_IVOR34,r3
  	li	r3,PerformanceMonitor@l
  	mtspr	SPRN_IVOR35,r3
  	sync
  	blr
  
  /* Adjust or setup IVORs for e500mc */
  _GLOBAL(__setup_e500mc_ivors)
  	li	r3,DebugDebug@l
  	mtspr	SPRN_IVOR15,r3
  	li	r3,PerformanceMonitor@l
  	mtspr	SPRN_IVOR35,r3
  	li	r3,Doorbell@l
  	mtspr	SPRN_IVOR36,r3
620165f97   Kumar Gala   powerpc: Add supp...
855
856
  	li	r3,CriticalDoorbell@l
  	mtspr	SPRN_IVOR37,r3
105c31df6   Kumar Gala   powerpc/fsl-booke...
857
858
  	sync
  	blr
14cf11af6   Paul Mackerras   powerpc: Merge en...
859
  /*
14cf11af6   Paul Mackerras   powerpc: Merge en...
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
   * extern void giveup_altivec(struct task_struct *prev)
   *
   * The e500 core does not have an AltiVec unit.
   */
  _GLOBAL(giveup_altivec)
  	blr
  
  #ifdef CONFIG_SPE
  /*
   * extern void giveup_spe(struct task_struct *prev)
   *
   */
  _GLOBAL(giveup_spe)
  	mfmsr	r5
  	oris	r5,r5,MSR_SPE@h
14cf11af6   Paul Mackerras   powerpc: Merge en...
875
876
877
878
879
880
881
  	mtmsr	r5			/* enable use of SPE now */
  	isync
  	cmpi	0,r3,0
  	beqlr-				/* if no previous owner, done */
  	addi	r3,r3,THREAD		/* want THREAD of task */
  	lwz	r5,PT_REGS(r3)
  	cmpi	0,r5,0
c51584d52   Scott Wood   powerpc/e500: SPE...
882
  	SAVE_32EVRS(0, r4, r3, THREAD_EVR0)
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
883
  	evxor	evr6, evr6, evr6	/* clear out evr6 */
14cf11af6   Paul Mackerras   powerpc: Merge en...
884
885
  	evmwumiaa evr6, evr6, evr6	/* evr6 <- ACC = 0 * 0 + ACC */
  	li	r4,THREAD_ACC
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
886
  	evstddx	evr6, r4, r3		/* save off accumulator */
14cf11af6   Paul Mackerras   powerpc: Merge en...
887
888
889
890
891
892
893
894
895
896
  	beq	1f
  	lwz	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
  	lis	r3,MSR_SPE@h
  	andc	r4,r4,r3		/* disable SPE for previous task */
  	stw	r4,_MSR-STACK_FRAME_OVERHEAD(r5)
  1:
  #ifndef CONFIG_SMP
  	li	r5,0
  	lis	r4,last_task_used_spe@ha
  	stw	r5,last_task_used_spe@l(r4)
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
897
  #endif /* !CONFIG_SMP */
14cf11af6   Paul Mackerras   powerpc: Merge en...
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
  	blr
  #endif /* CONFIG_SPE */
  
  /*
   * extern void giveup_fpu(struct task_struct *prev)
   *
   * Not all FSL Book-E cores have an FPU
   */
  #ifndef CONFIG_PPC_FPU
  _GLOBAL(giveup_fpu)
  	blr
  #endif
  
  /*
   * extern void abort(void)
   *
   * At present, this routine just applies a system reset.
   */
  _GLOBAL(abort)
  	li	r13,0
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
918
  	mtspr	SPRN_DBCR0,r13		/* disable all debug events */
a7cb03375   Becky Bruce   [PATCH] powerpc/p...
919
  	isync
14cf11af6   Paul Mackerras   powerpc: Merge en...
920
921
922
  	mfmsr	r13
  	ori	r13,r13,MSR_DE@l	/* Enable Debug Events */
  	mtmsr	r13
a7cb03375   Becky Bruce   [PATCH] powerpc/p...
923
  	isync
3c5df5c26   Kumar Gala   [POWERPC] Cleaned...
924
925
926
  	mfspr	r13,SPRN_DBCR0
  	lis	r13,(DBCR0_IDM|DBCR0_RST_CHIP)@h
  	mtspr	SPRN_DBCR0,r13
a7cb03375   Becky Bruce   [PATCH] powerpc/p...
927
  	isync
14cf11af6   Paul Mackerras   powerpc: Merge en...
928
929
930
931
932
933
934
935
936
937
938
939
940
941
  
  _GLOBAL(set_context)
  
  #ifdef CONFIG_BDI_SWITCH
  	/* Context switch the PTE pointer for the Abatron BDI2000.
  	 * The PGDIR is the second parameter.
  	 */
  	lis	r5, abatron_pteptrs@h
  	ori	r5, r5, abatron_pteptrs@l
  	stw	r4, 0x4(r5)
  #endif
  	mtspr	SPRN_PID,r3
  	isync			/* Force context change */
  	blr
fc4033b2f   Kumar Gala   powerpc/85xx: add...
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
  _GLOBAL(flush_dcache_L1)
  	mfspr	r3,SPRN_L1CFG0
  
  	rlwinm	r5,r3,9,3	/* Extract cache block size */
  	twlgti	r5,1		/* Only 32 and 64 byte cache blocks
  				 * are currently defined.
  				 */
  	li	r4,32
  	subfic	r6,r5,2		/* r6 = log2(1KiB / cache block size) -
  				 *      log2(number of ways)
  				 */
  	slw	r5,r4,r5	/* r5 = cache block size */
  
  	rlwinm	r7,r3,0,0xff	/* Extract number of KiB in the cache */
  	mulli	r7,r7,13	/* An 8-way cache will require 13
  				 * loads per set.
  				 */
  	slw	r7,r7,r6
  
  	/* save off HID0 and set DCFA */
  	mfspr	r8,SPRN_HID0
  	ori	r9,r8,HID0_DCFA@l
  	mtspr	SPRN_HID0,r9
  	isync
  
  	lis	r4,KERNELBASE@h
  	mtctr	r7
  
  1:	lwz	r3,0(r4)	/* Load... */
  	add	r4,r4,r5
  	bdnz	1b
  
  	msync
  	lis	r4,KERNELBASE@h
  	mtctr	r7
  
  1:	dcbf	0,r4		/* ...and flush. */
  	add	r4,r4,r5
  	bdnz	1b
  	
  	/* restore HID0 */
  	mtspr	SPRN_HID0,r8
  	isync
  
  	blr
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
  #ifdef CONFIG_SMP
  /* When we get here, r24 needs to hold the CPU # */
  	.globl __secondary_start
  __secondary_start:
  	lis	r3,__secondary_hold_acknowledge@h
  	ori	r3,r3,__secondary_hold_acknowledge@l
  	stw	r24,0(r3)
  
  	li	r3,0
  	mr	r4,r24		/* Why? */
  	bl	call_setup_cpu
  
  	lis	r3,tlbcam_index@ha
  	lwz	r3,tlbcam_index@l(r3)
  	mtctr	r3
  	li	r26,0		/* r26 safe? */
  
  	/* Load each CAM entry */
  1:	mr	r3,r26
  	bl	loadcam_entry
  	addi	r26,r26,1
  	bdnz	1b
  
  	/* get current_thread_info and current */
  	lis	r1,secondary_ti@ha
  	lwz	r1,secondary_ti@l(r1)
  	lwz	r2,TI_TASK(r1)
  
  	/* stack */
  	addi	r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
  	li	r0,0
  	stw	r0,0(r1)
  
  	/* ptr to current thread */
  	addi	r4,r2,THREAD	/* address of our thread_struct */
ee43eb788   Benjamin Herrenschmidt   powerpc: Use name...
1022
  	mtspr	SPRN_SPRG_THREAD,r4
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
1023
1024
  
  	/* Setup the defaults for TLB entries */
d66c82ea4   Kumar Gala   powerpc/fsl-booke...
1025
  	li	r4,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l
d5b26db2c   Kumar Gala   powerpc/85xx: Add...
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
  	mtspr	SPRN_MAS4,r4
  
  	/* Jump to start_secondary */
  	lis	r4,MSR_KERNEL@h
  	ori	r4,r4,MSR_KERNEL@l
  	lis	r3,start_secondary@h
  	ori	r3,r3,start_secondary@l
  	mtspr	SPRN_SRR0,r3
  	mtspr	SPRN_SRR1,r4
  	sync
  	rfi
  	sync
  
  	.globl __secondary_hold_acknowledge
  __secondary_hold_acknowledge:
  	.long	-1
  #endif
14cf11af6   Paul Mackerras   powerpc: Merge en...
1043
1044
1045
1046
1047
  /*
   * We put a few things here that have to be page-aligned. This stuff
   * goes at the beginning of the data segment, which is page-aligned.
   */
  	.data
ea703ce20   Kumar Gala   [PATCH] powerpc: ...
1048
1049
1050
1051
1052
  	.align	12
  	.globl	sdata
  sdata:
  	.globl	empty_zero_page
  empty_zero_page:
14cf11af6   Paul Mackerras   powerpc: Merge en...
1053
  	.space	4096
ea703ce20   Kumar Gala   [PATCH] powerpc: ...
1054
1055
  	.globl	swapper_pg_dir
  swapper_pg_dir:
bee86f14d   Kumar Gala   [POWERPC] Fix swa...
1056
  	.space	PGD_TABLE_SIZE
14cf11af6   Paul Mackerras   powerpc: Merge en...
1057

14cf11af6   Paul Mackerras   powerpc: Merge en...
1058
  /*
14cf11af6   Paul Mackerras   powerpc: Merge en...
1059
1060
1061
1062
1063
   * Room for two PTE pointers, usually the kernel and current user pointers
   * to their respective root page table.
   */
  abatron_pteptrs:
  	.space	8