[openfirmware] r884 - cpu/ppc cpu/x86 ofw/confvar

svn at openfirmware.info svn at openfirmware.info
Wed Aug 20 04:03:21 CEST 2008


Author: wmb
Date: 2008-08-20 04:03:20 +0200 (Wed, 20 Aug 2008)
New Revision: 884

Modified:
   cpu/ppc/kerncode.fth
   cpu/x86/kerncode.fth
   ofw/confvar/nameval.fth
Log:
Fixed yet another problem with r838.  There was a buffer conflict with
configuration variables, causing boot-device and boot-file (or any pair)
of string-valued variables to interfere with one another.


Modified: cpu/ppc/kerncode.fth
===================================================================
--- cpu/ppc/kerncode.fth	2008-08-18 10:00:37 UTC (rev 883)
+++ cpu/ppc/kerncode.fth	2008-08-20 02:03:20 UTC (rev 884)
@@ -291,6 +291,13 @@
    add     tos,tos,t0
 c;
 
+\ Loop limit for current do loop
+code ilimit  (s -- n )
+   push-tos
+   lwz     tos,1cell(rp)
+   addis   tos,tos,h#-8000	\ Bias by h#8000.0000
+c;
+
 \ Loop index for next enclosing do loop
 code j   (s -- n )
    push-tos
@@ -299,6 +306,13 @@
    add     tos,tos,t0
 c;
 
+\ Loop limit for next enclosing do loop
+code jlimit   (s -- n )
+   push-tos
+   lwz     tos,16(rp)
+   addis   tos,tos,h#-8000	\ Bias by h#8000.0000
+c;
+
 code (leave)  (s -- )
 mlabel pleave
    lwz     ip,2cells(rp)	\ Get the address of the ending offset

Modified: cpu/x86/kerncode.fth
===================================================================
--- cpu/x86/kerncode.fth	2008-08-18 10:00:37 UTC (rev 883)
+++ cpu/x86/kerncode.fth	2008-08-20 02:03:20 UTC (rev 884)
@@ -251,9 +251,15 @@
 \ Loop index for current do loop
 code i  (s -- n )   0 [rp] ax mov   /n [rp] ax add   1push  c;
 
+\ Loop limit for current do loop
+code ilimit  ( -- n )  1 /n* [rp] ax mov  80000000 # ax sub  1push  c;
+
 \ Loop index for next enclosing do loop
 code j   (s -- n )  3 /n* [rp] ax mov   4 /n* [rp] ax add   1push  c;
 
+\ Loop limit for next enclosing do loop
+code jlimit  ( -- n )  4 /n* [rp] ax mov  80000000 # ax sub  1push  c;
+
 code (leave)  (s -- )
 mloclabel pleave
    2 /n* [rp] ip mov   3 /n* # rp add

Modified: ofw/confvar/nameval.fth
===================================================================
--- ofw/confvar/nameval.fth	2008-08-18 10:00:37 UTC (rev 883)
+++ ofw/confvar/nameval.fth	2008-08-20 02:03:20 UTC (rev 884)
@@ -284,14 +284,15 @@
 h# ffe constant /pack-buf
 /pack-buf 2+ buffer: pack-buf
 0 value pntr
-: #consecutive  ( adr b -- n )
-   swap                            ( b adr )
-   h# 3f 0  do	                   ( b adr )
-      2dup i ca+ c@ <> if	   ( b adr )
-	 2drop i unloop exit       ( n )
-      then                         ( b adr )
-   loop                            ( b adr )
-   2drop  h# 7f
+: #consecutive  ( lastadr adr b -- n )
+   -rot                            ( b lastadr adr )
+   tuck -  h# 3f min               ( b adr maxn )
+   -rot  2 pick  0  do	           ( maxn b adr )
+      2dup i ca+ c@ <> if	   ( maxn b adr )
+	 3drop i unloop exit       ( n )
+      then                         ( maxn b adr )
+   loop                            ( maxn b adr )
+   2drop                           ( maxn )
 ;
 : pack-byte  ( b -- full? )
    pack-buf pntr ca+ c!
@@ -302,18 +303,18 @@
    0 to pntr   bounds ?do		( )
       i c@  case                        ( c: char )
          0 of    			( )
-            h# fe pack-byte       	( )
-	    i 0 #consecutive    	( step )
+            h# fe pack-byte ?leave     	( )
+	    ilimit i 0 #consecutive    	( step )
             dup                         ( step code )
          endof				( step code )
          h# fe  of 			( )
-            h# fe pack-byte       	( )
-	    i h# fe #consecutive 	( step )
+            h# fe pack-byte ?leave	( )
+	    ilimit i h# fe #consecutive ( step )
             dup h# 40 or                ( step code )
          endof				( step code )
 	 h# ff  of			( )
-            h# fe pack-byte       	( )
-	    i h# ff #consecutive  	( step )
+            h# fe pack-byte ?leave	( )
+	    ilimit i h# ff #consecutive ( step )
             dup h# 80 or		( step code )
 	 endof				( step code )
          ( default )  1 swap dup        ( step char char )
@@ -322,9 +323,32 @@
    +loop                                ( )
    pack-buf pntr                        ( adr len )
 ;
+0 value unpack-buf
+0 value /unpack-buf
+: not-packed?  ( adr len -- flag )
+   dup false                                   ( adr len  len packed? )
+   2swap  bounds  ?do                          ( ulen packed? )
+      i c@  h# fe =  if                        ( ulen packed? )
+         drop  2-               \ fe and next  ( ulen' )
+         i 1+ c@ h# 3f and  +   \ #inserted    ( ulen' )
+         true 2                                ( ulen packed? advance )
+      else                                     ( ulen packed? )
+         1                                     ( ulen packed? advance )
+      then                                     ( ulen advance )
+   +loop                                       ( ulen packed? )
+   if                                          ( ulen )
+      dup to /unpack-buf                       ( ulen )
+      alloc-mem to unpack-buf                  ( )
+      false                                    ( false )
+   else                                        ( ulen )
+      drop true                                ( true )
+   then                                        ( flag )
+;
+
 : unpack-env   ( adr len -- adr' len' )	\ Packed to binary
+   2dup not-packed?  if  exit  then     ( adr len )
    0 to pntr   bounds ?do	        ( )
-      /pack-buf pntr u<= ?leave
+      /unpack-buf pntr u<= ?leave
       1  i c@ dup h# fe =  if		( 1 c )
 	 2drop  2  i 1+ c@		( 2 n' )
 	 dup h# 3f and >r		( 2 n' )
@@ -332,16 +356,16 @@
          6 rshift			( 2 index )
          " "(00 fe ff ff)" drop + c@	( 2 c' )
 
-	 pack-buf pntr ca+		( 2 c' a )
-	 r@ /pack-buf pntr - min	( 2 c' a len )
+	 unpack-buf pntr ca+		( 2 c' a )
+	 r@ /unpack-buf pntr - min	( 2 c' a len )
 	 rot fill			( 2 )
 	 r> pntr + to pntr		( 2 )
       else				( 1 c )
-	 pack-buf pntr ca+ c!		( 1 )
+	 unpack-buf pntr ca+ c!		( 1 )
 	 pntr 1+ to pntr		( 1 )
       then				( step )
    +loop                                ( )
-   pack-buf  pntr                       ( adr len )
+   unpack-buf  pntr                     ( adr len )
 ;
 
 : (cv-bytes@)  ( apf -- adr len )




More information about the openfirmware mailing list