view head64test/head64.S @ 19:f8ef856d6691

two new test directory
author Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
date Tue, 09 Oct 2012 17:35:53 +0900
parents
children
line wrap: on
line source

.globl bootstart
.code16

bootstart:

    movb $0xff, %al
    outb %al, $0x21
    movb $0xff, %al
    outb %al, $0xa1
    cli

/* open A20 */
1:  inb $0x64, %al
    testb $2, %al
    jnz 1b
    movb $0xd1, %al
    outb %al, $0x64
1:  inb $0x64, %al
    testb $2, %al
    jnz 1b
    movb $0xdf, %al
    outb %al, $0x60

    lidt idt32ptr
    lgdt gdt32ptr

    movl %cr0, %eax
    andl $0x7fffffff
    orl $0x00000001, %eax
    movl %eax, %cr0

    ljmp $24, $entry32

    .align 16

idt32ptr:
    .word 0
    .long 0

    .align 16

gdt32ptr:
    .word 4*8-1
    .long gdt

    .align 16

gdt64ptr:
    .word 4*8-1
    .long gdt,0

    .align 16
gdt:
    .word 0,0,0,0
    .word 0xffff,0x0000,0x9a00,0x00af /* 8: r-x D=0 L=1 */
    .word 0xffff,0x0000,0x9200,0x00cf /* 16: data rw- */
    .word 0xffff,0x0000,0x9a00,0x00af /* 24: code r-x D=1 L=0 */
    .align 16

/* 32bit protected mode */

entry32:
    .code32
    movw $16, %ax
    movw %ax, %ds
    movw %ax, %es
    movw %ax, %fs
    movw %ax, %gs
    movw %ax, %ss
    movl $0x01fe8ff0, %esp

    /* enable PAE */
    movl $0x00000020, %eax
    movl %eax, %cr4

    /* create 64bit page table */
    movl $0x01fe9000, %ebx
    movl %ebx, %edi
    xorl %eax, %eax
    movl $(512*8*6/4), %ecx
    rep stosl
    
    /* level 4 page map */
    leal 0x1007(%ebx), %eax
    movl %eax, (%ebx)

    /* page directory pointers */
    leal 0x1000(%ebx), %edi
    leal 0x2007(%ebx), %eax
    movl $4, %ecx
1:  movl %eax, (%edi)
    addl $8, %edi
    addl $0x1000, %eax
    loop 1b

    /* page  directories */
    leal 0x2000(%ebx), %edi
    movl $0x183, %eax
    movl $(512*4), %ecx
1:  movl %eax, %(%edi)
    addl $8, %edi
    addl $0x00200000, %eax
    loop 1b

    /* set page table base register */
    movl %ebx, %cr3

    /* enable long mode */
    movl $0xc0000080, %ecx
    rdmsr
    btsl $8, %eax
    wrmsr

    /* activate page translation and long mode */
    movl $0x80000001, %eax
    movl %eax, %cr0

    /* load code 64 descriptor */
    pushl $8
    pushl $entry64
    lret

entry64:
    .code64

    /* clear screen */
    movl $0xb8000, %edi
    movw %0x0f20, %ax
    movl $80 * 25, %ecx
    rep stosw

    /* draw 4 characters with them attributes */
    movl $0xb8000, %edi
    movq fourchars(%rip), %r8
    movq %r8, (%rdi)

    /* work down. loop forever. */
2:  hlt
    jmp 2b

    .align 8

fourchars:
    .quad 0x0f330e320d310c30