Subversion Repositories Kolibri OS

Rev

Rev 5645 | Rev 6240 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5645 Rev 5984
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 5645 $
8
$Revision: 5984 $
9
 
9
 
10
 
10
 
11
MEM_WB     equ 6               ;write-back memory
11
MEM_WB     equ 6               ;write-back memory
12
MEM_WC     equ 1               ;write combined memory
12
MEM_WC     equ 1               ;write combined memory
13
MEM_UC     equ 0               ;uncached memory
13
MEM_UC     equ 0               ;uncached memory
14
 
14
 
15
align 4
15
align 4
16
proc mem_test
16
proc mem_test
17
; if we have BIOS with fn E820, skip the test
17
; if we have BIOS with fn E820, skip the test
18
        cmp     dword [BOOT_VARS-OS_BASE + 0x9100], 0
18
        cmp     dword [BOOT_VARS-OS_BASE + 0x9100], 0
19
        jnz     .ret
19
        jnz     .ret
20
 
20
 
21
        mov     eax, cr0
21
        mov     eax, cr0
22
        and     eax, not (CR0_CD+CR0_NW)
22
        and     eax, not (CR0_CD+CR0_NW)
23
        or      eax, CR0_CD       ;disable caching
23
        or      eax, CR0_CD       ;disable caching
24
        mov     cr0, eax
24
        mov     cr0, eax
25
        wbinvd                    ;invalidate cache
25
        wbinvd                    ;invalidate cache
26
 
26
 
27
        xor     edi, edi
27
        xor     edi, edi
28
        mov     ebx, 'TEST'
28
        mov     ebx, 'TEST'
29
@@:
29
@@:
30
        add     edi, 0x100000
30
        add     edi, 0x100000
31
        xchg    ebx, dword [edi]
31
        xchg    ebx, dword [edi]
32
        cmp     dword [edi], 'TEST'
32
        cmp     dword [edi], 'TEST'
33
        xchg    ebx, dword [edi]
33
        xchg    ebx, dword [edi]
34
        je      @b
34
        je      @b
35
 
35
 
36
        and     eax, not (CR0_CD+CR0_NW) ;enable caching
36
        and     eax, not (CR0_CD+CR0_NW) ;enable caching
37
        mov     cr0, eax
37
        mov     cr0, eax
38
        inc     dword [BOOT_VARS-OS_BASE + 0x9100]
38
        inc     dword [BOOT_VARS-OS_BASE + 0x9100]
39
        xor     eax, eax
39
        xor     eax, eax
40
        mov     [BOOT_VARS-OS_BASE + 0x9104], eax
40
        mov     [BOOT_VARS-OS_BASE + 0x9104], eax
41
        mov     [BOOT_VARS-OS_BASE + 0x9108], eax
41
        mov     [BOOT_VARS-OS_BASE + 0x9108], eax
42
        mov     [BOOT_VARS-OS_BASE + 0x910C], edi
42
        mov     [BOOT_VARS-OS_BASE + 0x910C], edi
43
        mov     [BOOT_VARS-OS_BASE + 0x9110], eax
43
        mov     [BOOT_VARS-OS_BASE + 0x9110], eax
44
        inc     eax
44
        inc     eax
45
        mov     [BOOT_VARS-OS_BASE + 0x9114], eax
45
        mov     [BOOT_VARS-OS_BASE + 0x9114], eax
46
.ret:
46
.ret:
47
        ret
47
        ret
48
endp
48
endp
49
 
49
 
50
align 4
50
align 4
51
proc init_mem
51
proc init_mem
52
; calculate maximum allocatable address and number of allocatable pages
52
; calculate maximum allocatable address and number of allocatable pages
53
        mov     edi, BOOT_VARS-OS_BASE + 0x9104
53
        mov     edi, BOOT_VARS-OS_BASE + 0x9104
54
        mov     ecx, [edi-4]
54
        mov     ecx, [edi-4]
55
        xor     esi, esi; esi will hold total amount of memory
55
        xor     esi, esi; esi will hold total amount of memory
56
        xor     edx, edx; edx will hold maximum allocatable address
56
        xor     edx, edx; edx will hold maximum allocatable address
57
.calcmax:
57
.calcmax:
58
; round all to pages
58
; round all to pages
59
        mov     eax, [edi]
59
        mov     eax, [edi]
60
        cmp     [edi+16], byte 1
60
        cmp     [edi+16], byte 1
61
        jne     .unusable
61
        jne     .unusable
62
 
62
 
63
        test    eax, 0xFFF
63
        test    eax, 0xFFF
64
        jz      @f
64
        jz      @f
65
        neg     eax
65
        neg     eax
66
        and     eax, 0xFFF
66
        and     eax, 0xFFF
67
        add     [edi], eax
67
        add     [edi], eax
68
        adc     dword [edi+4], 0
68
        adc     dword [edi+4], 0
69
        sub     [edi+8], eax
69
        sub     [edi+8], eax
70
        sbb     dword [edi+12], 0
70
        sbb     dword [edi+12], 0
71
        jc      .unusable
71
        jc      .unusable
72
@@:
72
@@:
73
        and     dword [edi+8], not 0xFFF
73
        and     dword [edi+8], not 0xFFF
74
        jz      .unusable
74
        jz      .unusable
75
; ignore memory after 4 Gb
75
; ignore memory after 4 Gb
76
        cmp     dword [edi+4], 0
76
        cmp     dword [edi+4], 0
77
        jnz     .unusable
77
        jnz     .unusable
78
        mov     eax, [edi]
78
        mov     eax, [edi]
