Subversion Repositories Kolibri OS

Rev

Rev 2434 | Rev 2441 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
750 victor 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
983 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
750 victor 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
593 mikedld 7
 
465 serge 8
$Revision: 2439 $
9
 
593 mikedld 10
 
465 serge 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
align 4
16
proc mem_test
1103 diamond 17
; if we have BIOS with fn E820, skip the test
2434 Serge 18
        cmp     dword [BOOT_VAR-OS_BASE + 0x9100], 0
19
        jnz     .ret
465 serge 20
 
2434 Serge 21
        mov     eax, cr0
22
        and     eax, not (CR0_CD+CR0_NW)
23
        or      eax, CR0_CD       ;disable caching
24
        mov     cr0, eax
25
        wbinvd                    ;invalidate cache
465 serge 26
 
2434 Serge 27
        xor     edi, edi
28
        mov     ebx, 'TEST'
465 serge 29
@@:
2434 Serge 30
        add     edi, 0x100000
31
        xchg    ebx, dword [edi]
32
        cmp     dword [edi], 'TEST'
33
        xchg    ebx, dword [edi]
34
        je      @b
465 serge 35
 
2434 Serge 36
        and     eax, not (CR0_CD+CR0_NW) ;enable caching
37
        mov     cr0, eax
38
        inc     dword [BOOT_VAR-OS_BASE + 0x9100]
39
        xor     eax, eax
40
        mov     [BOOT_VAR-OS_BASE + 0x9104], eax
41
        mov     [BOOT_VAR-OS_BASE + 0x9108], eax
42
        mov     [BOOT_VAR-OS_BASE + 0x910C], edi
43
        mov     [BOOT_VAR-OS_BASE + 0x9110], eax
1103 diamond 44
.ret:
2434 Serge 45
        ret
465 serge 46
endp
47
 
48
align 4
49
proc init_mem
1103 diamond 50
; calculate maximum allocatable address and number of allocatable pages
2434 Serge 51
        mov     edi, BOOT_VAR-OS_BASE + 0x9104
52
        mov     ecx, [edi-4]
53
        xor     esi, esi; esi will hold total amount of memory
54
        xor     edx, edx; edx will hold maximum allocatable address
1103 diamond 55
.calcmax:
56
; round all to pages
2434 Serge 57
        mov     eax, [edi]
58
        test    eax, 0xFFF
59
        jz      @f
60
        neg     eax
61
        and     eax, 0xFFF
62
        add     [edi], eax
63
        adc     dword [edi+4], 0
64
        sub     [edi+8], eax
65
        sbb     dword [edi+12], 0
66
        jc      .unusable
1103 diamond 67
@@:
2434 Serge 68
        and     dword [edi+8], not 0xFFF
69
        jz      .unusable
1103 diamond 70
; ignore memory after 4 Gb
2434 Serge 71
        cmp     dword [edi+4], 0
72
        jnz     .unusable
73
        mov     eax, [edi]
74
        cmp     dword [edi+12], 0
75
        jnz     .overflow
76
        add     eax, [edi+8]
77
        jnc     @f
1103 diamond 78
.overflow:
2434 Serge 79
        mov     eax, 0xFFFFF000
1103 diamond 80
@@:
2434 Serge 81
        cmp     edx, eax
82
        jae     @f
83
        mov     edx, eax
1103 diamond 84
@@:
2434 Serge 85
        sub     eax, [edi]
86
        mov     [edi+8], eax
87
        add     esi, eax
88
        jmp     .usable
1103 diamond 89
.unusable:
2434 Serge 90
        and     dword [edi+8], 0
1103 diamond 91
.usable:
2434 Serge 92
        add     edi, 20
93
        loop    .calcmax
1103 diamond 94
.calculated:
2434 Serge 95
        mov     [MEM_AMOUNT-OS_BASE], esi
96
        mov     [pg_data.mem_amount-OS_BASE], esi
97
        shr     esi, 12
98
        mov     [pg_data.pages_count-OS_BASE], esi
465 serge 99
 
2434 Serge 100
        shr     edx, 12
101
        add     edx, 31
102
        and     edx, not 31
