[OpenBIOS] r800 - dev/geode
svn at openbios.org
svn at openbios.org
Thu Jan 31 18:27:36 CET 2008
Author: wmb
Date: 2008-01-31 18:27:36 +0100 (Thu, 31 Jan 2008)
New Revision: 800
Modified:
dev/geode/smi.fth
Log:
Geode SMI handler - cleaned up the return from 32-bit to 16-bit mode.
Modified: dev/geode/smi.fth
===================================================================
--- dev/geode/smi.fth 2008-01-31 10:15:58 UTC (rev 799)
+++ dev/geode/smi.fth 2008-01-31 17:27:36 UTC (rev 800)
@@ -13,7 +13,7 @@
h# 1000 constant smm-size \ We use about 3K of this, 2K for stacks
: +smm ( offset -- adr ) smm-base + ;
-h# 28 constant /smm-gdt
+h# 30 constant /smm-gdt
\ The handler code takes about h# 140 bytes
@@ -43,10 +43,10 @@
: set-smm-descs ( -- )
\ smm-base -1 code32 format-descriptor smm-gdt 8 + +smm d! \ Boosted code32
- smm-base smm-size 1- code16 h# 08 set-descr
- smm-base smm-size 1- data16 h# 10 set-descr
- 0 -1 code32 h# 18 set-descr
- 0 -1 data32 h# 20 set-descr
+ smm-base smm-size 1- code16 h# 10 set-descr
+ smm-base smm-size 1- data16 h# 18 set-descr
+ 0 -1 code32 h# 20 set-descr
+ 0 -1 data32 h# 28 set-descr
/smm-gdt 1- smm-gdtp +smm w! \ GDT limit
smm-gdt +smm smm-gdtp +smm wa1+ l! \ GDT base
;
@@ -58,14 +58,15 @@
16-bit
cs: ds smm-save-seg d# 00 + #) svdc
- cs: smm-gdt h# 10 + #) ds rsdc \ Now we have a data segment
+ cs: smm-gdt h# 18 + #) ds rsdc \ GDT reference
+ \ Now we can use the data segment
es smm-save-seg d# 10 + #) svdc
fs smm-save-seg d# 20 + #) svdc
gs smm-save-seg d# 30 + #) svdc
ss smm-save-seg d# 40 + #) svdc
cs smm-save-seg d# 50 + #) svdc \ So we can get back to the boost segment
- smm-gdt h# 10 + #) ss rsdc
+ smm-gdt h# 18 + #) ss rsdc \ GDT reference
op: sp smm-save-esp #) mov
smm-stack # sp mov \ Now we have a stack
@@ -85,11 +86,11 @@
op: smm-gdtp #) lgdt
cr0 ax mov 1 # al or ax cr0 mov \ Enter protected mode
- op: here 7 + smm-handler - +smm h# 18 #) far jmp
+ op: here 7 + smm-handler - +smm h# 20 #) far jmp \ GDT reference
32-bit
\ Reload segment registers with protected mode bits
- op: h# 20 # ax mov
+ op: h# 28 # ax mov \ GDT reference
ax ds mov ax es mov ax fs mov ax gs mov ax ss mov
\ Turn on paging
@@ -131,16 +132,14 @@
\ Turn off paging
cr0 ax mov h# 8000.0000 invert # ax and ax cr0 mov \ Turn off Paging Enable bit
- cr0 ax mov 1 invert # al and ax cr0 mov \ Enter real mode
-
- \ Return to the boosted code-16 address space
- smm-save-seg d# 50 + +smm #) cs rsdc
+ here 7 + smm-handler - h# 08 #) far jmp \ Get into the boosted segment
16-bit
- op: here 5 + smm-base - #) jmp \ Decrease IP while increasing the segment register
+ cr0 ax mov 1 invert # al and ax cr0 mov \ Exit protected mode
+
\ Reload data segment registers
- cs: smm-gdt h# 10 + #) ss rsdc
- cs: smm-gdt h# 10 + #) ds rsdc
+ cs: smm-gdt h# 18 + #) ss rsdc \ GDT reference
+ cs: smm-gdt h# 18 + #) ds rsdc \ GDT reference
op: smm-save-gdt #) lgdt
@@ -186,11 +185,7 @@
h# 000ff.0.00.000ff.1.01. h# 180e msr!
\ Base Limit
-\ smm-base smm-size 1- h# 133b msr!
- \ The limit here must be large enough to cover the code address
- \ between the time that we reenter real mode and the time we
- \ reestablish the boosted descriptor.
- smm-base -1 h# 133b msr! \ Big limit
+ smm-base smm-size 1- h# 133b msr!
smm-base smm-header + 0 h# 132b msr! \ Offset of SMM Header
More information about the OpenBIOS
mailing list