PERFORCE change 65964 for review

Marcel Moolenaar marcel at FreeBSD.org
Sat Nov 27 20:12:23 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=65964

Change 65964 by marcel at marcel_nfs on 2004/11/28 04:12:11

	Load kernels linked at IA64_KERNELBASE. We don't need any fancy
	VA to PA mapping here, but we do need to build the page table
	that we need to pass on to the kernel.

Affected files ...

.. //depot/projects/ia64/sys/boot/ia64/ski/copy.c#2 edit

Differences ...

==== //depot/projects/ia64/sys/boot/ia64/ski/copy.c#2 (text+ko) ====

@@ -1,58 +1,87 @@
-/*-
- * Copyright (c) 1998 Michael Smith <msmith at freebsd.org>
+/*
+ * Copyright (c) 2004 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ * 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.
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/boot/ia64/ski/copy.c,v 1.4 2004/09/24 03:53:50 marcel Exp $");
+__FBSDID("$FreeBSD$");
 
-/*
- * MD primitives supporting placement of module data 
- *
- * XXX should check load address/size against memory top.
- */
 #include <stand.h>
 
-#include <machine/ia64_cpu.h>
 #include <machine/vmparam.h>
 
+#define	PHYS_START	(4L*1024*1024*1024)
+#define	PHYS_SIZE	(64L*1024*1024 - 4L*1024)
+
+uint64_t *pgtbl = (uint64_t *)(PHYS_START + PHYS_SIZE);
+
+static void *
+va2pa(uint64_t va)
+{
+	void *pa;
+
+	/* Backward compatibility. */
+	if (va > IA64_RR_BASE(7))
+		return ((void *)IA64_RR_MASK(va));
+
+	if (va < IA64_KERNELBASE) {
+		printf("\n%s: %lx: invalid loader virtual address\n",
+		    __func__, va);
+		exit(1);
+	}
+
+	if (va >= IA64_KERNELBASE + PHYS_SIZE) {
+		printf("\n%s: %lx: loader virtual address out of bounds\n",
+		    __func__, va);
+		exit(1);
+	}
+
+	va -= IA64_KERNELBASE;
+	pa = (void *)(va + PHYS_START);
+	pgtbl[va >> 20] = (va & ~((1 << 20) - 1)) + PHYS_START;
+	return (pa);
+}
+
 int
-ski_copyin(void *src, vm_offset_t dest, size_t len)
+ski_copyin(void *src, vm_offset_t va, size_t len)
 {
-	bcopy(src, (void*) IA64_RR_MASK(dest), len);
+
+	bcopy(src, va2pa(va), len);
 	return (len);
 }
 
 int
-ski_copyout(vm_offset_t src, void *dest, size_t len)
+ski_copyout(vm_offset_t va, void *dst, size_t len)
 {
-	bcopy((void*) IA64_RR_MASK(src), dest, len);
+
+	bcopy(va2pa(va), dst, len);
 	return (len);
 }
 
 int
-ski_readin(int fd, vm_offset_t dest, size_t len)
+ski_readin(int fd, vm_offset_t va, size_t len)
 {
-	return (read(fd, (void*) IA64_RR_MASK(dest), len));
+
+	return (read(fd, va2pa(va), len));
 }


More information about the p4-projects mailing list