diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-13 01:18:53 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-13 01:18:53 +0200 |
| commit | d7c12c5210ed1545549b9d2b14fb9fb89ce652e2 (patch) | |
| tree | 845e62b2f504138e7a95e35eee31d9b3a38bb287 /kernel | |
| parent | 2c1148e7920cf1d4c772d0d81757a7f8d736648e (diff) | |
implementing multiboot spec stuff
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/console.c | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 93 | ||||
| -rw-r--r-- | kernel/multiboot.h | 50 |
3 files changed, 124 insertions, 23 deletions
diff --git a/kernel/console.c b/kernel/console.c index b815c24..0a208bb 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -16,8 +16,8 @@ uint32_t console_init(){ scr_clear(); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init console"); - int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin"); - if(inode_nr!=-1)ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x8000000,0xffff); // load font; + // int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin"); + // if(inode_nr!=-1)ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x8000000,0xffff); // load font; return 0; } void console_del_char(){scr_backspace();} diff --git a/kernel/kernel.c b/kernel/kernel.c index 8bd60ca..d0f1bce 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -13,6 +13,7 @@ #include "mem.h" #include "vmem.h" #include "interrupts.h" +#include "multiboot.h" #include "console.h" @@ -23,31 +24,79 @@ #include "task.h" -// mp informs us if this if this is the main processor -void kernel_main(uint32_t initial_stack, int mp) +void kernel_main(uint32_t eax,uint32_t ebx) { -/* - int i=0; - while(true) - { - size_t *terminal_buffer = (uint16_t*) 0xB8000; - uint16_t c16='X'; - i++; - if (i%2)c16='_'; - - c16 = c16 | 4 << 8; - terminal_buffer[2] = c16; - } - */ + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kernel_main: eax=0x%08X ebx=0x%08X",eax,ebx); - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initial_stack: 0x%08X",initial_stack); // // Configuring the PIT timer. // + timer_init(); + // + // Process Multiboot Header + // + + if(eax!=0x2badb002)panic(FOOLOS_MODULE_NAME,"EAX was not set properly by your bootlaoder!"); + + multiboot_information *info; + info=ebx; + if(info->flags&&1<<9) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Loaded by: \"%s\"",info->boot_loader_name); + } + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"multiboot flags: 0x%08X",info->flags); + + if(info->flags&&1<<0) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_lower: %d KB",info->mem_lower); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mem_upper: %d KB",info->mem_upper); + } + + if(info->flags&&1<<2) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"cmdline: \"%s\"",info->cmdline); + } + + if(info->flags&&1<<3) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d modules loaded",info->mods_count); + + multiboot_mod *mod=info->mods_addr; + + for(int i=0;i<info->mods_count;i++) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"mod at 0x08%X-0x08%X : %s", + mod->mod_start,mod->mod_end, mod->string); + mod++; + } + } + + if(info->flags&&1<<6) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"memory map of length %d provided by bootloader",info->mmap_length); + + uint32_t mmap_addr=info->mmap_addr; + + while(mmap_addr<info->mmap_addr+info->mmap_length) + { + multiboot_mmap *mmap=mmap_addr; + uint32_t mem_start=mmap->base_addr; + uint32_t mem_end=mmap->base_addr+mmap->length; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%08X - %08X / type: %d, size: %d", + mem_start, mem_end, mmap->type, mmap->size); + + mmap_addr+=mmap->size+4; + } + + + } + else panic(FOOLOS_MODULE_NAME,"Unable to continue without memory map, sorry!"); + // // Memory Init // @@ -57,22 +106,24 @@ void kernel_main(uint32_t initial_stack, int mp) // we know that here, the bootloader placed the memory map and // the number of entries. // - mem_init((physical_address)0xa001,(int)(*((uint16_t *)(0xa000)))); +// mem_init((physical_address)0xa001,(int)(*((uint16_t *)(0xa000)))); + // // init output to screen // uint32_t physbase=console_init(); + // // Activate Virtual Memory (paging) - pdirectory *dir=vmem_init(physbase); +// pdirectory *dir=vmem_init(physbase); // log buffered messages to console log_log(); - //while(1); + while(1); // // Setup Interrupts (code segment: 0x08) @@ -110,7 +161,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Initialize Multitasking // - task_init(dir); //; this will never return! + //task_init(dir); //; this will never return! } diff --git a/kernel/multiboot.h b/kernel/multiboot.h new file mode 100644 index 0000000..874e473 --- /dev/null +++ b/kernel/multiboot.h @@ -0,0 +1,50 @@ +//# https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Boot-information-format + + +#include <stdbool.h> +#include <stdint.h> + +typedef struct multiboot_information_struct +{ + uint32_t flags; + uint32_t mem_lower; + uint32_t mem_upper; + uint32_t boot_device; + uint32_t cmdline; + uint32_t mods_count; + uint32_t mods_addr; + uint32_t mods_syms[4]; + uint32_t mmap_length; + uint32_t mmap_addr; + uint32_t drives_length; + uint32_t drives_addr; + uint32_t config_table; + uint32_t boot_loader_name; + uint32_t amp_table; + uint32_t vbe_control_info; + uint32_t vbe_mode_info; + uint16_t vbe_mode; + uint16_t vbe_interface_seg; + uint16_t vbe_interface_off; + uint16_t vbe_interface_len; + + +}multiboot_information; + +typedef struct multiboot_mmap_struct +{ + uint32_t size; + uint64_t base_addr; + uint64_t length; + uint32_t type; + +}multiboot_mmap; + +typedef struct multiboot_mod_struct +{ + uint32_t mod_start; + uint32_t mod_end; + uint32_t string; + uint32_t reserved; + +}multiboot_mod; |
