Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
1289 diamond 3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 serge 7
 
593 mikedld 8
$Revision: 2434 $
9
 
10
 
2434 Serge 11
struct  MEM_BLOCK
12
        list            LHEAD
13
        next_block      dd ? ;+8
14
        prev_block      dd ? ;+4
15
        base            dd ? ;+16
16
        size            dd ? ;+20
17
        flags           dd ? ;+24
18
        handle          dd ? ;+28
19
ends
164 serge 20
 
21
FREE_BLOCK      equ  4
22
USED_BLOCK      equ  8
546 diamond 23
DONT_FREE_BLOCK equ  10h
164 serge 24
 
25
 
26
block_next   equ MEM_BLOCK.next_block
27
block_prev   equ MEM_BLOCK.prev_block
2138 serge 28
list_fd      equ MEM_BLOCK.list.next
29
list_bk      equ MEM_BLOCK.list.prev
164 serge 30
block_base   equ MEM_BLOCK.base
31
block_size   equ MEM_BLOCK.size
32
block_flags  equ MEM_BLOCK.flags
33
 
34
macro calc_index op
35
{          shr op, 12
36
           dec op
37
           cmp op, 63
38
           jna @f
39
           mov op, 63
40
@@:
41
}
42
 
2156 serge 43
align 4
44
md:
45
.add_to_used:
46
           mov eax, [esi+block_base]
47
           mov ebx, [esi+block_base]
48
           shr ebx, 6
49
           add eax, ebx
50
           shr ebx, 6
51
           add eax, ebx
52
           shr eax, 12
53
           and eax, 63
54
           inc [mem_hash_cnt+eax*4]
164 serge 55
 
2156 serge 56
           lea ecx, [mem_used_list+eax*8]
57
           list_add esi, ecx
58
           mov [esi+block_flags], USED_BLOCK
59
           mov eax, [esi+block_size]
60
           sub [heap_free], eax
61
           ret
62
align 4
63
.find_used:
64
           mov ecx, eax
65
           mov ebx, eax
66
           shr ebx, 6
67
           add ecx, ebx
68
           shr ebx, 6
69
           add ecx, ebx
70
           shr ecx, 12
71
           and ecx, 63
72
 
73
           lea ebx, [mem_used_list+ecx*8]
74
           mov esi, ebx
75
.next:
76
           mov esi, [esi+list_fd]
77
           cmp esi, ebx
78
           je .fail
79
 
80
           cmp eax, [esi+block_base]
81
           jne .next
82
 
83
           ret
84
.fail:
85
           xor esi, esi
86
           ret
87
 
88
align 4
89
.del_from_used:
90
           call .find_used
91
           test esi, esi
92
           jz .done
93
 
94
           cmp [esi+block_flags], USED_BLOCK
95
           jne .fatal
96
 
97
           dec [mem_hash_cnt+ecx*4]
98
           list_del esi
99
.done:
100
           ret
101
.fatal:                            ;FIXME panic here
102
           xor esi, esi
103
           ret
104
 
2138 serge 105
;Initial heap state
106
;
2143 serge 107
;+heap_size               terminator        USED_BLOCK
2151 serge 108
;+4096*MEM_BLOCK.sizeof   free space        FREE_BLOCK
2143 serge 109
;HEAP_BASE                heap_descriptors  USED_BLOCK
2138 serge 110
;
111
 
164 serge 112
align 4
113
proc init_kernel_heap
114
 
2138 serge 115
            mov ecx, 64
116
            mov edi, mem_block_list
117
@@:
118
            mov eax, edi
119
            stosd
120
            stosd
121
            loop @B
164 serge 122
 
2156 serge 123
            mov ecx, 64
124
            mov edi, mem_used_list
125
@@:
126
            mov eax, edi
127
            stosd
128
            stosd
129
            loop @B
357 serge 130
 
2138 serge 131
            stdcall alloc_pages, dword 32
132
            mov ecx, 32
133
            mov edx, eax
134
            mov edi, HEAP_BASE
164 serge 135
.l1:
2434 Serge 136
        stdcall map_page, edi, edx, PG_SW
2138 serge 137
            add edi, 0x1000
138
            add edx, 0x1000
139
            dec ecx
140
            jnz .l1
164 serge 141
 
2138 serge 142
            mov edi, HEAP_BASE                     ;descriptors
2434 Serge 143
        mov     ebx, HEAP_BASE+sizeof.MEM_BLOCK      ;free space
144
        mov     ecx, HEAP_BASE+sizeof.MEM_BLOCK*2    ;terminator
164 serge 145
 
2138 serge 146
            xor eax, eax
147
            mov [edi+block_next], ebx
148
            mov [edi+block_prev], eax
149
            mov [edi+list_fd], eax
150
            mov [edi+list_bk], eax
151
            mov [edi+block_base], HEAP_BASE
2434 Serge 152
        mov     [edi+block_size], 4096*sizeof.MEM_BLOCK
2138 serge 153
            mov [edi+block_flags], USED_BLOCK
164 serge 154
 
2138 serge 155
            mov [ecx+block_next], eax
156
            mov [ecx+block_prev], ebx
157
            mov [edi+list_fd], eax
158
            mov [edi+list_bk], eax
2151 serge 159
            mov [edi+block_base], eax
160
            mov [edi+block_size], eax
2138 serge 161
            mov [edi+block_flags], USED_BLOCK
164 serge 162
 
2138 serge 163
            mov [ebx+block_next], ecx
164
            mov [ebx+block_prev], edi
2434 Serge 165
        mov     [ebx+block_base], HEAP_BASE+4096*sizeof.MEM_BLOCK
164 serge 166
 
2138 serge 167
            mov ecx, [pg_data.kernel_pages]
168
            shl ecx, 12
2434 Serge 169
        sub     ecx, HEAP_BASE-OS_BASE+4096*sizeof.MEM_BLOCK
2138 serge 170
            mov [heap_size], ecx
171
            mov [heap_free], ecx
172
            mov [ebx+block_size], ecx
173
            mov [ebx+block_flags], FREE_BLOCK
174
 
175
            mov [mem_block_mask], eax
2434 Serge 176
        mov     [mem_block_mask+4], 0x80000000
2138 serge 177
 
178
            mov ecx, mem_block_list+63*8
179
            list_add ebx, ecx
180
 
2151 serge 181
            mov ecx, 4096-3-1
2434 Serge 182
        mov     eax, HEAP_BASE+sizeof.MEM_BLOCK*4
2151 serge 183
 
2434 Serge 184
        mov     [next_memblock], HEAP_BASE+sizeof.MEM_BLOCK *3
2151 serge 185
@@:
2434 Serge 186
        mov     [eax-sizeof.MEM_BLOCK], eax
187
        add     eax, sizeof.MEM_BLOCK
2151 serge 188
            loop @B
189
 
2434 Serge 190
        mov     [eax-sizeof.MEM_BLOCK], dword 0
2151 serge 191
 
2138 serge 192
            mov ecx, heap_mutex
193
            call mutex_init
2151 serge 194
            mov [heap_blocks], 4094
195
            mov [free_blocks], 4093
2138 serge 196
            ret
164 serge 197
endp
198
 
369 serge 199
; param
200
;  eax= required size
201
;
202
; retval
203
;  edi= memory block descriptor
204
;  ebx= descriptor index
205
 
164 serge 206
align 4
819 serge 207
get_small_block:
164 serge 208
           mov ecx, eax
369 serge 209
           shr ecx, 12
210
           dec ecx
211
           cmp ecx, 63
212
           jle .get_index
213
           mov ecx, 63
214
.get_index: