All user-space apps ware moved to 8MB virtual address address (link.ld changes);...
[ZeXOS.git] / kernel / core / mm / swmem.c
blob564aeb388adb836a29da266c496d5f91cfc69560
1 /*
2 * ZeX/OS
3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <system.h>
21 #include <arch/io.h>
22 #include <string.h>
23 #include <build.h>
24 #include <proc.h>
26 #define SWMEM_PAGE 0x2000
28 #define SWMEM_LOW 0x500000
29 #define SWMEM_HIGH 0x800000
31 #define SWMEM_ARRAY (SWMEM_HIGH - SWMEM_LOW) / SWMEM_PAGE
33 #define SWMEM_PAGE_FREE 0x0
34 #define SWMEM_PAGE_USED 0x1
36 unsigned char swmempage[SWMEM_ARRAY];
38 void *swmalloc (unsigned size)
40 unsigned i, y, r;
42 for (i = 0; i < SWMEM_ARRAY; i ++) {
43 if (swmempage[i] == SWMEM_PAGE_FREE) { /* FREE */
44 r = 0;
45 if (size > SWMEM_PAGE) {
46 for (y = 0; y < (size/SWMEM_PAGE)+1; y ++) {
47 if (swmempage[i+y] == SWMEM_PAGE_FREE)
48 swmempage[i+y] = SWMEM_PAGE_USED;
49 else {
50 r = 1;
51 break;
54 if (r)
55 break;
57 } else
58 swmempage[i] = SWMEM_PAGE_USED;
60 if (r) {
61 i += y;
62 continue;
65 return (void *) ((i * SWMEM_PAGE) + SWMEM_LOW);
69 return (void *) 0;
72 unsigned swfree (void *ptr, unsigned size)
74 unsigned i = ((unsigned) ptr - SWMEM_LOW) / SWMEM_PAGE;
75 unsigned y;
77 if (swmempage[i] != SWMEM_PAGE_USED)
78 return 0;
80 if (size > SWMEM_PAGE) {
81 for (y = 0; y < (size/SWMEM_PAGE)+1; y ++) {
82 if (swmempage[i+y] == SWMEM_PAGE_USED)
83 swmempage[i+y] = SWMEM_PAGE_FREE;
84 else
85 return 0;
87 } else
88 swmempage[i] = SWMEM_PAGE_FREE;
90 return 1;
93 unsigned int swmem_init ()
95 memset (swmempage, 0, SWMEM_ARRAY);
97 return 1;