Subversion Repositories Kolibri OS

Rev

Rev 1710 | 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: 2014 $
9
 
10
 
164 serge 11
struc MEM_BLOCK
2014 art_zh 12
{  .next_block	dd ?
13
   .prev_block	dd ? ;+4
14
   .list_fd	dd ? ;+8
15
   .list_bk	dd ? ;+12
16
   .base	dd ? ;+16
17
   .size	dd ? ;+20
18
   .flags	dd ? ;+24
19
   .handle	dd ? ;+28
164 serge 20
}
21
 
357 serge 22
MEM_LIST_OFFSET equ  8
2014 art_zh 23
FREE_BLOCK	equ  4
24
USED_BLOCK	equ  8
546 diamond 25
DONT_FREE_BLOCK equ  10h
164 serge 26
 
27
virtual at 0
28
  MEM_BLOCK MEM_BLOCK
29
end virtual
30
 
31
MEM_BLOCK_SIZE equ 8*4
32
 
33
block_next   equ MEM_BLOCK.next_block
34
block_prev   equ MEM_BLOCK.prev_block
357 serge 35
list_fd      equ MEM_BLOCK.list_fd
36
list_bk      equ MEM_BLOCK.list_bk
164 serge 37
block_base   equ MEM_BLOCK.base
38
block_size   equ MEM_BLOCK.size
39
block_flags  equ MEM_BLOCK.flags
40
 
41
macro calc_index op
2014 art_zh 42
{	   shr op, 12
43
	   dec op
44
	   cmp op, 63
45
	   jna @f
46
	   mov op, 63
164 serge 47
@@:
48
}
49
 
50
macro remove_from_list op
2014 art_zh 51
{	   mov edx, [op+list_fd]
52
	   mov ecx, [op+list_bk]
53
	   test edx, edx
54
	   jz @f
55
	   mov [edx+list_bk], ecx
164 serge 56
@@:
2014 art_zh 57
	   test ecx, ecx
58
	   jz @f
59
	   mov [ecx+list_fd], edx
164 serge 60
@@:
2014 art_zh 61
	   mov [op+list_fd],0
62
	   mov [op+list_bk],0
164 serge 63
}
64
 
65
macro remove_from_free op
66
{
2014 art_zh 67
	   remove_from_list op
164 serge 68
 
2014 art_zh 69
	   mov eax, [op+block_size]
70
	   calc_index eax
71
	   cmp [mem_block_list+eax*4], op
72
	   jne @f
73
	   mov [mem_block_list+eax*4], edx
164 serge 74
@@:
2014 art_zh 75
	   cmp [mem_block_list+eax*4], 0
76
	   jne @f
77
	   btr [mem_block_mask], eax
164 serge 78
@@:
79
}
80
 
81
macro remove_from_used op
82
{
2014 art_zh 83
	   mov edx, [op+list_fd]
84
	   mov ecx, [op+list_bk]
85
	   mov [edx+list_bk], ecx
86
	   mov [ecx+list_fd], edx
87
	   mov [op+list_fd], 0
88
	   mov [op+list_bk], 0
164 serge 89
}
90
 
91
align 4
92
proc init_kernel_heap
93
 
2014 art_zh 94
	   mov ecx, 64
95
	   mov edi, mem_block_list
96
	   xor eax, eax
97
	   cld
98
	   rep stosd
164 serge 99
 
2014 art_zh 100
	   mov ecx, 512/4
101
	   mov edi, mem_block_map
102
	   not eax
103
	   rep stosd
164 serge 104
 
2014 art_zh 105
	   mov [mem_block_start], mem_block_map
106
	   mov [mem_block_end], mem_block_map+512
107
	   mov [mem_block_arr], HEAP_BASE
164 serge 108
 
2014 art_zh 109
	   mov eax, mem_used.fd-MEM_LIST_OFFSET
110
	   mov [mem_used.fd], eax
