Rev 8111 | Rev 8284 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8111 | Rev 8217 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2020. 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 8111 $ |
8 | $Revision: 8217 $ |
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 |
Line 13... | Line 13... | ||
13 | cmp dword [BOOT_LO.memmap_block_cnt], 0 |
13 | cmp [BOOT_LO.memmap_block_cnt], 0 |
14 | jnz .ret |
14 | jnz .ret |
15 | 15 | ||
Line 44... | Line 44... | ||
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] |
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] |
54 | mov eax, [edi+e820entry.addr.lo] |
55 | cmp [edi+16], byte 1 |
55 | cmp byte [edi+e820entry.type], 1 |
Line 56... | Line 56... | ||
56 | jne .unusable |
56 | jne .unusable |
57 | 57 | ||
58 | test eax, 0xFFF |
58 | test eax, 0xFFF |
59 | jz @f |
59 | jz @f |
60 | neg eax |
60 | neg eax |
61 | and eax, 0xFFF |
61 | and eax, 0xFFF |
62 | add [edi], eax |
62 | add [edi+e820entry.addr.lo], eax |
63 | adc dword [edi+4], 0 |
63 | adc [edi+e820entry.addr.hi], 0 |
64 | sub [edi+8], eax |
64 | sub [edi+e820entry.size.lo], eax |
65 | sbb dword [edi+12], 0 |
65 | sbb [edi+e820entry.size.hi], 0 |
66 | jc .unusable |
66 | jc .unusable |
67 | @@: |
67 | @@: |
68 | and dword [edi+8], not 0xFFF |
68 | and [edi+e820entry.size.lo], not 0xFFF |
69 | jz .unusable |
69 | jz .unusable |
70 | ; ignore memory after 4 Gb |
70 | ; ignore memory after 4 GiB |
71 | cmp dword [edi+4], 0 |
71 | cmp [edi+e820entry.addr.hi], 0 |
72 | jnz .unusable |
72 | jnz .unusable |
73 | mov eax, [edi] |
73 | mov eax, [edi] |
74 | cmp dword [edi+12], 0 |
74 | cmp [edi+e820entry.size.hi], 0 |
75 | jnz .overflow |
75 | jnz .overflow |
76 | add eax, [edi+8] |
76 | add eax, [edi+e820entry.size.lo] |
77 | jnc @f |
77 | jnc @f |
78 | .overflow: |
78 | .overflow: |
79 | mov eax, 0xFFFFF000 |
79 | mov eax, 0xFFFFF000 |
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] |
85 | sub eax, [edi+e820entry.addr.lo] |
86 | mov [edi+8], 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+8], 0 |
90 | ; and dword [edi+e820entry.size.lo], 0 |
91 | .usable: |
91 | .usable: |
92 | add edi, 20 |
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 |
Line 193... | Line 193... | ||
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 [ebx+16], byte 1 |
198 | cmp byte [ebx+e820entry.type], 1 |
Line 199... | Line 199... | ||
199 | jne .next |
199 | jne .next |
200 | 200 | ||
201 | mov ecx, [ebx+8] |
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] |
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 |
Line 237... | Line 237... | ||
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, 20 |
242 | add ebx, sizeof.e820entry |
243 | dec edx |
243 | dec edx |
244 | jnz .scanmap |
244 | jnz .scanmap |
Line 245... | Line 245... | ||
245 | 245 | ||
246 | ; mark kernel memory as allocated (unavailable) |
246 | ; mark kernel memory as allocated (unavailable) |