79
        cmp     dword [edi+12], 0
79
        cmp     dword [edi+12], 0
80
        jnz     .overflow
80
        jnz     .overflow
81
        add     eax, [edi+8]
81
        add     eax, [edi+8]
82
        jnc     @f
82
        jnc     @f
83
.overflow:
83
.overflow:
84
        mov     eax, 0xFFFFF000
84
        mov     eax, 0xFFFFF000
85
@@:
85
@@:
86
        cmp     edx, eax
86
        cmp     edx, eax
87
        jae     @f
87
        jae     @f
88
        mov     edx, eax
88
        mov     edx, eax
89
@@:
89
@@:
90
        sub     eax, [edi]
90
        sub     eax, [edi]
91
        mov     [edi+8], eax
91
        mov     [edi+8], eax
92
        add     esi, eax
92
        add     esi, eax
93
        jmp     .usable
93
        jmp     .usable
94
.unusable:
94
.unusable:
95
;        and     dword [edi+8], 0
95
;        and     dword [edi+8], 0
96
.usable:
96
.usable:
97
        add     edi, 20
97
        add     edi, 20
98
        loop    .calcmax
98
        loop    .calcmax
99
.calculated:
99
.calculated:
100
        mov     [MEM_AMOUNT-OS_BASE], esi
100
        mov     [MEM_AMOUNT-OS_BASE], esi
101
        mov     [pg_data.mem_amount-OS_BASE], esi
101
        mov     [pg_data.mem_amount-OS_BASE], esi
102
        shr     esi, 12
102
        shr     esi, 12
103
        mov     [pg_data.pages_count-OS_BASE], esi
103
        mov     [pg_data.pages_count-OS_BASE], esi
104
 
104
 
105
        shr     edx, 12
105
        shr     edx, 12
106
        add     edx, 31
106
        add     edx, 31
107
        and     edx, not 31
107
        and     edx, not 31
108
        shr     edx, 3
108
        shr     edx, 3
109
        mov     [pg_data.pagemap_size-OS_BASE], edx
109
        mov     [pg_data.pagemap_size-OS_BASE], edx
110
 
110
 
111
        add     edx, (sys_pgmap-OS_BASE)+4095
111
        add     edx, (sys_pgmap-OS_BASE)+4095
112
        and     edx, not 4095
112
        and     edx, not 4095
113
        mov     [tmp_page_tabs], edx
113
        mov     [tmp_page_tabs], edx
114
 
114
 
115
        mov     edx, esi
115
        mov     edx, esi
116
        and     edx, -1024
116
        and     edx, -1024
117
        cmp     edx, (OS_BASE/4096)
117
        cmp     edx, (OS_BASE/4096)
118
        jbe     @F
118
        jbe     @F
119
        mov     edx, (OS_BASE/4096)
119
        mov     edx, (OS_BASE/4096)
120
        jmp     .set
120
        jmp     .set
121
@@:
121
@@:
122
        cmp     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
122
        cmp     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
123
        jae     .set
123
        jae     .set
124
        mov     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
124
        mov     edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
125
.set:
125
.set:
126
        mov     [pg_data.kernel_pages-OS_BASE], edx
126
        mov     [pg_data.kernel_pages-OS_BASE], edx
127
        shr     edx, 10
127
        shr     edx, 10
128
        mov     [pg_data.kernel_tables-OS_BASE], edx
128
        mov     [pg_data.kernel_tables-OS_BASE], edx
129
 
129
 
130
        xor     eax, eax
130
        xor     eax, eax
131
        mov     edi, sys_proc-OS_BASE
131
        mov     edi, sys_proc-OS_BASE
132
        mov     ecx, 8192/4
132
        mov     ecx, 8192/4
133
        cld
133
        cld
134
        rep stosd
134
        rep stosd
135
 
135
 
136
        mov     edx, (sys_proc-OS_BASE+PROC.pdt_0)+ 0x800; (OS_BASE shr 20)
136
        mov     edx, (sys_proc-OS_BASE+PROC.pdt_0)+ 0x800; (OS_BASE shr 20)
137
        bt      [cpu_caps-OS_BASE], CAPS_PSE
137
        bt      [cpu_caps-OS_BASE], CAPS_PSE
138
        jnc     .no_PSE
138
        jnc     .no_PSE
139
 
139
 
140
        mov     ebx, cr4
140
        mov     ebx, cr4
141
        or      ebx, CR4_PSE
141
        or      ebx, CR4_PSE
142
        mov     eax, PDE_LARGE+PG_SWR
142
        mov     eax, PDE_LARGE+PG_SWR
143
        mov     cr4, ebx
143
        mov     cr4, ebx
144
        dec     [pg_data.kernel_tables-OS_BASE]
144
        dec     [pg_data.kernel_tables-OS_BASE]
145
 
145
 
146
        mov     [edx], eax
146
        mov     [edx], eax
147
        add     edx, 4
147
        add     edx, 4
148
 
148
 
149
        mov     edi, [tmp_page_tabs]
149
        mov     edi, [tmp_page_tabs]
150
        jmp     .map_kernel_heap        ; new kernel fits to the first 4Mb - nothing to do with ".map_low"
150
        jmp     .map_kernel_heap        ; new kernel fits to the first 4Mb - nothing to do with ".map_low"
151
.no_PSE:
151
.no_PSE:
152
        mov     eax, PG_SWR
152
        mov     eax, PG_SWR
153
        mov     ecx, [tmp_page_tabs]
153
        mov     ecx, [tmp_page_tabs]
154
        shr     ecx, 12
