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