[OpenBIOS] r798 - dev/geode

svn at openbios.org svn at openbios.org
Thu Jan 31 06:16:57 CET 2008


Author: wmb
Date: 2008-01-31 06:16:56 +0100 (Thu, 31 Jan 2008)
New Revision: 798

Modified:
   dev/geode/smi.fth
Log:
Geode SMI handler - first working version.



Modified: dev/geode/smi.fth
===================================================================
--- dev/geode/smi.fth	2008-01-31 02:37:24 UTC (rev 797)
+++ dev/geode/smi.fth	2008-01-31 05:16:56 UTC (rev 798)
@@ -19,7 +19,9 @@
 dup constant smm-save-gdt 8 +
 dup constant smm-gdtp     8 +
 dup constant smm-gdt      /smm-gdt +
-dup constant smm-pdir     4 +
+dup constant smm-pdir     la1+
+dup constant smm-forth-origin  la1+
+dup constant smm-forth-up      la1+
 
 dup constant smm-code16  h# a +
 dup constant smm-data16  h# a +
@@ -31,7 +33,8 @@
 dup constant smm-gs      h# a +
 dup constant smm-ss      h# a +
 dup constant smm-cs      h# a +
-dup constant smm-esp     4 +
+dup constant smm-esp     la1+
+dup constant smm-sp      wa1+
 drop
 
 : set-descr  ( base limit d.type sel offset -- )
@@ -48,10 +51,19 @@
    smm-base smm-size 1- data16 h# 18 smm-data16 set-descr
    0 -1 code32 h# 20 smm-code32 set-descr
    0 -1 data32 h# 28 smm-data32 set-descr
-   /smm-gdt 1-   smm-gdtp +smm 4 + w!   \ GDT limit
-   smm-gdt +smm  smm-gdtp +smm l!       \ GDT base
+   /smm-gdt 1-   smm-gdtp +smm w!   \ GDT limit
+   smm-gdt +smm  smm-gdtp +smm wa1+ l!  \ GDT base
 ;
 
+nuser smi-sp0
+nuser smi-rp0
+defer smi-return
+: smi-exec  ( -- )
+   ." Forth SMI handler" cr
+   quit
+   smi-return
+;
+
 label smm-handler
    16-bit
 
@@ -74,6 +86,7 @@
    op: ax         push
 
    cr3 ax mov  op: ax push
+   sp  smm-sp #)  mov
 
 \ ---
 \ Get into protected mode using the same segments 
@@ -105,21 +118,42 @@
    ax cr3  mov	\ Set Page Directory Base Register
    cr0 ax mov  h# 8000.0000 # ax or  ax cr0 mov	 \ Turn on Paging Enable bit
 
+\ Beginning of Forth-specific stuff
+   smm-forth-origin +smm #)  bx  mov
+   smm-forth-up     +smm #)  up  mov
 
-\   op:  here 7 + smm-handler - smm-base +  h# 20 #)  far jmp
-\   op:  here 7 + smm-handler -   8 #)  far jmp
+   \ Exchange the stack and return stack pointer with the smi versions
+   'user sp0  sp  mov
+   'user rp0  rp  mov
 
-\ Put Forth stuff here  
+   'user smi-sp0  sp  xchg
+   'user smi-rp0  rp  xchg
 
-\   smm-code16 +smm #)  cs  rsdc
-\   smm-code16 +smm #)  cs  rsdc   \ 64K boosted
+   sp  'user sp0  mov
+   rp  'user rp0  mov
 
-   nop nop nop nop nop nop nop nop nop nop 
+   \ Set the interpreter pointer
+   'body smi-exec origin - # ip mov
+   bx ip add				\ add current origin
 
+   cld
+c;
+code (smi-return)
+   \ Exchange the stack and return stack pointer with the smi versions
+   'user sp0  sp  mov
+   'user rp0  rp  mov
+
+   'user smi-sp0  sp  xchg
+   'user smi-rp0  rp  xchg
+
+   sp  'user sp0  mov
+   rp  'user rp0  mov
+
+\ End of Forth-specific stuff
+
    \ 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
    here 2 + #) jmp
 
@@ -136,10 +170,10 @@
 
 \ >Test
 
-
    op: smm-save-gdt #) lgdt
 
 \ ---
+   smm-sp #)  sp  mov
    op: ax pop  ax cr3 mov
 
    op: ax        pop
@@ -183,9 +217,21 @@
    smm-base dup  smm-size  -1 mmu-map
 
    smm-handler smm-base  /smm-handler  move
+
+   ['] (smi-return) smm-handler -  +smm  ( cfa-adr )
+   dup ta1+ swap token!
+
    set-smm-descs
    cr3@ smm-pdir +smm l!
+   origin smm-forth-origin +smm l!
+   up@ smm-forth-up +smm l!
+   h# 1000 +smm smi-sp0 !
+   h# 2000 +smm smi-rp0 !
 ;
+: do-smi-return  ( -- )
+   ['] (smi-return) smm-handler -  +smm  execute
+;
+' do-smi-return is smi-return
 
 : enable-virtual-pci  ( -- )
    h# 5000.2012 msr@  swap h# 8002 or   swap  h# 5000.2002 msr!  \ Virtualize devices f and 1
@@ -197,27 +243,9 @@
 
 \ Forth stuff
 [ifdef] notyet
-   op: smm-forth-origin #)  bx  mov
-   op: smm-forth-up     #)  up  mov
 [then]
    
 [ifdef] notyet
-   \ Exchange the stack and return stack pointer with the smi versions
-   'user sp0  sp  mov
-   'user rp0  rp  mov
-
-   'user smi-sp0  sp  xchg
-   'user smi-rp0  rp  xchg
-
-   sp  'user sp0  mov
-   rp  'user rp0  mov
-
-   \ Set the interpreter pointer
-   'body smi-exec origin - # ip mov
-   bx ip add				\ add current origin
-
-   cld
-c;
 XXX code to return from Forth
 [then]
 




More information about the OpenBIOS mailing list