154
        shr     ecx, 12
155
.map_low:
155
.map_low:
156
        mov     edi, [tmp_page_tabs]
156
        mov     edi, [tmp_page_tabs]
157
@@:                                   ;
157
@@:                                   ;
158
        stosd
158
        stosd
159
        add     eax, 0x1000
159
        add     eax, 0x1000
160
        dec     ecx
160
        dec     ecx
161
        jnz     @B
161
        jnz     @B
162
 
162
 
163
.map_kernel_heap:
163
.map_kernel_heap:
164
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
164
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
165
        shl     ecx, 10
165
        shl     ecx, 10
166
        xor     eax, eax
166
        xor     eax, eax
167
        rep stosd
167
        rep stosd
168
 
168
 
169
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
169
        mov     ecx, [pg_data.kernel_tables-OS_BASE]
170
        mov     eax, [tmp_page_tabs]
170
        mov     eax, [tmp_page_tabs]
171
        or      eax, PG_SWR
171
        or      eax, PG_SWR
172
        mov     edi, edx
172
        mov     edi, edx
173
 
173
 
174
.map_kernel_tabs:
174
.map_kernel_tabs:
175
        stosd
175
        stosd
176
        add     eax, 0x1000
176
        add     eax, 0x1000
177
        dec     ecx
177
        dec     ecx
178
        jnz     .map_kernel_tabs
178
        jnz     .map_kernel_tabs
179
 
179
 
180
        mov     dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE
180
        mov     dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE
181
 
181
 
182
        mov     edi, (sys_proc+PROC.pdt_0-OS_BASE)
182
        mov     edi, (sys_proc+PROC.pdt_0-OS_BASE)
183
        lea     esi, [edi+(OS_BASE shr 20)]
183
        lea     esi, [edi+(OS_BASE shr 20)]
184
        movsd
184
        movsd
185
        movsd
185
        movsd
186
        ret
186
        ret
187
endp
187
endp
188
 
188
 
189
align 4
189
align 4
190
proc init_page_map
190
proc init_page_map
191
; mark all memory as unavailable
191
; mark all memory as unavailable
192
        mov     edi, sys_pgmap-OS_BASE
192
        mov     edi, sys_pgmap-OS_BASE
193
        mov     ecx, [pg_data.pagemap_size-OS_BASE]
193
        mov     ecx, [pg_data.pagemap_size-OS_BASE]
194
        shr     ecx, 2
194
        shr     ecx, 2
195
        xor     eax, eax
195
        xor     eax, eax
196
        cld
196
        cld
197
        rep stosd
197
        rep stosd
198
 
198
 
199
; scan through memory map and mark free areas as available
199
; scan through memory map and mark free areas as available
200
        mov     ebx, BOOT_VARS-OS_BASE + 0x9104
200
        mov     ebx, BOOT_VARS-OS_BASE + 0x9104
201
        mov     edx, [ebx-4]
201
        mov     edx, [ebx-4]
202
.scanmap:
202
.scanmap:
203
        cmp     [ebx+16], byte 1
203
        cmp     [ebx+16], byte 1
204
        jne     .next
204
        jne     .next
205
 
205
 
206
        mov     ecx, [ebx+8]
206
        mov     ecx, [ebx+8]
207
        shr     ecx, 12; ecx = number of pages
207
        shr     ecx, 12; ecx = number of pages
208
        jz      .next
208
        jz      .next
209
        mov     edi, [ebx]
209
        mov     edi, [ebx]
210
        shr     edi, 12; edi = first page
210
        shr     edi, 12; edi = first page
211
        mov     eax, edi
211
        mov     eax, edi
212
        shr     edi, 5
212
        shr     edi, 5
213
        shl     edi, 2
213
        shl     edi, 2
214
        add     edi, sys_pgmap-OS_BASE
214
        add     edi, sys_pgmap-OS_BASE
215
        and     eax, 31
215
        and     eax, 31
216
        jz      .startok
216
        jz      .startok
217
        add     ecx, eax
217
        add     ecx, eax
218
        sub     ecx, 32
218
        sub     ecx, 32
219
        jbe     .onedword
219
        jbe     .onedword
220
        push    ecx
220
        push    ecx
221
        mov     ecx, eax
221
        mov     ecx, eax
222
        or      eax, -1
222
        or      eax, -1
223
        shl     eax, cl
223
        shl     eax, cl
224
        or      [edi], eax
224
        or      [edi], eax
225
        add     edi, 4
225
        add     edi, 4
226
        pop     ecx
226
        pop     ecx
227
.startok:
227
.startok:
228
        push    ecx
228
        push    ecx
229
        shr     ecx, 5
229
        shr     ecx, 5
230
        or      eax, -1
230
        or      eax, -1
231
        rep stosd
231
        rep stosd
232
        pop     ecx
232
        pop     ecx
233
        and     ecx, 31
233
        and     ecx, 31
234
        neg     eax
234
        neg     eax
235
        shl     eax, cl
235
        shl     eax, cl
236
        dec     eax
236
        dec     eax
237
        or      [edi], eax
237
        or      [edi], eax
238
        jmp     .next
238
        jmp     .next
239
.onedword:
239
.onedword:
240
        add     ecx, 32
240
        add     ecx, 32
241
        sub     ecx, eax
241
        sub     ecx, eax
242
@@:
242
@@:
243
        bts     [edi], eax
243
        bts     [edi], eax
244
        inc     eax
244
        inc     eax
245
        loop    @b
245
        loop    @b
246
.next:
246
.next:
247
        add     ebx, 20
