Advertisement
konalisp

start.asm

Nov 17th, 2014
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [BITS 32]
  2. [SECTION .mbhdr]
  3. [EXTERN _loadStart]
  4. [EXTERN _loadEnd]
  5. [EXTERN _bssEnd]
  6.  
  7. ; Multiboot constants
  8. MULTIBOOT_PAGE_ALIGN    equ 1<<0
  9. MULTIBOOT_MEMORY_INFO   equ 1<<1
  10. MULTIBOOT_HEADER_MAGIC  equ 0x1BADB002
  11. MULTIBOOT_HEADER_FLAGS  equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
  12. MULTIBOOT_CHECKSUM  equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
  13.  
  14. ; Multiboot header (needed to boot from GRUB)
  15. ALIGN 4
  16. multiboot_header:
  17.     dd MULTIBOOT_HEADER_MAGIC
  18.     dd MULTIBOOT_HEADER_FLAGS
  19.     dd MULTIBOOT_CHECKSUM
  20.  
  21. ALIGN 8
  22. MbHdr:
  23.     ; Magic
  24.     DD  0xE85250D6
  25.     ; Architecture
  26.     DD  0
  27.     ; Length
  28.     DD  HdrEnd - MbHdr
  29.     ; Checksum - NASM was complaining about this line, commented out for now.
  30.     ;DD -(0xE85250D6 + 0 + (HdrEnd - MbHdr))
  31.  
  32.     ;
  33.     ; Tags
  34.     ;
  35.  
  36.     ; Sections override
  37.     DW  2, 0
  38.     DD  24
  39.     DD  MbHdr
  40.     DD  _loadStart
  41.     DD  _loadEnd
  42.     DD  _bssEnd
  43.  
  44.     ; Entry point override
  45.     DW  3, 0
  46.     DD  12
  47.     DD  EntryPoint
  48.         DD      0           ; align next tag to 8 byte boundary
  49.  
  50.     ; End Of Tags
  51.     DW  0, 0
  52.     DD  8
  53.  
  54.     ; Hdr End Mark
  55. HdrEnd:
  56.  
  57.  
  58. [SECTION .boot]
  59. [GLOBAL EntryPoint]
  60. [EXTERN Stack]
  61. EntryPoint:
  62.     mov eax, Gdtr1
  63.     lgdt [eax]
  64.  
  65.     push 0x08
  66.     push .GdtReady
  67.     retf
  68.  
  69. .GdtReady:
  70.     mov eax, 0x10
  71.     mov ds, ax
  72.     mov ss, ax
  73.     mov esp, Stack
  74.  
  75.     call SetupPagingAndLongMode
  76.  
  77.     mov eax, Gdtr2
  78.     lgdt [Gdtr2]
  79.  
  80.     push 0x08
  81.     push .Gdt2Ready
  82.     retf
  83.  
  84. [BITS 64]
  85. [EXTERN kmain]
  86. .Gdt2Ready:
  87.     mov eax, 0x10
  88.     mov ds, ax
  89.     mov es, ax
  90.     mov ss, ax
  91.  
  92.     mov rsp, Stack + 0xFFFFFFFF80000000
  93.  
  94.     ; If you later decide to unmap the lower zone, you will have an invalid Gdt if you're still using Gdtr2
  95.     mov rax, Gdtr3
  96.     lgdt [rax]
  97.  
  98.     mov rax, kmain
  99.     call rax
  100.     cli
  101.     jmp $
  102.    
  103.  
  104. [BITS 32]
  105. [EXTERN Pml4]
  106. [EXTERN Pdpt]
  107. [EXTERN Pd]
  108. SetupPagingAndLongMode:
  109.     mov eax, Pdpt
  110.     or eax, 1
  111.     mov [Pml4], eax
  112.     mov [Pml4 + 0xFF8], eax
  113.  
  114.     mov eax, Pd
  115.     or eax, 1
  116.     mov [Pdpt], eax
  117.     mov [Pdpt + 0xFF0], eax
  118.  
  119.     mov dword [Pd], 0x000083
  120.     mov dword [Pd + 8], 0x200083
  121.     mov dword [Pd + 16], 0x400083
  122.     mov dword [Pd + 24], 0x600083
  123.  
  124.     ; Load CR3 with PML4
  125.     mov eax, Pml4
  126.     mov cr3, eax
  127.  
  128.     ; Enable PAE
  129.     mov eax, cr4
  130.     or eax, 1 << 5
  131.     mov cr4, eax
  132.  
  133.     ; Enable Long Mode in the MSR
  134.     mov ecx, 0xC0000080
  135.     rdmsr
  136.     or eax, 1 << 8
  137.     wrmsr
  138.  
  139.     ; Enable Paging
  140.     mov eax, cr0
  141.     or eax, 1 << 31
  142.     mov cr0, eax
  143.  
  144.     ret
  145.    
  146. TmpGdt:
  147.     DQ  0x0000000000000000
  148.     DQ  0x00CF9A000000FFFF
  149.     DQ  0x00CF92000000FFFF
  150.     DQ  0x0000000000000000
  151.     DQ  0x00A09A0000000000
  152.     DQ  0x00A0920000000000
  153.  
  154. Gdtr1:
  155.     DW  23
  156.     DD  TmpGdt
  157.  
  158. Gdtr2:
  159.     DW  23
  160.     DD  TmpGdt + 24
  161.     DD  0
  162.  
  163. Gdtr3:
  164.     DW  23
  165.     DQ  TmpGdt + 24 + 0xFFFFFFFF80000000
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement