static int kernel_routes(struct kernel_route *routes, int maxroutes) { int found = 0; void *data[3] = { &maxroutes, routes, &found }; struct kernel_filter filter = {0}; filter.route = filter_route; filter.route_closure = data; kernel_dump(CHANGE_ROUTE, &filter); return found; }
/* ifindex is 0 for all interfaces. ll indicates whether we are interested in link-local or global addresses. */ int kernel_addresses(int ifindex, int ll, struct kernel_route *routes, int maxroutes) { int found = 0; void *data[5] = { &maxroutes, routes, &found, &ifindex, &ll }; struct kernel_filter filter = {0}; filter.addr = filter_address; filter.addr_closure = data; kernel_dump(CHANGE_ADDR, &filter); return found; }
static error_t kernel_init(const multiboot_info_t* mbi) { multiboot_header_t* header; memory_map_t* mmap; paddr_t paddr; uint32_t size; uint32_t diff; TRACE_ENTRY(); /* check header */ header = (multiboot_header_t*)multiboot_header; if (header->magic != MULTIBOOT_HEADER_MAGIC) return ERROR_FAILURE; /* find space for the kernel */ g_kernel_info = NULL; for (mmap = (memory_map_t*)mbi->mmap_addr; (mmap < (memory_map_t*)mbi->mmap_addr + mbi->mmap_length) && (g_kernel_info == NULL); mmap = (memory_map_t*)((paddr_t)mmap + mmap->size + sizeof(mmap->size))) if (mmap->type == 1) { paddr = (paddr_t)mmap->base_addr_low; size = mmap->length_low; /* special case for NULL */ if ((paddr == NULL) && (size > PHYS_FRAME_SIZE)) { paddr += PHYS_FRAME_SIZE; size -= PHYS_FRAME_SIZE; } /* align on page boundary */ diff = (uint32_t)paddr & (PHYS_FRAME_SIZE - 1); if (diff) { if (diff < size) { paddr += diff; size -= diff; } else { paddr = NULL; size = 0; } } if ((paddr != NULL) && (size >= PHYS_FRAME_SIZE)) g_kernel_info = (kernel_info_t*)paddr; } if (g_kernel_info == NULL) return ERROR_NO_MEMORY; /* reset */ g_kernel_info->kernel_addr = NULL; g_kernel_info->kernel_size = 0; /* use multiboot infos */ if (header->flags & (1 << 15)) { g_kernel_info->kernel_addr = (paddr_t)header->load_addr; g_kernel_info->kernel_size = header->load_end_addr - header->load_addr; } else { g_kernel_info->kernel_addr = g_kernel_start; g_kernel_info->kernel_size = g_kernel_end - g_kernel_start; } kernel_dump(g_kernel_info); TRACE_EXIT(); return ERROR_SUCCESS; }