Added k_bootstrap.c, k_early_panic.[ch]

Calling k_bootstrap() from boot.asm in segmented mode

git-svn-id: svn://anubis/hos/trunk@25 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
josh 2009-06-30 20:12:39 +00:00
parent d4f5a0b244
commit 6ea8fe1a27
7 changed files with 88 additions and 26 deletions

View File

@ -18,6 +18,7 @@ iso: $(ISO) kernel
$(ISO): kernel $(ISO): kernel
cp kernel/$(KERNEL_FILE) iso/boot cp kernel/$(KERNEL_FILE) iso/boot
-rm -f $(ISO)
$(MKISOFS) -R -b boot/grub/stage2_eltorito -no-emul-boot \ $(MKISOFS) -R -b boot/grub/stage2_eltorito -no-emul-boot \
-boot-load-size 4 -boot-info-table -o $(ISO) iso -boot-load-size 4 -boot-info-table -o $(ISO) iso

View File

@ -8,6 +8,7 @@
%define MULTIBOOT_HEADER_FLAGS 0x00010003 %define MULTIBOOT_HEADER_FLAGS 0x00010003
%define VIRTUAL_OFFSET 0xE0000000 ; kernel virtual addr %define VIRTUAL_OFFSET 0xE0000000 ; kernel virtual addr
%define CONSOLE_MEMORY VIRTUAL_OFFSET + 0xB8000
%define PAGE_SIZE 0x1000 ; 4KB pages %define PAGE_SIZE 0x1000 ; 4KB pages
@ -15,7 +16,7 @@
extern _end, _bss extern _end, _bss
; Symbols from C ; Symbols from C
extern k_mbsave, page_directory extern k_bootstrap, page_directory
;------------------------------------------------------- ;-------------------------------------------------------
[section .text] [section .text]
@ -46,8 +47,8 @@ multiboot_header:
;* Resume execution * ;* Resume execution *
;************************************************************************** ;**************************************************************************
multiboot_entry: multiboot_entry:
mov ax, 0x0700 + 'a' mov cx, 0x0700 + 'a'
mov [0xB8000+160*8+0*2], ax mov [CONSOLE_MEMORY-VIRTUAL_OFFSET+160*8+0*2], cx
lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR
jmp KERNEL_CODE_32_TMP_SEG:segmented_start jmp KERNEL_CODE_32_TMP_SEG:segmented_start
@ -65,17 +66,17 @@ segmented_start:
mov fs, cx mov fs, cx
mov esp, page_directory+PAGE_SIZE-4 ; set up temporary stack space mov esp, page_directory+PAGE_SIZE-4 ; set up temporary stack space
mov ax, 0x0700 + 'b' mov cx, 0x0700 + 'b'
mov [VIRTUAL_OFFSET+0xB8000+160*8+1*2], ax mov [CONSOLE_MEMORY+160*8+1*2], cx
; add ebx, VIRTUAL_OFFSET add ebx, VIRTUAL_OFFSET
; push eax push eax
; push ebx ; pointer to multiboot info struct push ebx ; pointer to multiboot info struct
; call k_mbsave call k_bootstrap
; add esp, 8 add esp, 8
; mov ax, 0x0700 + 'c' mov cx, 0x0700 + 'e'
; mov [VIRTUAL_OFFSET+0xB8000+160*8+2*2], ax mov [CONSOLE_MEMORY+160*8+4*2], cx
idle_loop: idle_loop:
hlt hlt

26
kernel/boot/k_bootstrap.c Normal file
View File

@ -0,0 +1,26 @@
#include "hos_types.h"
#include "hos_defines.h"
#include "multiboot.h"
#include "k_early_panic.h"
#define DEBUG_LETTER(col,chr) *(u16_t *)(CONSOLE_MEMORY + 160 * 8 + (col) * 2) \
= 0x0700 | (chr)
/**************************************************************************
* This function is invoked before paging is enabled. Segmentation is *
* utilized to map virtual address 0xE000_0000 to physical address 0x0. *
*************************************************************************/
u32_t k_bootstrap(mb_info_t * mb_info, u32_t mb_magic)
{
DEBUG_LETTER(2, 'c');
if (mb_magic != MB_BOOTLOADER_MAGIC)
{
k_early_panic("Bad multiboot magic identifier!");
}
DEBUG_LETTER(3, 'd');
return 0;
}

