changeset 16:ae3984023229

separate directory.
author Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
date Mon, 24 Sep 2012 16:14:04 +0900
parents e7ab5a0911d4
children 0e67c0057780
files withGRUB2Kernel/boot/bootstrap.S withGRUB2Kernel/boot/head64.S withGRUB2Kernel/include/boot_header.h withGRUB2Kernel/include/multiboot2.h withGRUB2Kernel/kernel/kernel.cbc
diffstat 5 files changed, 233 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/withGRUB2Kernel/boot/bootstrap.S	Mon Sep 24 16:14:04 2012 +0900
@@ -0,0 +1,143 @@
+/*
+ * This program is boot to kernel.
+ * Change mode to 64bit mode and go to CbC kernel.  */
+
+.file "bootstrap.S"
+
+#include "../include/multiboot2.h"
+#include "../include/boot_header.h"
+
+.code32
+.text
+
+    /* Align 64 bit boundly. */
+    .align 8
+multiboot_header:
+    .long MULTIBOOT2_HEADER_MAGIC
+    .long MULTIBOOT_ARCHITECTURE_I386
+    .long multiboot_header_end - multiboot_header
+    .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
+    .short MULTIBOOT_HEADER_TAG_END
+    .short 0
+    .long 8
+multiboot_header_end:
+
+
+/*
+ * Prepare for entering 64bit-mode.
+ */
+
+.globl _start
+
+_start:
+    jmp move_longmode
+
+move_longmode:
+    /* load new GDT */
+    leal gdt(%ebp), %eax
+    movl %eax, gdt+2(%ebp)
+    lgdt gdt(%ebp)
+
+    /* 
+     * PAE mode ON.
+     * Physical Address Extension
+     * You can use capacity of memory more than 4GiB on 32 bit CPU.
+     */
+
+    movl $0x00000020, %eax
+    movl %eax, %cr4
+
+    /* 
+     * create 64bit page table
+     */
+    
+    /* 
+     * Initialize page tables to 0 
+     * 6144 = 512*8*6/4 
+     */
+
+    movl $0x01fe9000, %ebx
+    leal pgtable(%ebx), %edi
+    xorl %eax, %eax
+    movl $6144, %ecx
+    rep stosl
+
+    /* Build Level 4 */
+    leal pgtable + 0(%ebx), %edi
+    leal 0x1007(%edi), %eax
+    movl %eax, 0(%edi)
+
+    /* Build Level 3 */
+    leal pgtable + 0x1000(%ebx), %edi
+    leal 0x1007(%edi), %eax
+    movl $4, %ecx
+1:  movl %eax, 0x00(%edi)
+    addl $0x00001000, %eax
+    addl $8, %edi
+    decl %ecx
+    jnz 1b
+
+    /* Build level 2 */
+    leal pgtable + 0x2000(%ebx), %edi
+    movl $0x00000183, %eax
+    movl $2048, %ecx
+1:  movl %eax, 0(%edi)
+    addl $0x00200000, %eax
+    addl $8, %edi
+    decl %ecx
+    jnz 1b
+
+    /* Enable the boot page talbes */
+    leal pgtable(%ebx), %eax
+    movl %eax, %cr3
+    
+    /* Enable Long mode */
+    movl $MSR_EFER, %ecx
+    rdmsr
+    btsl $EFER_LME, %eax 
+    wrmsr
+    
+    pushl $(12*8)
+    leal start_kernel(%ebp), %eax
+    pushl %eax
+
+    /* activating Long Mode */
+    movl %eax, %cr0
+    
+    jmp start_kernel
+
+
+/* 
+ * jump to kernel.
+ * push ebx and eax send argument to kernel.
+ */
+.code64
+.text 
+
+start_kernel:
+    pushq %rbx
+    pushq %rax
+    call kmain 
+
+.data
+gdt:
+    .word gdt_end - gdt
+    .long gdt
+    .word 0
+    .quad 0x0000000000000000  /* NULL descriptor */
+    .quad 0x00af9a000000ffff  /* __KERNEL_CS */
+    .quad 0x00cf92000000ffff  /* __KERNEL_DS */
+    .quad 0x0080890000000000  /* TS descriptor */
+    .quad 0x0000000000000000  /* TS continued */
+gdt_end:
+
+
+/*
+ * Space for page tables.
+ * a : section is allocatable.
+ * @nobits : section does not contain data.
+ */
+.section ".pgtable", "a", @nobits
+.balign 4096
+pgtable:
+    .fill 6*4096, 1, 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/withGRUB2Kernel/boot/head64.S	Mon Sep 24 16:14:04 2012 +0900
@@ -0,0 +1,15 @@
+/* 
+ * jump to kernel.
+ * push ebx and eax send argument to kernel.
+ */
+
+
+#include "bootstrap.S"
+
+.code64
+.text 
+
+start_kernel:
+    pushq %rbx
+    pushq %rax
+    call kmain 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/withGRUB2Kernel/include/boot_header.h	Mon Sep 24 16:14:04 2012 +0900
@@ -0,0 +1,7 @@
+#ifndef BOOT_HEADER
+#define BOOT_HEADER
+
+#define MSR_EFER 0xc0000080
+#define EFER_LME 8
+
+#endif /* BOOT_HEADER */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/withGRUB2Kernel/include/multiboot2.h	Mon Sep 24 16:14:04 2012 +0900
@@ -0,0 +1,8 @@
+#ifndef MULTIBOOT2_HEADER
+#define MULTIBOOT2_HEADER
+
+#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
+#define MULTIBOOT_ARCHITECTURE_I386 0
+#define MULTIBOOT_HEADER_TAG_END 0
+
+#endif /* MULTIBOOT2_HEADER */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/withGRUB2Kernel/kernel/kernel.cbc	Mon Sep 24 16:14:04 2012 +0900
@@ -0,0 +1,60 @@
+__code memory(int state);
+__code kernel(int state);
+void init(int state);
+
+__code put_to_vmem(unsigned char* str, unsigned short *video)
+{
+    char c;
+    if ((c=*(str++))!=0) {
+        *video++ = (0x0E << 8) | c;
+        goto put_to_vmem(str, video);
+    } else {
+        goto kernel(3);
+    }
+}
+
+
+__code putchar(int state)
+{
+    unsigned short *video = (unsigned short *)0xb8000;
+    unsigned char *str = (unsigned char *)"hello,world";
+
+    goto put_to_vmem(str, video);
+
+    goto kernel(2);
+}
+
+__code kernel(int state)
+{
+    switch(state) {
+        case 1:
+            goto putchar(3);
+            break;
+        case 2:
+            goto memory(state);        
+            break; 
+    }
+    goto kernel(state);
+}
+
+__code memory(int state)
+{
+    if (state == 1) {
+        goto kernel(state);
+    }
+    init(state);
+}
+
+void
+init(int state)
+{
+    goto kernel(state);
+}
+
+int
+kmain(unsigned long magic, unsigned long addr)
+{
+    int state = 1;
+    init(state);
+    return 0;
+}