diff --git a/arch/main.c b/arch/main.c index ae3f8b1..ed777f1 100644 --- a/arch/main.c +++ b/arch/main.c @@ -15,12 +15,8 @@ void main(struct KernelMQ_Multiboot_Info multiboot_info) gdt_initialize(); idt_initialize(); - asm volatile ("int $0x0"); asm volatile ("int $0x3"); asm volatile ("int $0x4"); - asm volatile ("int $0xF"); - asm volatile ("int $0x10"); - asm volatile ("int $0x1F"); logger_warn("Nothing to do."); logger_fail("Halt."); diff --git a/arch/multiboot.c b/arch/multiboot.c index f76e560..06990c7 100644 --- a/arch/multiboot.c +++ b/arch/multiboot.c @@ -5,9 +5,27 @@ #define MULTIBOOT_1_MAGIC 0x2BADB002 #define MULTIBOOT_2_MAGIC 0x36d76289 -#define MULTIBOOT_TAG_TYPE_END 0 -#define MULTIBOOT_TAG_TYPE_CMDLINE 1 -#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_END 0 +#define MULTIBOOT_TAG_TYPE_CMDLINE 1 +#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 +#define MULTIBOOT_TAG_TYPE_MMAP 6 + +#define MULTIBOOT_MEMORY_AVAILABLE 1 +#define MULTIBOOT_MEMORY_RESERVED 2 +#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 +#define MULTIBOOT_MEMORY_NVS 4 + +struct multiboot_mmap_entry +{ + unsigned long long addr; + unsigned long long len; + unsigned int type; + unsigned int zero; +} +__attribute__((packed)); + +typedef struct multiboot_mmap_entry multiboot_memory_map_t; struct multiboot_tag { @@ -31,6 +49,23 @@ struct multiboot_tag_module char cmdline[0]; }; +struct multiboot_tag_basic_meminfo +{ + unsigned int type; + unsigned int size; + unsigned int mem_lower; + unsigned int mem_upper; +}; + +struct multiboot_tag_mmap +{ + unsigned int type; + unsigned int size; + unsigned int entry_size; + unsigned int entry_version; + struct multiboot_mmap_entry entries[0]; +}; + static void itoa(char *buf, int base, int d); static void printf(const char *format, ...); @@ -73,6 +108,35 @@ void print_multiboot_info(struct KernelMQ_Multiboot_Info info) ((struct multiboot_tag_module *) tag)->cmdline ); break; + + case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: + printf( + "mem_lower = %uKB, mem_upper = %uKB\n", + ((struct multiboot_tag_basic_meminfo *) tag)->mem_lower, + ((struct multiboot_tag_basic_meminfo *) tag)->mem_upper + ); + break; + + case MULTIBOOT_TAG_TYPE_MMAP: + { + printf("mmap\n"); + + for ( + multiboot_memory_map_t *mmap = ((struct multiboot_tag_mmap *) tag)->entries; + (unsigned char *) mmap < (unsigned char *) tag + tag->size; + mmap = (multiboot_memory_map_t *)((unsigned long) mmap + ((struct multiboot_tag_mmap *) tag)->entry_size) + ) { + printf( + " base_addr = 0x%x%x, length = 0x%x%x, type = 0x%x\n", + (unsigned) (mmap->addr >> 32), + (unsigned) (mmap->addr & 0xffffffff), + (unsigned) (mmap->len >> 32), + (unsigned) (mmap->len & 0xffffffff), + (unsigned) mmap->type + ); + } + } + break; } } }