initial commit
[freebsd-arm:freebsd-arm.git] / boot / ia64 / common / copy.c
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$");
29
30 #include <stand.h>
31 #include <ia64/include/vmparam.h>
32
33 #include "libia64.h"
34
35 static void *
36 va2pa(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
50 ssize_t
51 ia64_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
71 ssize_t
72 ia64_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
92 ssize_t
93 ia64_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 }