[OpenBIOS] r801 - dev/geode
svn at openbios.org
svn at openbios.org
Thu Jan 31 20:01:36 CET 2008
Author: wmb
Date: 2008-01-31 20:01:35 +0100 (Thu, 31 Jan 2008)
New Revision: 801
Modified:
dev/geode/smi.fth
Log:
Geode SMI handler - Added PCI config space virtualization.
Modified: dev/geode/smi.fth
===================================================================
--- dev/geode/smi.fth 2008-01-31 17:27:36 UTC (rev 800)
+++ dev/geode/smi.fth 2008-01-31 19:01:35 UTC (rev 801)
@@ -168,6 +168,11 @@
defer handle-smi ' noop is handle-smi
create smm-exec ] handle-smi smi-return [
+: enable-virtual-pci ( -- )
+ h# 5000.2012 msr@ swap h# 8002 or swap h# 5000.2012 msr! \ Virtualize devices f and 1
+ h# 5000.2002 msr@ swap 8 invert and swap h# 5000.2002 msr! \ Enable SSMI for config accesses
+;
+
: setup-smi ( -- )
\ This is how you would map the SMM region to physical memory at 4000.0000
\ This is a Base Mask Offset descriptor - the base address
@@ -208,14 +213,58 @@
up@ smm-forth-up +smm l!
h# 800 +smm smi-sp0 !
h# c00 +smm smi-rp0 !
+
+ enable-virtual-pci
;
: smi-interact ( -- ) ." In SMI" cr quit ;
' smi-interact is handle-smi
-: enable-virtual-pci ( -- )
- h# 5000.2012 msr@ swap h# 8002 or swap h# 5000.2002 msr! \ Virtualize devices f and 1
- h# 5000.2002 msr@ swap 8 invert and swap h# 5000.2002 msr! \ Enable SSMI for config accesses
+: smm-cs-base ( -- l ) smm-header h# 1c - +smm l@ ;
+: smm-eip ( -- l ) smm-header h# 10 - +smm l@ ;
+: smm-next-eip ( -- l ) smm-header h# 14 - +smm l@ ;
+: smm-flags ( -- w ) smm-header h# 24 - +smm w@ ;
+: smm-io-port ( -- port# ) smm-header h# 28 - +smm w@ ;
+: smm-io-size ( -- size ) smm-header h# 26 - +smm w@ ;
+: smm-io-data ( -- data ) smm-header h# 2c - +smm l@ ;
+: smm-config-adr ( -- adr )
+ smm-sp +smm w@ +smm la1+ @ h# 7fff.fffc and
+ smm-io-port 3 and or
;
+: smm-eax ( -- adr ) smm-sp +smm w@ +smm 9 la+ ;
+: vr-spoof? ( -- handled? ) false ;
+: config-spoof? ( -- handled? )
+ smm-io-port 3 invert and h# cfc <> if false exit then
+
+ \ The existing Forth config spoofer does the hard work
+ smm-flags 2 and if \ Write
+ smm-io-data smm-config-adr ( data config-adr )
+ smm-io-size case
+ 1 of config-b! endof
+ 3 of config-w! endof
+ f of config-l! endof
+ endcase
+ else
+ smm-config-adr ( config-adr )
+ smm-io-size case
+ 1 of config-b@ smm-eax c! endof
+ 3 of config-w@ smm-eax w! endof
+ f of config-l@ smm-eax l! endof
+ endcase
+ then
+ true
+;
+: virtualize-io ( -- )
+ smm-flags h# 80 and 0= if exit then
+ config-spoof? if exit then
+ vr-spoof? if exit then
+;
+: soft-smi smi-interact ;
+: smi-dispatch ( -- )
+ smm-flags h# 80 and if virtualize-io then
+ smm-flags h# 8 and if soft-smi then
+;
+' smi-dispatch is handle-smi
+
code smi smint c;
More information about the OpenBIOS
mailing list