copy.c revision 164010
177943Sdfr/*- 2164010Smarcel * Copyright (c) 2006 Marcel Moolenaar 377943Sdfr * All rights reserved. 477943Sdfr * 577943Sdfr * Redistribution and use in source and binary forms, with or without 677943Sdfr * modification, are permitted provided that the following conditions 777943Sdfr * are met: 8164010Smarcel * 977943Sdfr * 1. Redistributions of source code must retain the above copyright 1077943Sdfr * notice, this list of conditions and the following disclaimer. 1177943Sdfr * 2. Redistributions in binary form must reproduce the above copyright 1277943Sdfr * notice, this list of conditions and the following disclaimer in the 1377943Sdfr * documentation and/or other materials provided with the distribution. 1477943Sdfr * 15164010Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16164010Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17164010Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18164010Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19164010Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20164010Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21164010Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22164010Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23164010Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24164010Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2577943Sdfr */ 2678320Sobrien 27113038Sobrien#include <sys/cdefs.h> 28113038Sobrien__FBSDID("$FreeBSD: head/sys/boot/ia64/common/copy.c 164010 2006-11-05 22:03:04Z marcel $"); 2978320Sobrien 30138141Smarcel#include <stand.h> 31164010Smarcel#include <ia64/include/vmparam.h> 3277943Sdfr 33164010Smarcel#include "libia64.h" 34164010Smarcel 35164010Smarcel#define LDR_LOG2_PGSZ 20 36164010Smarcel 37164010Smarceluint64_t *ia64_pgtbl; 38164010Smarceluint32_t ia64_pgtblsz; 39164010Smarcel 40164010Smarcelstatic void * 41164010Smarcelva2pa(vm_offset_t va, size_t *len) 4277943Sdfr{ 43164010Smarcel uint64_t pa; 44138141Smarcel 45164010Smarcel if (va >= IA64_RR_BASE(7)) { 46164010Smarcel pa = IA64_RR_MASK(va); 47164010Smarcel return ((void *)pa); 48164010Smarcel } 49164010Smarcel 50164010Smarcel printf("\n%s: va=%lx, *len=%lx\n", __func__, va, *len); 51164010Smarcel *len = 0; 52164010Smarcel return (NULL); 5377943Sdfr} 5477943Sdfr 55164010Smarcelssize_t 56164010Smarcelia64_copyin(const void *src, vm_offset_t va, size_t len) 5777943Sdfr{ 58164010Smarcel void *pa; 59164010Smarcel ssize_t res; 60164010Smarcel size_t sz; 61138141Smarcel 62164010Smarcel res = 0; 63164010Smarcel while (len > 0) { 64164010Smarcel sz = len; 65164010Smarcel pa = va2pa(va, &sz); 66164010Smarcel if (sz == 0) 67164010Smarcel break; 68164010Smarcel bcopy(src, pa, sz); 69164010Smarcel len -= sz; 70164010Smarcel res += sz; 71164010Smarcel va += sz; 72164010Smarcel } 73164010Smarcel return (res); 7477943Sdfr} 7577943Sdfr 76164010Smarcelssize_t 77164010Smarcelia64_copyout(vm_offset_t va, void *dst, size_t len) 7877943Sdfr{ 79164010Smarcel void *pa; 80164010Smarcel ssize_t res; 81164010Smarcel size_t sz; 82138141Smarcel 83164010Smarcel res = 0; 84164010Smarcel while (len > 0) { 85164010Smarcel sz = len; 86164010Smarcel pa = va2pa(va, &sz); 87164010Smarcel if (sz == 0) 88164010Smarcel break; 89164010Smarcel bcopy(pa, dst, sz); 90164010Smarcel len -= sz; 91164010Smarcel res += sz; 92164010Smarcel va += sz; 93164010Smarcel } 94164010Smarcel return (res); 9577943Sdfr} 96164010Smarcel 97164010Smarcelssize_t 98164010Smarcelia64_readin(int fd, vm_offset_t va, size_t len) 99164010Smarcel{ 100164010Smarcel void *pa; 101164010Smarcel ssize_t res, s; 102164010Smarcel size_t sz; 103164010Smarcel 104164010Smarcel res = 0; 105164010Smarcel while (len > 0) { 106164010Smarcel sz = len; 107164010Smarcel pa = va2pa(va, &sz); 108164010Smarcel if (sz == 0) 109164010Smarcel break; 110164010Smarcel s = read(fd, pa, sz); 111164010Smarcel if (s <= 0) 112164010Smarcel break; 113164010Smarcel len -= s; 114164010Smarcel res += s; 115164010Smarcel va += s; 116164010Smarcel } 117164010Smarcel return (res); 118164010Smarcel} 119