📄 gpmcpu.inc
字号:
;---------------------------------------------------------------;
intel_func_00 proc near
call get_intel_gen_purpose_reg ;
clc ; (cy) = 00 for no error
ret
intel_func_00 endp
;---------------------------------------------------------------;
; INTEL_FUNC_01 ROUTINE ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: (CY) 00 for no error ;
; (CY) 01 for CPU not supported ;
; Register destroyed : (EAX),(SI) ;
; NOTE : ;
; Sets up cpu dump area for (EAX),(EBX),(ECX),(EDX),(ESI),;
; (EDI),(EBP),(EFLAGS) with on exit smi values from cpu_ ;
; gen_purpose_reg_entry ;
;---------------------------------------------------------------;
intel_func_01 proc near
call set_intel_gen_purpose_reg ;
clc ; (cy) = 00 for no error
ret
intel_func_01 endp
;---------------------------------------------------------------;
; GET_INTEL_GEN_PURPOSE_REG ROUTINE ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: NONE ;
; Register destroyed : (EAX),(DI) ;
;---------------------------------------------------------------;
get_intel_gen_purpose_reg proc near
mov di,cpu_gen_purpose_reg_entry ; (di) = pointer to on entry general purpose reg values structure
push es ;
push ds ;
pop es ; (ds) = (es)
mov eax,cs:cpu_dump_eax_intl ; (eax) = on entry (EAX)
stosd ;
mov eax,cs:cpu_dump_ebx_intl ; (eax) = on entry (EBX)
stosd ;
mov eax,cs:cpu_dump_ecx_intl ; (eax) = on entry (ECX)
stosd ;
mov eax,cs:cpu_dump_edx_intl ; (eax) = on entry (EDX)
stosd ;
mov eax,cs:cpu_dump_esi_intl ; (eax) = on entry (ESI)
stosd ;
mov eax,cs:cpu_dump_edi_intl ; (eax) = on entry (EDI)
stosd ;
mov eax,cs:cpu_dump_ebp_intl ; (eax) = on entry (EBP)
stosd ;
mov eax,cs:cpu_dump_eflags_intl ; (eax) = on entry EFLAG
stosd ;
mov eax,cs:cpu_dump_cr0_intl ; (eax) = on entry CR0
stosd ;
pop es ;
ret
get_intel_gen_purpose_reg endp
;---------------------------------------------------------------;
; SET_INTEL_GEN_PURPOSE_REG ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: NONE ;
; Register destroyed : (EAX),(SI) ;
;---------------------------------------------------------------;
set_intel_gen_purpose_reg proc near
mov si,cpu_gen_purpose_reg_entry ; (si) = pointer to reg values structure on exit
lodsd ; (eax) = on exit (EAX)
mov cs:cpu_dump_eax_intl,eax ;
lodsd ; (eax) = on exit (EBX)
mov cs:cpu_dump_ebx_intl,eax ;
lodsd ; (eax) = on exit (ECX)
mov cs:cpu_dump_ecx_intl,eax ;
lodsd ; (eax) = on exit (EDX)
mov cs:cpu_dump_edx_intl,eax ;
lodsd ; (eax) = on exit (ESI)
mov cs:cpu_dump_esi_intl,eax ;
lodsd ; (eax) = on exit (EDI)
mov cs:cpu_dump_edi_intl,eax ;
lodsd ; (eax) = on exit (EBP)
mov cs:cpu_dump_ebp_intl,eax ;
lodsd ; (eax) = on exit EFLAG
mov cs:cpu_dump_eflags_intl,eax ;
ret
set_intel_gen_purpose_reg endp
;---------------------------------------------------------------;
; INTEL_AMD_PLUS_RELOCATION ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
; Register destroyed : (EAX) ;
;---------------------------------------------------------------;
intel_amd_plus_relocation proc near
mov ax,cs:smi_code_seg_intel_amd_plus_cseg; (ax) = SMI code segment selector
cmp dword ptr cs:smi_seg_size_cseg,8000h; is 32KB SMRAM ?
ja short intel_amd_plus_relocation_01; no...64KB or greater SMRAM
sub ax,800h ; change it to 64KB form
intel_amd_plus_relocation_01:
movzx eax,ax ;
shl eax,4 ; (eax) = absolute address
mov cs:cpu_dump_smbase_slot_intl,eax; change SMBASE
ret
intel_amd_plus_relocation endp
;---------------------------------------------------------------;
intel_cpu_smi_support_end label byte
;---------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;---------------------------------------------------------------;
ELSE
intel_cpu_dummy_smi_support_start label byte
;---------------------------------------------------------------;
; DUMMY SMI SUPPORT FOR INTEL/AMD PLUS CPU ;
;---------------------------------------------------------------;
; INTEL_CPU_SMI_ENTRY_EXT ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
; Register destroyed : ALL ;
;---------------------------------------------------------------;
intel_cpu_smi_entry_ext proc near
;---------------------------------------------------------------;
; INTEL_CPU_SMI_EXIT ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
;---------------------------------------------------------------;
intel_cpu_smi_exit proc near
intel_rsm ; RSM (resume from SMI)
intel_cpu_smi_exit endp
intel_cpu_smi_entry_ext endp
;---------------------------------------------------------------;
; INTEL_FUNC_00 ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: (CY) 00 for no error ;
; (CY) 01 for CPU not supported ;
; Register destroyed : (EAX),(DI),(SI) ;
; NOTE : ;
; Sets up cpu_gen_purpose_reg_entry with on entry smi ;
; values from cpu dump area for (EAX),(EBX),(ECX),(EDX), ;
; (ESI),(EDI),(EBP) & (EFLAGS) ;
;---------------------------------------------------------------;
intel_func_00 proc near
;---------------------------------------------------------------;
; INTEL_FUNC_01 ROUTINE ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: (CY) 00 for no error ;
; (CY) 01 for CPU not supported ;
; Register destroyed : (EAX),(DI) ;
; NOTE : ;
; Sets up cpu dump area for (EAX),(EBX),(ECX),(EDX),(ESI),;
; (EDI),(EBP),(EFLAGS) with on exit smi values from cpu_ ;
; gen_purpose_reg_entry ;
;---------------------------------------------------------------;
intel_func_01 proc near
stc ; (cy) = 01 for function not supported
ret
intel_func_01 endp
intel_func_00 endp
;---------------------------------------------------------------;
; INTEL_AMD_PLUS_RELOCATION ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
; Register destroyed : (EAX),(DI) ;
;---------------------------------------------------------------;
intel_amd_plus_relocation proc near
ret
intel_amd_plus_relocation endp
;---------------------------------------------------------------;
intel_cpu_dummy_smi_support_end label byte
ENDIF
;---------------------------------------------------------------;
;*****************************************************************;
;*****************************************************************;
;** **;
;** (C)Copyright 1985-1996, American Megatrends Inc. **;
;** **;
;** All Rights Reserved. **;
;** **;
;** 6145-F, Northbelt Parkway, Norcross, **;
;** **;
;** Georgia - 30071, USA. Phone-(770)-246-8600. **;
;** **;
;*****************************************************************;
;*****************************************************************;
;---------------------------------------------------------------;
; THIS PORTION OF CODE SUPPORTS AMD non-PLUS/IBM/UMC CPU SMI ;
;---------------------------------------------------------------;
; Am386SXLV/Am386DXLV/Am486DXLV ;
; IBM486SLC2,BLUE LIGHTNING,386SLC ;
; UMC U5 CPU ;
;---------------------------------------------------------------;
IF AMD_NON_PLUS_IBM_SUPPORT
amd_ibm_cpu_smi_support_start label byte
;---------------------------------------------------------------;
; ACTUAL SMI SUPPORT FOR AMD non-PLUS/IBM/UMC CPU ;
;---------------------------------------------------------------;
; AMD_CPU_SMI_ENTRY_EXT ;
; IBM_CPU_SMI_ENTRY_EXT ;
; UMC_CPU_SMI_ENTRY_EXT ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
; Register destroyed : ALL ;
;---------------------------------------------------------------;
amd_cpu_smi_entry_ext proc near
ibm_cpu_smi_entry_ext proc near
umc_cpu_smi_entry_ext proc near
cli ; disable interrupts
cld ; clear direction flag
mov ax,cs ; (ax) = data segment for SMI execution
mov ds,ax ; set (DS) as PM BIOS data segment
mov es,ax ; set (ES) as PM BIOS data segment
mov ss,ax ; set (SS) as PM BIOS data segment
mov sp,pm_bios_global_stack_ptr ; set (SP) for GLOBAL stack pointer
mov word ptr ds:cpu_vendor,amd_cpu_bit or ibm_cpu_bit or umc_cpu_bit; set for AMD non-PLUS/IBM/UMC CPU
test byte ptr ds:bios_detected_cpu_mfr,ibm_cpu_bit; IBM cpu ?
jz short amd_cpu_smi_entry_ext_01 ; no...
cache_wbinvd ; flush & invalidate cache
amd_cpu_smi_entry_ext_01:
call actual_smi_handler ; handle the SMI source
;---------------------------------------------------------------;
; AMD_CPU_SMI_EXIT ;
; IBM_CPU_SMI_EXIT ;
; UMC_CPU_SMI_EXIT ;
;---------------------------------------------------------------;
; Input : NONE ;
; Output: NONE ;
;---------------------------------------------------------------;
amd_cpu_smi_exit proc near
ibm_cpu_smi_exit proc near
umc_cpu_smi_exit proc near
and dword ptr cs:cpu_dump_dr6_amd_ibm,0ffffefffh; clear SMMS bit
and dword ptr cs:cpu_dump_dr7_amd_ibm,0ffffefffh; clear soft SMI enable (SMIE) bit as AMD CPU always sets this bit while entering SMI
mov ax,cs ; (ax) = (cs)
mov es,ax ; (es) = SMI segment
xor edi,edi ; (edi) = set at beginning of CPU save area
amd_res3 ; RES3 (resume from SMI)
umc_cpu_smi_exit endp
ibm_cpu_smi_exit endp
amd_cpu_smi_exit endp
umc_cpu_smi_entry_ext endp
ibm_cpu_smi_entry_ext endp
amd_cpu_smi_entry_ext endp
;---------------------------------------------------------------;
; AMD_FUNC_00 ;
; IBM_FUNC_00 ;
; UMC_FUNC_00 ;
;---------------------------------------------------------------;
; Input : (DS) PM BIOS data segment ;
; Output: (CY) 00 for no error ;
; (CY) 01 for CPU not supported ;
; Register destroyed : (EAX),(DI) ;
; NOTE : ;
; Sets up cpu_gen_purpose_reg_entry with on entry smi ;
; values from cpu dump area for (EAX),(EBX),(ECX),(EDX), ;
; (ESI),(EDI),(EBP) & (EFLAGS) ;
; NOTE : ;
; Common routine for amd/ibm/umc cpu ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -