copy.c revision 164010
1/*- 2 * Copyright (c) 2006 Marcel Moolenaar 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__FBSDID("$FreeBSD: head/sys/boot/ia64/common/copy.c 164010 2006-11-05 22:03:04Z marcel $"); 29 30#include <stand.h> 31#include <ia64/include/vmparam.h> 32 33#include "libia64.h" 34 35#define LDR_LOG2_PGSZ 20 36 37uint64_t *ia64_pgtbl; 38uint32_t ia64_pgtblsz; 39 40static void * 41va2pa(vm_offset_t va, size_t *len) 42{ 43 uint64_t pa; 44 45 if (va >= IA64_RR_BASE(7)) { 46 pa = IA64_RR_MASK(va); 47 return ((void *)pa); 48 } 49 50 printf("\n%s: va=%lx, *len=%lx\n", __func__, va, *len); 51 *len = 0; 52 return (NULL); 53} 54 55ssize_t 56ia64_copyin(const void *src, vm_offset_t va, size_t len) 57{ 58 void *pa; 59 ssize_t res; 60 size_t sz; 61 62 res = 0; 63 while (len > 0) { 64 sz = len; 65 pa = va2pa(va, &sz); 66 if (sz == 0) 67 break; 68 bcopy(src, pa, sz); 69 len -= sz; 70 res += sz; 71 va += sz; 72 } 73 return (res); 74} 75 76ssize_t 77ia64_copyout(vm_offset_t va, void *dst, size_t len) 78{ 79 void *pa; 80 ssize_t res; 81 size_t sz; 82 83 res = 0; 84 while (len > 0) { 85 sz = len; 86 pa = va2pa(va, &sz); 87 if (sz == 0) 88 break; 89 bcopy(pa, dst, sz); 90 len -= sz; 91 res += sz; 92 va += sz; 93 } 94 return (res); 95} 96 97ssize_t 98ia64_readin(int fd, vm_offset_t va, size_t len) 99{ 100 void *pa; 101 ssize_t res, s; 102 size_t sz; 103 104 res = 0; 105 while (len > 0) { 106 sz = len; 107 pa = va2pa(va, &sz); 108 if (sz == 0) 109 break; 110 s = read(fd, pa, sz); 111 if (s <= 0) 112 break; 113 len -= s; 114 res += s; 115 va += s; 116 } 117 return (res); 118} 119