Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
MemPhysical.txt183 linesDownload Raw Back to Mem
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