[openfirmware] r1477 - cpu/x86/pc cpu/x86/pc/olpc cpu/x86/pc/olpc/via dev/geode dev/via

svn at openfirmware.info svn at openfirmware.info
Fri Nov 13 23:53:08 CET 2009


Author: wmb
Date: 2009-11-13 23:53:08 +0100 (Fri, 13 Nov 2009)
New Revision: 1477

Modified:
   cpu/x86/pc/biosints.fth
   cpu/x86/pc/olpc/security.fth
   cpu/x86/pc/olpc/via/addrs.fth
   cpu/x86/pc/olpc/via/sound.fth
   dev/geode/smi.fth
   dev/via/smi.fth
Log:
OLPC trac 9486 - Suite of fixes to the SMI handler and related BIOS emulation code.



Modified: cpu/x86/pc/biosints.fth
===================================================================
--- cpu/x86/pc/biosints.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ cpu/x86/pc/biosints.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -1,7 +1,7 @@
 purpose: Emulate legacy PC BIOS real-mode INTs
 \ See license at end of file
 
-8 /l* buffer: init-regs
+/rm-regs buffer: init-regs
 h# 80 value bios-boot-dev#
 
 : rm-es@  caller-regs >rm-es w@  ;
@@ -60,10 +60,24 @@
 
 : rm-si@  caller-regs >rm-esi w@  ;
 
+[ifdef] >rm-retaddr
 : rm-retaddr@  caller-regs >rm-retaddr seg:off@  ;
+[then]
+[ifdef] >rm-eip
+\ : rm-retaddr@  caller-regs >rm-eip @  ;
+: rm-caller-sp  caller-regs >rm-esp @  caller-regs >rm-ss w@  seg:off>  ;
+: rm-retaddr@  rm-caller-sp seg:off@  ;
+: .rm-stack  rm-caller-sp h# 40 wdump  ;
+[then]
 
+[ifdef] >rm-flags
 : rm-flags@  caller-regs >rm-flags w@  ;
 : rm-flags!  caller-regs >rm-flags w!  ;
+[then]
+[ifdef] >rm-eflags
+: rm-flags@  caller-regs >rm-eflags @  ;
+: rm-flags!  caller-regs >rm-eflags !  ;
+[then]
 
 : rm-set-cf  rm-flags@  1 or  rm-flags!  ;
 : rm-clr-cf  rm-flags@  1 invert and  rm-flags!  ;
@@ -110,7 +124,9 @@
 
 : set-mode3  ( -- )
    text-off  \ Stop using OFW screen output
+[ifdef] smi-access-fb  smi-access-fb  [then]
    " text-mode3" screen-ih $call-method
+[ifdef] smi-unaccess-fb  smi-unaccess-fb  [then]
 ;
 \ VBE status: AL = 4f -> function supported  else not supported
 \ AH = 0: success  1: fail  2: not supported in this config  3: invalid in this mode
@@ -401,8 +417,10 @@
 ;
 
 : set-mode12  ( -- )
+   text-off  \ Stop using OFW output to screen
+[ifdef] smi-access-fb  smi-access-fb  [then]
    " graphics-mode12" " screen-ih" eval $call-method
-   text-off  \ Stop using OFW output to screen
+[ifdef] smi-unaccess-fb  smi-unaccess-fb  [then]
 ;
 : set-video-mode  ( mode -- )
    case
@@ -781,7 +799,7 @@
 
 : get-conf  ( -- )
    sysconf rm-buf 8 move
-   rm-buf >seg:off  0 rm-es!  rm-bx! 
+   rm-buf >seg:off  rm-es!  rm-bx! 
    0 rm-ax!
 ;
 
@@ -792,10 +810,19 @@
    endcase
 ;
 
+: gate-a20  ( -- )
+   rm-al@ case
+      h# 00 of  rm-set-cf          endof  \ Disable - We don't support disabling A20
+      h# 01 of  0 rm-ah!           endof  \ Enable  - We always leave it enabled, so return OK (00) status
+      h# 02 of  1 rm-ax!           endof  \ Status  - Enabled (01) in AL , OK (00) in AH
+      h# 03 of  1 rm-bx! 0 rm-ah!  endof  \ Which   - Port92 (01) in BX, OK (00) in AH
+   endcase
+;
 : system-int  ( -- )  \ INT 15 handler
    noshow
    rm-clr-cf
    rm-ah@ case
+      h# 24 of  gate-a20   endof
       h# 91 of  noshow 0 rm-ah!  endof   \ "pause" while waiting for I/O
 noop
       h# 53 of  apm  endof
