From e4701b8d9688b64ddb384930c290e3e49317dc02 Mon Sep 17 00:00:00 2001 From: josh Date: Thu, 7 Jan 2010 15:38:15 +0000 Subject: [PATCH] merged in removing-assembly branch to do more in C git-svn-id: svn://anubis/hos/trunk@80 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/boot/boot.asm | 127 +------------------------------------ kernel/boot/k_bootstrap.cc | 41 +++++++++--- kernel/boot/k_bootstrap.h | 17 +++++ kernel/boot/k_main.cc | 1 + kernel/boot/k_main.h | 11 ++++ kernel/include/multiboot.h | 1 + kernel/link.ld | 1 + kernel/mm/mm.cc | 21 +++++- kernel/mm/mm.h | 24 +++---- kernel/sys/cpu.h | 7 +- 10 files changed, 104 insertions(+), 147 deletions(-) create mode 100644 kernel/boot/k_bootstrap.h create mode 100644 kernel/boot/k_main.h diff --git a/kernel/boot/boot.asm b/kernel/boot/boot.asm index 1d2b80a..a59c30f 100644 --- a/kernel/boot/boot.asm +++ b/kernel/boot/boot.asm @@ -1,146 +1,23 @@ - ; boot.asm ; Author: Josh Holtrop ; Date: 2009-06-25 ; Adapted from HOS 0.16 source -%define MULTIBOOT_HEADER_MAGIC 0x1BADB002 -%define MULTIBOOT_HEADER_FLAGS 0x00000003 - -%define VIRTUAL_OFFSET 0x00000000 ; kernel virtual addr %define CONSOLE_MEMORY 0xB8000 -%define PAGE_SIZE 0x1000 ; 4KB pages - -%define KERNEL_STACK_TOP 0xF0000000 ; permanent stack top - -; Symbols from the linker -extern _end, _bss - ; Symbols from C -extern k_bootstrap, bootstrap_stack, mm_gdtr, k_main +extern k_bootstrap, bootstrap_stack -;------------------------------------------------------- -[section .text] ;************************************************************************** ;* This is the first symbol in the .text section * ;************************************************************************** [global start] start: - - -;************************************************************************** -;* Resume execution * -;************************************************************************** -multiboot_entry: mov cx, 0x0700 + 'a' mov [CONSOLE_MEMORY+160*8+0*2], cx - lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR - jmp KERNEL_CODE_32_TMP_SEG:segmented_start + mov esp, bootstrap_stack+4096 ; set up temporary stack space - -;************************************************************************** -;* Multiboot header data block * -;************************************************************************** -align 4 -multiboot_header: - dd MULTIBOOT_HEADER_MAGIC ; magic - dd MULTIBOOT_HEADER_FLAGS ; flags - dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; checksum - - -;************************************************************************** -;* At this point address 0xE000_0000 is mapped to physical address 0x0 * -;************************************************************************** -segmented_start: - mov cx, KERNEL_DATA_32_TMP_SEG - mov ss, cx - mov ds, cx - mov es, cx - mov gs, cx - mov fs, cx - mov esp, bootstrap_stack+4096-4 ; set up temporary stack space - - mov cx, 0x0700 + 'b' - mov [CONSOLE_MEMORY+VIRTUAL_OFFSET+160*8+1*2], cx - - add ebx, VIRTUAL_OFFSET push eax ; multiboot bootloader magic value push ebx ; pointer to multiboot info struct call k_bootstrap - add esp, 8 - - mov cx, 0x0700 + 'e' - mov [CONSOLE_MEMORY+VIRTUAL_OFFSET+160*8+4*2], cx - - lgdt [mm_gdtr] ; load permanent GDTR - jmp 0x8:segmentation_disabled-VIRTUAL_OFFSET - -;************************************************************************** -;* At this point both segmentation and paging are disabled but we can * -;* now enable paging * -;************************************************************************** -segmentation_disabled: - mov cx, 0x10 - mov ss, cx - mov ds, cx - mov es, cx - mov gs, cx - mov fs, cx - - ; at this point paging is still disabled but the PDBR is valid and - ; points to a page directory that has all of RAM mapped to the - ; beginning of the kernel's virtual address space, and the entire - ; kernel mapped in above 0xE000_0000. - - ; turn on paging - mov eax, cr0 - bts eax, 31 - mov cr0, eax - - ; OK, segmentation is disabled and paging is active! - mov cx, 0x0700 + 'f' - mov [CONSOLE_MEMORY+160*8+5*2], cx - - mov esp, KERNEL_STACK_TOP - call k_main - -idle_loop: - hlt - jmp idle_loop - - -;------------------------------------------------------- -[section .rodata] -gdtr_tmp32: - dw gdt_end_tmp32-gdt_tmp32-1 - dd gdt_tmp32-VIRTUAL_OFFSET - -gdt_tmp32: ; 0 = null descriptor - dd 0 - dd 0 - - ; a base of 0x2000_0000, when added to 0xE000_0000 will produce - ; 0x0000_0000 physical before paging in effect -KERNEL_CODE_32_TMP_SEG equ $-gdt_tmp32 ; 8 - db 0xff ; limit 7:0 - db 0xff ; limit 15:8 - db 0x00 ; base 7:0 - db 0x00 ; base 15:8 - db 0x00 ; base 23:16 - db 0x9a ; access - db 0xcf ; flags / limit 19:16 - db 0x00 ; base 31:24 - -KERNEL_DATA_32_TMP_SEG equ $-gdt_tmp32 ; 16 - db 0xff ; limit 7:0 - db 0xff ; limit 15:8 - db 0x00 ; base 7:0 - db 0x00 ; base 15:8 - db 0x00 ; base 23:16 - db 0x92 ; access - db 0xcf ; flags / limit 19:16 - db 0x00 ; base 31:24 - -gdt_end_tmp32: diff --git a/kernel/boot/k_bootstrap.cc b/kernel/boot/k_bootstrap.cc index a5d573a..75f35b8 100644 --- a/kernel/boot/k_bootstrap.cc +++ b/kernel/boot/k_bootstrap.cc @@ -1,10 +1,11 @@ +#include "k_bootstrap.h" +#include "k_main.h" #include "hos_types.h" #include "hos_defines.h" #include "multiboot.h" #include "k_early_panic.h" #include "mm/mm.h" -#include "mm/stack.h" #include "lang/kio.h" #include "isr/interrupts.h" @@ -16,12 +17,20 @@ extern "C" { u8_t bootstrap_stack[4096]; /************************************************************************** - * This function is invoked before paging is enabled. Segmentation is * - * utilized to map virtual address 0xE000_0000 to physical address 0x0. * + * Multiboot header data block * *************************************************************************/ -u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) +u32_t mb_header[] __attribute__ ((section (".multiboot_header") )) = { + MB_HEADER_MAGIC, /* magic */ + MB_HEADER_FLAGS, /* flags */ + -(MB_HEADER_MAGIC + MB_HEADER_FLAGS) /* checksum */ +}; + +/************************************************************************** + * This function is invoked to bootstrap the kernel. * + *************************************************************************/ +void k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) { - DEBUG_LETTER(2, 'c'); + DEBUG_LETTER(1, 'b'); if (mb_magic != MB_BOOTLOADER_MAGIC) { @@ -40,7 +49,7 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) mmap = (mb_mmap_t *) (((u32_t)mmap) + mmap->size + 4); } - DEBUG_LETTER(3, 'd'); + DEBUG_LETTER(2, 'c'); /* * These functions could destroy the multiboot information block and @@ -48,11 +57,27 @@ u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) * before calling them. */ mm_bootstrap(); - stack_bootstrap(); + DEBUG_LETTER(3, 'd'); interrupts_bootstrap(); + DEBUG_LETTER(4, 'e'); kio_bootstrap(); + DEBUG_LETTER(5, 'f'); - return 0; + __asm__ __volatile__ ("mov $0xF0000000, %%esp;" + : /* no outputs */ + : /* no inputs */ + : /* no clobbers */); + k_main(); + + idle_loop(); +} + +void idle_loop() +{ + for (;;) + { + __asm__ __volatile__ ("hlt"); + } } } /* extern "C" */ diff --git a/kernel/boot/k_bootstrap.h b/kernel/boot/k_bootstrap.h new file mode 100644 index 0000000..44e0807 --- /dev/null +++ b/kernel/boot/k_bootstrap.h @@ -0,0 +1,17 @@ + +#ifndef K_BOOTSTRAP_H +#define K_BOOTSTRAP_H + +#include "hos_types.h" +#include "multiboot.h" + +extern "C" { + +void k_bootstrap(mb_info_t * mb_info, u32_t mb_magic) + __attribute__ ((noreturn)); +void idle_loop() + __attribute__ ((noreturn)); + +} + +#endif diff --git a/kernel/boot/k_main.cc b/kernel/boot/k_main.cc index 5ced9a7..4f72fea 100644 --- a/kernel/boot/k_main.cc +++ b/kernel/boot/k_main.cc @@ -1,4 +1,5 @@ +#include "k_main.h" #include "lang/kio.h" #include "mm/mm.h" #include "sys/timer.h" diff --git a/kernel/boot/k_main.h b/kernel/boot/k_main.h new file mode 100644 index 0000000..bc678e5 --- /dev/null +++ b/kernel/boot/k_main.h @@ -0,0 +1,11 @@ + +#ifndef K_MAIN_H +#define K_MAIN_H + +extern "C" { + +void k_main(); + +} + +#endif diff --git a/kernel/include/multiboot.h b/kernel/include/multiboot.h index 3a1a40c..2654b85 100644 --- a/kernel/include/multiboot.h +++ b/kernel/include/multiboot.h @@ -10,6 +10,7 @@ extern "C" { /* The magic number for the Multiboot header. */ #define MB_HEADER_MAGIC 0x1BADB002 +#define MB_HEADER_FLAGS 0x00000003 #define MB_HEADER_ALIGN_MODULES (1 << 0) #define MB_HEADER_MEM_INFO (1 << 1) diff --git a/kernel/link.ld b/kernel/link.ld index 40b33aa..299ac63 100644 --- a/kernel/link.ld +++ b/kernel/link.ld @@ -6,6 +6,7 @@ SECTIONS { .text virt : AT(phys) { code = .; _code = .; __code = .; + *(.multiboot_header*) *(.text*) *(.gnu.linkonce*) . = ALIGN(4096); diff --git a/kernel/mm/mm.cc b/kernel/mm/mm.cc index e8422ff..b319d21 100644 --- a/kernel/mm/mm.cc +++ b/kernel/mm/mm.cc @@ -154,8 +154,27 @@ void mm_bootstrap() mm_gdtr.limit = 3 * sizeof(mm_gdt[0]) - 1; mm_gdtr.base = gdt_base; + __asm__ __volatile__ ( + "lgdt (mm_gdtr);\n" + "jmp $0x08, $42f;\n" + "42:\n" + "mov $0x10, %%cx\n" + "mov %%cx, %%ss\n" + "mov %%cx, %%ds\n" + "mov %%cx, %%es\n" + "mov %%cx, %%fs\n" + "mov %%cx, %%gs\n" + : /* no outputs */ + : /* no inputs */ + : "ecx"); + /* set the page directory base register */ - set_cr3(page_directory); + write_cr3(page_directory); + + /* turn on paging */ + write_cr0(read_cr0() | (1 << 31)); + + stack_bootstrap(); } /************************************************************************** diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index a5111bf..ab35f2f 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -21,17 +21,6 @@ typedef struct u64_t length; } mm_mem_range_t; -void mm_record_mmap_entry(mb_mmap_t * mmap); -void mm_bootstrap(); - -int mm_early_map(u32_t virtual_address, u32_t physical_address, - u32_t user_mode, u32_t writable); -int mm_map(u32_t virtual_address, u32_t physical_address, - u32_t user_mode, u32_t writable); - -u32_t mm_early_page_alloc(); -u32_t mm_page_alloc(); - /* http://courses.ece.illinois.edu/ece391/references/descriptors.pdf */ /* granularity: 0: limit in bytes; 1: limit in pages */ /* dpl: 0: system mode; 3: user mode */ @@ -50,6 +39,19 @@ u32_t mm_page_alloc(); | ( (((u64_t) base) & 0x00FFFFFFull) << 16) /* base 23:00 */ \ | ( (((u64_t) limit) & 0x0000FFFFull) ) ) /* limit 15:00 */ +typedef u64_t descriptor_t; + +void mm_record_mmap_entry(mb_mmap_t * mmap); +void mm_bootstrap(); + +int mm_early_map(u32_t virtual_address, u32_t physical_address, + u32_t user_mode, u32_t writable); +int mm_map(u32_t virtual_address, u32_t physical_address, + u32_t user_mode, u32_t writable); + +u32_t mm_early_page_alloc(); +u32_t mm_page_alloc(); + void mm_print_memory_map(); #endif diff --git a/kernel/sys/cpu.h b/kernel/sys/cpu.h index 76ff655..d30f3a7 100644 --- a/kernel/sys/cpu.h +++ b/kernel/sys/cpu.h @@ -4,6 +4,7 @@ #include "hos_types.h" +static u32_t read_cr0() __attribute__ ((unused)); static u32_t read_cr0() { u32_t val; @@ -11,6 +12,7 @@ static u32_t read_cr0() return val; } +static u32_t read_cr2() __attribute__ ((unused)); static u32_t read_cr2() { u32_t val; @@ -18,6 +20,7 @@ static u32_t read_cr2() return val; } +static u32_t read_cr3() __attribute__ ((unused)); static u32_t read_cr3() { u32_t val; @@ -25,10 +28,10 @@ static u32_t read_cr3() return val; } -#define set_cr0(val) \ +#define write_cr0(val) \ __asm__ __volatile__ ("movl %0, %%cr0" : : "r" (val)); -#define set_cr3(val) \ +#define write_cr3(val) \ __asm__ __volatile__ ("movl %0, %%cr3" : : "r" (val)); #endif