Subversion Repositories Kolibri OS

Rev

Rev 2047 | Rev 2425 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2350 $
  9.  
  10.  
  11. MEM_WB     equ 6               ;write-back memory
  12. MEM_WC     equ 1               ;write combined memory
  13. MEM_UC     equ 0               ;uncached memory
  14.  
  15. ; ======================================================================
  16. align 4
  17. preinit_mem:
  18.  
  19. ; clear [CLEAN_ZONE..HEAP_BASE]
  20.            xor   eax,eax
  21.            mov   edi,CLEAN_ZONE                 ; 0x280000 = ramdisk FAT ?
  22.            mov   ecx,(HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4
  23.            cld
  24.            rep   stosd
  25.  
  26. ; clear [0x40000..0x90000]
  27.            mov   edi,0x50000                    ; 0x50000 is somewhere inside kernel code?
  28.            mov   ecx,(0x90000-0x50000)/4
  29.            rep   stosd
  30.  
  31. ; clear undefined kernel globals
  32.            mov   edi, endofcode-OS_BASE
  33.            mov   ecx, (uglobals_size/4)+4
  34.            rep   stosd
  35.  
  36. ; save [0..0xffff]
  37.            xor   esi, esi
  38.            mov   edi, (BOOT_VAR - OS_BASE)              ; low mem storage area
  39.            mov   ecx, 0x10000 / 4
  40.            rep   movsd
  41. ; clear [0x1000..0x0ffff]
  42.            mov   edi,0x1000
  43.            mov   ecx,0xf000 / 4
  44.            rep   stosd
  45.  
  46. ; clear <sys_pgdir> table
  47.            mov edi, sys_pgdir-OS_BASE
  48.            mov ecx, 4096/4
  49.            rep stosd
  50.         ret
  51.  
  52. ; ======================================================================
  53. align 4
  54. proc init_mem
  55.  
  56.            mov  ecx, 0xC001001A                         ; Top of Memory MSR
  57.            xor  edi, edi
  58.            rdmsr
  59.            mov  esi, eax                                ; esi = total amount of memory
  60.            mov  ecx, 0x0200
  61. .read_mtrr:
  62.            rdmsr
  63.            and  eax, 0xFFF00000                         ; not just bitcleaning
  64.            jz   .next_mtrr                              ; ignore the main memory and free MTRRs
  65.            cmp  esi, eax
  66.            jb   .next_mtrr                              ; ignore MMIO blocks
  67.            mov  esi, eax
  68. .next_mtrr:
  69.            add  cl, 2
  70.            cmp  cl, 0x10
  71.            jb   .read_mtrr
  72.  
  73.            mov  eax, USER_DMA_SIZE
  74.            sub  esi, eax                                ; exclude the Global DMA block...
  75.            and  esi, 0xFF800000                         ; ...and the hole above it
  76.            mov  eax, esi
  77.            mov  [MEM_AMOUNT-OS_BASE], eax
  78.            mov  [pg_data.mem_amount-OS_BASE], eax       ; the true MEMTOP
  79.            mov  [UserDMAaddr-OS_BASE], eax
  80.  
  81.            shr esi, 12
  82.            mov [pg_data.pages_count-OS_BASE], esi       ; max number of PTEs   ?
  83.  
  84.            mov edx, esi                                 ; edx will hold maximum allocatable address
  85.            shr edx, 3
  86.            mov [pg_data.pagemap_size-OS_BASE], edx      ; size of sys_pgmap structure
  87.  
  88.            add edx, (sys_pgmap-OS_BASE)+4095
  89.            and edx, not 4095
  90.            mov [tmp_page_tabs], edx                     ; free zone to build PTEs for all available memory
  91.  
  92.            mov edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
  93.            mov [pg_data.kernel_pages -OS_BASE], edx
  94.            shr edx, 10
  95.            mov [pg_data.kernel_tables-OS_BASE], edx     ; number of Kernel PDEs needed
  96.  
  97.            mov edx, (sys_pgdir-OS_BASE)+ 0x800          ; (0x800 = OS_BASE shr 20)
  98.  
  99.            mov ebx, cr4
  100.            or  ebx, CR4_PSE
  101.            mov eax, PG_LARGE+PG_SW
  102.            mov cr4, ebx
  103.            dec [pg_data.kernel_tables-OS_BASE]
  104.  
  105.            mov [edx], eax                               ; map first (physical) 4M bytes
  106.            add edx, 4
  107.  
  108.            mov edi, [tmp_page_tabs]
  109.            mov ecx, [pg_data.kernel_pages -OS_BASE]     ; safety cleaning of already-zeroed space
  110.            xor eax, eax
  111.            rep stosd
  112.  
  113.            mov ecx, [pg_data.kernel_tables-OS_BASE]     ; build some PDEs to hold empty PTEs
  114.            mov eax, [tmp_page_tabs]
  115.            or  eax, PG_SW
  116.            mov edi, edx                 ; edi = sys_pgdir+0x804
  117.  
  118. .map_kernel_tabs:
  119.            stosd
  120.            add eax, 0x1000
  121.            dec ecx
  122.            jnz .map_kernel_tabs
  123.  
  124. ; map pagetables to linear space
  125.            mov dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
  126.  
  127.            mov edi, (sys_pgdir-OS_BASE)
  128.            lea esi, [edi+(OS_BASE shr 20)]
  129.            movsd
  130.            movsd
  131.            ret
  132. endp
  133.  
  134. align 4
  135. proc init_page_map
  136. ; mark all memory as available
  137.            mov edi, sys_pgmap-OS_BASE
  138.            mov ecx, [pg_data.pagemap_size-OS_BASE]
  139.            shr ecx, 2
  140.            mov eax, -1
  141.            cld
  142.            rep stosd
  143.  
  144.  
  145. ; mark kernel memory as allocated (unavailable)
  146.            mov ecx, [tmp_page_tabs]
  147.            mov edx, [pg_data.pages_count-OS_BASE]
  148.            shr ecx, 12
  149.            add ecx, [pg_data.kernel_tables-OS_BASE]
  150.            sub edx, ecx
  151.            mov [pg_data.pages_free-OS_BASE], edx
  152.  
  153.            mov edi, sys_pgmap-OS_BASE
  154.            mov ebx, ecx
  155.            shr ecx, 5
  156.            xor eax, eax
  157.            rep stosd
  158.  
  159.            not eax
  160.            mov ecx, ebx
  161.            and ecx, 31
  162.            shl eax, cl
  163.            and [edi], eax
  164.            add edi, OS_BASE
  165.            mov [page_start-OS_BASE], edi;
  166.  
  167.            mov ebx, sys_pgmap
  168.            add ebx, [pg_data.pagemap_size-OS_BASE]
  169.            mov [page_end-OS_BASE], ebx
  170.  
  171.            mov [pg_data.pg_mutex-OS_BASE], 0
  172.            ret
  173. endp
  174.  
  175. align 4
  176.  
  177. init_BIOS32:
  178.            mov edi, 0xE0000
  179. .pcibios_nxt:
  180.            cmp dword[edi], '_32_' ; "magic" word
  181.            je .BIOS32_found
  182. .pcibios_nxt2:
  183.            add edi, 0x10
  184.            cmp edi, 0xFFFF0
  185.            je .BIOS32_not_found
  186.            jmp .pcibios_nxt
  187. .BIOS32_found:                  ; magic word found, check control summ
  188.  
  189.            movzx ecx, byte[edi + 9]
  190.            shl ecx, 4
  191.            mov esi, edi
  192.            xor eax, eax
  193.            cld   ; paranoia
  194. @@:     lodsb
  195.            add ah, al
  196.            loop @b
  197.            jnz .pcibios_nxt2 ; control summ must be zero
  198.     ; BIOS32 service found !
  199.            mov ebp, [edi + 4]
  200.            mov [bios32_entry], ebp
  201.     ; check PCI BIOS present
  202.            mov eax, '$PCI'
  203.            xor ebx, ebx
  204.            push cs  ; special for 'ret far' from  BIOS
  205.            call ebp
  206.            test al, al
  207.            jnz .PCI_BIOS32_not_found
  208.  
  209.  ; çäåñü ñîçäàþòñÿ äèñêðèïòîðû äëÿ PCI BIOS
  210.  
  211.            add ebx, OS_BASE
  212.            dec ecx
  213.            mov [(pci_code_32-OS_BASE)], cx    ;limit 0-15
  214.            mov [(pci_data_32-OS_BASE)], cx    ;limit 0-15
  215.  
  216.            mov [(pci_code_32-OS_BASE)+2], bx  ;base  0-15
  217.            mov [(pci_data_32-OS_BASE)+2], bx  ;base  0-15
  218.  
  219.            shr ebx, 16
  220.            mov [(pci_code_32-OS_BASE)+4], bl  ;base  16-23
  221.            mov [(pci_data_32-OS_BASE)+4], bl  ;base  16-23
  222.  
  223.            shr ecx, 16
  224.            and cl, 0x0F
  225.            mov ch, bh
  226.            add cx, D32
  227.            mov [(pci_code_32-OS_BASE)+6], cx  ;lim   16-19 &
  228.            mov [(pci_data_32-OS_BASE)+6], cx  ;base  24-31
  229.  
  230.            mov [(pci_bios_entry-OS_BASE)], edx
  231.          ; jmp .end
  232. .PCI_BIOS32_not_found:
  233.         ; çäåñü äîëæíà çàïîëíÿòñÿ pci_emu_dat
  234. .BIOS32_not_found:
  235. .end:
  236.            ret
  237.  
  238. align 4
  239. test_cpu:       ; only AMD machines supported
  240.  
  241.            xor eax, eax
  242.            mov [cpu_caps-OS_BASE], eax
  243.            mov [cpu_caps+4-OS_BASE], eax
  244.  
  245.            pushfd
  246.            pop eax
  247.            mov ecx, eax
  248.            xor eax, 0x40000
  249.            push eax
  250.            popfd
  251.            pushfd
  252.            pop eax
  253.            xor eax, ecx
  254.            jz $                 ; 386
  255.            push ecx
  256.            popfd
  257.  
  258.            mov eax, ecx
  259.            xor eax, 0x200000
  260.            push eax
  261.            popfd
  262.            pushfd
  263.            pop eax
  264.            xor eax, ecx
  265.            je $                 ; 486
  266.  
  267.            xor eax, eax
  268.            cpuid
  269.  
  270.            mov [cpu_vendor-OS_BASE],   ebx
  271.            mov [cpu_vendor+4-OS_BASE], edx
  272.            mov [cpu_vendor+8-OS_BASE], ecx
  273.  
  274.            cmp ebx, dword [AMD_str-OS_BASE]
  275.            jne $
  276.            cmp edx, dword [AMD_str+4-OS_BASE]
  277.            jne $
  278.            cmp ecx, dword [AMD_str+8-OS_BASE]
  279.            jne $
  280.            cmp eax, 1
  281.            jl $
  282.            mov eax, 1
  283.            cpuid
  284.            mov [cpu_sign-OS_BASE],  eax
  285.            mov [cpu_info-OS_BASE],  ebx
  286.            mov [cpu_caps-OS_BASE],  edx
  287.            mov [cpu_caps+4-OS_BASE],ecx
  288.            shr eax, 8
  289.            and eax, 0x0f
  290.            ret
  291.  
  292.  
  293.  
  294.