@@ -1061,17 +1088,18 @@
    loaded is-mbr?  if
       prep-rm
       loaded mbr-base swap move
-\      init-regs /sregs+gregs erase
-      \ XXX
+      init-regs /rm-regs erase
       bios-boot-dev#  init-regs >rm-edx c!   \ DL
       exit
    then
    init-program
 ;
+defer rm-go-hook ' noop to rm-go-hook
 \ " rm-go"  ' boot-command  set-config-string-default
 : execute-buffer  ( adr len -- )
    rm-prepped?  if      ( adr len )
       2drop             ( )
+      rm-go-hook
 \     usb-quiet         ( )
       init-regs mbr-base rm-run   ( )
       exit  \ Precautionary; rm-run shouldn't return
@@ -1141,8 +1169,10 @@
    " xp" device-name
    : open
       bypass-bios-boot?  if  false exit  then
-      " sd:1" ntfs?  if
-         " sd:0" set-hd-boot
+      " ext:1" ntfs?  if
+         " ext:0" set-hd-boot
+     " sound-end" evaluate
+
          true exit
       then
       false
@@ -1185,10 +1215,13 @@
 
 label xx  h# 99 # al mov  al h# 80 # out  begin again  end-code
 here xx - constant /xx
+: @.w  ( -- )  w@ 5 u.r  ;
+: @.l  ( -- )  @ 9 u.r  ;
 : put-xx  ( adr -- )  xx swap /xx move  ;
 : .lreg  ( adr -- adr' )  4 -  dup l@ 9 u.r   ;
 : .wreg  ( adr -- adr' )  2 -  dup w@ 5 u.r   ;
 : .caller-regs  ( -- )
+[ifdef] >rm-retaddr
    ."        AX       CX       DX       BX       SP       BP       SI       DI" cr
    caller-regs >rm-eax 4 +  8 0 do  .lreg  loop  cr
    cr
@@ -1197,6 +1230,27 @@
    drop
    rm-retaddr@ 9 u.r  2 spaces
    rm-flags@ 5 u.r cr
+[else]
+   ."        AX       BX       CX       DX       BP       SI       DI       SP" cr
+   caller-regs >rm-eax @.l
+   caller-regs >rm-ebx @.l
+   caller-regs >rm-ecx @.l
+   caller-regs >rm-edx @.l
+   caller-regs >rm-ebp @.l
+   caller-regs >rm-esi @.l
+   caller-regs >rm-edi @.l
+   caller-regs >rm-esp @.l
+   cr cr
+   ."    CS   DS   ES   FS   GS   SS       PC  FLAGS" cr
+   caller-regs >rm-cs @.w
+   caller-regs >rm-ds @.w
+   caller-regs >rm-es @.w
+   caller-regs >rm-fs @.w
+   caller-regs >rm-gs @.w
+   caller-regs >rm-ss @.w
+   rm-retaddr@ 9 u.r  2 spaces
+   rm-flags@ 5 u.r cr
+[then]
 ;
 
 : egadump  ( -- )

Modified: cpu/x86/pc/olpc/security.fth
===================================================================
--- cpu/x86/pc/olpc/security.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ cpu/x86/pc/olpc/security.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -3,6 +3,15 @@
 
 \ Specs at http://wiki.laptop.org/go/Firmware_Security
 
+patch noop suspend-interact suspend
+
+: rm-chain-visible  ( -- )
+   [ ' rm-go-hook behavior compile, ]  \ Chain to old behavior
+   visible
+;
+' rm-chain-visible to rm-go-hook
+
+
 : ?unfreeze  ( -- )
    game-key@ button-check and  if
      frozen?  if  unfreeze  visible banner  then

Modified: cpu/x86/pc/olpc/via/addrs.fth
===================================================================
--- cpu/x86/pc/olpc/via/addrs.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ cpu/x86/pc/olpc/via/addrs.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -73,6 +73,11 @@
 h# e01c0 constant dbgp-adr
 h# e0200 constant madt-adr  \ MADT is 5a bytes long
 h# e0280 constant hpet-adr
+
+h# e1000 constant smm-sp0
+h# e1400 constant smm-rp0
+h# e1800 constant smm-gdt
+
 h# fc000 constant dsdt-adr
 h# fd000 constant ssdt-adr
 
@@ -82,6 +87,8 @@
 h# fff48 constant video-mode-adr  \ Saves display mode for resume code
 \ h# fff4c constant next-adr
 
+h# fff80 constant 'int10-dispatch
+
 h#  4fff constant native-mode#
 
 h#  3e.0000 constant inflate-base

Modified: cpu/x86/pc/olpc/via/sound.fth
===================================================================
--- cpu/x86/pc/olpc/via/sound.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ cpu/x86/pc/olpc/via/sound.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -1,8 +1,16 @@
-: audio-quiet  ( -- )
-   [ ' go-hook behavior compile, ]    \ Chain to old behavior
+: close-audio  ( -- )
    audio-ih  if
       audio-ih close-dev
       0 to audio-ih
    then
 ;
+: audio-quiet  ( -- )
+   [ ' go-hook behavior compile, ]    \ Chain to old behavior
+   close-audio
+;
 ' audio-quiet to go-hook
+: xp-wait-audio  ( -- )
+   [ ' rm-go-hook behavior compile, ]  \ Chain to old behavior
+   sound-end  close-audio
+;
+' xp-wait-audio to rm-go-hook

Modified: dev/geode/smi.fth
===================================================================
--- dev/geode/smi.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ dev/geode/smi.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -1319,4 +1319,4 @@
   4 field >rm-eax
   4 field >rm-retaddr
   2 field >rm-flags
-drop
+constant /rm-regs

Modified: dev/via/smi.fth
===================================================================
--- dev/via/smi.fth	2009-11-13 22:51:37 UTC (rev 1476)
+++ dev/via/smi.fth	2009-11-13 22:53:08 UTC (rev 1477)
@@ -60,14 +60,14 @@
 : pm-data  ( offset "name" -- offset' )  +smm constant  ;
 
 \ Layout of SMM memory area:
-h# 8000 smm-data smm-gdt         \ Entry/exit handler code at the entry offset
+\ h# 8000 smm-data smm-gdt         \ Entry/exit handler code at the entry offset
                                  \ The GDT is embedded in the code wad
                                  \ The handler code takes about h# 160 bytes
 
-h# f400 pm-data smm-sp0          \ SMM Forth data   stack - h# 400 bytes
-h# f800 pm-data smm-rp0          \ SMM Forth return stack - h# 400 bytes
+\ h# f400 pm-data smm-sp0          \ SMM Forth data   stack - h# 400 bytes
+\ h# f800 pm-data smm-rp0          \ SMM Forth return stack - h# 400 bytes
 
-h# fc00  pm-data 'int10-dispatch \ Array of instruction sequences for bouncing INTs through SMI
+\ h# fc00  pm-data 'int10-dispatch \ Array of instruction sequences for bouncing INTs through SMI
 
 \ fcxx - fcff available
 
@@ -123,8 +123,11 @@
 h# ff70 smm-data smm-gs-base
 h# ff74 smm-data smm-gs-access
 
+h# ff78 smm-data smm-ldtr-limit
+h# ff7c smm-data smm-ldtr-base
+h# ff80 smm-data smm-ldtr-access
+
 h# ff84 smm-data smm-gdtr-limit
-
 h# ff88 smm-data smm-gdtr-base
 h# ff8c smm-data smm-gdtr-access
 
@@ -159,15 +162,53 @@
 h# fff8 smm-data smm-cr3
 h# fffc smm-data smm-cr0
 
+\ Layout of saved registers, used by biosints.fth
+
+: caller-regs  ( -- adr )  smm-es +smm  ;
+
+0 value rm-regs
+
+struct
+  4 field >rm-es
+  4 field >rm-cs
+  4 field >rm-ss
+  4 field >rm-ds
+  4 field >rm-fs
+  4 field >rm-gs
+  d# 16 +  \ LDTR, TR, DR7, DR6
+  4 field >rm-eax
+  4 field >rm-ecx
+  4 field >rm-edx
+  4 field >rm-ebx
+  4 field >rm-esp
+  4 field >rm-ebp
+  4 field >rm-esi
+  4 field >rm-edi
+  4 field >rm-eip
+  4 field >rm-eflags
+constant /rm-regs
+
 \ The basic SMI gateway.  This code lives at (is copied to) smm-base + h# 8000.
 \ It executes when the processor enters System Management Mode (SMM)
 \ for whatever reason.  It saves a bunch of state, sets up the world
 \ so Forth code can run (in 32-bit protected mode), and runs the Forth
 \ handler - typically "smi-dispatch" (via smm-exec and handle-smi).
 
+create smm-gdt-template
+   /smm-gdt 1- w,   smm-gdt l,       \ GDT pointer - limit.w base.l
+   0 w,
+
+   smm-base smm-size 1- code16 format-descriptor  swap l, l,  \  8 - smm-c16
+   smm-base smm-size 1- data16 format-descriptor  swap l, l,  \ 10 - smm-d16
+   0                 -1 code32 format-descriptor  swap l, l,  \ 18 - smm-c32
+   0                 -1 data32 format-descriptor  swap l, l,  \ 20 - smm-d32
+   \ End of GDT
+
+
 label smi-handler
    16-bit
-  
+
+0 [if]
    \ GDT (with jump tucked in at the beginning)
    \ We put the GDT right at the beginning and use the first entry (which
    \ cannot be used as a selector) for a 2-byte jmp and the 6-byte GDT pointer
@@ -180,14 +221,19 @@
    0                 -1 code32 format-descriptor  swap l, l,  \ 18 - smm-c32
    0                 -1 data32 format-descriptor  swap l, l,  \ 20 - smm-d32
    \ End of GDT
+[then]
 
    cs ax mov  ax ds mov
 
 wbinvd
 
+0 [if]
 \ Get into protected mode using the same segments 
 \ Don't bother with the IDT; we won't enable interrupts
    op: smm-gdt 2+ #) lgdt
+[else]
+   ad: op: smm-gdt smm-base - #) lgdt
+[then]
 
 \ ascii a report
 
@@ -262,6 +308,7 @@
 here smi-handler - constant /smi-handler
 
 : smm@  ( offset -- n )  +smm @  ;
+: smm!  ( n offset -- )  +smm !  ;
 
 \ Address of segment registers
 : 'smm-eax  ( -- adr )  smm-eax +smm  ;
@@ -272,19 +319,43 @@
    rshift  h# ffc and + l@
    dup h# fff invert and  swap 1 and 0=
 ;
+\ Finds a page table or page directory entry
+\ Implementation factor of (smm>physical)
+: >ptable64  ( table vadr shift -- table' unmapped? )
+   rshift  h# ff8 and + l@               \ Ignore high word for now
+   dup h# fff invert and  swap 1 and 0=
+;
 
 \ Converts a virtual address to a physical address via the page tables
 \ This is used by debugging tools, so that we can look at OS resources
 \ via their virtual addresses while we are running with paging disabled.
 \ XXX need to handle mapped-at-pde-level
 defer smm>physical
+: ?unmapped  ( unmapped? -- )
+\  abort" Unmapped"  
+   if   ." Unmapped " debug-me  then  
+;
+: vadr>pframe64  ( vadr pdpt -- padr )
+   over d# 27 >ptable64  ?unmapped  ( vadr pdir )
+   over d# 18 >ptable64  ?unmapped  ( vadr ptab )
+   over d#  9 >ptable64  ?unmapped  ( vadr pframe )
+;
+: vadr>pframe32  ( vadr pdir -- vadr pframe )
+   over d# 20 >ptable  ?unmapped  ( vadr ptab )
+   over d# 10 >ptable  ?unmapped  ( vadr pframe )
+;
+
 : (smm>physical)  ( vadr -- padr )
-\   smm-cr0 smm@  h# 8000.0000 and  0=  if  exit  then
-   cr3@                                  ( vadr pdir )
-   over d# 20 >ptable  abort" Unmapped"  ( vadr ptab )
-   over d# 10 >ptable  abort" Unmapped"  ( vadr pframe )
+   smm-cr3 smm@                          ( vadr pdir )
+   smm-cr4 smm@ h# 20 and  if  \ Physical Address Extension enabled
+      vadr>pframe64
+   else
+      vadr>pframe32
+   then
    swap h# fff and +
+
 ;
+
 ' (smm>physical) to smm>physical
 
 : smm-map?  ( vadr -- )  smm>physical  .  ;
@@ -335,18 +406,25 @@
 \ bios-int-smi is for accesses to the 0x30..0x3f I/O port bank that we "steal" for
 \ bouncing BIOS INTs into SMM.
 
+: caller-32bit?  ( -- flag )  smm-cs-access smm@ h# 4000 and  ;
+
+: caller-sp  ( -- laddr )
+   caller-32bit?  if  smm-esp smm@  else  rm-sp  then
+;
+
 : bios-int-smi  ( -- )
+   caller-32bit?  if  noop exit  then
    \ Handle BIOS INTs that were bounced into SMM by accessing
    \ I/O ports 0x30..0x3f
    h# 58 acpi-w@  dup h# fff0 and  h# 30  =  if   \ Via
       h# 20 -  to rm-int@
-      rm-sp la1+ >caller-physical w@  smm-eflags +smm w!
+      caller-sp la1+ >caller-physical w@  smm-eflags +smm w!
       \ Bias by -2 to point to INT instruction
 [ifdef] notyet
-      rm-sp >caller-physical l@ 2-  smm-retaddr l!
+      rm-sp >caller-physical l@ 2-  smm-eip l!
 [then]
       handle-bios-call
-      smm-eflags +smm w@  rm-sp la1+ >caller-physical w!
+      smm-eflags +smm w@  caller-sp la1+ >caller-physical w!
       exit
    else
       drop
@@ -363,12 +441,9 @@
 \ It's used to implement the ACPI "resume from S3" semantics that
 \ require jumping to a given address in real mode.
 
--1 value rm-entry-adr
-0 value rm-regs
-
 : #smint  ( n -- )  h# 2f acpi-b!  ;  \ Via
 
-: rm-run  ( 'gregs eip -- )  to rm-entry-adr  to rm-regs  h# f0 #smint  ;
+: rm-run  ( 'gregs eip -- )  swap to rm-regs  rm-regs >rm-eip !  h# f0 #smint  ;
 
 defer suspend-devices  ' noop to suspend-devices
 defer resume-devices   ' noop to resume-devices
@@ -454,50 +529,60 @@
 : l!++  ( adr l -- adr' )  over l!  la1+  ;
 : w!++  ( adr w -- adr' )  over w!  wa1+  ;
 
-[ifdef] notyet
-code rm-lidt  ( -- )  smm-rmidt #) lidt  c;
-[then]
-
 \ rm-setup fudges the saved SMM state so that, instead of returning
 \ to the context that invoked the SMI, the next exit from SMM returns
 \ to the address "eip" in real mode.  This is an implementation
 \ factor of the "rm-run" mechanism.
 
+: set-segment  ( base limit access 'seg-save -- )
+   >r               ( base limit access )
+   r@ 8 + smm!      ( base limit )  \ Set access rights field
+   r@ smm!          ( base )        \ Set limit field
+   r> 4 + smm!      ( )       \ Set base field
+;
+: set-data-segment  ( base 'seg-save -- )
+   \   >r  h# ffff  h# 4093  r> set-segment
+   >r  h# ffffffff  h# 0092  r> set-segment
+;
+
 : rm-setup  ( -- )
-[ifdef] notyet
-   rm-entry-adr >seg:off 2>r    ( off seg )
+   rm-regs >rm-eip @  >seg:off  ( off seg )
+   swap smm-eip smm!            ( seg )
+   dup smm-cs smm!              ( seg )
+   4 lshift h# ffff  h# 009a  smm-cs-limit set-segment
 
-   smm-header h# 30 - ( adr )
-   h#      38  l!++ ( adr' ) \ SMM_CTL
-   0           l!++ ( adr' ) \ I/O DATA
-   0           l!++ ( adr' ) \ I/O ADDRESS, I/O SIZE
-   h#  938009  l!++ ( adr' ) \ SS_FLAGS, SMM Flags
-   h#    ffff  l!++ ( adr' ) \ CS_LIMIT
-   r@ 4 lshift l!++ ( adr' ) \ CS_BASE
+   rm-regs >rm-ds w@  dup smm-ds-limit set-data-segment   smm-ds smm!
+   rm-regs >rm-es w@  dup smm-es-limit set-data-segment   smm-es smm!
+   rm-regs >rm-fs w@  dup smm-fs-limit set-data-segment   smm-fs smm!
+   rm-regs >rm-gs w@  dup smm-gs-limit set-data-segment   smm-gs smm!
+   rm-regs >rm-ss w@  dup smm-ss-limit set-data-segment   smm-ss smm!
 
-   r> h# 9a wljoin l!++ ( adr' ) \ CS_FLAGS.CS_INDEX
-   r>          l!++ ( adr' ) \ NEXT_IP
-   0           l!++ ( adr' ) \ CURRENT_IP
-   h# 10       l!++ ( adr' ) \ CR0
-   h# 2        l!++ ( adr' ) \ EFLAGS
-   h# 400      l!++ ( adr' ) \ DR7
-   drop
+   0 h#  3ff h# 82  smm-idtr-limit  set-segment
+   0 h# ffff h# 83  smm-tr-limit    set-segment     0 smm-tr   smm!
+   0       0 h# 82  smm-ldtr-limit  set-segment     0 smm-ldtr smm!   
 
-   0 smm-esp +smm  l!
+   \ gdtr - leave alone, GDT shouldn't matter in real mode
+   \ cr3  - leave alone, PDE base shouldn't matter with paging disabled
 
-   smm-save-seg +smm
-   h# ffff l!++  h# 9300 l!++  0 w!++  \ DS
-   h# ffff l!++  h# 9300 l!++  0 w!++  \ ES
-   h# ffff l!++  h# 9300 l!++  0 w!++  \ FS
-   h# ffff l!++  h# 9300 l!++  0 w!++  \ GS
-   h# ffff l!++  h# 9300 l!++  0 w!++  \ SS
-   drop
+   h#       10  smm-cr0    smm!  \ Paging and Protected Mode off
+   h#       10  smm-cr4    smm!  \ Page size extension on
+   h# ffff0ff0  smm-dr6    smm!  \ Value after init (status register)
+   h#      400  smm-dr7    smm!  \ Value after init - no breakpoints set
 
-   h# ffff smm-rmidt w!  0 smm-rmidt wa1+ l!  \ Limit and base
+   0 smm-tr smm!
 
-   \ Interrupts are off because we are in SMM
-   rm-lidt
-[then]
+   0 smm-io-restart smm!  \ Clear IO-restart and HLT-restart
+
+   rm-regs >rm-eflags @  2 or  smm-eflags smm!  \ 2 bit is "Must Be One"
+
+   rm-regs >rm-esp @  smm-esp smm!
+   rm-regs >rm-eax @  smm-eax smm!
+   rm-regs >rm-ebx @  smm-ebx smm!
+   rm-regs >rm-ecx @  smm-ecx smm!
+   rm-regs >rm-edx @  smm-edx smm!
+   rm-regs >rm-ebp @  smm-ebp smm!
+   rm-regs >rm-esi @  smm-esi smm!
+   rm-regs >rm-edi @  smm-edi smm!
 ;
 \ : rm-init-program   ( eip -- )  rm-init-program  rm-return  ;
 
@@ -509,12 +594,11 @@
    smi-debug?  if  ." SOFT" cr  then
    h# 2f acpi-b@ h# f0 =  if
       rm-setup
-      -1 to rm-entry-adr
       exit
    then
 
 [ifdef] notyet
-   smm-pc smm-retaddr l!   \ So .caller-regs will work
+   smm-pc smm-eip l!   \ So .caller-regs will work
    sbpadr @  if
       sbpadr @ smm>physical  smm-pc smm>physical <>  if
          ." Not at SMI breakpoint!" cr
@@ -633,6 +717,12 @@
    0 #smint                                   \ Trigger SMI
 ;
 
+: smi-access-fb  ( -- )
+   h#  383 config-b@ 2 or h#  383 config-b!   \ Direct SMM mode data accesses to A/Bxxxx range to frame buffer
+;
+: smi-unaccess-fb  ( -- )
+   h#  383 config-b@ 2 invert and h#  383 config-b!   \ Restore SMM mode data accesses to A/Bxxxx range to memory
+;
 \ Call this to enable SMI support
 : setup-smi  ( -- )
    h#  383 config-b@ 1 or h#  383 config-b!   \ Enable A/Bxxxx range as memory instead of frame buffer
@@ -650,6 +740,7 @@
    smm-sp0 smm-save-sp0 !
    smm-rp0 smm-save-rp0 !
 
+   smm-gdt-template  smm-gdt  /smm-gdt  move
    smi-handler  smm-base +smm-offset  /smi-handler  move
 
    \ Relocate the code field of the code word that is embedded in the sequence
@@ -667,27 +758,3 @@
    4 4 acpi-w!                                \ Trigger BIOS Release
 ;
 [then]
-
-\ Layout of saved registers, used by biosints.fth
-
-: caller-regs  ( -- adr )  smm-es +smm  ;
-
-struct
-  4 field >rm-es
-  4 field >rm-cs
-  4 field >rm-ss
-  4 field >rm-ds
-  4 field >rm-fs
-  4 field >rm-gs
-  d# 16 +  \ LDTR, TR, DR7, DR6
-  4 field >rm-eax
-  4 field >rm-edx
-  4 field >rm-ecx
-  4 field >rm-ebx
-  4 field >rm-exx
-  4 field >rm-ebp
-  4 field >rm-esi
-  4 field >rm-edi
-  4 field >rm-retaddr  \ EIP
-  4 field >rm-flags
-drop




More information about the openfirmware mailing list