patch-2.4.0-test3 linux/arch/mips64/kernel/head.S

Next file: linux/arch/mips64/kernel/ioctl32.c
Previous file: linux/arch/mips64/kernel/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test2/linux/arch/mips64/kernel/head.S linux/arch/mips64/kernel/head.S
@@ -1,5 +1,4 @@
-/* $Id: head.S,v 1.6 2000/03/27 21:05:04 ulfc Exp $
- *
+/*
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
@@ -19,15 +18,69 @@
 #include <asm/processor.h>
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
+#include <asm/pgtable.h>
+#include <asm/sn/addrs.h>
+#include <asm/sn/sn0/hubni.h>
+#include <asm/sn/klkernvars.h>
+
+	.macro	ARC64_TWIDDLE_PC
+#if defined(CONFIG_ARC64) || defined(CONFIG_MAPPED_KERNEL)
+	/* We get launched at a XKPHYS address but the kernel is linked to
+	   run at a KSEG0 address, so jump there.  */
+	la	t0, \@f
+	jr	t0
+\@:
+#endif
+	.endm
 
-#define ARC64_TWIDDLE_PC \
-#ifdef CONFIG_ARC64 \
-	/* We get launched at a XKPHYS address but the kernel is linked to \
-	   run at a KSEG0 address, so jump there.  */ \
-	la	t0, 1f \
-	jr	t0 \
-1: \
+	/*
+	 * outputs the local nasid into t1.
+	 */
+	.macro GET_NASID_ASM
+	dli	t1, LOCAL_HUB_ADDR(NI_STATUS_REV_ID)
+	ld	t1, (t1)
+	and	t1, NSRI_NODEID_MASK
+	dsrl	t1, NSRI_NODEID_SHFT
+	.endm
+
+	/*
+	 * inputs are the text nasid in t1, data nasid in t2.
+	 */
+	.macro MAPPED_KERNEL_SETUP_TLB
+#ifdef CONFIG_MAPPED_KERNEL
+	/*
+	 * This needs to read the nasid - assume 0 for now.
+	 * Drop in 0xffffffffc0000000 in tlbhi, 0+VG in tlblo_0,
+	 * 0+DVG in tlblo_1.
+	 */
+	dli	t0, 0xffffffffc0000000
+	dmtc0	t0, CP0_ENTRYHI
+	li	t0, 0x1c000		# Offset of text into node memory
+	dsll	t1, NASID_SHFT		# Shift text nasid into place
+	dsll	t2, NASID_SHFT		# Same for data nasid
+	or	t1, t1, t0		# Physical load address of kernel text
+	or	t2, t2, t0		# Physical load address of kernel data
+	dsrl	t1, 12			# 4K pfn
+	dsrl	t2, 12			# 4K pfn
+	dsll	t1, 6			# Get pfn into place
+	dsll	t2, 6			# Get pfn into place
+	li	t0, ((_PAGE_GLOBAL|_PAGE_VALID| _CACHE_CACHABLE_COW) >> 6)
+	or	t0, t0, t1
+	mtc0	t0, CP0_ENTRYLO0	# physaddr, VG, cach exlwr
+	li	t0, ((_PAGE_GLOBAL|_PAGE_VALID| _PAGE_DIRTY|_CACHE_CACHABLE_COW) >> 6)
+	or	t0, t0, t2
+	mtc0	t0, CP0_ENTRYLO1	# physaddr, DVG, cach exlwr
+	li	t0, 0x1ffe000		# MAPPED_KERN_TLBMASK, TLBPGMASK_16M
+	mtc0	t0, CP0_PAGEMASK
+	li	t0, 0			# KMAP_INX
+	mtc0	t0, CP0_INDEX
+	li	t0, 1
+	mtc0	t0, CP0_WIRED
+	tlbwi
+#else
+	mtc0	zero, CP0_WIRED
 #endif
+	.endm
 
 	.text
 
@@ -38,11 +91,15 @@
 
 NESTED(kernel_entry, 16, sp)			# kernel entry point
 
-	ARC64_TWIDDLE_PC
-
 	ori	sp, 0xf				# align stack on 16 byte.
 	xori	sp, 0xf
 
+	GET_NASID_ASM
+	move	t2, t1				# text and data are here
+	MAPPED_KERNEL_SETUP_TLB
+
+	ARC64_TWIDDLE_PC
+
 	/* Note that all firmware passed argument registers still
 	   have their values.  */
 	jal	prom_init			# initialize firmware
@@ -75,6 +132,14 @@
 	END(kernel_entry)
 
 NESTED(bootstrap, 16, sp)
+	GET_NASID_ASM
+	li	t0, KLDIR_OFFSET + (KLI_KERN_VARS * KLDIR_ENT_SIZE) + KLDIR_OFF_POINTER + K0BASE
+	dsll	t1, NASID_SHFT
+	or	t0, t0, t1
+	ld	t0, 0(t0)			# t0 points to kern_vars struct
+	lh	t1, KV_RO_NASID_OFFSET(t0)
+	lh	t2, KV_RW_NASID_OFFSET(t0)
+	MAPPED_KERNEL_SETUP_TLB
 	ARC64_TWIDDLE_PC
 	CLI
 	mfc0	t0, CP0_STATUS
@@ -89,20 +154,25 @@
 
 	.comm	kernelsp, 8, 8			# current stackpointer
 
+#undef PAGE_SIZE
 #define PAGE_SIZE	0x1000
 
 	.macro	page name, order=0
 	.globl	\name
-	.org	. + (PAGE_SIZE << \order)
 \name:	.size	\name, (PAGE_SIZE << \order)
+	.org	. + (PAGE_SIZE << \order)
 	.type	\name, @object
 	.endm
 
-	.align	12
 	.data
+	.align	12
 
 	page	swapper_pg_dir, 1
-	page	invalid_pte_table, 1
+	page	invalid_pte_table, 0
 	page	invalid_pmd_table, 1
-	page	empty_bad_page_table, 1
-	page	empty_bad_page
+	page	empty_bad_page_table, 0
+	page	empty_bad_pmd_table, 1
+	page	kptbl, KPTBL_PAGE_ORDER
+	.globl	ekptbl
+	page	kpmdtbl, 0
+ekptbl:

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)