?? event.inc
字號:
;-----------------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1999, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;-----------------------------------------------------------------------;
include event.equ
include mbiosequ.equ
include gpnv.equ
include pci.equ
include escd.equ
include dim.equ
include dim.dat
extrn get_cmos_item:near
extrn set_cmos_item_checksum:near
extrn read_cmos_8e:near
extrn read_gpnv_handle:near
extrn ram_segment:word
extrn get_gpnv_attribute_information:near
extrn update_gpnv_attribute:near
;-----------------------------------------------------------------------;
; init_event_log_buffer ;
;-----------------------------------------------------------------------;
; This routine will get the last event logs in gpnv and init the buffer ;
; if no previous logs. ;
; input : ;
; AX:0000 Event log buffer ;
; output: ;
; buffer updated ;
; register usage : none ;
;-----------------------------------------------------------------------;
public init_event_log_buffer
init_event_log_buffer proc near
push gs
push ds
push es
pusha
mov es,ax
xor si,si ; offset zero, buffer start point
mov (LOG_BUFFER ptr es:[si]).log_size,0; init size to zero
mov (LOG_BUFFER ptr es:[si]).log_capacity,0; assume space available
mov (LOG_BUFFER ptr es:[si]).log_validity,1; assume valid
mov (LOG_BUFFER ptr es:[si]).log_change,0; unchanged
mov (LOG_BUFFER ptr es:[si]).gpnv_handle,1; default handle #
mov (LOG_BUFFER ptr es:[si]).change_token,0; init change token
mov al,Q_EVENT_LOGGING
call get_cmos_item
mov (LOG_BUFFER ptr es:[si]).logging,al
mov (LOG_BUFFER ptr es:[si]).post_err1,0
mov (LOG_BUFFER ptr es:[si]).post_err2,0
mov al,Q_MARK_DMI_EVENTS_AS_READ
call get_cmos_item
mov (LOG_BUFFER ptr es:[si]).as_read,al
mov al,Q_CLEAR_EVENT_LOG
call get_cmos_item
jz load_event_log_from_gpnv
mov ax,Q_CLEAR_EVENT_LOG ;set to 'No'
call set_cmos_item_checksum
mov al,LOG_AREA_RESET_CLEARED
push es
pop ds ; DS = event log buffer
call logging_event
jmp short ielb_00
load_event_log_from_gpnv:
push si
mov bx,GPNV_DMI_EVENT_LOG_BIT ; attribute of the concerned GPNV area
call get_gpnv_attribute_information ; get the GPNV area details
pop si
jc ielb_00 ; read information error
mov (LOG_BUFFER ptr es:[si]).gpnv_handle,bl; save handle #
; mov bx,EVENT_LOG_GPNV_HANDLE; BX = GPNV handle# of event log
mov edi,LOG_BUFFER.log_data ; ES:EDI = event log data buffer
mov ax,0f000h ; real mode
mov ds,ax ; DS = GPNV Selector
mov gs,ax ; GS = BIOS Selector
mov al,READ_GPNV_DATA_SUBFUNC; AL = read gpnv header+data
call read_gpnv_handle ; read the data
jc ielb_00 ; read data error
xor cx,cx
ielb_04:
mov al,(LOG_RECORD ptr es:[di]).event_type
cmp al,0ffh ; end event?
je ielb_03
call check_supported_event
jnz log_data_invalid
movzx ax,(LOG_RECORD ptr es:[di]).record_len
and al,7fh
cmp al,08h ; min. event size >= 8
jb log_data_invalid
add cx,ax
inc (LOG_BUFFER ptr es:[si]).change_token
test (LOG_BUFFER ptr es:[si]).as_read,1 ; mark as read?
jz keep_current_read_status
and (LOG_RECORD ptr es:[di]).record_len,7fh ; mark the event as read
keep_current_read_status:
add di,ax ; ptr to next record
jmp ielb_04
ielb_03:
mov (LOG_BUFFER ptr es:[si]).log_size,cx; save the size
cmp cx,MAX_LOG_SIZE
jb ielb_00
mov (LOG_BUFFER ptr es:[si]).log_capacity,1; space full
ielb_00:
popa
pop es
pop ds
pop gs
ret
log_data_invalid:
mov (LOG_BUFFER ptr es:[si]).log_validity,0; invalid
jmp ielb_00
init_event_log_buffer endp
;-----------------------------------------------------------------------;
; CHECK_SUPPORTED_EVENT ;
;-----------------------------------------------------------------------;
; This routine varify the supported event type. ;
; input : ;
; AL = event type ;
; output: ;
; NZ the event type is supported ;
; ZR the event type is NOT supported ;
; register usage : none ;
;-----------------------------------------------------------------------;
check_supported_event proc near
push cx
push si
mov cx,(offset cs:event_type_supported_table_end-offset cs:event_type_supported_table)
mov si,offset cs:event_type_supported_table
cse_01:
cmp al,cs:[si]
jz cse_00 ;supported
inc si
loop cse_01
or sp,sp ;not supported
cse_00:
pop si
pop cx
ret
check_supported_event endp
;-----------------------------------------------------------------------;
; EVENT_TYPE_SUPPORTED_TABLE ;
;-----------------------------------------------------------------------;
; List of the supported event type, it should be synchronize with the ;
; event type supported list of SMBIOS type 15 (system evnet type). ;
;-----------------------------------------------------------------------;
event_type_supported_table label byte
db POST_ERROR
db LOG_AREA_RESET_CLEARED
event_type_supported_table_end label byte
;-----------------------------------------------------------------------;
; LOGGING_POST_ERROR1 ;
;-----------------------------------------------------------------------;
; check point : 85 ;
; This routine will log the POST error event. ;
; input : ;
; Code segment writeable ;
; output: ;
; cgroup:first_bp = 1st set post error ;
; register usage : none ;
;-----------------------------------------------------------------------;
logging_post_error1 proc near
mov cgroup:first_bp,bp
ret
logging_post_error1 endp
;-----------------------------------------------------------------------;
; LOGGING_POST_ERROR2 ;
;-----------------------------------------------------------------------;
; This routine will log the POST error event. ;
; input : ;
; BP = 2nd set post error ;
; output: ;
; none ;
; register usage : none ;
;-----------------------------------------------------------------------;
;;logging_post_error2 proc near
;; ret
;;logging_post_error2 endp
;-----------------------------------------------------------------------;
; LOGGING_POST_ERROR3 ;
;-----------------------------------------------------------------------;
; check point : 38 ;
; This routine will log the DIM POST error event. ;
; input : ;
; DS = DIMDATASEG ;
; Code segment writeable ;
; output: ;
; cgroup:dim_SysStatus ;
; register usage : eax ;
;-----------------------------------------------------------------------;
logging_post_error3 proc near
mov eax,ds:SysStatus
mov cgroup:dim_SysStatus,eax
mov eax,ds:IsaStatus
mov cgroup:dim_IsaStatus,eax
mov eax,ds:PciStatus
mov cgroup:dim_PciStatus,eax
ret
logging_post_error3 endp
;-----------------------------------------------------------------------;
; LOGGING_POST_ERROR ;
;-----------------------------------------------------------------------;
; This routine will log the post error event if exist. ;
; input : ;
; AX:0000 used as buffer ;
; output: ;
; none ;
; register usage : none ;
;-----------------------------------------------------------------------;
logging_post_error proc near
push eax
push ds
mov ds,ax
xor si,si ; DS:SI = event log buffer
call parse_all_post_errors_to_buffer
mov eax,(LOG_BUFFER ptr [si]).post_err1
add eax,(LOG_BUFFER ptr [si]).post_err2
jz no_post_error
mov al,POST_ERROR
call logging_event
no_post_error:
pop ds
pop eax
ret
logging_post_error endp
;-----------------------------------------------------------------------;
; LOGGING_EVENT ;
;-----------------------------------------------------------------------;
; This routine will add a event to the event log data area. ;
; input : ;
; AL = event type ;
; output: ;
; none ;
; note: ;
; DS:0000 will be used as the buffer for event log, ;
; see event.equ for the format. ;
; register usage : none ;
;-----------------------------------------------------------------------;
public logging_event
logging_event proc near
push ds
pushad
xor si,si ;SI = event log buffer start address
cmp (LOG_BUFFER ptr [si]).log_validity,0; invalid?
jz logging_event_end
cmp (LOG_BUFFER ptr [si]).logging,0;logging disabled?
jz logging_event_end
mov di,(LOG_BUFFER ptr [si]).log_size;DI = current log size
cmp di,MAX_LOG_SIZE
jae log_space_full
add di,LOG_BUFFER.log_data ;DI = end of the event log data
mov (LOG_RECORD ptr [di]).event_type,al ;set event type
mov (LOG_RECORD ptr [di]).record_len,88h ;assume length=8, bit7=1: has NOT been read
cmp al,POST_ERROR ;event type = POST error?
jnz not_post_error
mov (LOG_RECORD ptr [di]).record_len,90h;length=16, bit7=1: has NOT been read
mov eax,(LOG_BUFFER ptr [si]).post_err1;first POST results bitmap
mov (LOG_RECORD ptr [di]).var_data1,eax
mov eax,(LOG_BUFFER ptr [si]).post_err2;second POST results bitmap
mov (LOG_RECORD ptr [di]).var_data2,eax
not_post_error:
movzx bx,(LOG_RECORD ptr [di]).record_len
and bl,7fh ;bit6-0=length
add (LOG_BUFFER ptr [si]).log_size,bx
mov (LOG_BUFFER ptr [si]).log_change,1; changed
mov byte ptr [di+bx],0ffh;end event log indicator
call logging_date_time
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -