svn commit: r219555 - in projects/altix/sys: conf ia64/ia64 ia64/include

Marcel Moolenaar marcel at FreeBSD.org
Sat Mar 12 02:00:29 UTC 2011


Author: marcel
Date: Sat Mar 12 02:00:28 2011
New Revision: 219555
URL: http://svn.freebsd.org/changeset/base/219555

Log:
  First cut at having the kernel run within the PBVM:
  o   The bootinfo structure is now a virtual pointer.
  o   Replace VM_MAX_ADDRESS with VM_MAXUSER_ADDRESS and redefine
      VM_MAX_ADDRESS as the maximum address possible (~0UL).
  o   Since we're not using direct-mapped translations, switching
      to physical addressing is less trivial. Reserve the boot stack
      for running in physical mode and special-case the EFI call,
      as we're still on the boot stack.
  o   Region 4 belongs to the kernel now, not process space.

Added:
  projects/altix/sys/ia64/ia64/firmware.S   (contents, props changed)
Modified:
  projects/altix/sys/conf/files.ia64
  projects/altix/sys/ia64/ia64/autoconf.c
  projects/altix/sys/ia64/ia64/efi.c
  projects/altix/sys/ia64/ia64/genassym.c
  projects/altix/sys/ia64/ia64/locore.S
  projects/altix/sys/ia64/ia64/machdep.c
  projects/altix/sys/ia64/ia64/pal.S
  projects/altix/sys/ia64/ia64/pmap.c
  projects/altix/sys/ia64/ia64/support.S
  projects/altix/sys/ia64/ia64/trap.c
  projects/altix/sys/ia64/ia64/unaligned.c
  projects/altix/sys/ia64/include/bootinfo.h
  projects/altix/sys/ia64/include/efi.h
  projects/altix/sys/ia64/include/pal.h
  projects/altix/sys/ia64/include/vmparam.h

Modified: projects/altix/sys/conf/files.ia64
==============================================================================
--- projects/altix/sys/conf/files.ia64	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/conf/files.ia64	Sat Mar 12 02:00:28 2011	(r219555)
@@ -84,6 +84,7 @@ ia64/ia64/efi.c			standard
 ia64/ia64/elf_machdep.c		standard
 ia64/ia64/emulate.c		standard
 ia64/ia64/exception.S		standard
+ia64/ia64/firmware.S		standard
 ia64/ia64/gdb_machdep.c		optional	gdb
 ia64/ia64/highfp.c		standard
 ia64/ia64/in_cksum.c		optional	inet

Modified: projects/altix/sys/ia64/ia64/autoconf.c
==============================================================================
--- projects/altix/sys/ia64/ia64/autoconf.c	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/autoconf.c	Sat Mar 12 02:00:28 2011	(r219555)
@@ -38,7 +38,6 @@
 #include <sys/bus.h>
 #include <sys/cons.h>
 
-#include <machine/bootinfo.h>
 #include <machine/intr.h>
 #include <machine/md_var.h>
 

Modified: projects/altix/sys/ia64/ia64/efi.c
==============================================================================
--- projects/altix/sys/ia64/ia64/efi.c	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/efi.c	Sat Mar 12 02:00:28 2011	(r219555)
@@ -32,13 +32,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <machine/bootinfo.h>
 #include <machine/efi.h>
+#include <machine/md_var.h>
 #include <machine/sal.h>
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
-extern uint64_t ia64_call_efi_physical(uint64_t, uint64_t, uint64_t, uint64_t,
-    uint64_t, uint64_t);
-
 static struct efi_systbl *efi_systbl;
 static struct efi_cfgtbl *efi_cfgtbl;
 static struct efi_rt *efi_runtime;
@@ -96,6 +94,7 @@ efi_boot_finish(void)
 int
 efi_boot_minimal(uint64_t systbl)
 {
+	ia64_efi_f setvirt;
 	struct efi_md *md;
 	efi_status status;
 
@@ -121,18 +120,16 @@ efi_boot_minimal(uint64_t systbl)
 	md = efi_md_first();
 	while (md != NULL) {
 		if (md->md_attr & EFI_MD_ATTR_RT) {
-			if (md->md_attr & EFI_MD_ATTR_WB)
-				md->md_virt =
-				    (void *)IA64_PHYS_TO_RR7(md->md_phys);
-			else if (md->md_attr & EFI_MD_ATTR_UC)
-				md->md_virt = pmap_mapdev(md->md_phys,
-				    md->md_pages * EFI_PAGE_SIZE);
+			md->md_virt = (md->md_attr & EFI_MD_ATTR_WB) ?
+			    (void *)IA64_PHYS_TO_RR7(md->md_phys) :
+			    (void *)IA64_PHYS_TO_RR6(md->md_phys);
 		}
 		md = efi_md_next(md);
 	}
-	status = ia64_call_efi_physical((uint64_t)efi_runtime->rt_setvirtual,
-	    bootinfo.bi_memmap_size, bootinfo.bi_memdesc_size,
-	    bootinfo.bi_memdesc_version, bootinfo.bi_memmap, 0);
+	setvirt = (void *)IA64_PHYS_TO_RR7((u_long)efi_runtime->rt_setvirtual);
+	status = ia64_efi_physical(setvirt, bootinfo->bi_memmap_size,
+	    bootinfo->bi_memdesc_size, bootinfo->bi_memdesc_version,
+	    ia64_tpa(bootinfo->bi_memmap));
 	return ((status < 0) ? EFAULT : 0);
 }
 
@@ -165,9 +162,9 @@ struct efi_md *
 efi_md_first(void)
 {
 
-	if (bootinfo.bi_memmap == 0)
+	if (bootinfo->bi_memmap == 0)
 		return (NULL);
-	return ((struct efi_md *)IA64_PHYS_TO_RR7(bootinfo.bi_memmap));
+	return ((struct efi_md *)bootinfo->bi_memmap);
 }
 
 struct efi_md *
@@ -175,8 +172,8 @@ efi_md_next(struct efi_md *md)
 {
 	uint64_t plim;
 
-	plim = IA64_PHYS_TO_RR7(bootinfo.bi_memmap + bootinfo.bi_memmap_size);
-	md = (struct efi_md *)((uintptr_t)md + bootinfo.bi_memdesc_size);
+	plim = bootinfo->bi_memmap + bootinfo->bi_memmap_size;
+	md = (struct efi_md *)((uintptr_t)md + bootinfo->bi_memdesc_size);
 	return ((md >= (struct efi_md *)plim) ? NULL : md);
 }
 

Added: projects/altix/sys/ia64/ia64/firmware.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/altix/sys/ia64/ia64/firmware.S	Sat Mar 12 02:00:28 2011	(r219555)
@@ -0,0 +1,258 @@
+/*-
+ * Copyright (c) 2011 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <machine/asm.h>
+#include <machine/ia64_cpu.h>
+
+		.text
+
+/*
+ * u_long ia64_efi_physical(ia64_efi_f, u_long, u_long, u_long, u_long)
+ *
+ *	loc0 = ar.pfs
+ *	loc1 = rp
+ *	loc2 = psr
+ *	loc3 = sp
+ *	loc4 = bsp
+ *	loc5 = gp
+ */
+ENTRY(ia64_efi_physical, 5)
+		.prologue
+		.regstk 5,6,4,0
+		.save	ar.pfs,loc0
+		alloc	loc0=ar.pfs,5,6,4,0
+		;;
+		.save   rp,loc1
+		mov	loc1=rp
+		;;
+		.body
+		mov	loc2=psr		// save psr
+		movl	r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \
+			    IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH
+		;;
+		andcm	r14=loc2,r16
+		movl	r15=IA64_PSR_BN
+		;;
+		rsm	psr.i
+		mov	r17=ar.rsc
+		or	r16=r14,r15		// new psr
+		;;
+		mov	ar.rsc=0
+		or	loc2=loc2,r15
+		;;
+		flushrs
+		mov	loc3=sp			// save sp
+		;;
+		mov	loc4=ar.bsp		// save ar.bsp
+		mov	r18=ar.rnat
+		;;
+		tpa	r19=loc4		// new bspstore
+		mov	loc5=gp
+		;;
+		tpa	r20=loc3		// new sp
+		ld8	r21=[in0],8
+		;;
+1:
+		mov	r14=ip
+		;;
+		ld8	r22=[in0]
+		add	r15=2f-1b,r14
+		;;
+		tpa	r14=r15
+		;;
+		rsm	psr.ic
+		;;
+		srlz.i
+		;;
+		mov	cr.iip=r14
+		mov	cr.ifs=r0
+		mov	cr.ipsr=r16
+		;;
+		rfi
+2:
+		mov	ar.bspstore=r19
+		mov	sp=r20
+		;;
+		mov	ar.rnat=r18
+		mov	ar.rsc=r17
+		;;
+		mov	b6=r21
+		mov	gp=r22
+		mov	out0=in1
+		mov	out1=in2
+		mov	out2=in3
+		mov	out3=in4
+		;;
+		br.call.sptk.many	rp=b6
+		mov	gp=loc5
+		;;
+		rsm	psr.i | psr.ic
+		mov	r16=ar.rsc
+		;;
+		srlz.i
+		mov	ar.rsc=0
+		;;
+		flushrs
+		;;
+		mov	r17=ar.rnat
+		movl	r18=3f
+		;;
+		mov	cr.iip=r18
+		mov	cr.ifs=r0
+		mov	cr.ipsr=loc2
+		;;
+		rfi
+3:
+		mov	ar.bspstore=loc4
+		mov	sp=loc3
+		;;
+		mov	ar.rnat=r17
+		mov	ar.rsc=r16
+		;;
+		mov	rp=loc1
+		mov	ar.pfs=loc0
+		;;
+		br.ret.sptk.many	rp
+END(ia64_efi_physical)
+
+
+/*
+ * ia64_pal_ret ia64_pal_physical(ia64_fw_f, u_long, u_long, u_long, u_long)
+ *
+ *	loc0 = ar.pfs
+ *	loc1 = rp
+ *	loc2 = psr
+ *	loc3 = sp
+ *	loc4 = bsp
+ *	loc5 = gp
+ */
+ENTRY(ia64_pal_physical, 5)
+		.prologue
+		.regstk 5,6,4,0
+		.save	ar.pfs,loc0
+		alloc	loc0=ar.pfs,5,6,4,0
+		;;
+		.save   rp,loc1
+		mov	loc1=rp
+		;;
+		.body
+		mov	loc2=psr		// save psr
+		movl	r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \
+			    IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH
+		;;
+		andcm	r14=loc2,r16
+		movl	r15=IA64_PSR_BN
+		;;
+		rsm	psr.i
+		mov	r17=ar.rsc
+		or	r16=r14,r15		// new psr
+		;;
+		mov	ar.rsc=0
+		or	loc2=loc2,r15
+		;;
+		flushrs
+		mov	loc3=sp			// save sp
+		;;
+		mov	loc4=ar.bsp		// save ar.bsp
+		mov	r18=ar.rnat
+		;;
+		mov	loc5=gp
+		movl	r14=kstack
+		;;
+		tpa	r19=r14			// new bspstore
+		movl	r15=kstack_top
+		;;
+		tpa	r20=r15			// new sp
+		movl	r21=ia64_pal_entry
+		;;
+1:
+		mov	r14=ip
+		ld8	r22=[r21]
+		;;
+		tpa	r21=r22
+		add	r15=2f-1b,r14
+		;;
+		tpa	r14=r15
+		;;
+		rsm	psr.ic
+		;;
+		srlz.i
+		;;
+		mov	cr.iip=r14
+		mov	cr.ifs=r0
+		mov	cr.ipsr=r16
+		;;
+		rfi
+2:
+		mov	ar.bspstore=r19
+		add	sp=-16,r20
+		;;
+		mov	ar.rnat=r18
+		mov	ar.rsc=r17
+		;;
+		mov	b6=r21
+		mov	out0=in0
+		mov	out1=in1
+		mov	out2=in2
+		mov	out3=in3
+		// PAL static calls
+		mov	r28=in0
+		mov	r29=in1
+		mov	r30=in2
+		mov	r31=in3
+		br.call.sptk.many	rp=b6
+		mov	gp=loc5
+		;;
+		rsm	psr.i | psr.ic
+		mov	r16=ar.rsc
+		;;
+		srlz.i
+		mov	ar.rsc=0
+		;;
+		flushrs
+		;;
+		mov	r17=ar.rnat
+		movl	r18=3f
+		;;
+		mov	cr.iip=r18
+		mov	cr.ifs=r0
+		mov	cr.ipsr=loc2
+		;;
+		rfi
+3:
+		mov	ar.bspstore=loc4
+		mov	sp=loc3
+		;;
+		mov	ar.rnat=r17
+		mov	ar.rsc=r16
+		;;
+		mov	rp=loc1
+		mov	ar.pfs=loc0
+		;;
+		br.ret.sptk.many	rp
+END(ia64_pal_physical)

