static void reserve_resources_of_dev(struct pnp_dev *dev) { struct resource *res; int i; for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { if (res->flags & IORESOURCE_DISABLED) continue; if (res->start == 0) continue; /* disabled */ if (res->start < 0x100) /* * Below 0x100 is only standard PC hardware * (pics, kbd, timer, dma, ...) * We should not get resource conflicts there, * and the kernel reserves these anyway * (see arch/i386/kernel/setup.c). * So, do nothing */ continue; if (res->end < res->start) continue; /* invalid */ reserve_range(dev, res, 1); } for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { if (res->flags & IORESOURCE_DISABLED) continue; reserve_range(dev, res, 0); } }
static void reserve_resources_of_dev(struct pnp_dev *dev) { struct resource *res; int i; for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { if (res->flags & IORESOURCE_DISABLED) continue; if (res->start == 0) continue; if (res->start < 0x100) continue; if (res->end < res->start) continue; reserve_range(dev, res, 1); } for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { if (res->flags & IORESOURCE_DISABLED) continue; reserve_range(dev, res, 0); } }
void mm::physical::init( const multiboot_info* mbt, uintptr_t kernel_static_end, uintptr_t kernel_dynamic_end, uintptr_t himem_end ) { if( !himem_end ) { PANIC( "NO MEMORY FOUND!\n" ); } size_t dma_pool_size = (DMA_MEMORY_LIMIT < kernel_dynamic_end) ? DMA_MEMORY_LIMIT : kernel_dynamic_end; size_t default_pool_size = kernel_dynamic_end - dma_pool_size; size_t himem_pool_size = himem_end - kernel_dynamic_end; size_t dma_pool_pages = dma_pool_size / PAGE_SIZE; size_t default_pool_pages = default_pool_size / PAGE_SIZE; size_t himem_pool_pages = himem_pool_size / PAGE_SIZE; int* dma_pool_bitmap = linear_alloc<int>( dma_pool_pages * sizeof(int), 16, &kernel_static_end ); int* default_pool_bitmap = linear_alloc<int>( default_pool_pages * sizeof(int), 16, &kernel_static_end ); int* himem_pool_bitmap = linear_alloc<int>( himem_pool_pages * sizeof(int), 16, &kernel_static_end ); uintptr_t dma_pool_start = 0; uintptr_t default_pool_start = dma_pool_start + dma_pool_size; uintptr_t himem_pool_start = default_pool_start + default_pool_size; DMAPool.init( dma_pool_start, dma_pool_pages, dma_pool_bitmap ); DefaultPool.init( default_pool_start, default_pool_pages, default_pool_bitmap ); HiMemPool.init( himem_pool_start, himem_pool_pages, himem_pool_bitmap ); debug_bochs_printf( "Physical memory layout:\n" ); debug_bochs_printf( " DMA memory %x-%x\n", DMAPool.base(), DMAPool.limit() ); debug_bochs_printf( " Default memory %x-%x\n", DefaultPool.base(), DefaultPool.limit() ); debug_bochs_printf( " High memory %x-%x\n", HiMemPool.base(), HiMemPool.limit() ); multiboot::iterate_mmap( mbt, [](const multiboot_mmap_entry* mmap) { if( !(mmap->type & MULTIBOOT_MEMORY_AVAILABLE) ) { //console.printf( "Found reserved memory %lx - %lx\n", mmap->addr, mmap->addr + mmap->len ); reserve_range( mmap->addr, mmap->len ); } } ); // Reserve kernel code + pmem bitmaps (added above to kernel_static_end) reserve_range( 0, kernel_static_end ); }
int main(void){ void (*fnp)(void) = 0x5000000000000000; reserve_range((void*)fnp,0x42000000); (*fnp)(); svp_abort(); }
static void reserve_resources_of_dev(const struct pnp_dev *dev) { int i; for (i = 0; i < PNP_MAX_PORT; i++) { if (!pnp_port_valid(dev, i)) continue; if (pnp_port_start(dev, i) == 0) continue; /* disabled */ if (pnp_port_start(dev, i) < 0x100) /* * Below 0x100 is only standard PC hardware * (pics, kbd, timer, dma, ...) * We should not get resource conflicts there, * and the kernel reserves these anyway * (see arch/i386/kernel/setup.c). * So, do nothing */ continue; if (pnp_port_end(dev, i) < pnp_port_start(dev, i)) continue; /* invalid */ reserve_range(dev->dev.bus_id, pnp_port_start(dev, i), pnp_port_end(dev, i), 1); } for (i = 0; i < PNP_MAX_MEM; i++) { if (!pnp_mem_valid(dev, i)) continue; reserve_range(dev->dev.bus_id, pnp_mem_start(dev, i), pnp_mem_end(dev, i), 0); } return; }