mirror of
https://github.com/tailix/kernel.git
synced 2024-11-20 11:16:10 -05:00
Started parsing multiboot info
This commit is contained in:
parent
84746cb114
commit
e0739042f1
4 changed files with 31 additions and 11 deletions
14
arch/init.c
14
arch/init.c
|
@ -1,8 +1,9 @@
|
||||||
|
#include "console.h"
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
#include <kernelmq/info.h>
|
#include <kernelmq/info.h>
|
||||||
#include <kernelmq/stdlib.h>
|
#include <kernelmq/stdlib.h>
|
||||||
|
|
||||||
#define MULTIBOOT_MAGIC 0x36d76289
|
|
||||||
|
|
||||||
// Defined in linker script
|
// Defined in linker script
|
||||||
extern char _kernel_offset;
|
extern char _kernel_offset;
|
||||||
extern char _kernel_phys_base;
|
extern char _kernel_phys_base;
|
||||||
|
@ -16,13 +17,14 @@ const struct KernelMQ_Info *init(unsigned long multiboot_magic, unsigned long mu
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unaligned address
|
kmemset(&kinfo, 0, sizeof(struct KernelMQ_Info));
|
||||||
if (multiboot_info_addr & 7) {
|
|
||||||
|
console_initialize();
|
||||||
|
|
||||||
|
if (!multiboot_parse(&kinfo, multiboot_info_addr)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
kmemset(&kinfo, 0, sizeof(struct KernelMQ_Info));
|
|
||||||
|
|
||||||
kinfo.kernel_offset = (unsigned long)&_kernel_offset;
|
kinfo.kernel_offset = (unsigned long)&_kernel_offset;
|
||||||
|
|
||||||
kinfo.kernel_phys_base = (unsigned long)&_kernel_phys_base;
|
kinfo.kernel_phys_base = (unsigned long)&_kernel_phys_base;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#include "console.h"
|
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "protected.h"
|
#include "protected.h"
|
||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
|
@ -15,8 +14,6 @@ void main(const struct KernelMQ_Info *const kinfo_ptr)
|
||||||
{
|
{
|
||||||
kmemset(&kinfo, 0, sizeof(struct KernelMQ_Info));
|
kmemset(&kinfo, 0, sizeof(struct KernelMQ_Info));
|
||||||
|
|
||||||
console_initialize();
|
|
||||||
|
|
||||||
if (!kinfo_ptr) {
|
if (!kinfo_ptr) {
|
||||||
logger_fail("No kernel information. Halt.");
|
logger_fail("No kernel information. Halt.");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "kprintf.h"
|
#include "multiboot.h"
|
||||||
|
|
||||||
#define MULTIBOOT_TAG_TYPE_END 0
|
#define MULTIBOOT_TAG_TYPE_END 0
|
||||||
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
|
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
|
||||||
|
@ -68,8 +68,17 @@ static void print_multiboot_tag_module (const struct multiboot_tag_module
|
||||||
static void print_multiboot_tag_basic_meminfo(const struct multiboot_tag_basic_meminfo *tag);
|
static void print_multiboot_tag_basic_meminfo(const struct multiboot_tag_basic_meminfo *tag);
|
||||||
static void print_multiboot_tag_mmap (const struct multiboot_tag_mmap *tag);
|
static void print_multiboot_tag_mmap (const struct multiboot_tag_mmap *tag);
|
||||||
|
|
||||||
void print_multiboot_info(unsigned long addr)
|
unsigned char multiboot_parse(struct KernelMQ_Info *kinfo, unsigned long addr)
|
||||||
{
|
{
|
||||||
|
if (!kinfo) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unaligned address
|
||||||
|
if (addr & 7) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (
|
for (
|
||||||
struct multiboot_tag *tag = (struct multiboot_tag*)(addr + 8);
|
struct multiboot_tag *tag = (struct multiboot_tag*)(addr + 8);
|
||||||
tag->type != MULTIBOOT_TAG_TYPE_END;
|
tag->type != MULTIBOOT_TAG_TYPE_END;
|
||||||
|
@ -77,6 +86,8 @@ void print_multiboot_info(unsigned long addr)
|
||||||
) {
|
) {
|
||||||
print_multiboot_tag(tag);
|
print_multiboot_tag(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_multiboot_tag(const struct multiboot_tag *const tag)
|
void print_multiboot_tag(const struct multiboot_tag *const tag)
|
||||||
|
|
10
arch/multiboot.h
Normal file
10
arch/multiboot.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef KERNELMQ_INCLUDED_MULTIBOOT
|
||||||
|
#define KERNELMQ_INCLUDED_MULTIBOOT 1
|
||||||
|
|
||||||
|
#include <kernelmq/info.h>
|
||||||
|
|
||||||
|
#define MULTIBOOT_MAGIC 0x36d76289
|
||||||
|
|
||||||
|
unsigned char multiboot_parse(struct KernelMQ_Info *kinfo, unsigned long addr);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue