Subversion Repositories Kolibri OS

Rev

Rev 859 | Blame | Compare with Previous | 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 '.start' 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, 64
  73.            mov eax, PG_LARGE+PG_SW
  74.            mov edi, _sys_pdbr+(OS_BASE shr 20)+(0x100000000-OS_BASE)
  75.            mov [edi-4], dword (PG_LARGE+PG_USER)
  76. @@:
  77.            stosd
  78.            add eax, 4*1024*1024
  79.            loop @B
  80.  
  81.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)],   PG_LARGE+PG_SW
  82.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)+4], PG_LARGE+PG_SW+4*1024*1024
  83.            mov dword [_sys_pdbr+(0x100000000-OS_BASE)+(page_tabs shr 20)], _sys_pdbr+PG_SW+(0x100000000-OS_BASE)
  84.  
  85.            mov ebx, cr4
  86.            or ebx, CR4_PSE
  87.            and ebx, not CR4_PAE
  88.            mov cr4, ebx
  89.  
  90.            mov eax, _sys_pdbr+(0x100000000-OS_BASE)
  91.            mov ebx, cr0
  92.            or ebx,CR0_PG+CR0_WP
  93.  
  94.            mov cr3, eax
  95.            mov cr0, ebx
  96.  
  97.            mov ebx, [_boot_mbi+(0x100000000-OS_BASE)]
  98.  
  99.            mov edx, [ebx+20]
  100.            mov esi, [ebx+24]
  101.            mov ecx, LAST_PAGE
  102.            test edx, edx
  103.            jz .no_mods
  104. .scan_mod:
  105.            mov ecx, [esi+4]
  106.            add esi, 16
  107.            dec edx
  108.            jnz .scan_mod
  109.  
  110. .no_mods:
  111.            add ecx, 4095
  112.            and ecx, not 4095
  113.  
  114.            lgdt [_gdts]     ;+(0x100000000-OS_BASE)]
  115.            jmp pword 0x10:high_code
  116.  
  117.  
  118. .fault:
  119. ;           push ecx
  120. ;           call _lcls
  121. ;           call __bprintf
  122. _hlt:
  123.            hlt
  124.            jmp _hlt
  125.  
  126. sz_invboot db 'Invalid multiboot loader magic value',0x0A
  127.            db 'Halted',0
  128.  
  129. sz_nomods  db 'No modules loaded',0x0A
  130.            db 'Halted',0
  131.  
  132. sz_nommap  db 'No memory table', 0x0A
  133.            db 'Halted',0
  134.  
  135. sz_nopse   db 'Page size extensions not supported',0x0A
  136.            db 'Halted',0
  137.