;	[]===========================================================[]
;
;	NOTICE: THIS PROGRAM BELONGS TO AWARD SOFTWARE INTERNATIONAL(R)
;	        INC. IT IS CONSIDERED A TRADE SECRET AND IS NOT TO BE 	
;	        DIVULGED OR USED BY PARTIES WHO HAVE NOT RECEIVED	
;	        WRITTEN AUTHORIZATION FROM THE OWNER.
;
; 	[]===========================================================[]
;
  				
;----------------------------------------------------------------------------
;Rev	Date	 Name	Description
;----------------------------------------------------------------------------
;R00	04/08/99 BAR	Initial .
;			Backup Cpu register, when SMI mode use Cyrix CPU.

IF	COMPILE_FOR_CYRIXSMI EQ 1
SMI_STRUCT	STRUC
		dd	?
_CpuBrandOffset	dw	?	 	;intel SMM mode autosave eax offset
_EaxSave	dd	1 dup (?)
_EcxSave	dd	1 dup (?)
_EdxSave	dd	1 dup (?)
_EbxSave	dd	1 dup (?)
_EspSave	dd	1 dup (?)	
_EbpSave	dd	1 dup (?)	
_EsiSave	dd	1 dup (?)
_EdiSave	dd	1 dup (?)
_SpSave 	dw	1 dup (?)	;Save Cpu regsiter
_Cr2Save	dd	1 dup (?)
_Cr3Save	dd	1 dup (?)
_Gdt		dq	1 dup (0)
		dw	1 dup (?)
		dw	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
		dw	1 dup (?)
		dw	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
		db	1 dup (?)
_DsSave 	dt	1 dup (?)
_EsSave 	dt	1 dup (?)
_SsSave 	dt	1 dup (?)
_FsSave 	dt	1 dup (?)
_GsSave 	dt	1 dup (?)
_LdtSave	dt	1 dup (?)
_TskSave	dt	1 dup (?)
_Dstemp 	db	10 dup (?)
_GdtSave	df	1 dup (?)
_GdtNew 	dw	1 dup (?)
		dd	1 dup (?)
_IdtSave	df	1 dup (?)
_RealModeIdt	dw	1 dup (?)
		dd	1 dup (?)
SMI_STRUCT	ENDS

Cyrix_EFLAG	EQU	07ff8h

ENDIF	;COMPILE_FOR_CYRIXSMI EQ 1

;Data saving table for CYRIX CPU

IF	COMPILE_FOR_CYRIXSMI EQ 2
CpuBrandOffset	dw	( 07fd0h - _EaxSave)	;default offset 
EaxSave 	dd	?
EcxSave 	dd	?
EdxSave 	dd	?
EbxSave 	dd	?
EspSave 	dd	?
EbpSave 	dd	?
EsiSave 	dd	?
EdiSave 	dd	?
SpSave		dw	?
Cr2Save 	dd	?
Cr3Save 	dd	?

Gdt		dq	0
RD_WR		EQU	12h		;read/write
EX_RD		EQU	1Ah		;execute/readable
ADDR		=	0
LIMT		=	100000h
G_BIG		=	$ - Gdt
		dw	(LIMT-1 AND 0ffffh)
		dw	(ADDR AND 0ffffh)
		db	((ADDR SHR 16) AND 0ffh)
		db	RD_WR OR (0 SHL 5) OR (1 SHL 7)
		db	((LIMT-1 SHR 16) AND 0fh) OR (0 SHL 6) OR (1 SHL 7)
		db	((ADDR SHR 24) AND 0ffh)
G_CODE		=	$ - Gdt
		dw	(LIMT-1 AND 0ffffh)
		dw	(ADDR AND 0ffffh)
		db	((ADDR SHR 16) AND 0ffh)
		db	EX_RD OR (0 SHL 5) OR (1 SHL 7)
		db	((LIMT-1 SHR 16) AND 0fh) OR (0 SHL 6) OR (1 SHL 7)
		db	((ADDR SHR 24) AND 0ffh)
GDTSIZE 	=	($ - Gdt)

DsSave		dt	?
EsSave		dt	?
SsSave		dt	?
FsSave		dt	?
GsSave		dt	?
LdtSave 	dt	?
TskSave 	dt	?
Dstemp		db	0ffh,0ffh,0,0,0,92h,8fh,0,0,0	;4 Gb segment
GdtSave 	df	0
GdtNew		dw	GDTSIZE-1
		dd	?				;address
IdtSave 	df	0
RealModeIdt	dw	3ffh
		dd	0

Cyrix_SMI_Start:					;storage regsiter
		mov	cs:[_EaxSave],eax
		mov	cs:[_EspSave],esp
		mov	cs:[_EbxSave],ebx
		mov	cs:[_EcxSave],ecx
		mov	cs:[_EdxSave],edx
		mov	cs:[_EsiSave],esi
		mov	cs:[_EdiSave],edi
		SVLDT	CS,_LdtSave		;save LDT
		SVTS	CS,_TskSave		;save TSK
		SVDC	CS,_DsSave,DS		;save DS
		SVDC	CS,_EsSave,ES		;save ES
		SVDC	CS,_SsSave,SS		;save SS
		SVDC	CS,_FsSave,FS		;save FS
		SVDC	CS,_GsSave,GS		;save GS
		RSDC	CS,_Dstemp,DS		;set DS
		RSDC	CS,_Dstemp,SS		;set SS
		RSDC	CS,_Dstemp,ES		;set ES

		db	066h
		SGDT	fword ptr cs:[_GdtSave] ;save GDT

		db	066h
		SIDT	fword ptr cs:[_IdtSave] ;save IDT

		mov	eax,cr2
		mov	cs:[_Cr2Save],eax		;save CR2

		mov	eax,cr3
		mov	cs:[_Cr3Save],eax		;save CR3

ENDIF;	COMPILE_FOR_CYRIXSMI EQ 2

IF	COMPILE_FOR_CYRIXSMI EQ 3			;restore regsiter
Cyrix_SMI_Exit:
		RSLDT	CS,_LdtSave		;retore LDT
		RSTS	CS,_TskSave		;restore TSK
		RSDC	CS,_DsSave,DS		;restore DS
		RSDC	CS,_EsSave,ES		;restore ES
		RSDC	CS,_SsSave,SS		;restore SS
		RSDC	CS,_FsSave,FS		;restore FS
		RSDC	CS,_GsSave,GS		;restore GS

		db	66h
		LGDT	fword ptr cs:[_GdtSave] ;restore GDT
		db	66h
		LIDT	fword ptr cs:[_IdtSave] ;restore IDT

		mov	eax,cs:[_Cr2Save]	;restore CR2
		mov	cr2,eax
		mov	eax,cs:[_Cr3Save]	;restore CR3
		mov	cr3,eax

		mov	esp,cs:[_EspSave]
		mov	eax,cs:[_EaxSave]
		mov	ebx,cs:[_EbxSave]
		mov	ecx,cs:[_EcxSave]
		mov	edx,cs:[_EdxSave]
		mov	esi,cs:[_EsiSave]
		mov	edi,cs:[_EdiSave]

		RSM
ENDIF;	COMPILE_FOR_CYRIXSMI EQ 3

