Rev 9899 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9899 | Rev 9958 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2022. 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: 9899 $ |
8 | $Revision: 9958 $ |
9 | 9 | ||
10 | align 4 |
10 | align 4 |
11 | proc mem_test |
11 | proc mem_test |
12 | ; if we have BIOS with fn E820, skip the test |
12 | ; if we have BIOS with fn E820, skip the test |
13 | cmp [BOOT_LO.memmap_block_cnt], 0 |
13 | cmp [BOOT_LO.memmap_block_cnt], 0 |
14 | jnz .ret |
14 | jnz .ret |
15 | 15 | ||
16 | mov eax, cr0 |
16 | mov eax, cr0 |
17 | and eax, not (CR0_CD + CR0_NW) |
17 | and eax, not (CR0_CD + CR0_NW) |
18 | or eax, CR0_CD ;disable caching |
18 | or eax, CR0_CD ;disable caching |
19 | mov cr0, eax |
19 | mov cr0, eax |
20 | wbinvd ;invalidate cache |
20 | wbinvd ;invalidate cache |
21 | 21 | ||
22 | xor edi, edi |
22 | xor edi, edi |
23 | mov ebx, 'TEST' |
23 | mov ebx, 'TEST' |
24 | @@: |
24 | @@: |
25 | add edi, 0x100000 |
25 | add edi, 0x100000 |
26 | xchg ebx, dword [edi] |
26 | xchg ebx, dword [edi] |
27 | cmp dword [edi], 'TEST' |
27 | cmp dword [edi], 'TEST' |
28 | xchg ebx, dword [edi] |
28 | xchg ebx, dword [edi] |
29 | je @b |
29 | je @b |
30 | 30 | ||
31 | and eax, not (CR0_CD + CR0_NW) ;enable caching |
31 | and eax, not (CR0_CD + CR0_NW) ;enable caching |
32 | mov cr0, eax |
32 | mov cr0, eax |
33 | inc dword [BOOT_LO.memmap_block_cnt] |
33 | inc dword [BOOT_LO.memmap_block_cnt] |
34 | xor eax, eax |
34 | xor eax, eax |
35 | mov [BOOT_LO.memmap_blocks + e820entry.addr.lo], eax |
35 | mov [BOOT_LO.memmap_blocks + e820entry.addr.lo], eax |
36 | mov [BOOT_LO.memmap_blocks + e820entry.addr.hi], eax |
36 | mov [BOOT_LO.memmap_blocks + e820entry.addr.hi], eax |
37 | mov [BOOT_LO.memmap_blocks + e820entry.size.lo], edi |
37 | mov [BOOT_LO.memmap_blocks + e820entry.size.lo], edi |
38 | mov [BOOT_LO.memmap_blocks + e820entry.size.hi], eax |
38 | mov [BOOT_LO.memmap_blocks + e820entry.size.hi], eax |
39 | inc eax |
39 | inc eax |
40 | mov [BOOT_LO.memmap_blocks + e820entry.type], eax |
40 | mov [BOOT_LO.memmap_blocks + e820entry.type], eax |
41 | .ret: |
41 | .ret: |
42 | ret |
42 | ret |
43 | endp |
43 | endp |
44 | 44 | ||
45 | align 4 |
45 | align 4 |
46 | proc init_mem |
46 | proc init_mem |
47 | ; calculate maximum allocatable address and number of allocatable pages |
47 | ; calculate maximum allocatable address and number of allocatable pages |
48 | mov edi, BOOT_LO.memmap_blocks |
48 | mov edi, BOOT_LO.memmap_blocks |
49 | mov ecx, [edi-4] ; memmap_block_cnt |
49 | mov ecx, [edi-4] ; memmap_block_cnt |
50 | xor esi, esi; esi will hold total amount of memory |
50 | xor esi, esi; esi will hold total amount of memory |
51 | xor edx, edx; edx will hold maximum allocatable address |
51 | xor edx, edx; edx will hold maximum allocatable address |
52 | .calcmax: |
52 | .calcmax: |
53 | ; round all to pages |
53 | ; round all to pages |
54 | mov eax, [edi + e820entry.addr.lo] |
54 | mov eax, [edi + e820entry.addr.lo] |
55 | cmp byte [edi + e820entry.type], 1 |
55 | cmp byte [edi + e820entry.type], 1 |
56 | jne .unusable |
56 | jne .unusable |
57 | 57 | ||
58 | test eax, PAGE_SIZE-1 |
58 | test eax, PAGE_SIZE-1 |
59 | jz @f |
59 | jz @f |
60 | neg eax |
60 | neg eax |
61 | and eax, PAGE_SIZE-1 |
61 | and eax, PAGE_SIZE-1 |
62 | add [edi + e820entry.addr.lo], eax |
62 | add [edi + e820entry.addr.lo], eax |
63 | adc [edi + e820entry.addr.hi], 0 |
63 | adc [edi + e820entry.addr.hi], 0 |
64 | sub [edi + e820entry.size.lo], eax |
64 | sub [edi + e820entry.size.lo], eax |
65 | sbb [edi + e820entry.size.hi], 0 |
65 | sbb [edi + e820entry.size.hi], 0 |
66 | jc .unusable |
66 | jc .unusable |
67 | @@: |
67 | @@: |
68 | and [edi + e820entry.size.lo], -PAGE_SIZE |
68 | and [edi + e820entry.size.lo], -PAGE_SIZE |
69 | jz .unusable |
69 | jz .unusable |
70 | ; ignore memory after 4 GiB |
70 | ; ignore memory after 4 GiB |
71 | cmp [edi + e820entry.addr.hi], 0 |
71 | cmp [edi + e820entry.addr.hi], 0 |
72 | jnz .unusable |
72 | jnz .unusable |
73 | mov eax, [edi + e820entry.addr.lo] |
73 | mov eax, [edi + e820entry.addr.lo] |
74 | cmp [edi + e820entry.size.hi], 0 |
74 | cmp [edi + e820entry.size.hi], 0 |
75 | jnz .overflow |
75 | jnz .overflow |
76 | add eax, [edi + e820entry.size.lo] |
76 | add eax, [edi + e820entry.size.lo] |
77 | jnc @f |
77 | jnc @f |
78 | .overflow: |
78 | .overflow: |
79 | mov eax, -PAGE_SIZE |
79 | mov eax, -PAGE_SIZE |
80 | @@: |
80 | @@: |
81 | cmp edx, eax |
81 | cmp edx, eax |
82 | jae @f |
82 | jae @f |
83 | mov edx, eax |
83 | mov edx, eax |
84 | @@: |
84 | @@: |
85 | sub eax, [edi + e820entry.addr.lo] |
85 | sub eax, [edi + e820entry.addr.lo] |
86 | mov [edi + e820entry.size.lo], eax |
86 | mov [edi + e820entry.size.lo], eax |
87 | add esi, eax |
87 | add esi, eax |
88 | jmp .usable |
88 | jmp .usable |
89 | .unusable: |
89 | .unusable: |
90 | ; and dword [edi+e820entry.size.lo], 0 |
90 | ; and dword [edi+e820entry.size.lo], 0 |
91 | .usable: |
91 | .usable: |
92 | add edi, sizeof.e820entry |
92 | add edi, sizeof.e820entry |
93 | loop .calcmax |
93 | loop .calcmax |
94 | .calculated: |
94 | .calculated: |
95 | mov [MEM_AMOUNT - OS_BASE], esi |
95 | mov [MEM_AMOUNT - OS_BASE], esi |
96 | mov [pg_data.mem_amount - OS_BASE], esi |
96 | mov [pg_data.mem_amount - OS_BASE], esi |
97 | shr esi, 12 |
97 | shr esi, 12 |
98 | mov [pg_data.pages_count - OS_BASE], esi |
98 | mov [pg_data.pages_count - OS_BASE], esi |
99 | 99 | ||
100 | shr edx, 12 |
100 | shr edx, 12 |
101 | add edx, 31 |
101 | add edx, 31 |
102 | and edx, not 31 |
102 | and edx, not 31 |
103 | shr edx, 3 |
103 | shr edx, 3 |
104 | mov [pg_data.pagemap_size - OS_BASE], edx |
104 | mov [pg_data.pagemap_size - OS_BASE], edx |
105 | 105 | ||
106 | add edx, (sys_pgmap - OS_BASE)+PAGE_SIZE-1 |
106 | add edx, (sys_pgmap - OS_BASE)+PAGE_SIZE-1 |
107 | and edx, -PAGE_SIZE |
107 | and edx, -PAGE_SIZE |
108 | mov [tmp_page_tabs], edx |
108 | mov [tmp_page_tabs], edx |
109 | 109 | ||
110 | mov edx, esi |
110 | mov edx, esi |
111 | and edx, -1024 |
111 | and edx, -1024 |
112 | cmp edx, (OS_BASE/PAGE_SIZE) |
112 | cmp edx, (OS_BASE/PAGE_SIZE) |
113 | jbe @F |
113 | jbe @F |
114 | mov edx, (OS_BASE/PAGE_SIZE) |
114 | mov edx, (OS_BASE/PAGE_SIZE) |
115 | jmp .set |
115 | jmp .set |
116 | @@: |
116 | @@: |
117 | cmp edx, (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE |
117 | cmp edx, (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE |
118 | jae .set |
118 | jae .set |
119 | mov edx, (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE |
119 | mov edx, (HEAP_BASE - OS_BASE + HEAP_MIN_SIZE)/PAGE_SIZE |
120 | .set: |
120 | .set: |
121 | mov [pg_data.kernel_pages - OS_BASE], edx |
121 | mov [pg_data.kernel_pages - OS_BASE], edx |
122 | shr edx, 10 |
122 | shr edx, 10 |
123 | mov [pg_data.kernel_tables - OS_BASE], edx |
123 | mov [pg_data.kernel_tables - OS_BASE], edx |
124 | 124 | ||
125 | xor eax, eax |
125 | xor eax, eax |
126 | mov edi, sys_proc - OS_BASE |
126 | mov edi, sys_proc - OS_BASE |
127 | mov ecx, 2*PAGE_SIZE/4 |
127 | mov ecx, 2*PAGE_SIZE/4 |
128 | cld |
128 | cld |
129 | rep stosd |
129 | rep stosd |
130 | 130 | ||
131 | mov edx, (sys_proc - OS_BASE + PROC.pdt_0) + (OS_BASE shr 20) |
131 | mov edx, (sys_proc - OS_BASE + PROC.pdt_0) + (OS_BASE shr 20) |
132 | bt [cpu_caps - OS_BASE], CAPS_PSE |
132 | bt [cpu_caps - OS_BASE], CAPS_PSE |
133 | jnc .no_PSE |
133 | jnc .no_PSE |
134 | 134 | ||
135 | mov ebx, cr4 |
135 | mov ebx, cr4 |
136 | or ebx, CR4_PSE |
136 | or ebx, CR4_PSE |
137 | mov eax, PDE_LARGE + PG_SWR |
137 | mov eax, PDE_LARGE + PG_SWR |
138 | mov cr4, ebx |
138 | mov cr4, ebx |
139 | dec [pg_data.kernel_tables - OS_BASE] |
139 | dec [pg_data.kernel_tables - OS_BASE] |
140 | 140 | ||
141 | mov [edx], eax |
141 | mov [edx], eax |
142 | add edx, 4 |
142 | add edx, 4 |
143 | 143 | ||
144 | mov edi, [tmp_page_tabs] |
144 | mov edi, [tmp_page_tabs] |
145 | jmp .map_kernel_heap ; new kernel fits to the first 4Mb - nothing to do with ".map_low" |
145 | jmp .map_kernel_heap ; new kernel fits to the first 4Mb - nothing to do with ".map_low" |
146 | .no_PSE: |
146 | .no_PSE: |
147 | mov eax, PG_SWR |
147 | mov eax, PG_SWR |
148 | mov ecx, [tmp_page_tabs] |
148 | mov ecx, [tmp_page_tabs] |
149 | shr ecx, 12 |
149 | shr ecx, 12 |
150 | .map_low: |
150 | .map_low: |
151 | mov edi, [tmp_page_tabs] |
151 | mov edi, [tmp_page_tabs] |
152 | @@: ; |
152 | @@: ; |
153 | stosd |
153 | stosd |
154 | add eax, PAGE_SIZE |
154 | add eax, PAGE_SIZE |
155 | dec ecx |
155 | dec ecx |
156 | jnz @B |
156 | jnz @B |
157 | 157 | ||
158 | .map_kernel_heap: |
158 | .map_kernel_heap: |
159 | mov ecx, [pg_data.kernel_tables - OS_BASE] |
159 | mov ecx, [pg_data.kernel_tables - OS_BASE] |
160 | shl ecx, 10 |
160 | shl ecx, 10 |
161 | xor eax, eax |
161 | xor eax, eax |
162 | rep stosd |
162 | rep stosd |
163 | 163 | ||
164 | mov ecx, [pg_data.kernel_tables - OS_BASE] |
164 | mov ecx, [pg_data.kernel_tables - OS_BASE] |
165 | mov eax, [tmp_page_tabs] |
165 | mov eax, [tmp_page_tabs] |
166 | or eax, PG_SWR |
166 | or eax, PG_SWR |
167 | mov edi, edx |
167 | mov edi, edx |
168 | 168 | ||
169 | .map_kernel_tabs: |
169 | .map_kernel_tabs: |
170 | stosd |
170 | stosd |
171 | add eax, PAGE_SIZE |
171 | add eax, PAGE_SIZE |
172 | dec ecx |
172 | dec ecx |
173 | jnz .map_kernel_tabs |
173 | jnz .map_kernel_tabs |
174 | 174 | ||
175 | mov dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE |
175 | mov dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE |
176 | 176 | ||
177 | mov edi, (sys_proc + PROC.pdt_0 - OS_BASE) |
177 | mov edi, (sys_proc + PROC.pdt_0 - OS_BASE) |
178 | lea esi, [edi + (OS_BASE shr 20)] |
178 | lea esi, [edi + (OS_BASE shr 20)] |
179 | movsd |
179 | movsd |
180 | movsd |
180 | movsd |
181 | ret |
181 | ret |
182 | endp |
182 | endp |
183 | 183 | ||
184 | align 4 |
184 | align 4 |
185 | proc init_page_map |
185 | proc init_page_map |
186 | ; mark all memory as unavailable |
186 | ; mark all memory as unavailable |
187 | mov edi, sys_pgmap - OS_BASE |
187 | mov edi, sys_pgmap - OS_BASE |
188 | mov ecx, [pg_data.pagemap_size - OS_BASE] |
188 | mov ecx, [pg_data.pagemap_size - OS_BASE] |
189 | shr ecx, 2 |
189 | shr ecx, 2 |
190 | xor eax, eax |
190 | xor eax, eax |
191 | cld |
191 | cld |
192 | rep stosd |
192 | rep stosd |
193 | 193 | ||
194 | ; scan through memory map and mark free areas as available |
194 | ; scan through memory map and mark free areas as available |
195 | mov ebx, BOOT_LO.memmap_blocks |
195 | mov ebx, BOOT_LO.memmap_blocks |
196 | mov edx, [ebx-4] |
196 | mov edx, [ebx-4] |
197 | .scanmap: |
197 | .scanmap: |
198 | cmp byte [ebx + e820entry.type], 1 |
198 | cmp byte [ebx + e820entry.type], 1 |
199 | jne .next |
199 | jne .next |
200 | 200 | ||
201 | mov ecx, [ebx + e820entry.size.lo] |
201 | mov ecx, [ebx + e820entry.size.lo] |
202 | shr ecx, 12; ecx = number of pages |
202 | shr ecx, 12; ecx = number of pages |
203 | jz .next |
203 | jz .next |
204 | mov edi, [ebx + e820entry.addr.lo] |
204 | mov edi, [ebx + e820entry.addr.lo] |
205 | shr edi, 12; edi = first page |
205 | shr edi, 12; edi = first page |
206 | mov eax, edi |
206 | mov eax, edi |
207 | shr edi, 5 |
207 | shr edi, 5 |
208 | shl edi, 2 |
208 | shl edi, 2 |
209 | add edi, sys_pgmap - OS_BASE |
209 | add edi, sys_pgmap - OS_BASE |
210 | and eax, 31 |
210 | and eax, 31 |
211 | jz .startok |
211 | jz .startok |
212 | add ecx, eax |
212 | add ecx, eax |
213 | sub ecx, 32 |
213 | sub ecx, 32 |
214 | jbe .onedword |
214 | jbe .onedword |
215 | push ecx |
215 | push ecx |
216 | mov ecx, eax |
216 | mov ecx, eax |
217 | or eax, -1 |
217 | or eax, -1 |
218 | shl eax, cl |
218 | shl eax, cl |
219 | or [edi], eax |
219 | or [edi], eax |
220 | add edi, 4 |
220 | add edi, 4 |
221 | pop ecx |
221 | pop ecx |
222 | .startok: |
222 | .startok: |
223 | push ecx |
223 | push ecx |
224 | shr ecx, 5 |
224 | shr ecx, 5 |
225 | or eax, -1 |
225 | or eax, -1 |
226 | rep stosd |
226 | rep stosd |
227 | pop ecx |
227 | pop ecx |
228 | and ecx, 31 |
228 | and ecx, 31 |
229 | neg eax |
229 | neg eax |
230 | shl eax, cl |
230 | shl eax, cl |
231 | dec eax |
231 | dec eax |
232 | or [edi], eax |
232 | or [edi], eax |
233 | jmp .next |
233 | jmp .next |
234 | .onedword: |
234 | .onedword: |
235 | add ecx, 32 |
235 | add ecx, 32 |
236 | sub ecx, eax |
236 | sub ecx, eax |
237 | @@: |
237 | @@: |
238 | bts [edi], eax |
238 | bts [edi], eax |
239 | inc eax |
239 | inc eax |
240 | loop @b |
240 | loop @b |
241 | .next: |
241 | .next: |
242 | add ebx, sizeof.e820entry |
242 | add ebx, sizeof.e820entry |
243 | dec edx |
243 | dec edx |
244 | jnz .scanmap |
244 | jnz .scanmap |
245 | 245 | ||
246 | ; mark kernel memory as allocated (unavailable) |
246 | ; mark kernel memory as allocated (unavailable) |
247 | mov ecx, [tmp_page_tabs] |
247 | mov ecx, [tmp_page_tabs] |
248 | mov edx, [pg_data.pages_count - OS_BASE] |
248 | mov edx, [pg_data.pages_count - OS_BASE] |
249 | shr ecx, 12 |
249 | shr ecx, 12 |
250 | add ecx, [pg_data.kernel_tables - OS_BASE] |
250 | add ecx, [pg_data.kernel_tables - OS_BASE] |
251 | sub edx, ecx |
251 | sub edx, ecx |
252 | mov [pg_data.pages_free - OS_BASE], edx |
252 | mov [pg_data.pages_free - OS_BASE], edx |
253 | 253 | ||
254 | mov edi, sys_pgmap - OS_BASE |
254 | mov edi, sys_pgmap - OS_BASE |
255 | mov ebx, ecx |
255 | mov ebx, ecx |
256 | shr ecx, 5 |
256 | shr ecx, 5 |
257 | xor eax, eax |
257 | xor eax, eax |
258 | rep stosd |
258 | rep stosd |
259 | 259 | ||
260 | not eax |
260 | not eax |
261 | mov ecx, ebx |
261 | mov ecx, ebx |
262 | and ecx, 31 |
262 | and ecx, 31 |
263 | shl eax, cl |
263 | shl eax, cl |
264 | and [edi], eax |
264 | and [edi], eax |
265 | add edi, OS_BASE |
265 | add edi, OS_BASE |
266 | mov [page_start - OS_BASE], edi; |
266 | mov [page_start - OS_BASE], edi; |
267 | 267 | ||
268 | mov ebx, sys_pgmap |
268 | mov ebx, sys_pgmap |
269 | add ebx, [pg_data.pagemap_size - OS_BASE] |
269 | add ebx, [pg_data.pagemap_size - OS_BASE] |
270 | mov [page_end - OS_BASE], ebx |
270 | mov [page_end - OS_BASE], ebx |
271 | 271 | ||
272 | ret |
272 | ret |
273 | endp |
273 | endp |
274 | 274 | ||
275 | align 4 |
275 | align 4 |
276 | 276 | ||
277 | init_BIOS32: |
277 | init_BIOS32: |
278 | mov edi, 0xE0000 |
278 | mov edi, 0xE0000 |
279 | .pcibios_nxt: |
279 | .pcibios_nxt: |
280 | cmp dword[edi], '_32_'; "magic" word |
280 | cmp dword[edi], '_32_'; "magic" word |
281 | je .BIOS32_found |
281 | je .BIOS32_found |
282 | .pcibios_nxt2: |
282 | .pcibios_nxt2: |
283 | add edi, 0x10 |
283 | add edi, 0x10 |
284 | cmp edi, 0xFFFF0 |
284 | cmp edi, 0xFFFF0 |
285 | je .BIOS32_not_found |
285 | je .BIOS32_not_found |
286 | jmp .pcibios_nxt |
286 | jmp .pcibios_nxt |
287 | .BIOS32_found: ; magic word found, check control summ |
287 | .BIOS32_found: ; magic word found, check control summ |
288 | 288 | ||
289 | movzx ecx, byte[edi + 9] |
289 | movzx ecx, byte[edi + 9] |
290 | shl ecx, 4 |
290 | shl ecx, 4 |
291 | mov esi, edi |
291 | mov esi, edi |
292 | xor eax, eax |
292 | xor eax, eax |
293 | cld ; paranoia |
293 | cld ; paranoia |
294 | @@: |
294 | @@: |
295 | lodsb |
295 | lodsb |
296 | add ah, al |
296 | add ah, al |
297 | loop @b |
297 | loop @b |
298 | jnz .pcibios_nxt2; control summ must be zero |
298 | jnz .pcibios_nxt2; control summ must be zero |
299 | ; BIOS32 service found ! |
299 | ; BIOS32 service found ! |
300 | mov ebp, [edi + 4] |
300 | mov ebp, [edi + 4] |
301 | mov [bios32_entry], ebp |
301 | mov [bios32_entry], ebp |
302 | ; check PCI BIOS present |
302 | ; check PCI BIOS present |
303 | mov eax, '$PCI' |
303 | mov eax, '$PCI' |
304 | xor ebx, ebx |
304 | xor ebx, ebx |
305 | push cs ; special for 'ret far' from BIOS |
305 | push cs ; special for 'ret far' from BIOS |
306 | call ebp |
306 | call ebp |
307 | test al, al |
307 | test al, al |
308 | jnz .PCI_BIOS32_not_found |
308 | jnz .PCI_BIOS32_not_found |
309 | 309 | ||
310 | ; descriptors for PCI BIOS are created here |
310 | ; descriptors for PCI BIOS are created here |
311 | 311 | ||
312 | add ebx, OS_BASE |
312 | add ebx, OS_BASE |
313 | dec ecx |
313 | dec ecx |
314 | mov [(pci_code_32 - OS_BASE)], cx ;limit 0-15 |
314 | mov [(pci_code_32 - OS_BASE)], cx ;limit 0-15 |
315 | mov [(pci_data_32 - OS_BASE)], cx ;limit 0-15 |
315 | mov [(pci_data_32 - OS_BASE)], cx ;limit 0-15 |
316 | 316 | ||
317 | mov [(pci_code_32 - OS_BASE)+2], bx ;base 0-15 |
317 | mov [(pci_code_32 - OS_BASE)+2], bx ;base 0-15 |
318 | mov [(pci_data_32 - OS_BASE)+2], bx ;base 0-15 |
318 | mov [(pci_data_32 - OS_BASE)+2], bx ;base 0-15 |
319 | 319 | ||
320 | shr ebx, 16 |
320 | shr ebx, 16 |
321 | mov [(pci_code_32 - OS_BASE)+4], bl ;base 16-23 |
321 | mov [(pci_code_32 - OS_BASE)+4], bl ;base 16-23 |
322 | mov [(pci_data_32 - OS_BASE)+4], bl ;base 16-23 |
322 | mov [(pci_data_32 - OS_BASE)+4], bl ;base 16-23 |
323 | 323 | ||
324 | shr ecx, 16 |
324 | shr ecx, 16 |
325 | and cl, 0x0F |
325 | and cl, 0x0F |
326 | mov ch, bh |
326 | mov ch, bh |
327 | add cx, D32 |
327 | add cx, D32 |
328 | mov [(pci_code_32 - OS_BASE)+6], cx ;lim 16-19 & |
328 | mov [(pci_code_32 - OS_BASE)+6], cx ;lim 16-19 & |
329 | mov [(pci_data_32 - OS_BASE)+6], cx ;base 24-31 |
329 | mov [(pci_data_32 - OS_BASE)+6], cx ;base 24-31 |
330 | 330 | ||
331 | mov [(pci_bios_entry - OS_BASE)], edx |
331 | mov [(pci_bios_entry - OS_BASE)], edx |
332 | ; jmp .end |
332 | ; jmp .end |
333 | .PCI_BIOS32_not_found: |
333 | .PCI_BIOS32_not_found: |
334 | ; pci_emu_dat structure should be filled here |
334 | ; pci_emu_dat structure should be filled here |
335 | .BIOS32_not_found: |
335 | .BIOS32_not_found: |
336 | .end: |
336 | .end: |
337 | ret |
337 | ret |
338 | 338 | ||
339 | align 4 |
339 | align 4 |
340 | proc test_cpu |
340 | proc test_cpu |
341 | locals |
341 | locals |
342 | cpu_type dd ? |
342 | cpu_type dd ? |
343 | endl |
343 | endl |
344 | 344 | ||
345 | xor eax, eax |
345 | xor eax, eax |
346 | mov [cpu_type], eax |
346 | mov [cpu_type], eax |
347 | mov [cpu_caps - OS_BASE], eax |
347 | mov [cpu_caps - OS_BASE], eax |
348 | mov [cpu_caps + 4 - OS_BASE], eax |
348 | mov [cpu_caps + 4 - OS_BASE], eax |
349 | mov [cpu_phys_addr_width - OS_BASE], 32 |
349 | mov [cpu_phys_addr_width - OS_BASE], 32 |
350 | 350 | ||
351 | pushfd |
351 | pushfd |
352 | pop eax |
352 | pop eax |
353 | mov ecx, eax |
353 | mov ecx, eax |
354 | xor eax, EFLAGS_AC |
354 | xor eax, EFLAGS_AC |
355 | push eax |
355 | push eax |
356 | popfd |
356 | popfd |
357 | pushfd |
357 | pushfd |
358 | pop eax |
358 | pop eax |
359 | xor eax, ecx |
359 | xor eax, ecx |
360 | mov [cpu_type], CPU_386 |
360 | mov [cpu_type], CPU_386 |
361 | jz .end_cpuid |
361 | jz .end_cpuid |
362 | push ecx |
362 | push ecx |
363 | popfd |
363 | popfd |
364 | 364 | ||
365 | mov [cpu_type], CPU_486 |
365 | mov [cpu_type], CPU_486 |
366 | mov eax, ecx |
366 | mov eax, ecx |
367 | xor eax, EFLAGS_ID |
367 | xor eax, EFLAGS_ID |
368 | push eax |
368 | push eax |
369 | popfd |
369 | popfd |
370 | pushfd |
370 | pushfd |
371 | pop eax |
371 | pop eax |
372 | xor eax, ecx |
372 | xor eax, ecx |
373 | je .end_cpuid |
373 | je .end_cpuid |
374 | 374 | ||
375 | xor eax, eax |
375 | xor eax, eax |
376 | cpuid |
376 | cpuid |
377 | 377 | ||
378 | mov [cpu_vendor - OS_BASE], ebx |
378 | mov [cpu_vendor - OS_BASE], ebx |
379 | mov [cpu_vendor + 4 - OS_BASE], edx |
379 | mov [cpu_vendor + 4 - OS_BASE], edx |
380 | mov [cpu_vendor + 8 - OS_BASE], ecx |
380 | mov [cpu_vendor + 8 - OS_BASE], ecx |
381 | 381 | ||
382 | cmp eax, 1 |
382 | cmp eax, 1 |
383 | jl .end_cpuid |
383 | jl .end_cpuid |
384 | mov eax, 1 |
384 | mov eax, 1 |
385 | cpuid |
385 | cpuid |
386 | mov [cpu_sign - OS_BASE], eax |
386 | mov [cpu_sign - OS_BASE], eax |
387 | mov [cpu_info - OS_BASE], ebx |
387 | mov [cpu_info - OS_BASE], ebx |
388 | mov [cpu_caps - OS_BASE], edx |
388 | mov [cpu_caps - OS_BASE], edx |
389 | mov [cpu_caps + 4 - OS_BASE], ecx |
389 | mov [cpu_caps + 4 - OS_BASE], ecx |
390 | 390 | ||
391 | bt edx, CAPS_PAE |
391 | bt edx, CAPS_PAE |
392 | jnc @f |
392 | jnc @f |
393 | mov [cpu_phys_addr_width - OS_BASE], 36 |
393 | mov [cpu_phys_addr_width - OS_BASE], 36 |
394 | @@: |
394 | @@: |
395 | mov eax, 0x80000000 |
395 | mov eax, 0x80000000 |
396 | cpuid |
396 | cpuid |
397 | cmp eax, 0x80000008 |
397 | cmp eax, 0x80000008 |
398 | jb @f |
398 | jb @f |
399 | mov eax, 0x80000008 |
399 | mov eax, 0x80000008 |
400 | cpuid |
400 | cpuid |
401 | mov [cpu_phys_addr_width - OS_BASE], al |
401 | mov [cpu_phys_addr_width - OS_BASE], al |
402 | @@: |
402 | @@: |
403 | 403 | ||
404 | mov eax, [cpu_sign - OS_BASE] |
404 | mov eax, [cpu_sign - OS_BASE] |
405 | shr eax, 8 |
405 | shr eax, 8 |
406 | and eax, 0x0f |
406 | and eax, 0x0f |
407 | ret |
407 | ret |
408 | .end_cpuid: |
408 | .end_cpuid: |
409 | mov eax, [cpu_type] |
409 | mov eax, [cpu_type] |
410 | ret |
410 | ret |
411 | endp |
411 | endp |
412 | - | ||
413 | ACPI_HI_RSDP_WINDOW_START = 0x000E0000 |
- | |
414 | ACPI_HI_RSDP_WINDOW_END = 0x00100000 |
412 | |
415 | ACPI_RSDP_CHECKSUM_LENGTH = 20 |
413 | ACPI_RSDP_CHECKSUM_LENGTH = 20 |
416 | 414 | ||
417 | proc acpi_locate_tables uses ebx esi edi |
415 | proc acpi_locate_tables uses ebx esi edi |
418 | mov ebx, [ebx + ACPI_RSDP.RsdtAddress] |
416 | mov ebx, [ebx + ACPI_RSDP.RsdtAddress] |
419 | mov [acpi_rsdt_base - OS_BASE], ebx |
417 | mov [acpi_rsdt_base - OS_BASE], ebx |
420 | mov eax, [ebx + ACPI_RSDT.Length] |
418 | mov eax, [ebx + ACPI_RSDT.Length] |
421 | mov [acpi_rsdt_size - OS_BASE], eax |
419 | mov [acpi_rsdt_size - OS_BASE], eax |
422 | 420 | ||
423 | mov esi, [acpi_rsdt_base - OS_BASE] |
421 | mov esi, [acpi_rsdt_base - OS_BASE] |
424 | mov ecx, [esi + ACPI_RSDT.Length] |
422 | mov ecx, [esi + ACPI_RSDT.Length] |
425 | lea edi, [esi + ecx] |
423 | lea edi, [esi + ecx] |
426 | add esi, sizeof.ACPI_TABLE |
424 | add esi, sizeof.ACPI_TABLE |
427 | movi ecx, 1 |
425 | movi ecx, 1 |
428 | .next_table: |
426 | .next_table: |
429 | cmp esi, edi |
427 | cmp esi, edi |
430 | jae .done |
428 | jae .done |
431 | lodsd |
429 | lodsd |
432 | cmp [eax+ACPI_TABLE.Signature], 'SSDT' ; skip DSDT if present |
430 | cmp [eax+ACPI_TABLE.Signature], 'SSDT' ; skip DSDT if present |
433 | jz .ssdt ; read it from FADT |
431 | jz .ssdt ; read it from FADT |
434 | cmp [eax+ACPI_TABLE.Signature], 'FACP' ; this is FADT |
432 | cmp [eax+ACPI_TABLE.Signature], 'FACP' ; this is FADT |
435 | jz .fadt |
433 | jz .fadt |
436 | cmp [eax+ACPI_TABLE.Signature], 'APIC' ; this is MADT |
434 | cmp [eax+ACPI_TABLE.Signature], 'APIC' ; this is MADT |
437 | jz .madt |
435 | jz .madt |
438 | cmp [eax+ACPI_TABLE.Signature], 'HPET' |
436 | cmp [eax+ACPI_TABLE.Signature], 'HPET' |
439 | jz .hpet |
437 | jz .hpet |
440 | jmp .next_table |
438 | jmp .next_table |
441 | .ssdt: |
439 | .ssdt: |
442 | mov [acpi_ssdt_base + ecx*4 - OS_BASE], eax |
440 | mov [acpi_ssdt_base + ecx*4 - OS_BASE], eax |
443 | mov eax, [eax+ACPI_TABLE.Length] |
441 | mov eax, [eax+ACPI_TABLE.Length] |
444 | mov [acpi_ssdt_size + ecx*4 - OS_BASE], eax |
442 | mov [acpi_ssdt_size + ecx*4 - OS_BASE], eax |
445 | inc ecx |
443 | inc ecx |
446 | jmp .next_table |
444 | jmp .next_table |
447 | .fadt: |
445 | .fadt: |
448 | mov [acpi_fadt_base - OS_BASE], eax |
446 | mov [acpi_fadt_base - OS_BASE], eax |
449 | cmp [eax + ACPI_FADT.DSDT], 0 |
447 | cmp [eax + ACPI_FADT.DSDT], 0 |
450 | jz @f |
448 | jz @f |
451 | mov edx, [eax + ACPI_FADT.DSDT] |
449 | mov edx, [eax + ACPI_FADT.DSDT] |
452 | mov [acpi_ssdt_base - OS_BASE], edx |
450 | mov [acpi_ssdt_base - OS_BASE], edx |
453 | mov edx, [edx + ACPI_TABLE.Length] |
451 | mov edx, [edx + ACPI_TABLE.Length] |
454 | mov [acpi_ssdt_size - OS_BASE], edx |
452 | mov [acpi_ssdt_size - OS_BASE], edx |
455 | @@: |
453 | @@: |
456 | mov eax, [eax + ACPI_TABLE.Length] |
454 | mov eax, [eax + ACPI_TABLE.Length] |
457 | mov [acpi_fadt_size - OS_BASE], eax |
455 | mov [acpi_fadt_size - OS_BASE], eax |
458 | jmp .next_table |
456 | jmp .next_table |
459 | .madt: |
457 | .madt: |
460 | mov [acpi_madt_base - OS_BASE], eax |
458 | mov [acpi_madt_base - OS_BASE], eax |
461 | mov eax, [eax + ACPI_TABLE.Length] |
459 | mov eax, [eax + ACPI_TABLE.Length] |
462 | mov [acpi_madt_size - OS_BASE], eax |
460 | mov [acpi_madt_size - OS_BASE], eax |
463 | jmp .next_table |
461 | jmp .next_table |
464 | .hpet: |
462 | .hpet: |
465 | mov [acpi_hpet_base - OS_BASE], eax |
463 | mov [acpi_hpet_base - OS_BASE], eax |
466 | mov eax, [eax + ACPI_TABLE.Length] |
464 | mov eax, [eax + ACPI_TABLE.Length] |
467 | mov [acpi_hpet_size - OS_BASE], eax |
465 | mov [acpi_hpet_size - OS_BASE], eax |
468 | jmp .next_table |
466 | jmp .next_table |
469 | .done: |
467 | .done: |
470 | mov [acpi_ssdt_cnt - OS_BASE], ecx |
468 | mov [acpi_ssdt_cnt - OS_BASE], ecx |
471 | ret |
469 | ret |
472 | endp |
470 | endp |
473 | 471 | ||
474 | acpi_locate: |
472 | acpi_locate: |
475 | push ebx |
473 | push ebx |
476 | push edi |
474 | push edi |
477 | - | ||
478 | if defined UEFI |
- | |
479 | ; UEFI loader knows where RSDP is |
475 | |
480 | mov ebx, [BOOT_LO.acpi_rsdp] |
476 | mov ebx, [BOOT_LO.acpi_rsdp] |
481 | test ebx, ebx |
477 | test ebx, ebx |
482 | jz .done |
478 | jz .done |
- | 479 | mov edi, ebx |
|
483 | call .check |
480 | call .check |
484 | else |
- | |
485 | movzx ebx, word [0x40E] |
- | |
486 | shl ebx, 4 |
- | |
487 | lea ecx, [ebx+1024] |
- | |
488 | call .check |
- | |
489 | - | ||
490 | test ebx, ebx |
- | |
491 | jz @F |
- | |
492 | jmp .done |
- | |
493 | - | ||
494 | @@: |
- | |
495 | mov ebx, ACPI_HI_RSDP_WINDOW_START |
- | |
496 | mov edi, ACPI_HI_RSDP_WINDOW_END |
- | |
497 | call .check |
- | |
498 | end if |
- | |
499 | .done: |
481 | .done: |
500 | mov [acpi_rsdp_base - OS_BASE], ebx |
482 | mov [acpi_rsdp_base - OS_BASE], ebx |
501 | test ebx, ebx |
483 | test ebx, ebx |
502 | jz @f |
484 | jz @f |
503 | call acpi_locate_tables |
485 | call acpi_locate_tables |
504 | @@: |
486 | @@: |
505 | pop edi |
487 | pop edi |
506 | pop ebx |
488 | pop ebx |
507 | ret |
489 | ret |
508 | 490 | ||
509 | .check: |
491 | .check: |
510 | cmp [ebx], dword 'RSD ' |
492 | cmp [ebx], dword 'RSD ' |
511 | jne .next |
493 | jne .next |
512 | cmp [ebx+4], dword 'PTR ' |
494 | cmp [ebx+4], dword 'PTR ' |
513 | jne .next |
495 | jne .next |
514 | 496 | ||
515 | mov edx, ebx |
497 | mov edx, ebx |
516 | mov ecx, ACPI_RSDP_CHECKSUM_LENGTH |
498 | mov ecx, ACPI_RSDP_CHECKSUM_LENGTH |
517 | xor eax, eax |
499 | xor eax, eax |
518 | .sum: |
500 | .sum: |
519 | add al, [edx] |
501 | add al, [edx] |
520 | inc edx |
502 | inc edx |
521 | loop .sum |
503 | loop .sum |
522 | 504 | ||
523 | test al, al |
505 | test al, al |
524 | jnz .next |
506 | jnz .next |
525 | ret |
507 | ret |
526 | .next: |
508 | .next: |
527 | add ebx, 16 |
509 | add ebx, 16 |
528 | cmp ebx, edi |
510 | cmp ebx, edi |
529 | jb .check |
511 | jb .check |
530 | xor ebx, ebx |
512 | xor ebx, ebx |
531 | ret |
513 | ret |