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