67 static void *getEmptyDesc() {
73 tmpDesc = emptyKernDesc;
76 emptyKernDesc = tmpDesc->
next;
77 if (emptyKernDesc != 0x0)
78 emptyKernDesc->
prev = 0x0;
86 kpanic(
"Error: vmmGetFreeKernelPage returned NULL\n");
89 memset(emptyKernDesc, 0x0, 0x4000);
91 emptyKernDesc[0].
next = &emptyKernDesc[1];
93 for (i = 0x1; i < ((0x4000 /
sizeof(
struct memDescriptor))); i++) {
95 emptyKernDesc[i].
next = &emptyKernDesc[i + 1];
97 emptyKernDesc[i].
next = 0x0;
98 emptyKernDesc[i].
prev = &emptyKernDesc[i - 1];
101 tmpDesc = &emptyKernDesc[0];
103 emptyKernDesc = tmpDesc->
next;
104 emptyKernDesc->
prev = 0x0;
127 if (freeDesc->
limit <= 0x0)
128 kpanic(
"Inserting Descriptor with no limit\n");
130 if (freeKernDesc != 0x0) {
133 freeDesc->
next = freeKernDesc;
134 freeDesc->
prev = 0x0;
135 freeKernDesc->
prev = freeDesc;
136 freeKernDesc = freeDesc;
139 for (tmpDesc = freeKernDesc; tmpDesc != 0x0; tmpDesc = tmpDesc->
next) {
143 if (tmpDesc->
prev != 0x0)
146 tmpDesc->
prev = freeDesc;
147 freeDesc->
next = tmpDesc;
149 if (tmpDesc == freeKernDesc)
150 freeKernDesc = freeDesc;
153 if (tmpDesc->
next == 0x0) {
154 tmpDesc->
next = freeDesc;
155 freeDesc->
prev = tmpDesc;
156 freeDesc->
next = 0x0;
164 freeDesc->
prev = 0x0;
165 freeDesc->
next = 0x0;
166 freeKernDesc = freeDesc;
184 static void mergeMemBlocks() {
192 mergeStart:
for (tmpDesc1 = freeKernDesc; tmpDesc1 != 0x0; tmpDesc1 = tmpDesc1->
next) {
197 if (tmpDesc1->
limit != 0x0) {
199 for (tmpDesc2 = freeKernDesc; tmpDesc2; tmpDesc2 = tmpDesc2->
next) {
203 tmpDesc2->
limit = 0x0;
204 if (tmpDesc2->
prev) {
207 if (tmpDesc2->
next) {
210 tmpDesc2->
prev = 0x0;
211 tmpDesc2->
next = emptyKernDesc;
212 emptyKernDesc->
prev = tmpDesc2;
213 emptyKernDesc = tmpDesc2;
214 if (tmpDesc1->
prev) {
217 if (tmpDesc1->
next) {
220 tmpDesc1->
prev = 0x0;
221 tmpDesc1->
next = 0x0;
223 insertFreeDesc(tmpDesc1);
258 kprintf(
"kmalloc: len = 0!\n");
261 for (tmpDesc1 = freeKernDesc; tmpDesc1 != 0x0; tmpDesc1 = tmpDesc1->
next) {
263 if (tmpDesc1->
limit >= len) {
264 if (tmpDesc1->
prev != 0x0)
266 if (tmpDesc1->
next != 0x0)
269 if (tmpDesc1 == freeKernDesc)
270 freeKernDesc = tmpDesc1->
next;
272 tmpDesc1->
prev = 0x0;
273 tmpDesc1->
next = usedKernDesc;
274 if (usedKernDesc != 0x0)
275 usedKernDesc->
prev = tmpDesc1;
276 usedKernDesc = tmpDesc1;
277 if (tmpDesc1->
limit > len) {
278 tmpDesc2 = getEmptyDesc();
281 tmpDesc1->
limit = len;
283 tmpDesc2->
next = 0x0;
284 tmpDesc2->
prev = 0x0;
285 insertFreeDesc(tmpDesc2);
288 for (i = 0; i < tmpDesc1->
limit; i++) {
297 tmpDesc1 = getEmptyDesc();
299 if (tmpDesc1 != 0x0) {
300 pages = ((len + 4095) / 4096);
302 tmpDesc1->
limit = len;
303 tmpDesc1->
next = usedKernDesc;
304 tmpDesc1->
prev = 0x0;
305 if (usedKernDesc != 0x0)
306 usedKernDesc->
prev = tmpDesc1;
307 usedKernDesc = tmpDesc1;
309 if (((pages * 4096) - len) > 0x0) {
310 tmpDesc2 = getEmptyDesc();
313 tmpDesc2->
limit = ((pages * 4096) - len);
314 tmpDesc2->
prev = 0x0;
315 tmpDesc2->
next = 0x0;
316 if (tmpDesc2->
limit <= 0x0)
318 insertFreeDesc(tmpDesc2);
322 for (i = 0; i < tmpDesc1->
limit; i++) {
357 for (tmpDesc = usedKernDesc; tmpDesc != 0x0; tmpDesc = tmpDesc->
next) {
362 if (usedKernDesc == tmpDesc)
363 usedKernDesc = tmpDesc->
next;
365 if (tmpDesc->
prev != 0x0)
368 if (tmpDesc->
next != 0x0)
374 if (tmpDesc->
limit <= 0x0)
377 insertFreeDesc(tmpDesc);