From 7e0ce6007128ca6ff17bea89307276ffd3483e6e Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Mon, 14 Sep 2020 21:55:57 -0400 Subject: [PATCH] Reformatted Kernel files in Memory subdirectory. Reformatted BlkPool.CC, HeapCtrl.CC, MAllocFree.CC, MemPag.CC, MemPhysical.CC, PageTables.CC. --- ...o => Zenith-latest-2020-09-14-21_54_08.iso | Bin 34451456 -> 34453504 bytes src/Home/FilesReformatted.DD | 10 + src/Kernel/Memory/BlkPool.CC | 103 ++-- src/Kernel/Memory/HeapCtrl.CC | 36 +- src/Kernel/Memory/MAllocFree.CC | 474 +++++++++--------- src/Kernel/Memory/MemPag.CC | 202 ++++---- src/Kernel/Memory/MemPhysical.CC | 203 ++++---- src/Kernel/Memory/PageTables.CC | 270 +++++----- 8 files changed, 697 insertions(+), 601 deletions(-) rename Zenith-latest-2020-09-14-15_21_54.iso => Zenith-latest-2020-09-14-21_54_08.iso (99%) diff --git a/Zenith-latest-2020-09-14-15_21_54.iso b/Zenith-latest-2020-09-14-21_54_08.iso similarity index 99% rename from Zenith-latest-2020-09-14-15_21_54.iso rename to Zenith-latest-2020-09-14-21_54_08.iso index 625a6b0fdbbf33f7204177a14571ad2080fed9a5..ad4ba98c463f47a6e2318866d72911118a60d1b2 100755 GIT binary patch delta 45818 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

