hschumann2/TempleOS-Source-Code
0847
1 2Bool Mem32DevIns(CMemRange *tmpmr)3{4 CMemRange *tmpmr1=dev.mem32_head.next,*tmpmr2;5 while (tmpmr1!=&dev.mem32_head) {6 if (!tmpmr1->type && tmpmr->base>=tmpmr1->base &&7 tmpmr->base+tmpmr->size<=tmpmr1->base+tmpmr1->size) {8 if (tmpmr->base>tmpmr1->base) {9 tmpmr2=AMAlloc(sizeof(CMemRange));10 tmpmr2->type=MRT_UNUSED;11 tmpmr2->flags=0;12 tmpmr2->base=tmpmr1->base;13 tmpmr2->size=tmpmr->base-tmpmr1->base;14 QueInsRev(tmpmr2,tmpmr1);15 }16 QueInsRev(tmpmr,tmpmr1);17 tmpmr1->size=tmpmr1->base+tmpmr1->size-18 (tmpmr->base+tmpmr->size);19 tmpmr1->base=tmpmr->base+tmpmr->size;20 if (!tmpmr1->size) {21 QueRem(tmpmr1);22 Free(tmpmr1);23 }24 return TRUE;25 }26 tmpmr1=tmpmr1->next;27 }28 return FALSE;29}30 31U0 Mem32DevInit()32{33 CMemRange *tmpmr;34 CMemE820 *m20=MEM_E820;35 36 QueInit(&dev.mem32_head);37 tmpmr=AMAlloc(sizeof(CMemRange));38 tmpmr->type=MRT_UNUSED;39 tmpmr->flags=0;40//Maybe !!! Change this to 0xF0000000 !!!41 tmpmr->base=0xE0000000;42 tmpmr->size=0x10000000;43 QueIns(tmpmr,dev.mem32_head.last);44 45 if (m20->type) {46 while (m20->type) {47 tmpmr=AMAlloc(sizeof(CMemRange));48 tmpmr->type=m20->type;49 tmpmr->flags=0;50 tmpmr->base=m20->base;51 tmpmr->size=m20->len;52 if (!Mem32DevIns(tmpmr))53 Free(tmpmr);54 m20++;55 }56 }57}58 59U8 *Mem32DevAlloc(I64 size,I64 alignment)60{//Alloc 32-bit addr space for device. (Doesn't work.) Not used.61//For this to work the BIOS E820 map must be searched for gaps in62 //the 32-bit range and the pool initialized to the gaps.63 U8 *base,*limit;64 CMemRange *tmpmr,*tmpmr1;65 while (LBts(&sys_semas[SEMA_DEV_MEM],0))66 Yield;67 tmpmr1=dev.mem32_head.next;68 while (tmpmr1!=&dev.mem32_head) {69 base=(tmpmr1->base+alignment-1)&~(alignment-1);70 limit=base+size-1;71 if (!tmpmr1->type &&72 limit<tmpmr1->base+tmpmr1->size) {73 tmpmr=AMAlloc(sizeof(CMemRange));74 tmpmr->type=MRT_DEV;75 tmpmr->flags=0;76 tmpmr->base=base;77 tmpmr->size=size;78 if (!Mem32DevIns(tmpmr)) {79 Free(tmpmr);80 LBtr(&sys_semas[SEMA_DEV_MEM],0);81 return NULL;82 }83 LBtr(&sys_semas[SEMA_DEV_MEM],0);84 return tmpmr->base;85 }86 tmpmr1=tmpmr1->next;87 }88 LBtr(&sys_semas[SEMA_DEV_MEM],0);89 return NULL;90}91 92U0 Mem32DevFree(U8 *base)93{//Free 32-bit device address space.94 CMemRange *tmpmr;95 if (!base) return;96 while (LBts(&sys_semas[SEMA_DEV_MEM],0))97 Yield;98 tmpmr=dev.mem32_head.next;99 while (tmpmr!=&dev.mem32_head) {100 if (tmpmr->base==base) {101 tmpmr->type=MRT_UNUSED;102 break;103 }104 tmpmr=tmpmr->next;105 }106 LBtr(&sys_semas[SEMA_DEV_MEM],0);107}108 109U8 *Mem64DevAlloc(I64 *_pages1Gig)110{//Alloc 64-bit addr space for device.111 U8 *a;112 I64 i=*_pages1Gig,*pte;113 while (LBts(&sys_semas[SEMA_DEV_MEM],0))114 Yield;115 while (i--) {116 a=dev.mem64_ptr-=1<<30;117 do {118 pte=MemPageTable(a);119 *pte=*pte&~0x18 |0x11; //Uncached and present120 InvlPg(dev.mem64_ptr);121 a+=mem_page_size;122 } while (a-dev.mem64_ptr<1<<30);123 }124 LBtr(&sys_semas[SEMA_DEV_MEM],0);125 return dev.mem64_ptr;126}127 128U0 Mem64DevFree(U8 *base,I64 pages1Gig)129{//Free 64-bit device address space.130 if (!base) return;131 while (LBts(&sys_semas[SEMA_DEV_MEM],0))132 Yield;133 if (base==dev.mem64_ptr)134 dev.mem64_ptr+=pages1Gig*1<<30;135//else not freed136 LBtr(&sys_semas[SEMA_DEV_MEM],0);137}138 139U0 UncachedAliasAlloc() //Make uncached alias for 4 lowest Gig.140{141 I64 i=4,*pte;142 U8 *a;143 a=dev.uncached_alias=Mem64DevAlloc(&i);144 do {145 pte=MemPageTable(a);146 *pte=0x197+a-dev.uncached_alias;147 InvlPg(a);148 a+=mem_page_size;149 } while (a-dev.uncached_alias<1<<32);150}151 152I64 BIOSTotalMem()153{154 I64 r01,r20;155 U16 *m01=MEM_E801;156 CMemE820 *m20=MEM_E820;157 158 r01=0x100000+m01[0]<<10+m01[1]<<16;159 r20=0;160 if (m20->type) {161 while (m20->type) {162 if (m20->type==1)163 r20+=m20->len;164 m20++;165 }166 }167 return MaxI64(r01,r20);168}169 170I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024)171{//Helps pick DiskCache and RAMDisk sizes.172//Can be used in BootHDIns() config scripts.173 I64 i;174 if (sys_data_bp)175 i=sys_data_bp->alloced_u8s;176 else177 i=sys_code_bp->alloced_u8s;178 if (i>=limit)179 return max;180 else181 return min+(max-min)*i/limit;182}183 