Date: Sun, 28 Nov 2004 04:12:21 GMT From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 65964 for review Message-ID: <200411280412.iAS4CLR1072229@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=65964 Change 65964 by marcel@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@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)); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411280412.iAS4CLR1072229>
