diff options
| author | Benno Rice <benno@FreeBSD.org> | 2002-07-18 12:39:02 +0000 |
|---|---|---|
| committer | Benno Rice <benno@FreeBSD.org> | 2002-07-18 12:39:02 +0000 |
| commit | 8e465298e27ad4961f25a1955121f30a45db5975 (patch) | |
| tree | 495497d5c7cdccc4784cb4df5f42e884cb55326e /sys/boot | |
| parent | bff0acee63ca781a9b02c09441a44efecae79993 (diff) | |
Notes
Diffstat (limited to 'sys/boot')
| -rw-r--r-- | sys/boot/ofw/libofw/elf_freebsd.c | 5 | ||||
| -rw-r--r-- | sys/boot/ofw/libofw/ofw_copy.c | 28 | ||||
| -rw-r--r-- | sys/boot/ofw/libofw/ofw_disk.c | 4 | ||||
| -rw-r--r-- | sys/boot/ofw/libofw/ofw_memory.c | 16 | ||||
| -rw-r--r-- | sys/boot/ofw/libofw/openfirm.c | 4 | ||||
| -rw-r--r-- | sys/boot/ofw/libofw/openfirm.h | 1 |
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 e82a28dfcaf6b..95d4a908af69f 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 a7b3d83b1ec28..a9e0fd6bd27db 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 c6fb588df6637..1327f1834080e 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 a83b6fd028f83..59fdce2bf65b1 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 bb2dd20d448f9..4181067072d1c 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 86c39b080e445..e06011729b8ae 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 |
