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); PUSHFD CLI 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_PAG_BITS; bp->mem_free_list = m; LBtr(&bp->locked_flags, BPlf_LOCKED); POPFD } 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 - m(U8 *)) >> 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; total = MemBIOSTotal; if (total <= 0x80000000) code_heap_limit = total; else if (total <= 0x100000000) code_heap_limit = total / 4; else code_heap_limit = 0x80000000; i = code_heap_limit - SYS_16MEG_AREA_LIMIT; //See 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_limit<total) { while (m20->type) { if (m20->type == MEM_E820t_USABLE) { lo = m20->base; hi = m20->base + m20->len; if (lo<code_heap_limit) { if (hi > code_heap_limit) lo = code_heap_limit; else hi = lo; //cancel } 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); }