Modified: projects/altix/sys/ia64/ia64/genassym.c
==============================================================================
--- projects/altix/sys/ia64/ia64/genassym.c	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/genassym.c	Sat Mar 12 02:00:28 2011	(r219555)
@@ -77,8 +77,6 @@ ASSYM(ERESTART,		ERESTART);
 
 ASSYM(FRAME_SYSCALL,	FRAME_SYSCALL);
 
-ASSYM(IA64_ID_PAGE_SHIFT, IA64_ID_PAGE_SHIFT);
-
 ASSYM(KSTACK_PAGES,	KSTACK_PAGES);
 
 ASSYM(MC_PRESERVED,	offsetof(mcontext_t, mc_preserved));
@@ -116,4 +114,4 @@ ASSYM(TDF_NEEDRESCHED,	TDF_NEEDRESCHED);
 
 ASSYM(UC_MCONTEXT,	offsetof(ucontext_t, uc_mcontext));
 
-ASSYM(VM_MAX_ADDRESS,	VM_MAX_ADDRESS);
+ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS);

Modified: projects/altix/sys/ia64/ia64/locore.S
==============================================================================
--- projects/altix/sys/ia64/ia64/locore.S	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/locore.S	Sat Mar 12 02:00:28 2011	(r219555)
@@ -34,10 +34,15 @@
 #include <machine/intrcnt.h>
 #include <assym.s>
 
-	.section .data.proc0,"aw"
+#define	FW_STACK_SIZE	16384
+
+	.section .data.kstack, "aw"
+	.align	PAGE_SIZE
 	.global	kstack
