+
+
+/*
+ * Allocate and map memory for devices before the VM system comes alive.
+ */
+
+vm_offset_t io_map_spec(vm_offset_t phys_addr, vm_size_t size, unsigned int flags)
+{
+ vm_offset_t start;
+ unsigned int mflags;
+
+ if(kernel_map != VM_MAP_NULL) { /* If VM system is up, redirect to normal routine */
+
+ return io_map(phys_addr, size, flags); /* Map the address */
+
+ }
+
+ mflags = mmFlgBlock | mmFlgUseAttr | (flags & VM_MEM_GUARDED) | ((flags & VM_MEM_NOT_CACHEABLE) >> 1); /* Convert to our mapping_make flags */
+
+ size = round_page(size + (phys_addr - (phys_addr & -PAGE_SIZE))); /* Extend the length to include it all */
+ start = pmap_boot_map(size); /* Get me some virtual address */
+
+ (void)mapping_make(kernel_pmap, (addr64_t)start, (ppnum_t)(phys_addr >> 12),
+ mflags, /* Map with requested cache mode */
+ (size >> 12), VM_PROT_READ|VM_PROT_WRITE);
+
+ return (start + (phys_addr & PAGE_MASK));
+}