247
        add     ebx, 20
248
        dec     edx
248
        dec     edx
249
        jnz     .scanmap
249
        jnz     .scanmap
250
 
250
 
251
; mark kernel memory as allocated (unavailable)
251
; mark kernel memory as allocated (unavailable)
252
        mov     ecx, [tmp_page_tabs]
252
        mov     ecx, [tmp_page_tabs]
253
        mov     edx, [pg_data.pages_count-OS_BASE]
253
        mov     edx, [pg_data.pages_count-OS_BASE]
254
        shr     ecx, 12
254
        shr     ecx, 12
255
        add     ecx, [pg_data.kernel_tables-OS_BASE]
255
        add     ecx, [pg_data.kernel_tables-OS_BASE]
256
        sub     edx, ecx
256
        sub     edx, ecx
257
        mov     [pg_data.pages_free-OS_BASE], edx
257
        mov     [pg_data.pages_free-OS_BASE], edx
258
 
258
 
259
        mov     edi, sys_pgmap-OS_BASE
259
        mov     edi, sys_pgmap-OS_BASE
260
        mov     ebx, ecx
260
        mov     ebx, ecx
261
        shr     ecx, 5
261
        shr     ecx, 5
262
        xor     eax, eax
262
        xor     eax, eax
263
        rep stosd
263
        rep stosd
264
 
264
 
265
        not     eax
265
        not     eax
266
        mov     ecx, ebx
266
        mov     ecx, ebx
267
        and     ecx, 31
267
        and     ecx, 31
268
        shl     eax, cl
268
        shl     eax, cl
269
        and     [edi], eax
269
        and     [edi], eax
270
        add     edi, OS_BASE
270
        add     edi, OS_BASE
271
        mov     [page_start-OS_BASE], edi;
271
        mov     [page_start-OS_BASE], edi;
272
 
272
 
273
        mov     ebx, sys_pgmap
273
        mov     ebx, sys_pgmap
274
        add     ebx, [pg_data.pagemap_size-OS_BASE]
274
        add     ebx, [pg_data.pagemap_size-OS_BASE]
275
        mov     [page_end-OS_BASE], ebx
275
        mov     [page_end-OS_BASE], ebx
276
 
276
 
277
        ret
277
        ret
278
endp
278
endp
279
 
279
 
280
align 4
280
align 4
281
 
281
 
282
init_BIOS32:
282
init_BIOS32:
283
        mov     edi, 0xE0000
283
        mov     edi, 0xE0000
284
.pcibios_nxt:
284
.pcibios_nxt:
285
        cmp     dword[edi], '_32_'; "magic" word
285
        cmp     dword[edi], '_32_'; "magic" word
286
        je      .BIOS32_found
286
        je      .BIOS32_found
287
.pcibios_nxt2:
287
.pcibios_nxt2:
288
        add     edi, 0x10
288
        add     edi, 0x10
289
        cmp     edi, 0xFFFF0
289
        cmp     edi, 0xFFFF0
290
        je      .BIOS32_not_found
290
        je      .BIOS32_not_found
291
        jmp     .pcibios_nxt
291
        jmp     .pcibios_nxt
292
.BIOS32_found:                  ; magic word found, check control summ
292
.BIOS32_found:                  ; magic word found, check control summ
293
 
293
 
294
        movzx   ecx, byte[edi + 9]
294
        movzx   ecx, byte[edi + 9]
295
        shl     ecx, 4
295
        shl     ecx, 4
296
        mov     esi, edi
296
        mov     esi, edi
297
        xor     eax, eax
297
        xor     eax, eax
298
        cld      ; paranoia
298
        cld      ; paranoia
299
@@:
299
@@:
300
        lodsb
300
        lodsb
301
        add     ah, al
301
        add     ah, al
302
        loop    @b
302
        loop    @b
303
        jnz     .pcibios_nxt2; control summ must be zero
303
        jnz     .pcibios_nxt2; control summ must be zero
304
    ; BIOS32 service found !
304
    ; BIOS32 service found !
305
        mov     ebp, [edi + 4]
305
        mov     ebp, [edi + 4]
306
        mov     [bios32_entry], ebp
306
        mov     [bios32_entry], ebp
307
    ; check PCI BIOS present
307
    ; check PCI BIOS present
308
        mov     eax, '$PCI'
308
        mov     eax, '$PCI'
309
        xor     ebx, ebx
309
        xor     ebx, ebx
310
        push    cs  ; special for 'ret far' from  BIOS
310
        push    cs  ; special for 'ret far' from  BIOS
311
        call    ebp
311
        call    ebp
312
        test    al, al
312
        test    al, al
313
        jnz     .PCI_BIOS32_not_found
313
        jnz     .PCI_BIOS32_not_found
314
 
314
 
315
 ; здесь создаются дискрипторы для PCI BIOS
315
 ; здесь создаются дискрипторы для PCI BIOS
316
 
316
 
317
        add     ebx, OS_BASE
317
        add     ebx, OS_BASE
318
        dec     ecx
318
        dec     ecx
319
        mov     [(pci_code_32-OS_BASE)], cx   ;limit 0-15
319
        mov     [(pci_code_32-OS_BASE)], cx   ;limit 0-15
320
        mov     [(pci_data_32-OS_BASE)], cx   ;limit 0-15
320
        mov     [(pci_data_32-OS_BASE)], cx   ;limit 0-15
321
 
321
 
322
        mov     [(pci_code_32-OS_BASE)+2], bx ;base  0-15
322
        mov     [(pci_code_32-OS_BASE)+2], bx ;base  0-15
