.xlist include kernel.inc .list if KDEBUG DataBegin externB fBooting externW pGlobalHeap ;externW hGlobalHeap DataEnd sBegin CODE assumes CS,CODE externW gdtdsc externNP check_lru_list externNP check_free_list externNP get_physical_address ;externFP ValidateFreeSpaces ;-----------------------------------------------------------------------; ; CheckGlobalHeap ; ; ; ; The Global Heap is checked for consistency. First the forward links ; ; are examined to make sure they lead from the hi_first to the hi_last. ; ; Then the backward links are checked to make sure they lead from the ; ; hi_last to the hi_first. Then the arenas are sequentially checked ; ; to see that the moveable entries point to allocated handles and that ; ; said handles point back. The handle table is then checked to see ; ; that the number of used handles match the number of referenced ; ; handles, and that the number of total handles matches the sum of the ; ; free, discarded, and used handles. Finally the free list of handles ; ; is checked. ; ; ; ; Arguments: ; ; none ; ; ; ; Returns: ; ; CF = 0 everything is just fine ; ; all registers preserved ; ; ; ; Error Returns: ; ; CF = 1 ; ; DX = offending arena header ; ; AX = 01h Forward links invalid ; ; 02h Backward links invalid ; ; 04h ga_handle points to free handle ; ; 08h arena points to handle but not vice versa ; ; 80h ga_sig is bad ; ; DX = 0 ; ; AX = 10h allocated handles don't match used handles ; ; 20h total number of handles don't match up ; ; 40h total number of free handles don't match up ; ; ; ; Registers Preserved: ; ; All ; ; ; ; Registers Destroyed: ; ; ; ; Calls: ; ; ; ; History: ; ; ; ; Sat Nov 01, 1986 02:16:46p -by- David N. Weise [davidw] ; ; Rewrote it from C into assembly. ; ;-----------------------------------------------------------------------; cProc CheckGlobalHeap, cBegin nogen push ax push dx push bx push cx push di push si push ds push es xor ax,ax xor dx,dx xor di,di SetKernelDS cmp pGlobalHeap,di jnz there_is_a_GlobalHeap jmp all_done there_is_a_GlobalHeap: cmp fBooting, 1 jz no_check mov ds,pGlobalHeap UnSetKernelDS cmp [di].hi_check,di jnz checking_enabled no_check: jmp all_done checking_enabled: mov cx,[di].hi_count mov dx,[di].hi_first mov es, dx forward_ho: push cx cCall get_physical_address, add ax, 10h adc dx, 0 mov bx, es:[di].ga_size xor cx, cx rept 4 shl bx, 1 rcl cx, 1 endm cmp es:[di].ga_owner, di je no_limit_check cmp es:[di].ga_handle, di je no_limit_check push bx push cx push si push ds smov ds, gdtdsc mov si, es:[di].ga_handle sel_check si sub bx, 1 sbb cx, 0 or cx, cx ; More than 1 selector? jz @F mov bx, -1 @@: cmp [si], bx jne bad_limit mov ch, [si+6] and cx, 0F0Fh cmp ch, cl je ok_limit bad_limit: Debug_Out "gacheck: Bad limit for #SI" ok_limit: pop ds pop si pop cx pop bx no_limit_check: cmp es:[di].ga_owner,GA_NOT_THERE ;286pmode has some of these jnz check_size ; with 0 size pop cx jmp short size_ok check_size: add bx, ax adc cx, dx cCall get_physical_address, cmp cx, dx pop cx mov dx, es xchg ax, dx jne forward_size_mismatch cmp dx, bx jne forward_size_mismatch size_ok: mov ax, es mov dx, es:[di].ga_next mov es, dx cmp ax, es:[di].ga_prev jz size_and_next_match forward_size_mismatch: cmp cx,1 jnz forward_links_invalid size_and_next_match: loop xxxx cmp ax,[di].hi_last jz forward_links_okay forward_links_invalid: Debug_Out "gacheck: Forward links invalid" mov dx,ax mov ax,1 jmp all_done xxxx: jmp forward_ho forward_links_okay: xor ax, ax clear_dx_all_done: xor dx,dx all_done: pop es pop ds pop si pop di pop cx pop bx or ax,ax jnz cgh_error pop dx pop ax ret cgh_error: int 3 add sp,4 stc ret cEnd nogen sEnd CODE endif end