View File

@ -0,0 +1,18 @@
#include "hos_types.h"
#include "hos_defines.h"
#include "k_early_panic.h"
void k_early_panic(const char * msg)
{
char * dest = (char *) CONSOLE_MEMORY;
while (*msg)
{
*dest++ = *msg++;
*dest++ = 0x04; /* red error message */
}
/* infinite loop */
for (;;)
;
}

View File

@ -0,0 +1,7 @@
#ifndef K_EARLY_PANIC_H
#define K_EARLY_PANIC_H
void k_early_panic(const char * msg);
#endif

View File

@ -2,6 +2,11 @@
#ifndef HOS_DEFINES_H #ifndef HOS_DEFINES_H
#define HOS_DEFINES_H #define HOS_DEFINES_H
#define PAGE_SIZE 4096 #define PAGE_LOG_SIZE 12
#define PAGE_SIZE (1 << PAGE_LOG_SIZE)
#define PAGE_HIGH_MASK (0xFFFFFFFFu << PAGE_LOG_SIZE)
#define PAGE_LOW_MASK (0xFFFFFFFFu >> (32 - PAGE_LOG_SIZE))
#define CONSOLE_MEMORY 0xE00B8000
#endif #endif

View File

@ -36,11 +36,15 @@ typedef struct
u32_t magic; u32_t magic;
u32_t flags; u32_t flags;
u32_t checksum; u32_t checksum;
u32_t header_addr; u32_t header_addr; // if flags[16]
u32_t load_addr; u32_t load_addr; // if flags[16]
u32_t load_end_addr; u32_t load_end_addr; // if flags[16]
u32_t bss_end_addr; u32_t bss_end_addr; // if flags[16]
u32_t entry_addr; u32_t entry_addr; // if flags[16]
u32_t mode_type; // if flags[2]
u32_t width; // if flags[2]
u32_t height; // if flags[2]
u32_t depth; // if flags[2]
} mb_header_t; } mb_header_t;
/* The symbol table for a.out. */ /* The symbol table for a.out. */
@ -70,26 +74,26 @@ typedef struct
u32_t boot_device; // 1 u32_t boot_device; // 1
u32_t cmdline; // 2 u32_t cmdline; // 2
u32_t mods_count; // 3 u32_t mods_count; // 3
u32_t mods_addr; u32_t mods_addr; // 3
union union
{ {
mb_aout_symbol_table_t aout_sym; // 4 mb_aout_symbol_table_t aout_sym; // 4
mb_elf_section_header_table_t elf_sec; // 5 mb_elf_section_header_table_t elf_sec; // 5
}; };
u32_t mmap_length; // 6 u32_t mmap_length; // 6
u32_t mmap_addr; u32_t mmap_addr; // 6
u32_t drives_length; // 7 u32_t drives_length; // 7
u32_t drives_addr; u32_t drives_addr; // 7
u32_t config_table; // 8 u32_t config_table; // 8
u32_t bootloader_name; // 9 u32_t bootloader_name; // 9
u32_t apm_table; // 10 u32_t apm_table; // 10
u32_t vbe_control_info; // 11 u32_t vbe_control_info; // 11
u32_t vbe_mode_info; u32_t vbe_mode_info; // 11
u16_t vbe_mode; u16_t vbe_mode; // 11
u16_t vbe_interface_seg; u16_t vbe_interface_seg; // 11
u16_t vbe_interface_off; u16_t vbe_interface_off; // 11
u16_t vbe_interface_len; u16_t vbe_interface_len; // 11
} mb_info_t; } mb_info_t;
/* The module structure. */ /* The module structure. */