+kstack:	.space	FW_STACK_SIZE
 	.align	PAGE_SIZE
-kstack:	.space KSTACK_PAGES * PAGE_SIZE
+	.global	kstack_top
+kstack_top:
 
 	.text
 
@@ -64,7 +69,7 @@ ENTRY_NOPROFILE(__start, 1)
 	srlz.i
 	;;
 	ssm	IA64_PSR_DFH
-	mov	r17=KSTACK_PAGES*PAGE_SIZE-SIZEOF_PCB-SIZEOF_TRAPFRAME-16
+	mov	r17=FW_STACK_SIZE-16
 	;;
 }
 {	.mlx
@@ -74,7 +79,7 @@ ENTRY_NOPROFILE(__start, 1)
 }
 {	.mlx
 	mov	ar.bspstore=r16		// switch backing store
-	movl	r16=pa_bootinfo
+	movl	r16=bootinfo
 	;;
 }
 {	.mmi
@@ -199,19 +204,25 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
 	srlz.d
 	rsm	IA64_PSR_IC|IA64_PSR_I
 	;;
+	mov     r16 = (4<<8)|(16<<2)
+	movl    r17 = 4<<61
+	;;
+	mov     rr[r17] = r16
+	;;
+	srlz.d
 	mov	r16 = (5<<8)|(PAGE_SHIFT<<2)|1
 	movl	r17 = 5<<61
 	;;
 	mov	rr[r17] = r16
 	;;
 	srlz.d
-	mov	r16 = (6<<8)|(IA64_ID_PAGE_SHIFT<<2)
+	mov	r16 = (6<<8)|(PAGE_SHIFT<<2)
 	movl	r17 = 6<<61
 	;;
 	mov	rr[r17] = r16
 	;;
 	srlz.d
-	mov	r16 = (7<<8)|(IA64_ID_PAGE_SHIFT<<2)
+	mov	r16 = (7<<8)|(PAGE_SHIFT<<2)
 	movl	r17 = 7<<61
 	;;
 	mov	rr[r17] = r16

Modified: projects/altix/sys/ia64/ia64/machdep.c
==============================================================================
--- projects/altix/sys/ia64/ia64/machdep.c	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/machdep.c	Sat Mar 12 02:00:28 2011	(r219555)
@@ -115,8 +115,7 @@ SYSCTL_UINT(_hw_freq, OID_AUTO, itc, CTL
 
 int cold = 1;
 
-u_int64_t pa_bootinfo;
-struct bootinfo bootinfo;
+struct bootinfo *bootinfo;
 
 struct pcpu pcpu0;
 
@@ -678,15 +677,15 @@ map_gateway_page(void)
 
 	pte = PTE_PRESENT | PTE_MA_WB | PTE_ACCESSED | PTE_DIRTY |
 	    PTE_PL_KERN | PTE_AR_X_RX;
-	pte |= (uint64_t)ia64_gateway_page & PTE_PPN_MASK;
+	pte |= ia64_tpa((uint64_t)ia64_gateway_page) & PTE_PPN_MASK;
 
 	__asm __volatile("ptr.d %0,%1; ptr.i %0,%1" ::
-	    "r"(VM_MAX_ADDRESS), "r"(PAGE_SHIFT << 2));
+	    "r"(VM_MAXUSER_ADDRESS), "r"(PAGE_SHIFT << 2));
 
 	__asm __volatile("mov	%0=psr" : "=r"(psr));
 	__asm __volatile("rsm	psr.ic|psr.i");
 	ia64_srlz_i();
-	ia64_set_ifa(VM_MAX_ADDRESS);
+	ia64_set_ifa(VM_MAXUSER_ADDRESS);
 	ia64_set_itir(PAGE_SHIFT << 2);
 	ia64_srlz_d();
 	__asm __volatile("itr.d	dtr[%0]=%1" :: "r"(3), "r"(pte));
@@ -696,7 +695,7 @@ map_gateway_page(void)
 	ia64_srlz_i();
 
 	/* Expose the mapping to userland in ar.k5 */
-	ia64_set_k5(VM_MAX_ADDRESS);
+	ia64_set_k5(VM_MAXUSER_ADDRESS);
 }
 
 static u_int
@@ -761,17 +760,6 @@ ia64_init(void)
 	 */
 
 	/*
-	 * pa_bootinfo is the physical address of the bootinfo block as
-	 * passed to us by the loader and set in locore.s.
-	 */
-	bootinfo = *(struct bootinfo *)(IA64_PHYS_TO_RR7(pa_bootinfo));
-
-	if (bootinfo.bi_magic != BOOTINFO_MAGIC || bootinfo.bi_version != 1) {
-		bzero(&bootinfo, sizeof(bootinfo));
-		bootinfo.bi_kernend = (vm_offset_t) round_page(_end);
-	}
-
-	/*
 	 * Look for the I/O ports first - we need them for console
 	 * probing.
 	 */
