コード例 #1
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;	/* 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);
	}
}
コード例 #2
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);
	}
}
コード例 #3
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 );
}
コード例 #4
0
ファイル: basfunc.c プロジェクト: LeendertD/ProgramLoader
int main(void){
  void (*fnp)(void) = 0x5000000000000000;
  reserve_range((void*)fnp,0x42000000);

  (*fnp)();

  svp_abort();
}
コード例 #5
0
ファイル: system.c プロジェクト: 3sOx/asuswrt-merlin
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;
}