323
        mov     [(pci_data_32-OS_BASE)+2], bx ;base  0-15
323
        mov     [(pci_data_32-OS_BASE)+2], bx ;base  0-15
324
 
324
 
325
        shr     ebx, 16
325
        shr     ebx, 16
326
        mov     [(pci_code_32-OS_BASE)+4], bl ;base  16-23
326
        mov     [(pci_code_32-OS_BASE)+4], bl ;base  16-23
327
        mov     [(pci_data_32-OS_BASE)+4], bl ;base  16-23
327
        mov     [(pci_data_32-OS_BASE)+4], bl ;base  16-23
328
 
328
 
329
        shr     ecx, 16
329
        shr     ecx, 16
330
        and     cl, 0x0F
330
        and     cl, 0x0F
331
        mov     ch, bh
331
        mov     ch, bh
332
        add     cx, D32
332
        add     cx, D32
333
        mov     [(pci_code_32-OS_BASE)+6], cx ;lim   16-19 &
333
        mov     [(pci_code_32-OS_BASE)+6], cx ;lim   16-19 &
334
        mov     [(pci_data_32-OS_BASE)+6], cx ;base  24-31
334
        mov     [(pci_data_32-OS_BASE)+6], cx ;base  24-31
335
 
335
 
336
        mov     [(pci_bios_entry-OS_BASE)], edx
336
        mov     [(pci_bios_entry-OS_BASE)], edx
337
         ; jmp .end
337
         ; jmp .end
338
.PCI_BIOS32_not_found:
338
.PCI_BIOS32_not_found:
339
        ; здесь должна заполнятся pci_emu_dat
339
        ; здесь должна заполнятся pci_emu_dat
340
.BIOS32_not_found:
340
.BIOS32_not_found:
341
.end:
341
.end:
342
        ret
342
        ret
343
 
343
 
344
align 4
344
align 4
345
proc test_cpu
345
proc test_cpu
346
           locals
346
           locals
347
              cpu_type   dd ?
347
              cpu_type   dd ?
348
           endl
348
           endl
349
 
349
 
350
        xor     eax, eax
350
        xor     eax, eax
351
        mov     [cpu_type], eax
351
        mov     [cpu_type], eax
352
        mov     [cpu_caps-OS_BASE], eax
352
        mov     [cpu_caps-OS_BASE], eax
353
        mov     [cpu_caps+4-OS_BASE], eax
353
        mov     [cpu_caps+4-OS_BASE], eax
354
        mov     [cpu_phys_addr_width-OS_BASE], 32
354
        mov     [cpu_phys_addr_width-OS_BASE], 32
355
 
355
 
356
        pushfd
356
        pushfd
357
        pop     eax
357
        pop     eax
358
        mov     ecx, eax
358
        mov     ecx, eax
359
        xor     eax, 0x40000
359
        xor     eax, 0x40000
360
        push    eax
360
        push    eax
361
        popfd
361
        popfd
362
        pushfd
362
        pushfd
363
        pop     eax
363
        pop     eax
364
        xor     eax, ecx
364
        xor     eax, ecx
365
        mov     [cpu_type], CPU_386
365
        mov     [cpu_type], CPU_386
366
        jz      .end_cpuid
366
        jz      .end_cpuid
367
        push    ecx
367
        push    ecx
368
        popfd
368
        popfd
369
 
369
 
370
        mov     [cpu_type], CPU_486
370
        mov     [cpu_type], CPU_486
371
        mov     eax, ecx
371
        mov     eax, ecx
372
        xor     eax, 0x200000
372
        xor     eax, 0x200000
373
        push    eax
373
        push    eax
374
        popfd
374
        popfd
375
        pushfd
375
        pushfd
376
        pop     eax
376
        pop     eax
377
        xor     eax, ecx
377
        xor     eax, ecx
378
        je      .end_cpuid
378
        je      .end_cpuid
379
 
379
 
380
        xor     eax, eax
380
        xor     eax, eax
381
        cpuid
381
        cpuid
382
 
382
 
383
        mov     [cpu_vendor-OS_BASE], ebx
383
        mov     [cpu_vendor-OS_BASE], ebx
384
        mov     [cpu_vendor+4-OS_BASE], edx
384
        mov     [cpu_vendor+4-OS_BASE], edx
385
        mov     [cpu_vendor+8-OS_BASE], ecx
385
        mov     [cpu_vendor+8-OS_BASE], ecx
386
 
386
 
387
        cmp     eax, 1
387
        cmp     eax, 1
388
        jl      .end_cpuid
388
        jl      .end_cpuid
389
        mov     eax, 1
389
        mov     eax, 1
390
        cpuid
390
        cpuid
391
        mov     [cpu_sign-OS_BASE], eax
391
        mov     [cpu_sign-OS_BASE], eax
392
        mov     [cpu_info-OS_BASE], ebx
392
        mov     [cpu_info-OS_BASE], ebx
393
        mov     [cpu_caps-OS_BASE], edx
393
        mov     [cpu_caps-OS_BASE], edx
394
        mov     [cpu_caps+4-OS_BASE], ecx
394
        mov     [cpu_caps+4-OS_BASE], ecx
395
 
395
 
396
        bt      edx, CAPS_PAE
396
        bt      edx, CAPS_PAE
397
        jnc     @f
397
        jnc     @f
398
        mov     [cpu_phys_addr_width-OS_BASE], 36
398
        mov     [cpu_phys_addr_width-OS_BASE], 36
399
@@:
399
@@:
400
        mov     eax, 0x80000000
