copy.c revision 164412
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 164412 2006-11-19 20:04:11Z marcel $"); 29 30#include <stand.h> 31#include <ia64/include/vmparam.h> 32 33#include "libia64.h" 34 35static void * 36va2pa(vm_offset_t va, size_t *len) 37{ 38 uint64_t pa; 39 40 if (va >= IA64_RR_BASE(7)) { 41 pa = IA64_RR_MASK(va); 42 return ((void *)pa); 43 } 44 45 printf("\n%s: va=%lx, *len=%lx\n", __func__, va, *len); 46 *len = 0; 47 return (NULL); 48} 49 50ssize_t 51ia64_copyin(const void *src, vm_offset_t va, size_t len) 52{ 53 void *pa; 54 ssize_t res; 55 size_t sz; 56 57 res = 0; 58 while (len > 0) { 59 sz = len; 60 pa = va2pa(va, &sz); 61 if (sz == 0) 62 break; 63 bcopy(src, pa, sz); 64 len -= sz; 65 res += sz; 66 va += sz; 67 } 68 return (res); 69} 70 71ssize_t 72ia64_copyout(vm_offset_t va, void *dst, size_t len) 73{ 74 void *pa; 75 ssize_t res; 76 size_t sz; 77 78 res = 0; 79 while (len > 0) { 80 sz = len; 81 pa = va2pa(va, &sz); 82 if (sz == 0) 83 break; 84 bcopy(pa, dst, sz); 85 len -= sz; 86 res += sz; 87 va += sz; 88 } 89 return (res); 90} 91 92ssize_t 93ia64_readin(int fd, vm_offset_t va, size_t len) 94{ 95 void *pa; 96 ssize_t res, s; 97 size_t sz; 98 99 res = 0; 100 while (len > 0) { 101 sz = len; 102 pa = va2pa(va, &sz); 103 if (sz == 0) 104 break; 105 s = read(fd, pa, sz); 106 if (s <= 0) 107 break; 108 len -= s; 109 res += s; 110 va += s; 111 } 112 return (res); 113} 114