summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbenno <benno@FreeBSD.org>2002-07-18 12:39:02 +0000
committerbenno <benno@FreeBSD.org>2002-07-18 12:39:02 +0000
commit44423651cb9bcc3ccbb2b1be3edc47d91ce6bcdb (patch)
tree495497d5c7cdccc4784cb4df5f42e884cb55326e
parented13465e591fdc3e0b558d313695094b32d03e72 (diff)
downloadFreeBSD-src-44423651cb9bcc3ccbb2b1be3edc47d91ce6bcdb.zip
FreeBSD-src-44423651cb9bcc3ccbb2b1be3edc47d91ce6bcdb.tar.gz
Major rework of how we copy data into kernel space.
We now talk to the memory and mmu instances directly rather than using the OpenFirmware "claim" method.
-rw-r--r--sys/boot/ofw/libofw/elf_freebsd.c5
-rw-r--r--sys/boot/ofw/libofw/ofw_copy.c28
-rw-r--r--sys/boot/ofw/libofw/ofw_disk.c4
-rw-r--r--sys/boot/ofw/libofw/ofw_memory.c16
-rw-r--r--sys/boot/ofw/libofw/openfirm.c4
-rw-r--r--sys/boot/ofw/libofw/openfirm.h1
6 files changed, 36 insertions, 22 deletions
diff --git a/sys/boot/ofw/libofw/elf_freebsd.c b/sys/boot/ofw/libofw/elf_freebsd.c
index e82a28d..95d4a90 100644
--- a/sys/boot/ofw/libofw/elf_freebsd.c
+++ b/sys/boot/ofw/libofw/elf_freebsd.c
@@ -52,11 +52,6 @@ ofw_elf_loadfile(char *filename, vm_offset_t dest,
if (r != 0)
return (r);
- addr = OF_claim((void *)(*result)->f_addr, (*result)->f_size, 0);
-
- if (addr == (void *)-1 || addr != (void *)(*result)->f_addr)
- return (ENOMEM);
-
return (0);
}
diff --git a/sys/boot/ofw/libofw/ofw_copy.c b/sys/boot/ofw/libofw/ofw_copy.c
index a7b3d83..a9e0fd6 100644
--- a/sys/boot/ofw/libofw/ofw_copy.c
+++ b/sys/boot/ofw/libofw/ofw_copy.c
@@ -35,10 +35,36 @@
#include "libofw.h"
#define READIN_BUF (4 * 1024)
+#define PAGE_SIZE 0x1000
+#define PAGE_MASK 0x0fff
+
+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
ssize_t
ofw_copyin(const void *src, vm_offset_t dest, const size_t len)
{
+ void *destp, *addr;
+ size_t dlen;
+
+ destp = (void *)(dest & ~PAGE_MASK);
+ dlen = roundup(len, PAGE_SIZE);
+
+ if (OF_call_method("claim", memory, 3, 1, destp, dlen, 0, &addr)
+ == -1) {
+ printf("ofw_copyin: physical claim failed\n");
+ return (0);
+ }
+
+ if (OF_call_method("claim", mmu, 3, 1, destp, dlen, 0, &addr) == -1) {
+ printf("ofw_copyin: virtual claim failed\n");
+ return (0);
+ }
+
+ if (OF_call_method("map", mmu, 4, 0, destp, destp, dlen, 0) == -1) {
+ printf("ofw_copyin: map failed\n");
+ return (0);
+ }
+
bcopy(src, (void *)dest, len);
return(len);
}
@@ -76,7 +102,7 @@ ofw_readin(const int fd, vm_offset_t dest, const size_t len)
break;
}
- bcopy(buf, (void *)p, got);
+ ofw_copyin(buf, p, got);
}
free(buf);
diff --git a/sys/boot/ofw/libofw/ofw_disk.c b/sys/boot/ofw/libofw/ofw_disk.c
index c6fb588..1327f18 100644
--- a/sys/boot/ofw/libofw/ofw_disk.c
+++ b/sys/boot/ofw/libofw/ofw_disk.c
@@ -181,12 +181,8 @@ ofwd_probe_devs(void)
static int
ofwd_init(void)
{
-#ifdef __sparc64__
/* Short-circuit the device probing, since it takes too long. */
return 0;
-#else
- return ofwd_init_devs();
-#endif
}
static int
diff --git a/sys/boot/ofw/libofw/ofw_memory.c b/sys/boot/ofw/libofw/ofw_memory.c
index a83b6fd..59fdce2 100644
--- a/sys/boot/ofw/libofw/ofw_memory.c
+++ b/sys/boot/ofw/libofw/ofw_memory.c
@@ -47,17 +47,15 @@ struct ofw_mapping {
void
ofw_memmap(void)
{
- ihandle_t mmui;
- phandle_t mmu;
+ phandle_t mmup;
int nmapping, i;
struct ofw_mapping mappings[256];
- OF_getprop(chosen, "mmu", &mmui, 4);
- mmu = OF_instance_to_package(mmui);
+ mmup = OF_instance_to_package(mmu);
bzero(mappings, sizeof(mappings));
- nmapping = OF_getprop(mmu, "translations", mappings, sizeof(mappings));
+ nmapping = OF_getprop(mmup, "translations", mappings, sizeof(mappings));
if (nmapping == -1) {
printf("Could not get memory map (%d)\n",
nmapping);
@@ -79,14 +77,12 @@ ofw_memmap(void)
void *
ofw_alloc_heap(unsigned int size)
{
- ihandle_t meminstance;
- phandle_t memory;
+ phandle_t memoryp;
struct ofw_reg available;
void *base;
- OF_getprop(chosen, "memory", &meminstance, sizeof(meminstance));
- memory = OF_instance_to_package(meminstance);
- OF_getprop(memory, "available", &available, sizeof(available));
+ memoryp = OF_instance_to_package(memory);
+ OF_getprop(memoryp, "available", &available, sizeof(available));
heap_base = OF_claim((void *)available.base, size, sizeof(register_t));
diff --git a/sys/boot/ofw/libofw/openfirm.c b/sys/boot/ofw/libofw/openfirm.c
index bb2dd20..4181067 100644
--- a/sys/boot/ofw/libofw/openfirm.c
+++ b/sys/boot/ofw/libofw/openfirm.c
@@ -68,8 +68,8 @@ int (*openfirmware)(void *);
static ihandle_t stdin;
static ihandle_t stdout;
-static ihandle_t mmu;
-static ihandle_t memory;
+ihandle_t mmu;
+ihandle_t memory;
/* Initialiaser */
diff --git a/sys/boot/ofw/libofw/openfirm.h b/sys/boot/ofw/libofw/openfirm.h
index 86c39b0..e060117 100644
--- a/sys/boot/ofw/libofw/openfirm.h
+++ b/sys/boot/ofw/libofw/openfirm.h
@@ -71,6 +71,7 @@ typedef unsigned long int cell_t;
extern int (*openfirmware)(void *);
extern phandle_t chosen;
+extern ihandle_t memory, mmu;
/*
* This isn't actually an OpenFirmware function, but it seemed like the right
OpenPOWER on IntegriCloud