400
        mov     eax, 0x80000000
401
        cpuid
401
        cpuid
402
        cmp     eax, 0x80000008
402
        cmp     eax, 0x80000008
403
        jb      @f
403
        jb      @f
404
        mov     eax, 0x80000008
404
        mov     eax, 0x80000008
405
        cpuid
405
        cpuid
406
        mov     [cpu_phys_addr_width-OS_BASE], al
406
        mov     [cpu_phys_addr_width-OS_BASE], al
407
@@:
407
@@:
408
 
408
 
409
        mov     eax, [cpu_sign-OS_BASE]
409
        mov     eax, [cpu_sign-OS_BASE]
410
        shr     eax, 8
410
        shr     eax, 8
411
        and     eax, 0x0f
411
        and     eax, 0x0f
412
        ret
412
        ret
413
.end_cpuid:
413
.end_cpuid:
414
        mov     eax, [cpu_type]
414
        mov     eax, [cpu_type]
415
        ret
415
        ret
416
endp
416
endp
417
 
417
 
418
iglobal
418
iglobal
419
align 4
419
align 4
420
acpi_lapic_base   dd 0xfee00000   ; default local apic base
420
acpi_lapic_base   dd 0xfee00000   ; default local apic base
421
endg
421
endg
422
 
422
 
423
uglobal
423
uglobal
424
align 4
424
align 4
425
acpi_rsdp         rd 1
425
acpi_rsdp         rd 1
426
acpi_rsdt         rd 1
426
acpi_rsdt         rd 1
427
acpi_madt         rd 1
427
acpi_madt         rd 1
428
 
428
 
429
acpi_dev_data     rd 1
429
acpi_dev_data     rd 1
430
acpi_dev_size     rd 1
430
acpi_dev_size     rd 1
431
 
431
 
432
acpi_rsdt_base    rd 1
432
acpi_rsdt_base    rd 1
433
acpi_fadt_base    rd 1
433
acpi_fadt_base    rd 1
434
acpi_dsdt_base    rd 1
434
acpi_dsdt_base    rd 1
435
acpi_dsdt_size    rd 1
435
acpi_dsdt_size    rd 1
436
acpi_madt_base    rd 1
436
acpi_madt_base    rd 1
437
acpi_ioapic_base  rd 1
437
acpi_ioapic_base  rd 1
438
acpi_hpet_base    rd 1
438
acpi_hpet_base    rd 1
439
hpet_base         rd 1
439
hpet_base         rd 1
440
hpet_period       rd 1
440
hpet_period       rd 1
441
hpet_timers       rd 1
441
hpet_timers       rd 1
442
 
-
 
-
 
442
hpet_tsc_start    rd 2
443
cpu_count         rd 1
443
cpu_count         rd 1
444
smpt              rd 16
444
smpt              rd 16
445
endg
445
endg
446
 
446
 
447
ACPI_HI_RSDP_WINDOW_START  equ 0x000E0000
447
ACPI_HI_RSDP_WINDOW_START  equ 0x000E0000
448
ACPI_HI_RSDP_WINDOW_END    equ 0x00100000
448
ACPI_HI_RSDP_WINDOW_END    equ 0x00100000
449
ACPI_RSDP_CHECKSUM_LENGTH  equ 20
449
ACPI_RSDP_CHECKSUM_LENGTH  equ 20
450
 
450
 
451
ACPI_HPET_SIGN             equ 0x54455048
451
ACPI_HPET_SIGN             equ 0x54455048
452
ACPI_MADT_SIGN             equ 0x43495041
452
ACPI_MADT_SIGN             equ 0x43495041
453
ACPI_FADT_SIGN             equ 0x50434146
453
ACPI_FADT_SIGN             equ 0x50434146
454
 
454
 
455
 
455
 
456
acpi_locate:
456
acpi_locate:
457
        push    ebx
457
        push    ebx
458
        mov     ebx, ACPI_HI_RSDP_WINDOW_START
458
        mov     ebx, ACPI_HI_RSDP_WINDOW_START
459
.check:
459
.check:
460
        cmp     [ebx], dword 0x20445352
460
        cmp     [ebx], dword 0x20445352
461
        jne     .next
461
        jne     .next
462
        cmp     [ebx+4], dword 0x20525450
462
        cmp     [ebx+4], dword 0x20525450
463
        jne     .next
463
        jne     .next
464
 
464
 
465
        mov     edx, ebx
465
        mov     edx, ebx
466
        mov     ecx, ACPI_RSDP_CHECKSUM_LENGTH
466
        mov     ecx, ACPI_RSDP_CHECKSUM_LENGTH
467
        xor     eax, eax
467
        xor     eax, eax
468
.sum:
468
.sum:
469
        add     al, [edx]
469
        add     al, [edx]
470
        inc     edx
470
        inc     edx
471
        loop    .sum
471
        loop    .sum
472
 
472
 
473
        test    al, al
473
        test    al, al
474
        jnz     .next
474
        jnz     .next
475
 
475
 
476
        mov     eax, ebx
476
        mov     eax, ebx
477
        pop     ebx
477
        pop     ebx
478
        ret
478
        ret
479
.next:
479
.next:
480
        add     ebx, 16
480
        add     ebx, 16
481
        cmp     ebx, ACPI_HI_RSDP_WINDOW_END
481
        cmp     ebx, ACPI_HI_RSDP_WINDOW_END
482
        jb      .check
482
        jb      .check
483
 
483
 
484
        pop     ebx
484
        pop     ebx
485
        xor     eax, eax
485
        xor     eax, eax
