Пример #1
0
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;
}
Пример #2
0
/* 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;
}
Пример #3
0
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;
}