@@ -788,20 +776,20 @@ ia64_init(void)
 	}
 
 	metadata_missing = 0;
-	if (bootinfo.bi_modulep)
-		preload_metadata = (caddr_t)bootinfo.bi_modulep;
+	if (bootinfo->bi_modulep)
+		preload_metadata = (caddr_t)bootinfo->bi_modulep;
 	else
 		metadata_missing = 1;
 
-	if (envmode == 0 && bootinfo.bi_envp)
-		kern_envp = (caddr_t)bootinfo.bi_envp;
+	if (envmode == 0 && bootinfo->bi_envp)
+		kern_envp = (caddr_t)bootinfo->bi_envp;
 	else
 		kern_envp = static_env;
 
 	/*
 	 * Look at arguments passed to us and compute boothowto.
 	 */
-	boothowto = bootinfo.bi_boothowto;
+	boothowto = bootinfo->bi_boothowto;
 
 	if (boothowto & RB_VERBOSE)
 		bootverbose = 1;
@@ -811,51 +799,49 @@ ia64_init(void)
 	 */
 	kernstart = trunc_page(kernel_text);
 #ifdef DDB
-	ksym_start = bootinfo.bi_symtab;
-	ksym_end = bootinfo.bi_esymtab;
+	ksym_start = bootinfo->bi_symtab;
+	ksym_end = bootinfo->bi_esymtab;
 	kernend = (vm_offset_t)round_page(ksym_end);
 #else
 	kernend = (vm_offset_t)round_page(_end);
 #endif
 	/* But if the bootstrap tells us otherwise, believe it! */
-	if (bootinfo.bi_kernend)
-		kernend = round_page(bootinfo.bi_kernend);
+	if (bootinfo->bi_kernend)
+		kernend = round_page(bootinfo->bi_kernend);
+
+        /*
+         * Region 6 is direct mapped UC and region 7 is direct mapped
+         * WC. The details of this is controlled by the Alt {I,D}TLB
+         * handlers. Here we just make sure that they have the largest
+         * possible page size to minimise TLB usage.
+         */
+        ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (PAGE_SHIFT << 2));
+        ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (PAGE_SHIFT << 2));
+        ia64_srlz_d();
 
-	/*
-	 * Setup the PCPU data for the bootstrap processor. It is needed
-	 * by printf(). Also, since printf() has critical sections, we
-	 * need to initialize at least pc_curthread.
-	 */
-	pcpup = &pcpu0;
-	ia64_set_k4((u_int64_t)pcpup);
-	pcpu_init(pcpup, 0, sizeof(pcpu0));
-	dpcpu_init((void *)kernend, 0);
-	cpu_pcpu_setup(pcpup, ~0U, ia64_get_lid());
-	kernend += DPCPU_SIZE;
-	PCPU_SET(curthread, &thread0);
-
-#if 0
-	if (ia64_pal_base != 0) {
-		ia64_pal_base &= ~IA64_ID_PAGE_MASK;
-		/*
-		 * We use a TR to map the first 256M of memory - this might
-		 * cover the palcode too.
-		 */
-		if (ia64_pal_base == 0)
-			printf("PAL code mapped by the kernel's TR\n");
-	} else
-		printf("PAL code not found\n");
-#endif
 
 	/*
 	 * Wire things up so we can call the firmware.
 	 */
 	map_pal_code();
-	efi_boot_minimal(bootinfo.bi_systab);
+	efi_boot_minimal(bootinfo->bi_systab);
 	ia64_xiv_init();
 	ia64_sal_init();
 	calculate_frequencies();
 
+        /*
+         * Setup the PCPU data for the bootstrap processor. It is needed
+         * by printf(). Also, since printf() has critical sections, we
+         * need to initialize at least pc_curthread.
+         */
+        pcpup = &pcpu0;
+        ia64_set_k4((u_int64_t)pcpup);
+        pcpu_init(pcpup, 0, sizeof(pcpu0));
+        dpcpu_init((void *)kernend, 0);
+        cpu_pcpu_setup(pcpup, ~0U, ia64_get_lid());
+        kernend += DPCPU_SIZE;
+        PCPU_SET(curthread, &thread0);
+
 	/*
 	 * Initialize the console before we print anything out.
 	 */
@@ -869,8 +855,8 @@ ia64_init(void)
 	check_sn_sal();
 
 	/* Get FPSWA interface */
-	fpswa_iface = (bootinfo.bi_fpswa == 0) ? NULL :
-	    (struct fpswa_iface *)IA64_PHYS_TO_RR7(bootinfo.bi_fpswa);
+	fpswa_iface = (bootinfo->bi_fpswa == 0) ? NULL :
+	    (struct fpswa_iface *)IA64_PHYS_TO_RR7(bootinfo->bi_fpswa);
 
 	/* Init basic tunables, including hz */
 	init_param1();