486
        ret
486
        ret
487
 
487
 
488
align 4
488
align 4
489
rsdt_find:           ;ecx= rsdt edx= SIG
489
rsdt_find:           ;ecx= rsdt edx= SIG
490
        push    ebx
490
        push    ebx
491
        push    esi
491
        push    esi
492
 
492
 
493
        lea     ebx, [ecx+36]
493
        lea     ebx, [ecx+36]
494
        mov     esi, [ecx+4]
494
        mov     esi, [ecx+4]
495
        add     esi, ecx
495
        add     esi, ecx
496
align 4
496
align 4
497
.next:
497
.next:
498
        mov     eax, [ebx]
498
        mov     eax, [ebx]
499
        cmp     [eax], edx
499
        cmp     [eax], edx
500
        je      .done
500
        je      .done
501
 
501
 
502
        add     ebx, 4
502
        add     ebx, 4
503
        cmp     ebx, esi
503
        cmp     ebx, esi
504
        jb      .next
504
        jb      .next
505
 
505
 
506
        xor     eax, eax
506
        xor     eax, eax
507
        pop     esi
507
        pop     esi
508
        pop     ebx
508
        pop     ebx
509
        ret
509
        ret
510
 
510
 
511
.done:
511
.done:
512
        mov     eax, [ebx]
512
        mov     eax, [ebx]
513
        pop     esi
513
        pop     esi
514
        pop     ebx
514
        pop     ebx
515
        ret
515
        ret
516
 
516
 
517
align 4
517
align 4
518
check_acpi:
518
check_acpi:
519
 
519
 
520
        call    acpi_locate
520
        call    acpi_locate
521
        test    eax, eax
521
        test    eax, eax
522
        jz      .done
522
        jz      .done
523
 
523
 
524
        mov     ecx, [eax+16]
524
        mov     ecx, [eax+16]
525
        mov     edx, ACPI_FADT_SIGN
525
        mov     edx, ACPI_FADT_SIGN
526
        mov     [acpi_rsdt_base-OS_BASE], ecx
526
        mov     [acpi_rsdt_base-OS_BASE], ecx
527
        call    rsdt_find
527
        call    rsdt_find
528
        mov     [acpi_fadt_base-OS_BASE], eax
528
        mov     [acpi_fadt_base-OS_BASE], eax
529
        test    eax, eax
529
        test    eax, eax
530
        jz      @f
530
        jz      @f
531
 
531
 
532
        mov     eax, [eax+40]
532
        mov     eax, [eax+40]
533
        mov     [acpi_dsdt_base-OS_BASE], eax
533
        mov     [acpi_dsdt_base-OS_BASE], eax
534
        mov     eax, [eax+4]
534
        mov     eax, [eax+4]
535
        mov     [acpi_dsdt_size-OS_BASE], eax
535
        mov     [acpi_dsdt_size-OS_BASE], eax
536
@@:
536
@@:
537
        mov     edx, ACPI_HPET_SIGN
537
        mov     edx, ACPI_HPET_SIGN
538
        mov     ecx, [acpi_rsdt_base-OS_BASE]
538
        mov     ecx, [acpi_rsdt_base-OS_BASE]
539
        call    rsdt_find
539
        call    rsdt_find
540
        test    eax, eax
540
        test    eax, eax
541
        jz      @F
541
        jz      @F
542
 
542
 
543
        mov     [acpi_hpet_base-OS_BASE], eax
543
        mov     [acpi_hpet_base-OS_BASE], eax
544
        mov     eax, [eax+44]
544
        mov     eax, [eax+44]
545
        mov     [hpet_base-OS_BASE], eax
545
        mov     [hpet_base-OS_BASE], eax
546
@@:
546
@@:
547
        mov     edx, ACPI_MADT_SIGN
547
        mov     edx, ACPI_MADT_SIGN
548
        mov     ecx, [acpi_rsdt_base-OS_BASE]
548
        mov     ecx, [acpi_rsdt_base-OS_BASE]
549
        call    rsdt_find
549
        call    rsdt_find
550
        test    eax, eax
550
        test    eax, eax
551
        jz      .done
551
        jz      .done
552
 
552
 
553
        mov     [acpi_madt_base-OS_BASE], eax
553
        mov     [acpi_madt_base-OS_BASE], eax
554
        mov     ecx, [eax+36]
554
        mov     ecx, [eax+36]
555
        mov     [acpi_lapic_base-OS_BASE], ecx
555
        mov     [acpi_lapic_base-OS_BASE], ecx
556
 
556
 
557
        mov     edi, smpt-OS_BASE
557
        mov     edi, smpt-OS_BASE
558
        mov     ebx, [ecx+0x20]
558
        mov     ebx, [ecx+0x20]
559
        shr     ebx, 24              ; read APIC ID
559
        shr     ebx, 24              ; read APIC ID
560
 
560
 
561
        mov     [edi], ebx           ; bootstrap always first
561
        mov     [edi], ebx           ; bootstrap always first
562
        inc     [cpu_count-OS_BASE]
562
        inc     [cpu_count-OS_BASE]
563
        add     edi, 4
563
        add     edi, 4
564
 
564
 
565
        lea     edx, [eax+44]
565
        lea     edx, [eax+44]
566
        mov     ecx, [eax+4]
566
        mov     ecx, [eax+4]
567
        add     ecx, eax
567
        add     ecx, eax
568
.check:
568
.check:
569
        mov     eax, [edx]
569
        mov     eax, [edx]
570
        cmp     al, 0
570
        cmp     al, 0
571
        jne     .io_apic
