--- Gnu-Mach/vm/vm_kern.c 2020/09/02 04:36:57 1.1 +++ Gnu-Mach/vm/vm_kern.c 2020/09/02 04:45:27 1.1.1.2 @@ -34,11 +34,17 @@ * Kernel memory management. */ +#include + #include -#include "vm_param.h" +#include +#include #include +#include #include #include +#include +#include #include #include #include @@ -52,7 +58,8 @@ * Variables exported by this module. */ -vm_map_t kernel_map; +static struct vm_map kernel_map_store; +vm_map_t kernel_map = &kernel_map_store; vm_map_t kernel_pageable_map; extern void kmem_alloc_pages(); @@ -149,7 +156,7 @@ projected_buffer_allocate(map, size, per kmem_alloc_pages(object, 0, *kernel_p, *kernel_p + size, VM_PROT_READ | VM_PROT_WRITE); - bzero(*kernel_p, size); /*Zero fill*/ + memset((void*) *kernel_p, 0, size); /*Zero fill*/ /* Set up physical mappings for user pmap */ @@ -181,7 +188,6 @@ projected_buffer_map(map, kernel_addr, s vm_prot_t protection; vm_inherit_t inheritance; /*Currently only VM_INHERIT_NONE supported*/ { - vm_object_t object; vm_map_entry_t u_entry, k_entry; vm_offset_t physical_addr, user_addr; vm_size_t r_size; @@ -265,9 +271,9 @@ projected_buffer_deallocate(map, start, /*Prepare for deallocation*/ if (entry->vme_start < start) - _vm_map_clip_start(map, entry, start); + _vm_map_clip_start(&map->hdr, entry, start); if (entry->vme_end > end) - _vm_map_clip_end(map, entry, end); + _vm_map_clip_end(&map->hdr, entry, end); if (map->first_free == entry) /*Adjust first_free hint*/ map->first_free = entry->vme_prev; entry->projected_on = 0; /*Needed to allow deletion*/ @@ -383,6 +389,7 @@ kmem_alloc(map, addrp, size) kr = vm_map_find_entry(map, &addr, size, (vm_offset_t) 0, VM_OBJECT_NULL, &entry); if (kr != KERN_SUCCESS) { + printf_once("no more room for kmem_alloc in %p\n", map); vm_map_unlock(map); vm_object_deallocate(object); return kr; @@ -449,6 +456,7 @@ kern_return_t kmem_realloc(map, oldaddr, VM_OBJECT_NULL, &newentry); if (kr != KERN_SUCCESS) { vm_map_unlock(map); + printf_once("no more room for kmem_realloc in %p\n", map); return kr; } @@ -533,6 +541,7 @@ kmem_alloc_wired(map, addrp, size) kr = vm_map_find_entry(map, &addr, size, (vm_offset_t) 0, kernel_object, &entry); if (kr != KERN_SUCCESS) { + printf_once("no more room for kmem_alloc_wired in %p\n", map); vm_map_unlock(map); return kr; } @@ -607,6 +616,7 @@ kmem_alloc_aligned(map, addrp, size) kr = vm_map_find_entry(map, &addr, size, size - 1, kernel_object, &entry); if (kr != KERN_SUCCESS) { + printf_once("no more rooom for kmem_alloc_aligned in %p\n", map); vm_map_unlock(map); return kr; } @@ -668,8 +678,10 @@ kmem_alloc_pageable(map, addrp, size) (vm_offset_t) 0, TRUE, VM_OBJECT_NULL, (vm_offset_t) 0, FALSE, VM_PROT_DEFAULT, VM_PROT_ALL, VM_INHERIT_DEFAULT); - if (kr != KERN_SUCCESS) + if (kr != KERN_SUCCESS) { + printf_once("no more room for kmem_alloc_pageable in %p\n", map); return kr; + } *addrp = addr; return KERN_SUCCESS; @@ -800,27 +812,27 @@ kmem_remap_pages(object, offset, start, } /* - * kmem_suballoc: + * kmem_submap: * - * Allocates a map to manage a subrange + * Initializes a map to manage a subrange * of the kernel virtual address space. * * Arguments are as follows: * + * map Map to initialize * parent Map to take range from * size Size of range to find * min, max Returned endpoints of map * pageable Can the region be paged */ -vm_map_t -kmem_suballoc(parent, min, max, size, pageable) - vm_map_t parent; +void +kmem_submap(map, parent, min, max, size, pageable) + vm_map_t map, parent; vm_offset_t *min, *max; vm_size_t size; boolean_t pageable; { - vm_map_t map; vm_offset_t addr; kern_return_t kr; @@ -839,20 +851,16 @@ kmem_suballoc(parent, min, max, size, pa vm_submap_object, (vm_offset_t) 0, FALSE, VM_PROT_DEFAULT, VM_PROT_ALL, VM_INHERIT_DEFAULT); if (kr != KERN_SUCCESS) - panic("kmem_suballoc"); + panic("kmem_submap"); pmap_reference(vm_map_pmap(parent)); - map = vm_map_create(vm_map_pmap(parent), addr, addr + size, pageable); - if (map == VM_MAP_NULL) - panic("kmem_suballoc"); - + vm_map_setup(map, vm_map_pmap(parent), addr, addr + size, pageable); kr = vm_map_submap(parent, addr, addr + size, map); if (kr != KERN_SUCCESS) - panic("kmem_suballoc"); + panic("kmem_submap"); *min = addr; *max = addr + size; - return map; } /* @@ -865,9 +873,8 @@ void kmem_init(start, end) vm_offset_t start; vm_offset_t end; { - kernel_map = vm_map_create(pmap_kernel(), - VM_MIN_KERNEL_ADDRESS, end, - FALSE); + vm_map_setup(kernel_map, pmap_kernel(), VM_MIN_KERNEL_ADDRESS, end, + FALSE); /* * Reserve virtual memory allocated up to this time. @@ -1035,7 +1042,7 @@ int copyinmap(map, fromaddr, toaddr, len { if (vm_map_pmap(map) == kernel_pmap) { /* assume a correct copy */ - bcopy(fromaddr, toaddr, length); + memcpy(toaddr, fromaddr, length); return 0; } @@ -1061,7 +1068,7 @@ int copyoutmap(map, fromaddr, toaddr, le { if (vm_map_pmap(map) == kernel_pmap) { /* assume a correct copy */ - bcopy(fromaddr, toaddr, length); + memcpy(toaddr, fromaddr, length); return 0; }