(2&z-zo0*$^3LWrGFLLBMSq3a~`#8{$t{i72| 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 delta 45889 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 Ay8r+H diff --git a/src/Home/FilesReformatted.DD b/src/Home/FilesReformatted.DD index 8b9c748f..fcea5153 100755 --- a/src/Home/FilesReformatted.DD +++ b/src/Home/FilesReformatted.DD @@ -136,4 +136,14 @@ StartOS.CC FileSysFAT.CC FileSysRedSea.CC MakeBlkDev.CC + + Memory/ + BlkPool.CC + HeapCtrl.CC + MAllocFree.CC + MakeMemory.CC + MemPag.CC + MemPhysical.CC + PageTables.CC + $FG,7$-Tom$FG,0$ diff --git a/src/Kernel/Memory/BlkPool.CC b/src/Kernel/Memory/BlkPool.CC index e19a8aac..a9c06ec4 100755 --- a/src/Kernel/Memory/BlkPool.CC +++ b/src/Kernel/Memory/BlkPool.CC @@ -1,73 +1,82 @@ -U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pags) +U0 BlkPoolAdd(CBlkPool *bp, CMemBlk *m, I64 pags) {//Add mem to BlkPool. if (sys_mem_init_flag) - MemSet(m,sys_mem_init_val,pags*MEM_PAG_SIZE); + MemSet(m, sys_mem_init_val, pags * MEM_PAG_SIZE); + PUSHFD CLI - while (LBts(&bp->locked_flags,BPlf_LOCKED)) + while (LBts(&bp->locked_flags, BPlf_LOCKED)) PAUSE - m->next=bp->mem_free_list; - m->pags=pags; - m->mb_signature=MBS_UNUSED_SIGNATURE_VAL; - bp->alloced_u8s+=pags<mem_free_list=m; - LBtr(&bp->locked_flags,BPlf_LOCKED); + m->next = bp->mem_free_list; + m->pags = pags; + m->mb_signature = MBS_UNUSED_SIGNATURE_VAL; + bp->alloced_u8s += pags << MEM_PAG_BITS; + bp->mem_free_list = m; + LBtr(&bp->locked_flags, BPlf_LOCKED); POPFD } -U0 BlkPoolInit(CBlkPool *bp,I64 pags) +U0 BlkPoolInit(CBlkPool *bp, I64 pags) {//Make mem chunk into a BlkPool. - I64 num; - CMemBlk *m; - MemSet(bp,0,sizeof(CBlkPool)); - m=(bp(U8 *)+sizeof(CBlkPool)+MEM_PAG_SIZE-1)&~(MEM_PAG_SIZE-1); - num=(bp(U8 *)+pags<>MEM_PAG_BITS; - bp->alloced_u8s=(pags-num)<> MEM_PAG_BITS; + bp->alloced_u8s = (pags-num) << MEM_PAG_BITS; //Compensate before num added. + BlkPoolAdd(bp, m, num); } U0 BlkPoolsInit() { - I64 i,total,lo,hi,code_heap_limit; - CMemE820 *m20=MEM_E820; - Bool first=TRUE; + I64 i, total, lo, hi, code_heap_limit; + CMemE820 *m20 = MEM_E820; + Bool first = TRUE; - total=MemBIOSTotal; + total = MemBIOSTotal; - if (total<=0x80000000) - code_heap_limit=total; - else if (total<=0x100000000) - code_heap_limit=total/4; + if (total <= 0x80000000) + code_heap_limit = total; + else if (total <= 0x100000000) + code_heap_limit = total / 4; else - code_heap_limit=0x80000000; + code_heap_limit = 0x80000000; - i=code_heap_limit-SYS_16MEG_AREA_LIMIT; //See $LK,"RLf_16MEG_SYS_CODE_BP",A="FF:::/Kernel/Memory/PageTables.CC,RLf_16MEG_SYS_CODE_BP"$ - BlkPoolAdd(sys_code_bp,SYS_16MEG_AREA_LIMIT,i>>MEM_PAG_BITS); - mem_heap_limit=i+SYS_16MEG_AREA_LIMIT-1; + i = code_heap_limit - SYS_16MEG_AREA_LIMIT; //See $LK,"RLf_16MEG_SYS_CODE_BP",A="FF:::/Kernel/Memory/PageTables.CC,RLf_16MEG_SYS_CODE_BP"$ + BlkPoolAdd(sys_code_bp, SYS_16MEG_AREA_LIMIT, i >> MEM_PAG_BITS); + mem_heap_limit = i + SYS_16MEG_AREA_LIMIT - 1; - if (code_heap_limittype) { - if (m20->type==MEM_E820t_USABLE) { - lo=m20->base; - hi=m20->base+m20->len; - if (locode_heap_limit) - lo=code_heap_limit; + if (code_heap_limittype) + { + if (m20->type == MEM_E820t_USABLE) + { + lo = m20->base; + hi = m20->base + m20->len; + if (lo code_heap_limit) + lo = code_heap_limit; else - hi=lo; //cancel + hi = lo; //cancel } - if (code_heap_limit<=lo>MEM_PAG_BITS); - sys_data_bp=lo; - Fs->data_heap=HeapCtrlInit(,Fs,sys_data_bp); - first=FALSE; - } else - BlkPoolAdd(sys_data_bp,lo,(hi-lo)>>MEM_PAG_BITS); + if (code_heap_limit <= lo < hi) + { + if (first) + { + BlkPoolInit(lo, (hi - lo) >> MEM_PAG_BITS); + sys_data_bp = lo; + Fs->data_heap = HeapCtrlInit(, Fs, sys_data_bp); + first = FALSE; + } + else + BlkPoolAdd(sys_data_bp, lo, (hi - lo) >> MEM_PAG_BITS); } } m20++; } } - LBts(&sys_run_level,RLf_FULL_HEAPS); + LBts(&sys_run_level, RLf_FULL_HEAPS); } diff --git a/src/Kernel/Memory/HeapCtrl.CC b/src/Kernel/Memory/HeapCtrl.CC index 25d0336f..bf39909d 100755 --- a/src/Kernel/Memory/HeapCtrl.CC +++ b/src/Kernel/Memory/HeapCtrl.CC @@ -1,33 +1,37 @@ -CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL,CTask *task=NULL,CBlkPool *bp) +CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL, CTask *task=NULL, CBlkPool *bp) {//See $LK,"HeapLog",A="MN:HeapLog"$() for an example. //Duplicated for $LK,"Zenith Task",A="FF:::/Kernel/KStart64.CC,CHeapCtrl.bp"$. if (!hc) - hc=ZCAlloc(sizeof(CHeapCtrl)); - hc->hc_signature=HEAP_CTRL_SIGNATURE_VAL; - hc->mem_task=task; - hc->bp=bp; + hc = ZCAlloc(sizeof(CHeapCtrl)); + hc->hc_signature = HEAP_CTRL_SIGNATURE_VAL; + hc->mem_task = task; + hc->bp = bp; QueueInit(&hc->next_mem_blk); - hc->last_mergable=NULL; - hc->next_um=hc->last_um=(&hc->next_um)(U8 *)-offset(CMemUsed.next); + hc->last_mergable = NULL; + hc->next_um = hc->last_um = (&hc->next_um)(U8 *) - offset(CMemUsed.next); return hc; } U0 HeapCtrlDel(CHeapCtrl *hc) {//Free all blks alloced to a HeapCtrl. - CMemBlk *m,*m1; - if (hc) { + CMemBlk *m, *m1; + + if (hc) + { PUSHFD CLI - while (LBts(&hc->locked_flags,HClf_LOCKED)) + while (LBts(&hc->locked_flags, HClf_LOCKED)) PAUSE - m=hc->next_mem_blk; - while (m!=&hc->next_mem_blk) { - m1=m->next; - MemPagTaskFree(m,hc); - m=m1; + m = hc->next_mem_blk; + while (m != &hc->next_mem_blk) + { + m1 = m->next; + MemPagTaskFree(m, hc); + m = m1; } - LBtr(&hc->locked_flags,HClf_LOCKED); + LBtr(&hc->locked_flags, HClf_LOCKED); POPFD + Free(hc); } } diff --git a/src/Kernel/Memory/MAllocFree.CC b/src/Kernel/Memory/MAllocFree.CC index 8a501ed7..5e4f1d6c 100755 --- a/src/Kernel/Memory/MAllocFree.CC +++ b/src/Kernel/Memory/MAllocFree.CC @@ -4,213 +4,213 @@ asm { _MALLOC:: // Throws 'OutMem' PUSH RBP - MOV RBP,RSP + MOV RBP, RSP PUSH RSI PUSH RDI - XOR RBX,RBX - MOV RDX,U64 SF_ARG2[RBP] - TEST RDX,RDX + XOR RBX, RBX + MOV RDX, U64 SF_ARG2[RBP] + TEST RDX, RDX JNZ @@05 - MOV RDX,U64 FS:CTask.addr[RBX] -@@05: CMP U32 CTask.task_signature[RDX],TASK_SIGNATURE_VAL + MOV RDX, U64 FS:CTask.addr[RBX] +@@05: CMP U32 CTask.task_signature[RDX], TASK_SIGNATURE_VAL -#assert CTask.task_signature==CHeapCtrl.hc_signature //location signature same +#assert CTask.task_signature == CHeapCtrl.hc_signature //location signature same JNE @@10 - MOV RDX,U64 CTask.data_heap[RDX] -@@10: CMP U32 CHeapCtrl.hc_signature[RDX],HEAP_CTRL_SIGNATURE_VAL + MOV RDX, U64 CTask.data_heap[RDX] +@@10: CMP U32 CHeapCtrl.hc_signature[RDX], HEAP_CTRL_SIGNATURE_VAL JE @@15 PUSH RDX CALL &SysBadMAlloc JMP I32 _SYS_HLT -@@15: MOV RAX,U64 SF_ARG1[RBP] +@@15: MOV RAX, U64 SF_ARG1[RBP] PUSHFD - ADD RAX,CMemUsed.start+7 //round-up to I64 - AND AL,0xF8 -#assert CMemUsed.start>=sizeof(CMemUnused) - CMP RAX,CMemUsed.start + ADD RAX, CMemUsed.start + 7 //round-up to I64 + AND AL, 0xF8 +#assert CMemUsed.start >= sizeof(CMemUnused) + CMP RAX, CMemUsed.start JAE @@20 - MOV RAX,CMemUsed.start + MOV RAX, CMemUsed.start @@20: CLI -@@25: LOCK - BTS U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED +@@25: LOCK + BTS U32 CHeapCtrl.locked_flags[RDX], HClf_LOCKED PAUSE //don't know if this inst helps JC @@25 - CMP RAX,MEM_HEAP_HASH_SIZE + CMP RAX, MEM_HEAP_HASH_SIZE JAE @@30 - MOV RSI,U64 CHeapCtrl.heap_hash[RAX+RDX] - TEST RSI,RSI + MOV RSI, U64 CHeapCtrl.heap_hash[RAX + RDX] + TEST RSI, RSI JZ @@35 - MOV RCX,U64 CMemUnused.next[RSI] - MOV U64 CHeapCtrl.heap_hash[RAX+RDX],RCX + MOV RCX, U64 CMemUnused.next[RSI] + MOV U64 CHeapCtrl.heap_hash[RAX + RDX], RCX JMP I32 MALLOC_ALMOST_DONE //Big allocation -@@30: ADD RAX,sizeof(CMemBlk)+MEM_PAG_SIZE-1 - SHR RAX,MEM_PAG_BITS +@@30: ADD RAX, sizeof(CMemBlk) + MEM_PAG_SIZE - 1 + SHR RAX, MEM_PAG_BITS PUSH RDX //preserve HeapCtrl PUSH RDX PUSH RAX CALL &MemPagTaskAlloc POP RDX - TEST RAX,RAX + TEST RAX, RAX JZ @@45 //Out of memory - MOV RSI,RAX - MOV EAX,U32 CMemBlk.pags[RSI] + MOV RSI, RAX + MOV EAX, U32 CMemBlk.pags[RSI] - SHL RAX,MEM_PAG_BITS - SUB RAX,sizeof(CMemBlk) - ADD RSI,sizeof(CMemBlk) + SHL RAX, MEM_PAG_BITS + SUB RAX, sizeof(CMemBlk) + ADD RSI, sizeof(CMemBlk) JMP I32 MALLOC_ALMOST_DONE //Little allocation, chunk-off piece from free list chunks -@@35: LEA RSI,U64 CHeapCtrl.malloc_free_list-CMemUnused.next[RDX] +@@35: LEA RSI, U64 CHeapCtrl.malloc_free_list - CMemUnused.next[RDX] -@@40: MOV RBX,RSI - MOV RSI,U64 CMemUnused.next[RBX] - TEST RSI,RSI +@@40: MOV RBX, RSI + MOV RSI, U64 CMemUnused.next[RBX] + TEST RSI, RSI JNZ I32 @@60 PUSH RAX //-**** save byte size - ADD RAX,16*MEM_PAG_SIZE-1 - SHR RAX,MEM_PAG_BITS + ADD RAX, 16 * MEM_PAG_SIZE - 1 + SHR RAX, MEM_PAG_BITS PUSH RDX //preserve HeapCtrl PUSH RDX PUSH RAX CALL &MemPagTaskAlloc POP RDX - TEST RAX,RAX + TEST RAX, RAX JNZ @@50 //Out of memory -@@45: LOCK - BTR U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED +@@45: LOCK + BTR U32 CHeapCtrl.locked_flags[RDX], HClf_LOCKED POPFD PUSH TRUE - MOV RAX,'OutMem' + MOV RAX, 'OutMem' PUSH RAX CALL I32 &throw JMP I32 MALLOC_FINAL_EXIT //Never gets here, hopefully. -@@50: MOV RSI,RAX - MOV EAX,U32 CMemBlk.pags[RSI] - SHL RAX,MEM_PAG_BITS +@@50: MOV RSI, RAX + MOV EAX, U32 CMemBlk.pags[RSI] + SHL RAX, MEM_PAG_BITS //Can it be combined with last chunk? (Never Free these chunks.) - MOV RDI,U64 CHeapCtrl.last_mergable[RDX] - LEA RBX,U64 [RSI+RAX] - CMP RDI,RBX + MOV RDI, U64 CHeapCtrl.last_mergable[RDX] + LEA RBX, U64 [RSI + RAX] + CMP RDI, RBX JNE @@55 PUSH RAX - MOV EAX,U32 CMemBlk.pags[RDI] + MOV EAX, U32 CMemBlk.pags[RDI] ADD U32 CMemBlk.pags[RSI],EAX //QueueRemove - MOV RAX,U64 CMemBlk.next[RDI] - MOV RBX,U64 CMemBlk.last[RDI] - MOV U64 CMemBlk.last[RAX],RBX - MOV U64 CMemBlk.next[RBX],RAX + MOV RAX, U64 CMemBlk.next[RDI] + MOV RBX, U64 CMemBlk.last[RDI] + MOV U64 CMemBlk.last[RAX], RBX + MOV U64 CMemBlk.next[RBX], RAX POP RAX -@@55: MOV U64 CHeapCtrl.last_mergable[RDX],RSI - LEA RSI,U64 sizeof(CMemBlk)[RSI] - SUB RAX,sizeof(CMemBlk) - LEA RBX,U64 CHeapCtrl.malloc_free_list-CMemUnused.next[RDX] - MOV RDI,U64 CMemUnused.next[RBX] - MOV U64 CMemUnused.next[RSI],RDI - MOV U64 CMemUnused.size[RSI],RAX - MOV U64 CMemUnused.next[RBX],RSI - POP RAX //+**** +@@55: MOV U64 CHeapCtrl.last_mergable[RDX], RSI + LEA RSI, U64 sizeof(CMemBlk)[RSI] + SUB RAX, sizeof(CMemBlk) + LEA RBX, U64 CHeapCtrl.malloc_free_list - CMemUnused.next[RDX] + MOV RDI, U64 CMemUnused.next[RBX] + MOV U64 CMemUnused.next[RSI], RDI + MOV U64 CMemUnused.size[RSI], RAX + MOV U64 CMemUnused.next[RBX], RSI + POP RAX //+**** JMP @@70 -@@60: CMP U64 CMemUnused.size[RSI],RAX +@@60: CMP U64 CMemUnused.size[RSI], RAX JB I32 @@40 JNE @@70 -@@65: MOV RDI,U64 CMemUnused.next[RSI] - MOV U64 CMemUnused.next[RBX],RDI +@@65: MOV RDI, U64 CMemUnused.next[RSI] + MOV U64 CMemUnused.next[RBX], RDI JMP MALLOC_ALMOST_DONE -@@70: SUB U64 CMemUnused.size[RSI],RAX //UPDATE FREE ENTRY - CMP U64 CMemUnused.size[RSI],sizeof(CMemUnused) +@@70: SUB U64 CMemUnused.size[RSI], RAX //UPDATE FREE ENTRY + CMP U64 CMemUnused.size[RSI], sizeof(CMemUnused) JAE @@75 //take from top of block - ADD U64 CMemUnused.size[RSI],RAX //doesn't fit, undo + ADD U64 CMemUnused.size[RSI], RAX //doesn't fit, undo JMP I32 @@40 -@@75: ADD RSI,U64 CMemUnused.size[RSI] +@@75: ADD RSI, U64 CMemUnused.size[RSI] MALLOC_ALMOST_DONE: -//RSI=res-CMemUsed.size -//RAX=size+CMemUsed.size -//RDX=HeapCtrl - ADD U64 CHeapCtrl.used_u8s[RDX],RAX +//RSI = res - CMemUsed.size +//RAX = size + CMemUsed.size +//RDX = HeapCtrl + ADD U64 CHeapCtrl.used_u8s[RDX], RAX #if _CONFIG_HEAP_DEBUG //QueueInsert - MOV RDI,U64 CHeapCtrl.last_um[RDX] - MOV U64 CMemUsed.next[RDI],RSI - MOV U64 CHeapCtrl.last_um[RDX],RSI - MOV U64 CMemUsed.last[RSI],RDI - LEA RDI,U64 CHeapCtrl.next_um-CMemUsed.next[RDX] - MOV U64 CMemUsed.next[RSI],RDI + MOV RDI, U64 CHeapCtrl.last_um[RDX] + MOV U64 CMemUsed.next[RDI], RSI + MOV U64 CHeapCtrl.last_um[RDX], RSI + MOV U64 CMemUsed.last[RSI], RDI + LEA RDI, U64 CHeapCtrl.next_um - CMemUsed.next[RDX] + MOV U64 CMemUsed.next[RSI], RDI //Caller1/Caller2 PUSH RDX - MOV RDX,U64 [MEM_HEAP_LIMIT] - MOV RDI,U64 SF_RIP[RBP] - CMP RDI,RDX + MOV RDX, U64 [MEM_HEAP_LIMIT] + MOV RDI, U64 SF_RIP[RBP] + CMP RDI, RDX JB @@80 - XOR RDI,RDI - MOV U64 CMemUsed.caller1[RSI],RDI + XOR RDI, RDI + MOV U64 CMemUsed.caller1[RSI], RDI JMP @@90 -@@80: MOV U64 CMemUsed.caller1[RSI],RDI - MOV RDI,U64 SF_RBP[RBP] - CMP RDI,RDX +@@80: MOV U64 CMemUsed.caller1[RSI], RDI + MOV RDI, U64 SF_RBP[RBP] + CMP RDI, RDX JB @@85 - XOR RDI,RDI + XOR RDI, RDI JMP @@90 -@@85: MOV RDI,U64 SF_RIP[RDI] - CMP RDI,RDX +@@85: MOV RDI, U64 SF_RIP[RDI] + CMP RDI, RDX JB @@90 - XOR RDI,RDI -@@90: MOV U64 CMemUsed.caller2[RSI],RDI + XOR RDI, RDI +@@90: MOV U64 CMemUsed.caller2[RSI], RDI POP RDX #endif LOCK - BTR U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED + BTR U32 CHeapCtrl.locked_flags[RDX], HClf_LOCKED POPFD - MOV U64 CMemUsed.size[RSI],RAX - MOV U64 CMemUsed.hc[RSI],RDX - LEA RAX,U64 CMemUsed.start[RSI] + MOV U64 CMemUsed.size[RSI], RAX + MOV U64 CMemUsed.hc[RSI], RDX + LEA RAX, U64 CMemUsed.start[RSI] - TEST U8 [SYS_SEMAS+SEMA_HEAPLOG_ACTIVE*DEFAULT_CACHE_LINE_WIDTH],1 + TEST U8 [SYS_SEMAS + SEMA_HEAPLOG_ACTIVE * DEFAULT_CACHE_LINE_WIDTH], 1 JZ @@105 PUSH RAX PUSH RAX - MOV RAX,U64 [SYS_EXTERN_TABLE] - MOV RAX,U64 EXT_HEAPLOG_MALLOC*8[RAX] - TEST RAX,RAX + MOV RAX, U64 [SYS_EXTERN_TABLE] + MOV RAX, U64 EXT_HEAPLOG_MALLOC*8[RAX] + TEST RAX, RAX JZ @@95 CALL RAX JMP @@100 -@@95: ADD RSP,8 -@@100: POP RAX +@@95: ADD RSP, 8 +@@100: POP RAX -@@105: TEST U8 [SYS_HEAP_INIT_FLAG],1 +@@105: TEST U8 [SYS_HEAP_INIT_FLAG], 1 JZ MALLOC_FINAL_EXIT PUSH RAX - MOV RCX,U64 CMemUsed.size-CMemUsed.start[RAX] - SUB RCX,CMemUsed.start - MOV RDI,RAX - MOV AL,U8 [SYS_HEAP_INIT_VAL] + MOV RCX, U64 CMemUsed.size - CMemUsed.start[RAX] + SUB RCX, CMemUsed.start + MOV RDI, RAX + MOV AL, U8 [SYS_HEAP_INIT_VAL] REP_STOSB POP RAX @@ -219,34 +219,35 @@ MALLOC_FINAL_EXIT: POP RSI POP RBP RET1 16 + //************************************ _FREE:: //Be aware of $LK,"heap_hash",A="FF:::/Kernel/Memory/MAllocFree.CC,heap_hash"$ in $LK,"MemPagTaskAlloc",A="MN:MemPagTaskAlloc"$(). PUSH RBP - MOV RBP,RSP + MOV RBP, RSP PUSH RSI PUSH RDI - TEST U8 [SYS_SEMAS+SEMA_HEAPLOG_ACTIVE*DEFAULT_CACHE_LINE_WIDTH],1 + TEST U8 [SYS_SEMAS + SEMA_HEAPLOG_ACTIVE * DEFAULT_CACHE_LINE_WIDTH], 1 JZ @@15 - MOV RBX,U64 SF_ARG1[RBP] - TEST RBX,RBX + MOV RBX, U64 SF_ARG1[RBP] + TEST RBX, RBX JZ @@05 - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] - TEST RAX,RAX + MOV RAX, U64 CMemUsed.size - CMemUsed.start[RBX] + TEST RAX, RAX JGE @@05 //Aligned alloced chunks have neg size - ADD RBX,RAX -@@05: PUSH RBX - MOV RAX,U64 [SYS_EXTERN_TABLE] - MOV RAX,U64 EXT_HEAPLOG_FREE*8[RAX] - TEST RAX,RAX + ADD RBX, RAX +@@05: PUSH RBX + MOV RAX, U64 [SYS_EXTERN_TABLE] + MOV RAX, U64 EXT_HEAPLOG_FREE*8[RAX] + TEST RAX, RAX JZ @@10 CALL RAX JMP @@15 -@@10: ADD RSP,8 +@@10: ADD RSP, 8 -@@15: MOV RSI,U64 SF_ARG1[RBP] - TEST RSI,RSI +@@15: MOV RSI, U64 SF_ARG1[RBP] + TEST RSI, RSI #if _CONFIG_HEAP_DEBUG JZ I32 FREE_DONE @@ -254,192 +255,202 @@ _FREE:: JZ FREE_DONE #endif - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RSI] - TEST RAX,RAX + MOV RAX, U64 CMemUsed.size - CMemUsed.start[RSI] + TEST RAX, RAX JGE @@20 //Aligned alloced chunks have neg size. - //The neg size is offset to start of $LK,"CMemUsed",A="MN:CMemUsed"$ struct. - ADD RSI,RAX + //The neg size is offset to start of $LK,"CMemUsed",A="MN:CMemUsed"$ struct. + ADD RSI, RAX -@@20: PUSHFD - SUB RSI,CMemUsed.start - MOV RDX,U64 CMemUsed.hc[RSI] - CMP U32 CHeapCtrl.hc_signature[RDX],HEAP_CTRL_SIGNATURE_VAL +@@20: PUSHFD + SUB RSI, CMemUsed.start + MOV RDX, U64 CMemUsed.hc[RSI] + CMP U32 CHeapCtrl.hc_signature[RDX], HEAP_CTRL_SIGNATURE_VAL JE @@25 - ADD RSI,CMemUsed.start + ADD RSI, CMemUsed.start PUSH RSI CALL &SysBadFree JMP I32 _SYS_HLT -@@25: MOV RAX,U64 CMemUsed.size[RSI] - SUB U64 CHeapCtrl.used_u8s[RDX],RAX +@@25: MOV RAX, U64 CMemUsed.size[RSI] + SUB U64 CHeapCtrl.used_u8s[RDX], RAX CLI -@@30: LOCK - BTS U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED +@@30: LOCK + BTS U32 CHeapCtrl.locked_flags[RDX], HClf_LOCKED PAUSE JC @@30 #if _CONFIG_HEAP_DEBUG //QueueRemove - MOV RDX,U64 CMemUsed.next[RSI] - MOV RDI,U64 CMemUsed.last[RSI] - MOV U64 CMemUsed.last[RDX],RDI - MOV U64 CMemUsed.next[RDI],RDX + MOV RDX, U64 CMemUsed.next[RSI] + MOV RDI, U64 CMemUsed.last[RSI] + MOV U64 CMemUsed.last[RDX], RDI + MOV U64 CMemUsed.next[RDI], RDX //Caller1/Caller2 - MOV RDX,U64 [MEM_HEAP_LIMIT] - MOV RDI,U64 SF_RIP[RBP] - CMP RDI,RDX + MOV RDX, U64 [MEM_HEAP_LIMIT] + MOV RDI, U64 SF_RIP[RBP] + CMP RDI, RDX JB @@35 - XOR RDI,RDI - MOV U64 CMemUnused.caller1[RSI],RDI + XOR RDI, RDI + MOV U64 CMemUnused.caller1[RSI], RDI JMP @@45 -@@35: MOV U64 CMemUnused.caller1[RSI],RDI - MOV RDI,U64 SF_RBP[RBP] - CMP RDI,RDX +@@35: MOV U64 CMemUnused.caller1[RSI], RDI + MOV RDI, U64 SF_RBP[RBP] + CMP RDI, RDX JB @@40 - XOR RDI,RDI + XOR RDI, RDI JMP @@45 -@@40: MOV RDI,U64 SF_RIP[RDI] - CMP RDI,RDX +@@40: MOV RDI, U64 SF_RIP[RDI] + CMP RDI, RDX JB @@45 - XOR RDI,RDI -@@45: MOV U64 CMemUnused.caller2[RSI],RDI + XOR RDI, RDI +@@45: MOV U64 CMemUnused.caller2[RSI], RDI - MOV RDX,U64 CMemUsed.hc[RSI] + MOV RDX, U64 CMemUsed.hc[RSI] #endif - CMP RAX,MEM_HEAP_HASH_SIZE + CMP RAX, MEM_HEAP_HASH_SIZE JAE @@50 -#assert CMemUnused.size==CMemUsed.size -// MOV U64 CMemUnused.size[RSI],RAX +#assert CMemUnused.size == CMemUsed.size +// MOV U64 CMemUnused.size[RSI], RAX - MOV RBX,U64 CHeapCtrl.heap_hash[RAX+RDX] - MOV U64 CMemUnused.next[RSI],RBX - MOV U64 CHeapCtrl.heap_hash[RAX+RDX],RSI + MOV RBX, U64 CHeapCtrl.heap_hash[RAX + RDX] + MOV U64 CMemUnused.next[RSI], RBX + MOV U64 CHeapCtrl.heap_hash[RAX + RDX], RSI JMP @@55 -@@50: SUB RSI,sizeof(CMemBlk) +@@50: SUB RSI, sizeof(CMemBlk) PUSH RDX PUSH RDX PUSH RSI CALL &MemPagTaskFree POP RDX -@@55: LOCK - BTR U32 CHeapCtrl.locked_flags[RDX],HClf_LOCKED +@@55: LOCK + BTR U32 CHeapCtrl.locked_flags[RDX], HClf_LOCKED POPFD FREE_DONE: POP RDI POP RSI POP RBP RET1 8 + //************************************ _MSIZE:: PUSH RBP - MOV RBP,RSP - MOV RBX,U64 SF_ARG1[RBP] - XOR RAX,RAX - TEST RBX,RBX + MOV RBP, RSP + MOV RBX, U64 SF_ARG1[RBP] + XOR RAX, RAX + TEST RBX, RBX JZ @@10 - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] - TEST RAX,RAX + MOV RAX, U64 CMemUsed.size - CMemUsed.start[RBX] + TEST RAX, RAX JGE @@05 //Aligned alloced chunks have neg size - ADD RBX,RAX - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] -@@05: SUB RAX,CMemUsed.start -@@10: POP RBP + ADD RBX, RAX + MOV RAX, U64 CMemUsed.size - CMemUsed.start[RBX] +@@05: SUB RAX, CMemUsed.start +@@10: POP RBP RET1 8 + //************************************ _MSIZE2:: PUSH RBP - MOV RBP,RSP - MOV RBX,U64 SF_ARG1[RBP] - XOR RAX,RAX - TEST RBX,RBX + MOV RBP, RSP + MOV RBX, U64 SF_ARG1[RBP] + XOR RAX, RAX + TEST RBX, RBX JZ @@10 - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] - TEST RAX,RAX + MOV RAX, U64 CMemUsed.size-CMemUsed.start[RBX] + TEST RAX, RAX JGE @@05 //Aligned alloced chunks have neg size - ADD RBX,RAX -@@05: MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] -@@10: POP RBP + ADD RBX, RAX +@@05: MOV RAX, U64 CMemUsed.size - CMemUsed.start[RBX] +@@10: POP RBP RET1 8 + //************************************ _MHEAP_CTRL:: PUSH RBP - MOV RBP,RSP - MOV RBX,U64 SF_ARG1[RBP] - XOR RAX,RAX - TEST RBX,RBX + MOV RBP, RSP + MOV RBX, U64 SF_ARG1[RBP] + XOR RAX, RAX + TEST RBX, RBX JZ @@10 - MOV RAX,U64 CMemUsed.size-CMemUsed.start[RBX] - TEST RAX,RAX + MOV RAX, U64 CMemUsed.size-CMemUsed.start[RBX] + TEST RAX, RAX JGE @@05 //Aligned alloced chunks have neg size - ADD RBX,RAX -@@05: MOV RAX,U64 CMemUsed.hc-CMemUsed.start[RBX] -@@10: POP RBP + ADD RBX, RAX +@@05: MOV RAX, U64 CMemUsed.hc - CMemUsed.start[RBX] +@@10: POP RBP RET1 8 } -_extern _FREE U0 Free(U8 *addr); //Free $LK,"MAlloc",A="MN:MAlloc"$()ed memory chunk. -_extern _MSIZE I64 MSize(U8 *src); //Size of heap object. -_extern _MSIZE2 I64 MSize2(U8 *src); //Internal size of heap object. -_extern _MHEAP_CTRL CHeapCtrl *MHeapCtrl(U8 *src); //$LK,"CHeapCtrl",A="MN:CHeapCtrl"$ of object. -_extern _MALLOC U8 *MAlloc(I64 size,CTask *mem_task=NULL); //Alloc memory chunk. +_extern _FREE U0 Free(U8 *addr); //Free $LK,"MAlloc",A="MN:MAlloc"$()ed memory chunk. +_extern _MSIZE I64 MSize( U8 *src); //Size of heap object. +_extern _MSIZE2 I64 MSize2( U8 *src); //Internal size of heap object. +_extern _MHEAP_CTRL CHeapCtrl *MHeapCtrl(U8 *src); //$LK,"CHeapCtrl",A="MN:CHeapCtrl"$ of object. +_extern _MALLOC U8 *MAlloc(I64 size, CTask *mem_task=NULL); //Alloc memory chunk. //Accepts a $LK,"CTask",A="MN:CTask"$ or $LK,"CHeapCtrl",A="MN:CHeapCtrl"$. NULL allocs off current task's heap. U8 *ZMAlloc(I64 size) {//Alloc memory in Zenith's heap. - return MAlloc(size,zenith_task); + return MAlloc(size, zenith_task); } -U8 *CAlloc(I64 size,CTask *mem_task=NULL) +U8 *CAlloc(I64 size, CTask *mem_task=NULL) {//Accepts a $LK,"CTask",A="MN:CTask"$ or $LK,"CHeapCtrl",A="MN:CHeapCtrl"$. NULL allocs off current task's heap. - U8 *res=MAlloc(size,mem_task); - MemSet(res,0,size); + U8 *res = MAlloc(size, mem_task); + + MemSet(res, 0, size); + return res; } U8 *ZCAlloc(I64 size) {//Alloc and set to zero memory in Zenith's heap. - return CAlloc(size,zenith_task); + return CAlloc(size, zenith_task); } -U8 *MAllocIdent(U8 *src,CTask *mem_task=NULL) +U8 *MAllocIdent(U8 *src, CTask *mem_task=NULL) {//Accepts a $LK,"CTask",A="MN:CTask"$ or $LK,"CHeapCtrl",A="MN:CHeapCtrl"$. NULL allocs off current task's heap. U8 *res; I64 size; - if (!src) return NULL; - size=MSize(src); - res=MAlloc(size,mem_task); - MemCopy(res,src,size); + + if (!src) + return NULL; + size = MSize(src); + res = MAlloc(size, mem_task); + MemCopy(res, src, size); + return res; } U8 *ZMAllocIdent(U8 *src) {//Alloc in Zenith's heap, ident copy of heap node. - return MAllocIdent(src,zenith_task); + return MAllocIdent(src, zenith_task); } -U8 *MAllocAligned(I64 size,I64 alignment, - CTask *mem_task=NULL,I64 misalignment=0) +U8 *MAllocAligned(I64 size, I64 alignment, CTask *mem_task=NULL, I64 misalignment=0) {//Only powers of two alignment. This is awful. - I64 mask=alignment-1; - U8 *ptr=MAlloc(size+mask+sizeof(I64)+misalignment,mem_task), - *res=(ptr+sizeof(I64)+mask)&~mask+misalignment; - res(I64 *)[-1]=ptr-res; -#assert offset(CMemUsed.size)==offset(CMemUsed.start)-sizeof(I64) + I64 mask = alignment - 1; + U8 *ptr = MAlloc(size + mask + sizeof(I64) + misalignment, mem_task), + *res = (ptr + sizeof(I64) + mask) & ~mask + misalignment; + + res(I64 *)[-1] = ptr - res; +#assert offset(CMemUsed.size) == offset(CMemUsed.start) - sizeof(I64) + return res; } -U8 *CAllocAligned(I64 size,I64 alignment, - CTask *mem_task=NULL,I64 misalignment=0) +U8 *CAllocAligned(I64 size, I64 alignment, CTask *mem_task=NULL, I64 misalignment=0) {//Only powers of two alignment. This is awful. - I64 mask=alignment-1; - U8 *ptr=MAlloc(size+mask+sizeof(I64)+misalignment,mem_task), - *res=(ptr+sizeof(I64)+mask)&~mask+misalignment; - res(I64 *)[-1]=ptr-res; -#assert offset(CMemUsed.size)==offset(CMemUsed.start)-sizeof(I64) - MemSet(res,0,size); + I64 mask = alignment-1; + U8 *ptr = MAlloc(size + mask + sizeof(I64) + misalignment, mem_task), + *res = (ptr + sizeof(I64) + mask) & ~mask + misalignment; + + res(I64 *)[-1] = ptr - res; +#assert offset(CMemUsed.size) == offset(CMemUsed.start) - sizeof(I64) + MemSet(res, 0, size); + return res; } @@ -449,18 +460,19 @@ U8 *ReAlloc(U8 *ptr, U64 new_size, CTask *mem_task=NULL) //Useless for changing chunk sizes smaller than 8 bytes because MAlloc allocs 8 bytes at a time. U8 *res; - if(!new_size) + if (!new_size) { Free(ptr); //we can free NULL return NULL; } res = MAlloc(new_size, mem_task); - if(!ptr) + if (!ptr) return res; MemCopy(res, ptr, MinI64(MSize(ptr), new_size)); Free(ptr); + return res; } @@ -469,22 +481,26 @@ U8 *ZReAlloc(U8 *ptr, I64 new_size) return ReAlloc(ptr, new_size, zenith_task); } -U8 *StrNew(U8 *buf,CTask *mem_task=NULL) +U8 *StrNew(U8 *buf, CTask *mem_task=NULL) {//Accepts a $LK,"CTask",A="MN:CTask"$ or $LK,"CHeapCtrl",A="MN:CHeapCtrl"$. NULL allocs off current task's heap. U8 *res; I64 size; - if (buf) { - size=StrLen(buf)+1; - res=MAlloc(size,mem_task); - MemCopy(res,buf,size); - } else { - res=MAlloc(1,mem_task); - *res=0; + + if (buf) + { + size = StrLen(buf) + 1; + res = MAlloc(size, mem_task); + MemCopy(res, buf, size); + } + else + { + res = MAlloc(1, mem_task); + *res = 0; } return res; } U8 *ZStrNew(U8 *buf) {//Alloc copy of string in Zenith's heap. - return StrNew(buf,zenith_task); + return StrNew(buf, zenith_task); } diff --git a/src/Kernel/Memory/MemPag.CC b/src/Kernel/Memory/MemPag.CC index 4c58dea6..d0f9147e 100755 --- a/src/Kernel/Memory/MemPag.CC +++ b/src/Kernel/Memory/MemPag.CC @@ -1,166 +1,200 @@ U0 SysBadFree(I64 *ptr) { - Panic("Bad Free:",ptr); + Panic("Bad Free:", ptr); } U0 SysBadMAlloc(I64 *ptr) { - Panic("Bad MAlloc:",ptr); + Panic("Bad MAlloc:", ptr); } -U8 *MemPagAlloc(I64 pags,CBlkPool *bp=NULL) +U8 *MemPagAlloc(I64 pags, CBlkPool *bp=NULL) {/*Alloc pags from BlkPool. Don't link to task. (Linking to a task means they will be freed when the task dies.) It might give you more than you asked for. Return: NULL if out of memory. */ - CMemBlk *res=NULL,*m; - I64 i; - if (!bp) bp=sys_code_bp; + CMemBlk *res = NULL, *m; + I64 i; + + if (!bp) + bp = sys_code_bp; + PUSHFD CLI - while (LBts(&bp->locked_flags,BPlf_LOCKED)) + while (LBts(&bp->locked_flags, BPlf_LOCKED)) PAUSE - if (pagsfree_pag_hash[pags]) { - bp->free_pag_hash[pags]=res->next; + if (pags < MEM_FREE_PAG_HASH_SIZE) + { + if (res = bp->free_pag_hash[pags]) + { + bp->free_pag_hash[pags] = res->next; goto at_done; } - i=Bsr(MEM_FREE_PAG_HASH_SIZE)+1; + i = Bsr(MEM_FREE_PAG_HASH_SIZE) + 1; } else { //We'll now round-up to a power of two. //There is some overhead on allocations and //we wouldn't want to round to the next //power of two if a power of two was requested. //So we use a little more than a power of two. - pags-=MEM_EXTRA_HASH2_PAGS; - i=Bsr(pags)+1; - pags=1<free_pag_hash2[i]) { - bp->free_pag_hash2[i]=res->next; + pags -= MEM_EXTRA_HASH2_PAGS; + i = Bsr(pags) + 1; + pags = 1 << i + MEM_EXTRA_HASH2_PAGS; + if (res = bp->free_pag_hash2[i]) + { + bp->free_pag_hash2[i] = res->next; goto at_done; } } - m=&bp->mem_free_list; - while (TRUE) { - if (!(res=m->next)) { + m = &bp->mem_free_list; + while (TRUE) + { + if (!(res = m->next)) + { //We're probably out of luck, but lets search for a //freed larger size block... and, screw-it, return the whole thing. - do { - if (res=bp->free_pag_hash2[++i]) { - pags=1<free_pag_hash2[i]=res->next; + do + { + if (res = bp->free_pag_hash2[++i]) + { + pags = 1 << i + MEM_EXTRA_HASH2_PAGS; + bp->free_pag_hash2[i] = res->next; goto at_done; } - } while (i<64-MEM_PAG_BITS-1); - pags=0; - res=NULL; //Out of memory + } + while (i < 64 - MEM_PAG_BITS - 1); + + pags = 0; + res = NULL; //Out of memory goto at_done2; } - if (res->pagspags==pags) { - m->next=res->next; + if (res->pags < pags) + m = res; + else + { + if (res->pags == pags) + { + m->next = res->next; goto at_done; - } else { - res->pags-=pags; - res(U8 *)+=res->pags<pags=pags; + } + else + { + res->pags -= pags; + res(U8 *) += res->pags << MEM_PAG_BITS; + res->pags = pags; goto at_done; } } } at_done: - bp->used_u8s+=res->pags<used_u8s += res->pags << MEM_PAG_BITS; at_done2: - LBtr(&bp->locked_flags,BPlf_LOCKED); + LBtr(&bp->locked_flags, BPlf_LOCKED); POPFD + return res; } -U0 MemPagFree(CMemBlk *m,CBlkPool *bp=NULL) +U0 MemPagFree(CMemBlk *m, CBlkPool *bp=NULL) {//Return non-task pags to BlkPool. - I64 i,pags; - if (m) { - if (!bp) bp=sys_code_bp; + I64 i, pags; + + if (m) + { + if (!bp) + bp = sys_code_bp; + PUSHFD CLI - while (LBts(&bp->locked_flags,BPlf_LOCKED)) + while (LBts(&bp->locked_flags, BPlf_LOCKED)) PAUSE - pags=m->pags; - m->mb_signature=MBS_UNUSED_SIGNATURE_VAL; - bp->used_u8s-=pags<next=bp->free_pag_hash[pags]; - bp->free_pag_hash[pags]=m; - } else { + pags = m->pags; + m->mb_signature = MBS_UNUSED_SIGNATURE_VAL; + bp->used_u8s -= pags << MEM_PAG_BITS; + if (pags < MEM_FREE_PAG_HASH_SIZE) + { + m->next = bp->free_pag_hash[pags]; + bp->free_pag_hash[pags] = m; + } + else + { //We'll now round-up to a power of two. //There is some overhead on allocations and //we wouldn't want to round to the next //power of two if a power of two was requested. //So we use a little more than a power of two. - pags-=MEM_EXTRA_HASH2_PAGS; - i=Bsr(pags); - m->next=bp->free_pag_hash2[i]; - bp->free_pag_hash2[i]=m; + pags -= MEM_EXTRA_HASH2_PAGS; + i = Bsr(pags); + m->next = bp->free_pag_hash2[i]; + bp->free_pag_hash2[i] = m; } - LBtr(&bp->locked_flags,BPlf_LOCKED); + LBtr(&bp->locked_flags, BPlf_LOCKED); POPFD } } -CMemBlk *MemPagTaskAlloc(I64 pags,CHeapCtrl *hc) +CMemBlk *MemPagTaskAlloc(I64 pags, CHeapCtrl *hc) {/*hc must be locked. Don't preempt this routine. Currently, this is only called from $LK,"MAlloc",A="MN:MAlloc"$(). Return: NULL if out of memory. */ - CMemBlk *res; - I64 threshold,count,size; - CMemUnused *uum,**_uum,**_ptr; - if (res=MemPagAlloc(pags,hc->bp)) { - QueueInsert(res,hc->last_mem_blk); - res->mb_signature=MBS_USED_SIGNATURE_VAL; - hc->alloced_u8s+=res->pags<bp)) + { + QueueInsert(res, hc->last_mem_blk); + res->mb_signature = MBS_USED_SIGNATURE_VAL; + hc->alloced_u8s += res->pags << MEM_PAG_BITS; //Tidy-up free list (Move into heap hash) //because if free list gets long, delay causes crash. - threshold=MEM_HEAP_HASH_SIZE>>4; -#assert MEM_HEAP_HASH_SIZE>>4>=sizeof(U8 *) - do { - count=0; - _uum=&hc->malloc_free_list; - while (uum=*_uum) { + threshold = MEM_HEAP_HASH_SIZE >> 4; +#assert MEM_HEAP_HASH_SIZE >> 4 >= sizeof(U8 *) + do + { + count = 0; + _uum = &hc->malloc_free_list; + while (uum = *_uum) + { #assert !offset(CMemUnused.next) - size=uum->size; - if (sizenext; - _ptr=(&hc->heap_hash)(U8 *)+size; - uum->next=*_ptr; - *_ptr=uum; - } else { + size = uum->size; + if (size < threshold) + { + *_uum = uum->next; + _ptr = (&hc->heap_hash)(U8 *) + size; + uum->next = *_ptr; + *_ptr = uum; + } + else + { count++; - _uum=uum; + _uum = uum; } } - threshold<<=1; - } while (count>8 && threshold<=MEM_HEAP_HASH_SIZE); + threshold <<= 1; + } + while (count > 8 && threshold <= MEM_HEAP_HASH_SIZE); } return res; } -U0 MemPagTaskFree(CMemBlk *m,CHeapCtrl *hc) +U0 MemPagTaskFree(CMemBlk *m, CHeapCtrl *hc) {//hc must be locked - if (m) { + if (m) + { PUSHFD CLI - if (m->mb_signature!=MBS_USED_SIGNATURE_VAL) + if (m->mb_signature != MBS_USED_SIGNATURE_VAL) SysBadFree(m); - else { + else + { QueueRemove(m); - hc->alloced_u8s-=m->pags<bp); + hc->alloced_u8s -= m->pags << MEM_PAG_BITS; + MemPagFree(m, hc->bp); } POPFD } diff --git a/src/Kernel/Memory/MemPhysical.CC b/src/Kernel/Memory/MemPhysical.CC index 6eaae6db..e67b9c14 100755 --- a/src/Kernel/Memory/MemPhysical.CC +++ b/src/Kernel/Memory/MemPhysical.CC @@ -1,53 +1,59 @@ Bool Mem32DevIns(CMemRange *tmpmr) { - CMemRange *tmpmr1=dev.mem32_head.next,*tmpmr2; - while (tmpmr1!=&dev.mem32_head) { - if (!tmpmr1->type && tmpmr->base>=tmpmr1->base && - tmpmr->base+tmpmr->size<=tmpmr1->base+tmpmr1->size) { - if (tmpmr->base>tmpmr1->base) { - tmpmr2=ZMAlloc(sizeof(CMemRange)); - tmpmr2->type=MRT_UNUSED; - tmpmr2->flags=0; - tmpmr2->base=tmpmr1->base; - tmpmr2->size=tmpmr->base-tmpmr1->base; - QueueInsertRev(tmpmr2,tmpmr1); + CMemRange *tmpmr1 = dev.mem32_head.next, *tmpmr2; + + while (tmpmr1 != &dev.mem32_head) + { + if (!tmpmr1->type && tmpmr->base >= tmpmr1->base && tmpmr->base + tmpmr->size <= tmpmr1->base + tmpmr1->size) + { + if (tmpmr->base > tmpmr1->base) + { + tmpmr2 = ZMAlloc(sizeof(CMemRange)); + tmpmr2->type = MRT_UNUSED; + tmpmr2->flags = 0; + tmpmr2->base = tmpmr1->base; + tmpmr2->size = tmpmr->base - tmpmr1->base; + QueueInsertRev(tmpmr2, tmpmr1); } - QueueInsertRev(tmpmr,tmpmr1); - tmpmr1->size=tmpmr1->base+tmpmr1->size- - (tmpmr->base+tmpmr->size); - tmpmr1->base=tmpmr->base+tmpmr->size; - if (!tmpmr1->size) { + QueueInsertRev(tmpmr, tmpmr1); + tmpmr1->size = tmpmr1->base + tmpmr1->size - (tmpmr->base + tmpmr->size); + tmpmr1->base = tmpmr->base + tmpmr->size; + if (!tmpmr1->size) + { QueueRemove(tmpmr1); Free(tmpmr1); } return TRUE; } - tmpmr1=tmpmr1->next; + tmpmr1 = tmpmr1->next; } + return FALSE; } U0 Mem32DevInit() { CMemRange *tmpmr; - CMemE820 *m20=MEM_E820; + CMemE820 *m20 = MEM_E820; QueueInit(&dev.mem32_head); - tmpmr=ZMAlloc(sizeof(CMemRange)); - tmpmr->type=MRT_UNUSED; - tmpmr->flags=0; + tmpmr = ZMAlloc(sizeof(CMemRange)); + tmpmr->type = MRT_UNUSED; + tmpmr->flags = 0; //Maybe !!! Change this to 0xF0000000 !!! - tmpmr->base=0xE0000000; - tmpmr->size=0x10000000; - QueueInsert(tmpmr,dev.mem32_head.last); + tmpmr->base = 0xE0000000; + tmpmr->size = 0x10000000; + QueueInsert(tmpmr, dev.mem32_head.last); - if (m20->type) { - while (m20->type) { - tmpmr=ZMAlloc(sizeof(CMemRange)); - tmpmr->type=m20->type; - tmpmr->flags=0; - tmpmr->base=m20->base; - tmpmr->size=m20->len; + if (m20->type) + { + while (m20->type) + { + tmpmr = ZMAlloc(sizeof(CMemRange)); + tmpmr->type = m20->type; + tmpmr->flags = 0; + tmpmr->base = m20->base; + tmpmr->size = m20->len; if (!Mem32DevIns(tmpmr)) Free(tmpmr); m20++; @@ -55,102 +61,118 @@ U0 Mem32DevInit() } } -U8 *Mem32DevAlloc(I64 size,I64 alignment) +U8 *Mem32DevAlloc(I64 size, I64 alignment) {//Alloc 32-bit addr space for device. (Doesn't work.) Not used. //For this to work the BIOS E820 map must be searched for gaps in //the 32-bit range and the pool initialized to the gaps. - U8 *base,*limit; - CMemRange *tmpmr,*tmpmr1; - while (LBts(&sys_semas[SEMA_DEV_MEM],0)) + U8 *base, *limit; + CMemRange *tmpmr, *tmpmr1; + + while (LBts(&sys_semas[SEMA_DEV_MEM], 0)) Yield; - tmpmr1=dev.mem32_head.next; - while (tmpmr1!=&dev.mem32_head) { - base=(tmpmr1->base+alignment-1)&~(alignment-1); - limit=base+size-1; - if (!tmpmr1->type && - limitbase+tmpmr1->size) { - tmpmr=ZMAlloc(sizeof(CMemRange)); - tmpmr->type=MRT_DEV; - tmpmr->flags=0; - tmpmr->base=base; - tmpmr->size=size; - if (!Mem32DevIns(tmpmr)) { + tmpmr1 = dev.mem32_head.next; + while (tmpmr1 != &dev.mem32_head) + { + base = (tmpmr1->base + alignment - 1) & ~(alignment - 1); + limit = base + size - 1; + if (!tmpmr1->type && limit < tmpmr1->base + tmpmr1->size) + { + tmpmr = ZMAlloc(sizeof(CMemRange)); + tmpmr->type = MRT_DEV; + tmpmr->flags = 0; + tmpmr->base = base; + tmpmr->size = size; + if (!Mem32DevIns(tmpmr)) + { Free(tmpmr); - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); return NULL; } - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); return tmpmr->base; } - tmpmr1=tmpmr1->next; + tmpmr1 = tmpmr1->next; } - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); + return NULL; } U0 Mem32DevFree(U8 *base) {//Free 32-bit device address space. CMemRange *tmpmr; - if (!base) return; - while (LBts(&sys_semas[SEMA_DEV_MEM],0)) + + if (!base) + return; + while (LBts(&sys_semas[SEMA_DEV_MEM], 0)) Yield; - tmpmr=dev.mem32_head.next; - while (tmpmr!=&dev.mem32_head) { - if (tmpmr->base==base) { - tmpmr->type=MRT_UNUSED; + tmpmr = dev.mem32_head.next; + while (tmpmr != &dev.mem32_head) + { + if (tmpmr->base == base) + { + tmpmr->type = MRT_UNUSED; break; } - tmpmr=tmpmr->next; + tmpmr = tmpmr->next; } - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); } U8 *Mem64DevAlloc(I64 *_pages1Gig) {//Alloc 64-bit addr space for device. U8 *a; - I64 i=*_pages1Gig,*pte; - while (LBts(&sys_semas[SEMA_DEV_MEM],0)) + I64 i = *_pages1Gig, *pte; + + while (LBts(&sys_semas[SEMA_DEV_MEM], 0)) Yield; - while (i--) { - a=dev.mem64_ptr-=1<<30; - do { - pte=MemPageTable(a); - *pte=*pte&~0x18 |0x11; //Uncached and present + while (i--) + { + a = dev.mem64_ptr -= 1 << 30; + do + { + pte = MemPageTable(a); + *pte = *pte & ~0x18 | 0x11; //Uncached and present InvalidatePage(dev.mem64_ptr); - a+=mem_page_size; - } while (a-dev.mem64_ptr<1<<30); + a += mem_page_size; + } + while (a - dev.mem64_ptr < 1 << 30); } - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); return dev.mem64_ptr; } -U0 Mem64DevFree(U8 *base,I64 pages1Gig) +U0 Mem64DevFree(U8 *base, I64 pages1Gig) {//Free 64-bit device address space. - if (!base) return; - while (LBts(&sys_semas[SEMA_DEV_MEM],0)) + if (!base) + return; + while (LBts(&sys_semas[SEMA_DEV_MEM], 0)) Yield; - if (base==dev.mem64_ptr) - dev.mem64_ptr+=pages1Gig*1<<30; + if (base == dev.mem64_ptr) + dev.mem64_ptr += pages1Gig * 1 << 30; //else not freed - LBtr(&sys_semas[SEMA_DEV_MEM],0); + LBtr(&sys_semas[SEMA_DEV_MEM], 0); } U0 UncachedAliasAlloc() //Make uncached alias for 4 lowest Gig. { - I64 i=4,*pte; + I64 i = 4, *pte; U8 *a; - a=dev.uncached_alias=Mem64DevAlloc(&i); - do { - pte=MemPageTable(a); - *pte=0x197+a-dev.uncached_alias; + + a = dev.uncached_alias = Mem64DevAlloc(&i); + do + { + pte = MemPageTable(a); + *pte = 0x197 + a - dev.uncached_alias; InvalidatePage(a); - a+=mem_page_size; - } while (a-dev.uncached_alias<1<<32); + a += mem_page_size; + } + while (a - dev.uncached_alias < 1 << 32); } I64 MemBIOSTotal() {//Returns max of either E801 or E820 mem map. - I64 total01 = 0x100000, total20 = 0; + I64 total01 = 0x100000, total20 = 0; U16 *mem01 = MEM_E801; CMemE820 *mem20 = MEM_E820; @@ -159,28 +181,29 @@ I64 MemBIOSTotal() if (mem20->type) { - while(mem20->type) + while (mem20->type) { if(mem20->type == MEM_E820t_USABLE) total20 += mem20->len; mem20++; } - } + } return MaxI64(total01, total20); } -I64 Scale2Mem(I64 min,I64 max,I64 limit=2*1024*1024*1024) +I64 Scale2Mem(I64 min, I64 max, I64 limit=2*1024*1024*1024) {//Helps pick DiskCache and RAMDisk sizes. //Can be used in $LK,"BootHDIns",A="MN:BootHDIns"$() config scripts. I64 i; + if (sys_data_bp) - i=sys_data_bp->alloced_u8s; + i = sys_data_bp->alloced_u8s; else - i=sys_code_bp->alloced_u8s; - if (i>=limit) + i = sys_code_bp->alloced_u8s; + if (i >= limit) return max; else - return min+(max-min)*i/limit; + return min + (max - min) * i / limit; } I64 Seg2Linear(U32 *ptr) diff --git a/src/Kernel/Memory/PageTables.CC b/src/Kernel/Memory/PageTables.CC index 18d8abc8..73f718a9 100755 --- a/src/Kernel/Memory/PageTables.CC +++ b/src/Kernel/Memory/PageTables.CC @@ -4,202 +4,202 @@ asm { USE32 SYS_INIT_PAGE_TABLES:: //Check 1Gig page capability and set page size. - MOV EAX,0x80000001 + MOV EAX, 0x80000001 CPUID - MOV EAX,1<<21 - BT EDX,26 - JNC @@05 - MOV EAX,1<<30 -@@05: MOV U32 [MEM_PAGE_SIZE],EAX + MOV EAX, 1 << 21 + BT EDX, 26 + JNC @@05 + MOV EAX, 1 << 30 +@@05: MOV U32 [MEM_PAGE_SIZE], EAX //Set mapped space limit - MOV EAX,[MEM_PHYSICAL_SPACE] - MOV EDX,[MEM_PHYSICAL_SPACE+4] - BT U32 [MEM_PAGE_SIZE],30 //Round-up to 1Gig boundary? + MOV EAX, [MEM_PHYSICAL_SPACE] + MOV EDX, [MEM_PHYSICAL_SPACE + 4] + BT U32 [MEM_PAGE_SIZE], 30 //Round-up to 1Gig boundary? JNC @@10 - ADD EAX,0x3FFFFFFF - ADC EDX,0 - AND EAX,~0x3FFFFFFF -@@10: INC EDX //Need 4Gig extra for uncached alias up at top of space. - MOV [MEM_MAPPED_SPACE],EAX - MOV [MEM_MAPPED_SPACE+4],EDX + ADD EAX, 0x3FFFFFFF + ADC EDX, 0 + AND EAX, ~0x3FFFFFFF +@@10: INC EDX //Need 4Gig extra for uncached alias up at top of space. + MOV [MEM_MAPPED_SPACE], EAX + MOV [MEM_MAPPED_SPACE + 4], EDX //How many 2Meg pages? - MOV CL,21 - ADD EAX,0x1FFFFF - ADC EDX,0 - SHRD EAX,EDX - SHR EDX,CL - MOV [MEM_2MEG_NUM],EAX - MOV [MEM_2MEG_NUM+4],EDX + MOV CL, 21 + ADD EAX, 0x1FFFFF + ADC EDX, 0 + SHRD EAX, EDX + SHR EDX, CL + MOV [MEM_2MEG_NUM], EAX + MOV [MEM_2MEG_NUM + 4], EDX //How many 1Gig pages? - MOV CL,9 - ADD EAX,0x1FF - ADC EDX,0 - SHRD EAX,EDX - SHR EDX,CL - MOV [MEM_1GIG_NUM],EAX - MOV [MEM_1GIG_NUM+4],EDX + MOV CL, 9 + ADD EAX, 0x1FF + ADC EDX, 0 + SHRD EAX, EDX + SHR EDX, CL + MOV [MEM_1GIG_NUM], EAX + MOV [MEM_1GIG_NUM + 4], EDX //How many 512Gig pages? - MOV CL,9 - ADD EAX,0x1FF - ADC EDX,0 - SHRD EAX,EDX - SHR EDX,CL - MOV [MEM_512GIG_NUM],EAX - MOV [MEM_512GIG_NUM+4],EDX + MOV CL, 9 + ADD EAX, 0x1FF + ADC EDX, 0 + SHRD EAX, EDX + SHR EDX, CL + MOV [MEM_512GIG_NUM], EAX + MOV [MEM_512GIG_NUM + 4], EDX //Set $LK,"CSysFixedArea",A="MN:CSysFixedArea"$ to zero - MOV EDI,SYS_FIXED_AREA - XOR EAX,EAX - MOV ECX,sizeof(CSysFixedArea)/4 + MOV EDI, SYS_FIXED_AREA + XOR EAX, EAX + MOV ECX, sizeof(CSysFixedArea) / 4 REP_STOSD - MOV U32 [MEM_PML2],EDI + MOV U32 [MEM_PML2], EDI //Check for 1Gig page capability. - BT U32 [MEM_PAGE_SIZE],30 + BT U32 [MEM_PAGE_SIZE], 30 JC @@15 //Find PML2 Size - MOV EAX,U32 [MEM_2MEG_NUM] - ADD EAX,0x1FF - AND EAX,~0x1FF - SHL EAX,3 - ADD EDI,EAX + MOV EAX, U32 [MEM_2MEG_NUM] + ADD EAX, 0x1FF + AND EAX, ~0x1FF + SHL EAX, 3 + ADD EDI, EAX //Find PML3 Size -@@15: MOV U32 [MEM_PML3],EDI - MOV EAX,U32 [MEM_1GIG_NUM] - ADD EAX,0x1FF - AND EAX,~0x1FF - SHL EAX,3 - ADD EDI,EAX +@@15: MOV U32 [MEM_PML3], EDI + MOV EAX, U32 [MEM_1GIG_NUM] + ADD EAX, 0x1FF + AND EAX, ~0x1FF + SHL EAX, 3 + ADD EDI, EAX //Find PML4 Size - MOV U32 [MEM_PML4],EDI - MOV EAX,U32 [MEM_512GIG_NUM] - ADD EAX,0x1FF - AND EAX,~0x1FF - SHL EAX,3 - ADD EAX,EDI + MOV U32 [MEM_PML4], EDI + MOV EAX, U32 [MEM_512GIG_NUM] + ADD EAX, 0x1FF + AND EAX, ~0x1FF + SHL EAX, 3 + ADD EAX, EDI - MOV U32 [MEM_HEAP_BASE],EAX + MOV U32 [MEM_HEAP_BASE], EAX //Set page tables to zero - MOV EDI,U32 [MEM_PML2] - SUB EAX,EDI - MOV ECX,EAX - SHR ECX,2 - XOR EAX,EAX + MOV EDI, U32 [MEM_PML2] + SUB EAX, EDI + MOV ECX, EAX + SHR ECX, 2 + XOR EAX, EAX REP_STOSD //Check for 1Gig page capability. - BT U32 [MEM_PAGE_SIZE],30 + BT U32 [MEM_PAGE_SIZE], 30 JC @@30 //PML2: Use 2Meg Pages - MOV EAX,0x87 //bit 7 is page size (2Meg) - XOR EDX,EDX - MOV EDI,[MEM_PML2] - MOV ECX,[MEM_2MEG_NUM] -@@20: MOV U32 [EDI],EAX - ADD EDI,4 - MOV U32 [EDI],EDX - ADD EDI,4 - ADD EAX,0x200000 - ADC EDX,0 + MOV EAX, 0x87 //bit 7 is page size (2Meg) + XOR EDX, EDX + MOV EDI, [MEM_PML2] + MOV ECX, [MEM_2MEG_NUM] +@@20: MOV U32 [EDI], EAX + ADD EDI, 4 + MOV U32 [EDI], EDX + ADD EDI, 4 + ADD EAX, 0x200000 + ADC EDX, 0 LOOP @@20 //PML3: Use 2Meg Pages - MOV EAX,[MEM_PML2] - OR EAX,7 - XOR EDX,EDX - MOV EDI,[MEM_PML3] - MOV ECX,[MEM_1GIG_NUM] -@@25: MOV U32 [EDI],EAX - ADD EDI,4 - MOV U32 [EDI],EDX - ADD EDI,4 - ADD EAX,0x1000 - ADC EDX,0 + MOV EAX, [MEM_PML2] + OR EAX, 7 + XOR EDX, EDX + MOV EDI, [MEM_PML3] + MOV ECX, [MEM_1GIG_NUM] +@@25: MOV U32 [EDI], EAX + ADD EDI, 4 + MOV U32 [EDI], EDX + ADD EDI, 4 + ADD EAX, 0x1000 + ADC EDX, 0 LOOP @@25 JMP @@40 //PML3: Use 1Gig Pages -@@30: MOV EAX,0x87 //bit 7 is page size (1Gig) - XOR EDX,EDX - MOV EDI,[MEM_PML3] - MOV ECX,[MEM_1GIG_NUM] -@@35: MOV U32 [EDI],EAX - ADD EDI,4 - MOV U32 [EDI],EDX - ADD EDI,4 - ADD EAX,0x40000000 - ADC EDX,0 +@@30: MOV EAX, 0x87 //bit 7 is page size (1Gig) + XOR EDX, EDX + MOV EDI, [MEM_PML3] + MOV ECX, [MEM_1GIG_NUM] +@@35: MOV U32 [EDI], EAX + ADD EDI, 4 + MOV U32 [EDI], EDX + ADD EDI, 4 + ADD EAX, 0x40000000 + ADC EDX, 0 LOOP @@35 //PML4 -@@40: MOV EAX,[MEM_PML3] - OR EAX,7 - XOR EDX,EDX - MOV EDI,[MEM_PML4] - MOV ECX,[MEM_512GIG_NUM] -@@45: MOV U32 [EDI],EAX - ADD EDI,4 - MOV U32 [EDI],EDX - ADD EDI,4 - ADD EAX,0x1000 - ADC EDX,0 +@@40: MOV EAX, [MEM_PML3] + OR EAX, 7 + XOR EDX, EDX + MOV EDI, [MEM_PML4] + MOV ECX, [MEM_512GIG_NUM] +@@45: MOV U32 [EDI], EAX + ADD EDI, 4 + MOV U32 [EDI], EDX + ADD EDI, 4 + ADD EAX, 0x1000 + ADC EDX, 0 LOOP @@45 RET SYS_INIT_16MEG_SYS_CODE_BP:: // Init sys_code_bp to BIOS E801 lowest 16Meg val. // $LK,"BlkPoolsInit",A="MN:BlkPoolsInit"$() adds the rest. - MOV U32 [SYS_CODE_BP],SYS_FIXED_AREA+CSysFixedArea.sys_code_bp - MOV U32 [SYS_CODE_BP+4],0 + MOV U32 [SYS_CODE_BP], SYS_FIXED_AREA + CSysFixedArea.sys_code_bp + MOV U32 [SYS_CODE_BP + 4], 0 - MOV U32 [SYS_DATA_BP],0 - MOV U32 [SYS_DATA_BP+4],0 + MOV U32 [SYS_DATA_BP], 0 + MOV U32 [SYS_DATA_BP + 4], 0 - XOR EAX,EAX - MOV AX,U16 [MEM_E801] //1 Kb blks between 1M and 16M - SHL EAX,10 - ADD EAX,0x100000 - MOV EDI,U32 [MEM_HEAP_BASE] - SUB EAX,EDI + XOR EAX, EAX + MOV AX, U16 [MEM_E801] //1 Kb blks between 1M and 16M + SHL EAX, 10 + ADD EAX, 0x100000 + MOV EDI, U32 [MEM_HEAP_BASE] + SUB EAX, EDI //EDI=BASE EAX=SIZE - TEST U8 [SYS_MEM_INIT_FLAG],1 + TEST U8 [SYS_MEM_INIT_FLAG], 1 JZ @@05 PUSH EAX PUSH EDI - MOV ECX,EAX - MOV AL,U8 [SYS_MEM_INIT_VAL] + MOV ECX, EAX + MOV AL, U8 [SYS_MEM_INIT_VAL] REP_STOSB POP EDI POP EAX -@@05: SHR EAX,MEM_PAG_BITS - MOV ESI,SYS_FIXED_AREA+CSysFixedArea.sys_code_bp - MOV EBX,U32 CBlkPool.mem_free_list[ESI] - MOV U32 CMemBlk.next[EDI],EBX - MOV U32 CMemBlk.next+4[EDI],0 - MOV U32 CBlkPool.mem_free_list[ESI],EDI - MOV U32 CBlkPool.mem_free_list+4[ESI],0 - MOV U32 CMemBlk.mb_signature[EDI],MBS_UNUSED_SIGNATURE_VAL - MOV U32 CMemBlk.pags[EDI],EAX - SHL EAX,MEM_PAG_BITS - ADD U32 CBlkPool.alloced_u8s[ESI],EAX +@@05: SHR EAX, MEM_PAG_BITS + MOV ESI, SYS_FIXED_AREA + CSysFixedArea.sys_code_bp + MOV EBX, U32 CBlkPool.mem_free_list[ESI] + MOV U32 CMemBlk.next [EDI], EBX + MOV U32 CMemBlk.next + 4 [EDI], 0 + MOV U32 CBlkPool.mem_free_list [ESI], EDI + MOV U32 CBlkPool.mem_free_list + 4 [ESI], 0 + MOV U32 CMemBlk.mb_signature[EDI], MBS_UNUSED_SIGNATURE_VAL + MOV U32 CMemBlk.pags[EDI], EAX + SHL EAX, MEM_PAG_BITS + ADD U32 CBlkPool.alloced_u8s[ESI], EAX - BTS U32 [SYS_RUN_LEVEL],RLf_16MEG_SYS_CODE_BP + BTS U32 [SYS_RUN_LEVEL], RLf_16MEG_SYS_CODE_BP RET } I64 *MemPageTable(U8 *a) {//Point to page table entry for addr. - if (Bt(&mem_page_size,30)) - return *MEM_PML3(U64 *)+a>>30*8; + if (Bt(&mem_page_size, 30)) + return *MEM_PML3(U64 *) + a >> 30 * 8; else - return *MEM_PML2(U64 *)+a>>21*8; + return *MEM_PML2(U64 *) + a >> 21 * 8; }