summaryrefslogtreecommitdiffstats
path: root/sys
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 /sys
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.
Diffstat (limited to 'sys')
-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