| #include "config.h" |
| #include "kernel/kernel.h" |
| #include "arch/common/elf_boot.h" |
| #include "libopenbios/sys_info.h" |
| #include "context.h" |
| #include "boot.h" |
| |
| #define printf printk |
| #ifdef CONFIG_DEBUG_BOOT |
| #define debug printk |
| #else |
| #define debug(x...) |
| #endif |
| |
| uint64_t qemu_mem_size; |
| unsigned long va_shift; |
| |
| void collect_multiboot_info(struct sys_info *); |
| |
| void collect_sys_info(struct sys_info *info) |
| { |
| int i; |
| unsigned long long total = 0; |
| struct memrange *mmap; |
| |
| /* Pick up paramters given by bootloader to us */ |
| //info->boot_type = boot_ctx->eax; |
| //info->boot_data = boot_ctx->ebx; |
| info->boot_arg = boot_ctx->param[0]; |
| //debug("boot eax = %#lx\n", info->boot_type); |
| //debug("boot ebx = %#lx\n", info->boot_data); |
| info->boot_type = ELF_BHDR_MAGIC; |
| info->boot_data = virt_to_phys(&elf_image_notes); |
| debug("boot arg = %#lx\n", info->boot_arg); |
| |
| collect_elfboot_info(info); |
| #ifdef CONFIG_LINUXBIOS |
| collect_linuxbios_info(info); |
| #endif |
| #ifdef CONFIG_IMAGE_ELF_MULTIBOOT |
| collect_multiboot_info(info); |
| #endif |
| |
| if (!info->memrange) { |
| info->n_memranges = 1; |
| info->memrange = malloc(1 * sizeof(struct memrange)); |
| info->memrange[0].base = 0; |
| info->memrange[0].size = qemu_mem_size; |
| } |
| |
| debug("\n"); |
| mmap=info->memrange; |
| for (i = 0; i < info->n_memranges; i++) { |
| debug("%08lx-", (long)mmap[i].base); |
| debug("%08lx\n", (long)mmap[i].base + (long)mmap[i].size); |
| total += mmap[i].size; |
| } |
| debug("RAM %ld MB\n", (long)total >> 20); |
| } |