@@ -1025,7 +1011,7 @@ uint64_t
 ia64_get_hcdp(void)
 {
 
-	return (bootinfo.bi_hcdp);
+	return (bootinfo->bi_hcdp);
 }
 
 void

Modified: projects/altix/sys/ia64/ia64/pal.S
==============================================================================
--- projects/altix/sys/ia64/ia64/pal.S	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/pal.S	Sat Mar 12 02:00:28 2011	(r219555)
@@ -75,63 +75,8 @@ psrsave	=	loc4
 	;;
 	srlz.d
 	br.ret.sptk rp
-
 END(ia64_call_pal_static)
-	
-#ifdef _KERNEL
-	
-/*
- * struct ia64_pal_result ia64_call_pal_static_physical(u_int64_t proc,
- *	u_int64_t arg1, u_int64_t arg2, u_int64_t arg3)
- */
-ENTRY(ia64_call_pal_static_physical, 4)
-	
-	.regstk	4,5,0,0
-palret	=	loc0
-entry	=	loc1
-rpsave	=	loc2
-pfssave =	loc3
-psrsave	=	loc4
-
-	alloc	pfssave=ar.pfs,4,5,0,0
-	;; 
-	mov	rpsave=rp
-
-	movl	entry=@gprel(ia64_pal_entry)
-1:	mov	palret=ip		// for return address
-	;;
-	add	entry=entry,gp
-	mov	r28=in0			// procedure number
-	;;
-	ld8	entry=[entry]		// read entry point
-	mov	r29=in1			// copy arguments
-	mov	r30=in2
-	mov	r31=in3
-	;;
-	dep	entry=0,entry,61,3	// physical address
-	dep	palret=0,palret,61,3	// physical address
-	br.call.sptk.many rp=ia64_physical_mode
-	mov	psrsave=ret0
-	;;
-	mov	b6=entry
-	add	palret=2f-1b,palret	// calculate return address
-	;;
-	mov	b0=palret
-	br.cond.sptk b6			// call into firmware
-	;;
-2:	mov	r14=psrsave
-	;;
-	br.call.sptk.many rp=ia64_change_mode
-	;; 
-	mov	rp=rpsave
-	mov	ar.pfs=pfssave
-	;;
-	br.ret.sptk rp
 
-END(ia64_call_pal_static_physical)
-	
-#endif
-	
 /*
  * struct ia64_pal_result ia64_call_pal_stacked(u_int64_t proc,
  *	u_int64_t arg1, u_int64_t arg2, u_int64_t arg3)
@@ -172,52 +117,3 @@ psrsave	=	loc3
 	br.ret.sptk rp
 
 END(ia64_call_pal_stacked)
-	
-#ifdef _KERNEL
-	
-/*
- * struct ia64_pal_result ia64_call_pal_stacked_physical(u_int64_t proc,
- *	u_int64_t arg1, u_int64_t arg2, u_int64_t arg3)
- */
-ENTRY(ia64_call_pal_stacked_physical, 4)
-	
-	.regstk	4,4,4,0
-entry	=	loc0
-rpsave	=	loc1
-pfssave =	loc2
-psrsave	=	loc3
-
-	alloc	pfssave=ar.pfs,4,4,4,0
-	;; 
-	mov	rpsave=rp
-	movl	entry=@gprel(ia64_pal_entry)
-	;;
-	add	entry=entry,gp
-	mov	r28=in0			// procedure number
-	mov	out0=in0
-	;;
-	ld8	entry=[entry]		// read entry point
-	mov	out1=in1		// copy arguments
-	mov	out2=in2
-	mov	out3=in3
-	;;
-	dep	entry=0,entry,61,3	// physical address
-	br.call.sptk.many rp=ia64_physical_mode
-	mov	psrsave=ret0
-	;;
-	mov	b6=entry
-	;;
-	br.call.sptk.many rp=b6		// call into firmware
-	;;
-	mov	r14=psrsave
-	;;
-	br.call.sptk.many rp=ia64_change_mode
-	;; 
-	mov	rp=rpsave
-	mov	ar.pfs=pfssave
-	;;
-	br.ret.sptk rp
-
-END(ia64_call_pal_stacked_physical)
-
-#endif

Modified: projects/altix/sys/ia64/ia64/pmap.c
==============================================================================
--- projects/altix/sys/ia64/ia64/pmap.c	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/pmap.c	Sat Mar 12 02:00:28 2011	(r219555)
@@ -390,7 +390,7 @@ pmap_bootstrap()
 	 */
 	ia64_kptdir = (void *)pmap_steal_memory(PAGE_SIZE);
 	nkpt = 0;
-	kernel_vm_end = VM_MIN_KERNEL_ADDRESS - VM_GATEWAY_SIZE;
+	kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
 
 	for (i = 0; phys_avail[i+2]; i+= 2)
 		;
