Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. format MS COFF
  3.  
  4. include '../macros.inc'
  5.  
  6. $Revision: 849 $
  7.  
  8. include "../const.inc"
  9.  
  10. public __start
  11.  
  12. extrn  _high_code
  13. extrn  __os_stack
  14. extrn  _boot_mbi
  15. extrn  _sys_pdbr
  16.  
  17. extrn  _gdts
  18. extrn  __edata
  19.  
  20. section '.init' code readable align 16
  21.  
  22. use32
  23.  
  24. align 4
  25.  
  26. mboot:
  27.   dd  0x1BADB002
  28.   dd  0x00010003
  29.   dd  -(0x1BADB002 + 0x00010003)
  30.   dd  mboot
  31.   dd  0x100000
  32.   dd  __edata; - OS_BASE
  33.   dd  LAST_PAGE
  34.   dd  __start
  35.  
  36. align 16
  37. __start:
  38.            cld
  39.  
  40.            mov esp, __os_stack +(0x100000000-OS_BASE)
  41.            push 0
  42.            popf
  43.  
  44.            cmp eax, 0x2BADB002
  45.            mov ecx, sz_invboot
  46.            jne .fault
  47.  
  48.            bt dword [ebx], 3
  49.            mov ecx, sz_nomods
  50.            jnc .fault
  51.  
  52.            bt dword [ebx], 6
  53.            mov ecx, sz_nommap
  54.            jnc .fault
  55.  
  56.            mov [_boot_mbi+(0x100000000-OS_BASE)], ebx
  57.  
  58.            xor eax, eax
  59.            cpuid
  60.            cmp eax, 0
  61.            mov ecx, sz_nopse
  62.            jbe .fault
  63.  
  64.            mov eax, 1
  65.            cpuid
  66.            bt edx, 3
  67.            mov ecx, sz_nopse
  68.            jnc .fault
  69.  
  70. ; ENABLE PAGING
  71.  
  72.            mov ecx, 32
  73.            mov edi, _sys_pdbr+(OS_BASE shr 20)+(0x100000000-OS_BASE)
  74.            mov eax, PG_LARGE+PG_SW
  75. @@:
  76.            stosd
  77.            add eax, 4*1024*1024
  78.            loop @B
  79.  
  80.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)],   PG_LARGE+PG_SW
  81.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)+4], PG_LARGE+PG_SW+4*1024*1024
  82.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)+(page_tabs shr 20)], _sys_pdbr+PG_SW+(0x100000000-OS_BASE)
  83.  
  84.            mov ebx, cr4
  85.            or ebx, CR4_PSE
  86.            and ebx, not CR4_PAE
  87.            mov cr4, ebx
  88.  
  89.            mov eax, _sys_pdbr+(0x100000000-OS_BASE)
  90.            mov ebx, cr0
  91.            or ebx,CR0_PG+CR0_WP
  92.  
  93.            mov cr3, eax
  94.            mov cr0, ebx
  95.  
  96.            mov ebx, [_boot_mbi+(0x100000000-OS_BASE)]
  97.  
  98.            mov edx, [ebx+20]
  99.            mov esi, [ebx+24]
  100.            mov ecx, LAST_PAGE
  101.            test edx, edx
  102.            jz .no_mods
  103. .scan_mod:
  104.            mov ecx, [esi+4]
  105.            add esi, 16
  106.            dec edx
  107.            jnz .scan_mod
  108.  
  109. .no_mods:
  110.            add ecx, 4095
  111.            and ecx, not 4095
  112.  
  113.            lgdt [_gdts+(0x100000000-OS_BASE)]
  114.            jmp pword 0x08:_high_code
  115.  
  116.  
  117. .fault:
  118. ;           push ecx
  119. ;           call _lcls
  120. ;           call __bprintf
  121. _hlt:
  122.            hlt
  123.            jmp _hlt
  124.  
  125. sz_invboot db 'Invalid multiboot loader magic value',0x0A
  126.            db 'Halted',0
  127.  
  128. sz_nomods  db 'No modules loaded',0x0A
  129.            db 'Halted',0
  130.  
  131. sz_nommap  db 'No memory table', 0x0A
  132.            db 'Halted',0
  133.  
  134. sz_nopse   db 'Page size extensions not supported',0x0A
  135.            db 'Halted',0
  136.