111
	   mov [mem_used.bk], eax
357 serge 112
 
1710 art_zh 113
	   mov [KERNEL_ALLOC_FLAG], dword PG_SW
2014 art_zh 114
	   stdcall alloc_pages, dword 32
115
	   mov ecx, 32
116
	   mov edx, eax
117
	   mov edi, HEAP_BASE
164 serge 118
.l1:
2014 art_zh 119
	   stdcall map_page,edi,edx,PG_SW
120
	   add edi, 0x1000
121
	   add edx, 0x1000
122
	   dec ecx
123
	   jnz .l1
164 serge 124
 
2014 art_zh 125
	   mov edi, HEAP_BASE
126
	   mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
127
	   xor eax, eax
128
	   mov [edi+block_next], ebx
129
	   mov [edi+block_prev], eax
130
	   mov [edi+list_fd], eax
131
	   mov [edi+list_bk], eax
132
	   mov [edi+block_base], HEAP_BASE
133
	   mov [edi+block_size], 4096*MEM_BLOCK_SIZE
134
	   mov [edi+block_flags], USED_BLOCK
164 serge 135
 
2014 art_zh 136
	   mov [ebx+block_next], eax
137
	   mov [ebx+block_prev], eax
138
	   mov [ebx+list_fd], eax
139
	   mov [ebx+list_bk], eax
140
	   mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
164 serge 141
 
2014 art_zh 142
	   mov ecx, [pg_data.kernel_pages]
143
	   shl ecx, 12
144
	   sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK_SIZE
145
	   mov [heap_size], ecx
146
	   mov [heap_free], ecx
147
	   mov [ebx+block_size], ecx
148
	   mov [ebx+block_flags], FREE_BLOCK
164 serge 149
 
2014 art_zh 150
	   mov [mem_block_mask], eax
151
	   mov [mem_block_mask+4],0x80000000
164 serge 152
 
2014 art_zh 153
	   mov [mem_block_list+63*4], ebx
154
	   mov byte [mem_block_map], 0xFC
155
	   and [heap_mutex], 0
156
	   mov [heap_blocks], 4095
157
	   mov [free_blocks], 4094
158
	   ret
164 serge 159
endp
160
 
369 serge 161
; param
162
;  eax= required size
163
;
164
; retval
165
;  edi= memory block descriptor
166
;  ebx= descriptor index
167
 
164 serge 168
align 4
819 serge 169
get_small_block:
2014 art_zh 170
	   mov ecx, eax
171
	   shr ecx, 12
172
	   dec ecx
173
	   cmp ecx, 63
174
	   jle .get_index
175
	   mov ecx, 63
369 serge 176
.get_index:
2014 art_zh 177
	   lea esi, [mem_block_mask]
178
	   xor ebx, ebx
179
	   or edx, -1
164 serge 180
 
2014 art_zh 181
	   cmp ecx, 32
182
	   jb .bit_test
164 serge 183
 
2014 art_zh 184
	   sub ecx, 32
185
	   add ebx, 32
186
	   add esi, 4
164 serge 187
.bit_test:
2014 art_zh 188
	   shl edx, cl
189
	   and edx, [esi]
369 serge 190
.find:
2014 art_zh 191
	   bsf edi, edx
192
	   jz .high_mask
193
	   add ebx, edi
194
	   mov edi, [mem_block_list+ebx*4]
369 serge 195
.check_size:
2014 art_zh 196
	   cmp eax, [edi+block_size]
197
	   ja .next
198
	   ret
164 serge 199
 
200
.high_mask:
2014 art_zh 201
	   add esi, 4
202
	   cmp esi, mem_block_mask+8
203
	   jae .err
204
	   add ebx, 32
205
	   mov edx, [esi]
206
	   jmp .find
369 serge 207
.next:
2014 art_zh 208
	   mov edi, [edi+list_fd]
209
	   test edi, edi
210
	   jnz .check_size
369 serge 211
.err: