Subversion Repositories Kolibri OS

Rev

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)