@@ -451,7 +451,7 @@ pmap_bootstrap()
 	 * Initialize the kernel pmap (which is statically allocated).
 	 */
 	PMAP_LOCK_INIT(kernel_pmap);
-	for (i = 0; i < 5; i++)
+	for (i = 0; i < 4; i++)
 		kernel_pmap->pm_rid[i] = 0;
 	TAILQ_INIT(&kernel_pmap->pm_pvlist);
 	PCPU_SET(md.current_pmap, kernel_pmap);
@@ -463,16 +463,6 @@ pmap_bootstrap()
 		    (5 << 8) | (PAGE_SHIFT << 2) | 1);
 
 	/*
-	 * Region 6 is direct mapped UC and region 7 is direct mapped
-	 * WC. The details of this is controlled by the Alt {I,D}TLB
-	 * handlers. Here we just make sure that they have the largest 
-	 * possible page size to minimise TLB usage.
-	 */
-	ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (IA64_ID_PAGE_SHIFT << 2));
-	ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (IA64_ID_PAGE_SHIFT << 2));
-	ia64_srlz_d();
-
-	/*
 	 * Clear out any random TLB entries left over from booting.
 	 */
 	pmap_invalidate_all();
@@ -678,7 +668,7 @@ pmap_pinit(struct pmap *pmap)
 	int i;
 
 	PMAP_LOCK_INIT(pmap);
-	for (i = 0; i < 5; i++)
+	for (i = 0; i < 4; i++)
 		pmap->pm_rid[i] = pmap_allocate_rid();
 	TAILQ_INIT(&pmap->pm_pvlist);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