571
        jne     .io_apic
572
 
572
 
573
        shr     eax, 24              ; get APIC ID
573
        shr     eax, 24              ; get APIC ID
574
        cmp     eax, ebx             ; skip self
574
        cmp     eax, ebx             ; skip self
575
        je      .next
575
        je      .next
576
 
576
 
577
        test    [edx+4], byte 1      ; is enabled ?
577
        test    [edx+4], byte 1      ; is enabled ?
578
        jz      .next
578
        jz      .next
579
 
579
 
580
        cmp     [cpu_count-OS_BASE], 16
580
        cmp     [cpu_count-OS_BASE], 16
581
        jae     .next
581
        jae     .next
582
 
582
 
583
        stosd                        ; store APIC ID
583
        stosd                        ; store APIC ID
584
        inc     [cpu_count-OS_BASE]
584
        inc     [cpu_count-OS_BASE]
585
.next:
585
.next:
586
        mov     eax, [edx]
586
        mov     eax, [edx]
587
        movzx   eax, ah
587
        movzx   eax, ah
588
        add     edx, eax
588
        add     edx, eax
589
        cmp     edx, ecx
589
        cmp     edx, ecx
590
        jb      .check
590
        jb      .check
591
.done:
591
.done:
592
        ret
592
        ret
593
 
593
 
594
.io_apic:
594
.io_apic:
595
        cmp     al, 1
595
        cmp     al, 1
596
        jne     .next
596
        jne     .next
597
 
597
 
598
        mov     eax, [edx+4]
598
        mov     eax, [edx+4]
599
        mov     [acpi_ioapic_base-OS_BASE], eax
599
        mov     [acpi_ioapic_base-OS_BASE], eax
600
        jmp     .next
600
        jmp     .next
601
 
601
 
602
HPET_PERIOD             equ 0x004
602
HPET_PERIOD             equ 0x0004
603
HPET_CFG_ENABLE         equ     1
603
HPET_CFG_ENABLE         equ 0x0001
-
 
604
HPET_CFG                equ 0x0010
-
 
605
HPET_COUNTER            equ 0x00f0
-
 
606
HPET_T0_CFG             equ 0x0100
-
 
607
 
-
 
608
HPET_TN_LEVEL           equ 0x0002
-
 
609
HPET_TN_ENABLE          equ 0x0004
604
HPET_CFG                equ 0x010
610
HPET_TN_FSB             equ 0x4000
605
 
611
 
606
align 4
612
align 4
607
init_hpet:
613
init_hpet:
608
        mov     ebx, [hpet_base-OS_BASE]
614
        mov     ebx, [hpet_base-OS_BASE]
609
        test    ebx, ebx
615
        test    ebx, ebx
610
        jz      @F
616
        jz      .done
611
 
617
 
612
        mov     eax, [ebx]
618
        mov     eax, [ebx]
613
        and     ah, 0x1F
619
        and     ah, 0x1F
614
        inc     ah
620
        inc     ah
615
        movzx   eax, ah
621
        movzx   eax, ah
616
        mov     [hpet_timers-OS_BASE], eax
622
        mov     [hpet_timers-OS_BASE], eax
-
 
623
        mov     ecx, eax
617
 
624
 
618
        mov     eax, [ebx+HPET_PERIOD]
625
        mov     eax, [ebx+HPET_PERIOD]
619
        mov     edx, 0x431BDE83
626
        xor     edx, edx
620
        mul     edx
627
        shld    edx, eax, 10
-
 
628
        shl     eax, 10
-
 
629
        mov     esi, 1000000
621
        shr     edx, 18
630
        div     esi
622
        mov     [hpet_period-OS_BASE], edx
631
        mov     [hpet_period-OS_BASE], eax
623
 
632
 
624
        mov     eax, [ebx+HPET_CFG]
633
        mov     esi, [ebx+HPET_CFG]
625
        and     eax, not HPET_CFG_ENABLE
634
        and     esi, not HPET_CFG_ENABLE
626
        mov     [ebx+HPET_CFG], eax     ;stop main counter
-
 
627
 
-
 
628
        xor     ecx, ecx
-
 
629
        mov     [ebx+0xF0], ecx         ;reset counter
-
 
630
        mov     [ebx+0xF4], ecx
635
        mov     [ebx+HPET_CFG], esi             ;stop main counter
-
 
636
 
-
 
637
        lea     edx, [ebx+HPET_T0_CFG]
-
 
638
@@:
-
 
639
        jcxz    @F
631
 
640
        mov     eax, [edx]
-
 
641
        and     eax, not (HPET_TN_ENABLE+HPET_TN_LEVEL+HPET_TN_FSB)
-
 
642
        mov     [edx], eax
-
 
643
        add     edx, 0x20
632
        or      eax, HPET_CFG_ENABLE
644
        dec     ecx
-
 
645
        jmp     @B
-
 
646
@@:
-
 
647
        mov     [ebx+HPET_COUNTER], ecx         ;reset main counter
-
 
648
        mov     [ebx+HPET_COUNTER+4], ecx
-
 
649
 
-
 
650
        or      esi, HPET_CFG_ENABLE
-
 
651
        mov     [ebx+HPET_CFG], esi             ;and start again
-
 
652
 
-
 
653
.done:
-
 
654
        rdtsc
-
 
655
        mov     [hpet_tsc_start-OS_BASE], eax
633
        mov     [ebx+HPET_CFG], eax     ;and start again
656
        mov     [hpet_tsc_start+4-OS_BASE], edx
634
@@:
657
 
635
        ret
658
        ret