summaryrefslogtreecommitdiffstats
path: root/sys/boot/ia64/common/copy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/ia64/common/copy.c')
-rw-r--r--sys/boot/ia64/common/copy.c113
1 files changed, 88 insertions, 25 deletions
diff --git a/sys/boot/ia64/common/copy.c b/sys/boot/ia64/common/copy.c
index 4b4b9bd..5583b15 100644
--- a/sys/boot/ia64/common/copy.c
+++ b/sys/boot/ia64/common/copy.c
@@ -1,55 +1,118 @@
/*-
- * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
+ * Copyright (c) 2006 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
+ *
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <efi.h>
-#include <efilib.h>
#include <stand.h>
+#include <ia64/include/vmparam.h>
+
+#include "libia64.h"
+
+#define LDR_LOG2_PGSZ 20
+
+uint64_t *ia64_pgtbl;
+uint32_t ia64_pgtblsz;
+
+static void *
+va2pa(vm_offset_t va, size_t *len)
+{
+ uint64_t pa;
+
+ if (va >= IA64_RR_BASE(7)) {
+ pa = IA64_RR_MASK(va);
+ return ((void *)pa);
+ }
+
+ printf("\n%s: va=%lx, *len=%lx\n", __func__, va, *len);
+ *len = 0;
+ return (NULL);
+}
-int
-efi_copyin(void *src, vm_offset_t va, size_t len)
+ssize_t
+ia64_copyin(const void *src, vm_offset_t va, size_t len)
{
+ void *pa;
+ ssize_t res;
+ size_t sz;
- bcopy(src, (void *)efimd_va2pa(va), len);
- return (len);
+ res = 0;
+ while (len > 0) {
+ sz = len;
+ pa = va2pa(va, &sz);
+ if (sz == 0)
+ break;
+ bcopy(src, pa, sz);
+ len -= sz;
+ res += sz;
+ va += sz;
+ }
+ return (res);
}
-int
-efi_copyout(vm_offset_t va, void *dst, size_t len)
+ssize_t
+ia64_copyout(vm_offset_t va, void *dst, size_t len)
{
+ void *pa;
+ ssize_t res;
+ size_t sz;
- bcopy((void *)efimd_va2pa(va), dst, len);
- return (len);
+ res = 0;
+ while (len > 0) {
+ sz = len;
+ pa = va2pa(va, &sz);
+ if (sz == 0)
+ break;
+ bcopy(pa, dst, sz);
+ len -= sz;
+ res += sz;
+ va += sz;
+ }
+ return (res);
}
-int
-efi_readin(int fd, vm_offset_t va, size_t len)
+ssize_t
+ia64_readin(int fd, vm_offset_t va, size_t len)
{
+ void *pa;
+ ssize_t res, s;
+ size_t sz;
- return (read(fd, (void *)efimd_va2pa(va), len));
+ res = 0;
+ while (len > 0) {
+ sz = len;
+ pa = va2pa(va, &sz);
+ if (sz == 0)
+ break;
+ s = read(fd, pa, sz);
+ if (s <= 0)
+ break;
+ len -= s;
+ res += s;
+ va += s;
+ }
+ return (res);
}
OpenPOWER on IntegriCloud