@@ -699,7 +689,7 @@ pmap_release(pmap_t pmap)
 {
 	int i;
 
-	for (i = 0; i < 5; i++)
+	for (i = 0; i < 4; i++)
 		if (pmap->pm_rid[i])
 			pmap_free_rid(pmap->pm_rid[i]);
 	PMAP_LOCK_DESTROY(pmap);
@@ -1219,7 +1209,6 @@ vm_paddr_t
 pmap_kextract(vm_offset_t va)
 {
 	struct ia64_lpte *pte;
-	vm_offset_t gwpage;
 
 	KASSERT(va >= IA64_RR_BASE(5), ("Must be kernel VA"));
 
@@ -1227,19 +1216,16 @@ pmap_kextract(vm_offset_t va)
 	if (va >= IA64_RR_BASE(6))
 		return (IA64_RR_MASK(va));
 
-	/* EPC gateway page? */
-	gwpage = (vm_offset_t)ia64_get_k5();
-	if (va >= gwpage && va < gwpage + VM_GATEWAY_SIZE)
-		return (IA64_RR_MASK((vm_offset_t)ia64_gateway_page));
-
 	/* Bail out if the virtual address is beyond our limits. */
 	if (va >= kernel_vm_end)
 		return (0);
 
-	pte = pmap_find_kpte(va);
-	if (!pmap_present(pte))
-		return (0);
-	return (pmap_ppn(pte) | (va & PAGE_MASK));
+	if (va >= VM_MIN_KERNEL_ADDRESS) {
+		pte = pmap_find_kpte(va);
+		return (pmap_present(pte) ? pmap_ppn(pte)|(va&PAGE_MASK) : 0);
+	}
+
+	return (0);
 }
 
 /*
@@ -2285,12 +2271,12 @@ pmap_switch(pmap_t pm)
 	if (prevpm == pm)
 		goto out;
 	if (pm == NULL) {
-		for (i = 0; i < 5; i++) {
+		for (i = 0; i < 4; i++) {
 			ia64_set_rr(IA64_RR_BASE(i),
 			    (i << 8)|(PAGE_SHIFT << 2)|1);
 		}
 	} else {
-		for (i = 0; i < 5; i++) {
+		for (i = 0; i < 4; i++) {
 			ia64_set_rr(IA64_RR_BASE(i),
 			    (pm->pm_rid[i] << 8)|(PAGE_SHIFT << 2)|1);
 		}
@@ -2387,8 +2373,8 @@ print_trs(int type)
 	db_printf("V RID    Virtual Page  Physical Page PgSz ED AR PL D A MA  P KEY\n");
 	for (i = 0; i <= maxtr; i++) {
 		bzero(&buf, sizeof(buf));
-		res = ia64_call_pal_stacked_physical
-			(PAL_VM_TR_READ, i, type, ia64_tpa((uint64_t) &buf));
+		res = ia64_pal_physical(PAL_VM_TR_READ, i, type,
+		    ia64_tpa((uint64_t)&buf));
 		if (!(res.pal_result[0] & 1))
 			buf.pte &= ~PTE_AR_MASK;
 		if (!(res.pal_result[0] & 2))

Modified: projects/altix/sys/ia64/ia64/support.S
==============================================================================
--- projects/altix/sys/ia64/ia64/support.S	Sat Mar 12 01:26:04 2011	(r219554)
+++ projects/altix/sys/ia64/ia64/support.S	Sat Mar 12 02:00:28 2011	(r219555)
@@ -58,131 +58,6 @@
 
 	.text
 
-/*
- * ia64_change_mode:	change mode to/from physical mode
- *
- * Arguments:
- *	r14	psr for desired mode
- *
- * Modifies:
- *	r15-r19	scratch
- *	ar.bsp	tranlated to new mode
- */
-ENTRY_NOPROFILE(ia64_change_mode, 0)
-	rsm	psr.i | psr.ic
-	mov	r19=ar.rsc		// save rsc while we change mode
-	tbit.nz	p6,p7=r14,17		// physical or virtual ?
-	;;
-	mov	ar.rsc=0		// turn off RSE
-(p6)	mov	r15=7			// RR base for virtual addresses
-(p7)	mov	r15=0			// RR base for physical addresses
-	;;
-	flushrs				// no dirty registers please
-	srlz.i
-	;;
-	mov	r16=ar.bsp
-	mov	r17=rp
-	mov	r18=ar.rnat
-	;;
-	dep	r16=r15,r16,61,3	// new address of ar.bsp
-	dep	r17=r15,r17,61,3	// new address of rp
-	dep	sp=r15,sp,61,3		// new address of sp
-	;;
-	mov	ar.bspstore=r16
-	mov	rp=r17
-	;;
-1:	mov	r16=ip
-	mov	ar.rnat=r18
-	mov	cr.ipsr=r14		// psr for new mode
-	;; 
-	add	r16=2f-1b,r16		// address to rfi to
-	;;
-	dep	r16=r15,r16,61,3	// new mode address for rfi
-	;;
-	mov	cr.iip=r16		// setup for rfi
-	mov	cr.ifs=r0
-	;;
-	rfi
-	
-2:	mov	ar.rsc=r19		// restore ar.rsc
-	br.ret.sptk.few rp		// now in new mode
-END(ia64_change_mode)
-
-/*
- * ia64_physical_mode:	change mode to physical mode
- *
- * Return:
- *	ret0	psr to restore
- *
- * Modifies:
- *	r15-r18	scratch
- *	ar.bsp	tranlated to physical mode
- *	psr.i	cleared
- */
-ENTRY(ia64_physical_mode, 0)
-	mov	r14=psr
-	mov	ret0=psr
-	movl	r15=(IA64_PSR_I|IA64_PSR_IT|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFL|IA64_PSR_DFH)
-	movl	r16=IA64_PSR_BN
-	;;
-	andcm	r14=r14,r15		// clear various xT bits
-	;; 
-	or	r14=r14,r16		// make sure BN=1
-	or	ret0=ret0,r16		// make sure BN=1
-
-	br.cond.sptk.many ia64_change_mode
-END(ia64_physical_mode)
-
-/*
- * ia64_call_efi_physical:	call an EFI procedure in physical mode
- *
- * Arguments:
- *	in0		Address of EFI procedure descriptor
- *	in1-in5		Arguments to EFI procedure
- *
- * Return:
- *	ret0-ret3	return values from EFI
- *
- */
-ENTRY(ia64_call_efi_physical, 6)
-	.prologue
-	.regstk	6,4,5,0
-	.save	ar.pfs,loc0
-	alloc	loc0=ar.pfs,6,4,5,0
-	;;
-	.save	rp,loc1
-	mov	loc1=rp
-	;;
-	.body
-	br.call.sptk.many rp=ia64_physical_mode
-	;;
-	mov	loc2=r8			// psr to restore mode
-	mov	loc3=gp			// save kernel gp
-	ld8	r14=[in0],8		// function address
-	;;
-	mov	out0=in1
-	mov	out1=in2
-	mov	out2=in3
-	mov	out3=in4
-	mov	out4=in5
-	ld8	gp=[in0]		// function gp value
-	;;
-	mov	b6=r14
-	;;
-	br.call.sptk.many rp=b6		// call EFI procedure
-	mov	gp=loc3			// restore kernel gp
-	;; 
-	mov	r14=loc2		// psr to restore mode
-	br.call.sptk.many rp=ia64_change_mode
-	;;
-	mov	rp=loc1
-	mov	ar.pfs=loc0
-	;;
-	br.ret.sptk.many rp
-END(ia64_call_efi_physical)
-	
-/**************************************************************************/
-
 ENTRY(fusufault, 0)
 {	.mib
 	st8.rel		[r15]=r0		// Clear onfault.
@@ -199,7 +74,7 @@ END(fusufault)
 ENTRY(casuword, 3)
 {	.mlx
 	add		r15=PC_CURTHREAD,r13
-	movl		r14=VM_MAX_ADDRESS
+	movl		r14=VM_MAXUSER_ADDRESS
 	;;
 }
 {	.mib
@@ -249,7 +124,7 @@ END(casuword)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list