123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- .code16
- main:
- ljmp $0x0,$0x7c05
- main2:
- mov $0x0, %ax
- mov %ax, %ds
- mov %ax, %ss
- mov $0x7b00, %ax
- mov %ax, %sp
- mov $0x500, %ax
- mov %ax, %es
- clc
- int $0x12
- mov %ax, (lower_mem)
- mov $0x0, %di
- call do_e820
- jc hang
- cli
- in $0x92, %al
- or $2, %al
- out %al, $0x92
- xor %eax, %eax
- mov %ds, %ax
- shl $4, %eax
- add $gdt_base, %eax
- mov %eax, gdtr+2
- mov $gdt_end, %eax
- sub $gdt_base, %eax
- mov %ax, gdtr
- lgdtw gdtr
- mov %cr0, %eax
- or $1, %eax
- mov %eax, %cr0
- mov $0x10, %ax
- mov %ax, %ds
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %gs
- mov %ax, %ss
- .global kmain
- ljmp $0x08,$kmain
- hang:
- jmp hang
- do_e820:
- xor %ebx, %ebx
- xor %bp, %bp
- mov $0x534D4150, %edx
- mov $0xe820, %eax
- movl $0x1,%es:20(%di)
- mov $24, %ecx
- int $0x15
- jb do_e820.failed
- mov $0x534D4150, %edx
- cmp %edx, %eax
- jne do_e820.failed
- test %ebx, %ebx
- je do_e820.failed
- jmp do_e820.jmpin
- do_e820.e820lp:
- mov $0xe820, %eax
- movl $0x1,%es:20(%di)
- mov $24, %ecx
- int $0x15
- jb do_e820.e820f
- mov $0x534D4150, %edx
- do_e820.jmpin:
- jcxz do_e820.skipent
- cmp $20, %cl
- jbe do_e820.notext
- testb $0x1, %es:20(%di)
- je do_e820.skipent
- do_e820.notext:
- mov %es:8(%di), %ecx
- or %es:12(%di), %ecx
- jz do_e820.skipent
- inc %bp
- add $24, %di
- do_e820.skipent:
- test %ebx, %ebx
- jne do_e820.e820lp
- do_e820.e820f:
- mov %bp, mmap_ent
- clc
- ret
- do_e820.failed:
- stc
- ret
- .align 8
- gdtr:
- .word 0
- .long 0
- gdt_base:
- .quad 0
- .word 0xFFFF
- .word 0
- .byte 0
- .byte 0x9a
- .byte 0xcf
- .byte 0
- .word 0xffff
- .word 0
- .byte 0
- .byte 0x92
- .byte 0xcf
- .byte 0
- gdt_end:
- .global mmap_ent
- mmap_ent:
- .byte 0
- .byte 0
- .global lower_mem
- lower_mem:
- .byte 0
- .byte 0
|