⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpmcpu.inc

📁 <BIOS研发技术剖析>书的源代码,包括完整的BIOS汇编语言源程序.
💻 INC
📖 第 1 页 / 共 4 页
字号:
;---------------------------------------------------------------;

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 + -