103
        shr     edx, 3
104
        mov     [pg_data.pagemap_size-OS_BASE], edx
465 serge 105
 
2434 Serge 106
        add     edx, (sys_pgmap-OS_BASE)+4095
107
        and     edx, not 4095
108
        mov     [tmp_page_tabs], edx
513 serge 109
 
2434 Serge 110
        mov     edx, esi
111
        and     edx, -1024
112
        cmp     edx, (OS_BASE/4096)
113
        jbe     @F
114
        mov     edx, (OS_BASE/4096)
115
        jmp     .set
1130 diamond 116
@@:
2434 Serge 117
        cmp     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
118
        jae     .set
119
        mov     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
1130 diamond 120
.set:
2434 Serge 121
        mov     [pg_data.kernel_pages-OS_BASE], edx
122
        shr     edx, 10
123
        mov     [pg_data.kernel_tables-OS_BASE], edx
465 serge 124
 
2434 Serge 125
        xor     eax, eax
126
        mov     edi, sys_pgdir-OS_BASE
127
        mov     ecx, 4096/4
128
        cld
129
        rep stosd
465 serge 130
 
2434 Serge 131
        mov     edx, (sys_pgdir-OS_BASE)+ 0x800; (OS_BASE shr 20)
132
        bt      [cpu_caps-OS_BASE], CAPS_PSE
133
        jnc     .no_PSE
465 serge 134
 
2434 Serge 135
        mov     ebx, cr4
136
        or      ebx, CR4_PSE
137
        mov     eax, PG_LARGE+PG_SW
138
        mov     cr4, ebx
139
        dec     [pg_data.kernel_tables-OS_BASE]
465 serge 140
 
2434 Serge 141
        mov     [edx], eax
142
        add     edx, 4
465 serge 143
 
2434 Serge 144
        mov     edi, [tmp_page_tabs]
145
        jmp     .map_kernel_heap        ; new kernel fits to the first 4Mb - nothing to do with ".map_low"
1455 art_zh 146
.no_PSE:
2434 Serge 147
        mov     eax, PG_SW
148
        mov     ecx, [tmp_page_tabs]
149
        shr     ecx, 12
1455 art_zh 150
.map_low:
2434 Serge 151
        mov     edi, [tmp_page_tabs]
1455 art_zh 152
@@:                                   ;
2434 Serge 153
        stosd
154
        add     eax, 0x1000
155
        dec     ecx
156
        jnz     @B
1455 art_zh 157
 
158
.map_kernel_heap:
2434 Serge 159
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
160
        shl     ecx, 10
161
        xor     eax, eax
162
        rep stosd
465 serge 163
 
2434 Serge 164
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
165
        mov     eax, [tmp_page_tabs]
166
        or      eax, PG_SW
167
        mov     edi, edx
2212 Serge 168
 
465 serge 169
.map_kernel_tabs:
2434 Serge 170
        stosd
171
        add     eax, 0x1000
172
        dec     ecx
173
        jnz     .map_kernel_tabs
465 serge 174
 
2434 Serge 175
        mov     dword [sys_pgdir-OS_BASE+(page_tabs shr 20)], sys_pgdir+PG_SW-OS_BASE
465 serge 176
 
2434 Serge 177
        mov     edi, (sys_pgdir-OS_BASE)
178
        lea     esi, [edi+(OS_BASE shr 20)]
179
        movsd
180
        movsd
181
        ret
465 serge 182
endp
183
 
184
align 4
185
proc init_page_map
1103 diamond 186
; mark all memory as unavailable
2434 Serge 187
        mov     edi, sys_pgmap-OS_BASE
188
        mov     ecx, [pg_data.pagemap_size-OS_BASE]
189
        shr     ecx, 2
190
        xor     eax, eax
191
        cld
192
        rep stosd
465 serge 193
 
1103 diamond 194
; scan through memory map and mark free areas as available
2434 Serge 195
        mov     ebx, BOOT_VAR-OS_BASE + 0x9104
196
        mov     edx, [ebx-4]
1103 diamond 197
.scanmap:
2434 Serge 198
        mov     ecx, [ebx+8]