00001
00013 #define ENOMEM (-1)
00014
00015 void *sbrk(signed int increment);
00016
00017
00018
00019 const long initialBrk = 0x00400000;
00020 long brk = initialBrk;
00021 long availableInPage = 0x0;
00022
00023
00024
00025 long availableMemory = 0x00A00000;
00026
00027 void *sbrk(signed int increment)
00028 {
00029 void *allocBase;
00030 void *pageAddr;
00031
00032 long linearAddr, physAddr;
00033
00034
00035
00036
00037 if(increment > 0)
00038 {
00039
00040 allocBase = (void *)brk;
00041
00042
00043 if((unsigned)availableMemory >= (unsigned)increment)
00044 {
00045
00046 brk += increment;
00047
00048
00049 if(availableInPage > increment)
00050 {
00051
00052 availableInPage -= increment;
00053 }
00054 else
00055 {
00056
00057
00058
00059
00060 linearAddr = (long)allocBase;
00061
00062
00063
00064
00065 increment -= availableInPage;
00066
00067
00068 availableInPage = PAGE_SIZE - (increment & PAGE_SIZE_MASK);
00069 if(availableInPage == PAGE_SIZE) availableInPage = 0;
00070
00071
00072 while(increment > 0)
00073 {
00074
00075
00076 pageAddr = pages().AllocPage();
00077
00078 pager().MapToLinear(pageAddr, (void *)linearAddr);
00079
00080
00081
00082 linearAddr += PAGE_SIZE;
00083
00084 increment -= PAGE_SIZE;
00085 }
00086 }
00087 return allocBase;
00088 }
00089 else return (void *)(-2);
00090 }
00091 else if(increment < 0)
00092 {
00093
00094
00095 increment = -increment;
00096
00097 if( (brk - increment) >= initialBrk)
00098 {
00099
00100
00101
00102 if( (PAGE_SIZE - availableInPage) > increment)
00103 {
00104 availableInPage -= increment;
00105 brk -= increment;
00106 }
00107 else
00108 {
00109 linearAddr = brk - (PAGE_SIZE - availableInPage);
00110 brk -= increment;
00111
00112 while(increment >= PAGE_SIZE)
00113 {
00114
00115
00116 physAddr = (long)pager().LinearToPhysical((void *)linearAddr);
00117
00118 pager().UnMap((void *)linearAddr);
00119 pages().FreePage((void *)physAddr);
00120
00121 increment -= PAGE_SIZE;
00122 linearAddr -= PAGE_SIZE;
00123 }
00124
00125
00126 availableInPage = PAGE_SIZE - increment;
00127 if(availableInPage == PAGE_SIZE) availableInPage = 0;
00128 }
00129 }
00130 else return (void *)(-3);
00131 }
00132
00133 return (void *)brk;
00134 }