[OpenBIOS] r736 - cpu/x86/pc/olpc

svn at openbios.org svn at openbios.org
Sun Nov 18 04:54:49 CET 2007


Author: wmb
Date: 2007-11-18 04:54:48 +0100 (Sun, 18 Nov 2007)
New Revision: 736

Modified:
   cpu/x86/pc/olpc/fw.bth
   cpu/x86/pc/olpc/loaddropins.fth
   cpu/x86/pc/olpc/security.fth
Log:
OLPC - Cosmetic improvements in secure boot error messages
and some stuff to help the factory repair systems after FQA.


Modified: cpu/x86/pc/olpc/fw.bth
===================================================================
--- cpu/x86/pc/olpc/fw.bth	2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/fw.bth	2007-11-18 03:54:48 UTC (rev 736)
@@ -332,9 +332,9 @@
 fload ${BP}/cpu/x86/pc/olpc/lzip.fth         \ Access zip images from memory
 fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth
 fload ${BP}/cpu/x86/pc/olpc/linux.fth
+fload ${BP}/cpu/x86/pc/olpc/setwp.fth
 fload ${BP}/cpu/x86/pc/olpc/security.fth
 fload ${BP}/cpu/x86/pc/olpc/fsupdate.fth
-fload ${BP}/cpu/x86/pc/olpc/setwp.fth
 fload ${BP}/ofw/gui/ofpong.fth
 fload ${BP}/cpu/x86/pc/olpc/life.fth
 fload ${BP}/cpu/x86/pc/olpc/sound.fth
@@ -520,12 +520,13 @@
       ." Tests complete - powering off" cr  d# 5000 ms  power-off
    then
 ;
+
 : ?scan-nand  ( -- )
    rocker-up game-key?  if  text-on  scan-nand   then
 ;
 : ?fs-update  ( -- )
    button-check button-x or  button-o or  button-square or   ( mask )
-   game-key-mask over and  =  if
+   game-key-mask =  if
       try-fs-update
    then
 ;
@@ -547,6 +548,8 @@
 
    no-page
 
+   ?factory-mode
+
    console-start
 
    ?resume-botch

Modified: cpu/x86/pc/olpc/loaddropins.fth
===================================================================
--- cpu/x86/pc/olpc/loaddropins.fth	2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/loaddropins.fth	2007-11-18 03:54:48 UTC (rev 736)
@@ -27,7 +27,7 @@
 
    " ${BP}/ofw/inet/telnetd.fth"          " telnetd"             $add-deflated-dropin
 
-   " ${BP}/cpu/x86/pc/olpc/images/warnings.565"  " warnings.565"  $add-deflated-dropin
+\    " ${BP}/cpu/x86/pc/olpc/images/warnings.565"  " warnings.565"  $add-deflated-dropin
    " ${BP}/cpu/x86/pc/olpc/images/lightdot.565"  " lightdot.565"  $add-deflated-dropin
    " ${BP}/cpu/x86/pc/olpc/images/yellowdot.565" " yellowdot.565" $add-deflated-dropin
    " ${BP}/cpu/x86/pc/olpc/images/darkdot.565"   " darkdot.565"   $add-deflated-dropin

Modified: cpu/x86/pc/olpc/security.fth
===================================================================
--- cpu/x86/pc/olpc/security.fth	2007-11-16 22:29:19 UTC (rev 735)
+++ cpu/x86/pc/olpc/security.fth	2007-11-18 03:54:48 UTC (rev 736)
@@ -13,8 +13,8 @@
 
 0 0 2value base-xy
 0 0 2value next-xy
-d# 410 d# 540 2constant progress-xy
-d# 557 d# 283 2constant sad-xy
+d# 463 d# 540 2constant progress-xy
+d# 552 d# 283 2constant sad-xy
 
 true value debug-security?
 : ?lease-debug   ( msg$ -- )
@@ -23,6 +23,9 @@
 : ?lease-debug-cr  ( msg$2 -- )
    debug-security?  if  type cr  else  2drop  then
 ;
+: ?lease-error-cr  ( msg$2 -- )
+   debug-security?  if  red-letters type black-letters cr  else  2drop  then
+;
 
 : fail-load  ( -- )
    text-on
@@ -31,15 +34,21 @@
    begin again
 ;
 
+code halt  hlt  c;  \ To save power
+
 0 value security-off?
 
 : security-failure  ( -- )
    visible
-   ." Stopping" cr
-   security-off?  if  quit  then
+   security-off?  if  ." Stopping" cr  quit  then
 
-   d# 10000 ms
-   power-off
+   button-check game-key?  if
+      ." Use power button to power off" cr
+      begin halt again
+   else
+      ." Powering off in 10 seconds" cr
+      d# 10000 ms  power-off
+   then
 ;
 
 : +icon-xy  ( delta-x,y -- )  icon-xy d+ to icon-xy  ;
@@ -56,6 +65,12 @@
    sad-xy to icon-xy  " sad" show-icon
    to icon-xy
 ;
+: .security-failure  ( error$ -- )
+   visible  red-letters type black-letters cr
+   show-sad
+   security-failure
+;
+
 : show-lock    ( -- )  " lock" show-icon  ;
 : show-unlock  ( -- )  " unlock" show-icon  ;
 : show-child  ( -- )
@@ -63,14 +78,16 @@
    d# 552 d# 383 to icon-xy  " rom:xogray.565" $show-opaque
    progress-xy to icon-xy  \ For boot progress reports
 ;
+
+0 [if]
 : show-warnings  ( -- )
    " erase-screen" $call-screen
    d# 48 d# 32 to icon-xy  " rom:warnings.565" $show-opaque
    dcon-freeze
 ;
+[then]
 
 
-
 h#  20 buffer: cn-buf  \ filename prefix - either "act" or "run"
 h#  20 buffer: fn-buf  \ filename tail - either "os" or "rd"
 h# 100 buffer: pn-buf  \ pathname - either "\boot" or "\boot-alt"
@@ -211,7 +228,7 @@
 
    pubkey$  2swap  signature-bad?  ( error? )
    dup  if
-      "   Signature invalid" ?lease-debug-cr
+      "   Signature invalid" ?lease-error-cr
    else
       "   Signature valid" ?lease-debug-cr
    then
@@ -233,7 +250,7 @@
       2dup our-pubkey?  if  false exit  then  ( rem$  line$ )
       2drop                                   ( rem$ )
    repeat                                     ( rem$ )
-   " No signature for our key" ?lease-debug-cr
+   " No signature for our key" ?lease-error-cr
    2drop true
 ;
 
@@ -266,94 +283,64 @@
    over r@ -  r>     ( tail$ head$ )
 ;
 
-0. 2value exp-seconds  \ Accumulator for parsing data/time strings
-
 \ numfield is a factor used for parsing 2-digit fields from date/time strings.
-\ Radix is the number to scale the result by, i.e. one more than the maximum
-\ value of the field.  Adjust is 0 for fields whose first valid value is 0
-\ (hours, minutes, seconds) or 1 for fields that start at 1 (month,day).
-
-: numfield  ( exp$ adjust radix -- exp$' )
-   >r >r                      ( exp$ r: radix adjust )
-   2 break$ $number  throw    ( exp$' num  r: radix adjust )
-   r> -                       ( exp$  num' r: radix )
-   dup r@ u>= throw           ( exp$  num  r: radix )
-
-   \ No need to multiply the top half because it can only become nonzero
-   \ on the last call to scale-time
-   exp-seconds drop  r>  um*  ( exp$  num  d.seconds )
-   rot 0  d+  to exp-seconds  ( exp$ )
+: numfield  ( exp$ min max -- exp$' )
+   >r >r                      ( exp$ r: max min )
+   2 break$ $number  throw    ( exp$' num  r: max min )
+   dup r> < throw             ( exp$  num  r: max )
+   dup r> > throw             ( exp$  num  )
 ;
 
 \ expiration-to-seconds parses an expiration date string like
 \ "20070820T130401Z", converting it to (double precision) seconds
 \ according to the simplified calculation described above for "get-date"
 
-: (expiration-to-seconds)  ( expiration$ -- true | d.seconds false )
-   4 break$ $number throw          ( exp$' year )
-   dup d# 2999 u> throw            ( exp$' year )
-   0 to exp-seconds                ( exp$' )
-
-   1 d# 12 numfield                ( exp$' )  \ Month
-   1 d# 31 numfield                ( exp$' )  \ Day
-
-   1 break$ " T" $=  0=  throw     ( exp$' )
-
-   0 d# 24 numfield                ( exp$' )  \ Hour
-   0 d# 60 numfield                ( exp$' )  \ Minute
-   0 d# 60 numfield                ( exp$' )  \ Second
-
-   " Z" $=  0=  throw              ( )
-   exp-seconds
+: (expiration-to-seconds)  ( expiration$ -- d.seconds )
+   4 break$ $number throw >r     ( exp$' r: y )
+   1 d# 12 numfield >r           ( exp$' r: y m )
+   1 d# 31 numfield >r           ( exp$' r: y m d )
+   1 break$ " T" $=  0=  throw   ( exp$' r: y m d )
+   0 d# 23 numfield >r           ( exp$' r: y m d h )
+   0 d# 59 numfield >r           ( exp$' r: y m d h m )
+   0 d# 59 numfield >r           ( exp$' r: y m d h m s )
+   " Z" $= 0= throw              ( r: y m d h m s )
+   r> r> r> r> r> r>             ( s m h m d y )
+   >unix-seconds
 ;
 
-: expiration-to-seconds  ( expiration$ -- true | d.seconds false )
+: expiration-to-seconds  ( expiration$ -- true | seconds false )
    push-decimal
-   ['] (expiration-to-seconds)  catch  ( x x true  |  d.seconds false )
+   ['] (expiration-to-seconds)  catch  ( x x true  |  seconds false )
    pop-base
    dup  if  nip nip  then
 ;
 
-\ earliest is the earliest acceptable date value (in seconds).
-\ It is the date that the first test version of this code was
-\ deployed.  If a laptop has any earlier date that than, that
-\ date is presumed bogus.
+0 value current-seconds
 
-" 20070101T000000Z" expiration-to-seconds drop  2constant earliest
+: date-bad?  ( -- flag )
+   current-seconds  0=  if
+      time&date >unix-seconds to current-seconds
+   then
 
-0. 2value current-seconds
+   \ earliest is the earliest acceptable date value (in seconds).
+   \ It is the date that the first test version of this code was
+   \ deployed.  If a laptop has any earlier date that than, that
+   \ date is presumed bogus.
 
-\ get-date reads the date and time from the real time clock
-\ and converts it to seconds.
-
-\ The seconds conversion uses a simplified approach that ignores
-\ leap years and the like - it assumes that all months are 31 days.
-\ This is sufficient for comparison purposes so long as we use the
-\ same calculation in all cases.  It is not good for doing
-\ arithmetic on dates.
-: get-date  ( -- )
-   time&date           ( s m h d m y )
-   d# 12 *  swap 1- +  ( s m h d m' )  \ Months start at 1
-   d# 31 *  swap 1- +  ( s m h d' )    \ Days start at 1
-   d# 24 * +   ( s m h' )
-   d# 60 * +   ( s m' )   \ Can't overflow so far
-   d# 60 um*   ( s d.s' )
-   swap 0 d+   to current-seconds
+   current-seconds  [ " 20070101T000000Z" expiration-to-seconds drop ] literal - 0<
 ;
 
+
 \ expired? determines whether or not the expiration time string is
 \ earlier than this machine's current time (from the real time clock).
 
 : expired?  ( expiration$ -- bad? )
-   expiration-to-seconds  if  true exit  then  ( d.seconds )
+   expiration-to-seconds  if  true exit  then  ( seconds )
 
-   current-seconds 0. d=  if                   ( d.seconds )
-   then
-
    \ If the date is bad, leases are deemed to have expired
-   current-seconds  earliest d<  if  2drop true exit  then
+   date-bad?  if  drop true exit  then         ( seconds )
 
-   current-seconds  d<
+   current-seconds -  0<
 ;
 
 d# 1024 constant /sec-line-max
@@ -380,11 +367,11 @@
 : get-my-sn  ( -- error? )
 
    " SN" find-tag  0=  if
-      " No serial number in mfg data" ?lease-debug-cr
+      " No serial number in mfg data" ?lease-error-cr
       true exit
    then                                             ( adr len )
    ?-null  dup d# 11 <>  if
-      " Invalid serial number" ?lease-debug-cr
+      " Invalid serial number" ?lease-error-cr
       2drop true exit
    then                                             ( adr len )
    machine-id-buf  swap  move
@@ -392,11 +379,11 @@
    [char] : machine-id-buf d# 11 + c!
 
    " U#" find-tag  0=  if
-      " No UUID in mfg data" ?lease-debug-cr
+      " No UUID in mfg data" ?lease-error-cr
       true exit
    then                                             ( adr len )
    ?-null  dup d# 36 <>  if
-      " Invalid UUID" ?lease-debug-cr
+      " Invalid UUID" ?lease-error-cr
       2drop true exit
    then                                             ( adr len )
    machine-id-buf d# 12 +  swap  move
@@ -419,12 +406,12 @@
    2dup " 00000000T000000Z" $=  if  0 exit  then
 
    dup d# 16 <>  if                        ( expiration$ )
-      " has bad expiration format" ?lease-debug-cr
+      " has bad expiration format" ?lease-error-cr
       -1 exit
    then                                    ( expiration$ )
 
    2dup expired?  if
-      " expired" ?lease-debug-cr
+      " expired" ?lease-error-cr
       -1 exit
    then                                    ( expiration$ )
    0
@@ -454,7 +441,10 @@
    my-sn$ $=  0=  if  2drop 0 exit  then   ( rem$ )
 
    \ Disposition code
-   bl left-parse-string  1 <>  if  3drop -1 exit  then  ( rem$ disp-adr )
+   bl left-parse-string  1 <>  if
+      "   No disposition code" ?lease-error-cr
+      3drop -1 exit
+   then                                    ( rem$ disp-adr )
    set-disposition                         ( rem$ )
 
    bl left-parse-string  check-expiry  if  4drop -1 exit  then   ( sig$ exp$ )
@@ -470,7 +460,7 @@
 
 : check-lease  ( act01-lease$ -- -1|0|1 )
    bl left-parse-string  " act01:"  $=  0=  if
-      "   Not act01:" ?lease-debug-cr
+      "   Not act01:" ?lease-error-cr
       2drop -1 exit
    then                                    ( rem$ )
    check-timed-signature                   ( -1|0|1 )
@@ -498,7 +488,7 @@
          -1  of  r> close-file drop  " lock"   show-icon  false exit  endof
       endcase
    repeat         
-   "   No matching records" ?lease-debug-cr
+   "   No matching records" ?lease-error-cr
    r> close-file drop  false
 ;
 
@@ -575,6 +565,7 @@
 ;
 
 false value secure?
+false value in-factory?
 
 stand-init: wp
    " wp" find-tag  if  2drop  true to secure?  then
@@ -612,7 +603,7 @@
          -1  of  r> close-file drop  false exit  endof
       endcase
    repeat         
-   "   No matching records" ?lease-debug-cr
+   "   No matching records" ?lease-error-cr
    r> close-file drop  false
 ;
 
@@ -625,13 +616,13 @@
    base @ >r  d# 36 base !
    fw#buf 5 $number  if
       show-x
-      visible  ." Invalid firmware version number"  security-failure
+      " Invalid firmware version number"  .security-failure
    then
    pop-base
 ;
 
 : firmware-up-to-date?  ( img$ -- )
-   /flash <>  if  show-x  visible  ." Invalid Firmware image" security-failure  then  ( adr )
+   /flash <>  if  show-x  " Invalid Firmware image" .security-failure  then  ( adr )
    (fw-version)          ( file-version# )
    rom-pa (fw-version)   ( file-version# rom-version# )
    u<=
@@ -680,7 +671,7 @@
 
             ['] ?enough-power  catch  ?dup  if
                visible
-               .error
+               red-letters .error black-letters
                security-failure
             then
 
@@ -689,9 +680,7 @@
 
             reflash      \ Should power-off and reboot
             show-x
-            visible
-            ." Reflash returned, unexpectedly" cr
-            security-failure
+            " Reflash returned, unexpectedly" .security-failure
          then
          show-lock
       then
@@ -757,7 +746,6 @@
 
       next-xy to icon-xy                    ( list$ )
    repeat                                   ( list$ )
-   " sad" show-icon                         ( list$ )
    2drop false                              ( )
 ;
 
@@ -765,15 +753,19 @@
 
 : all-devices$  ( -- list$ )  " disk: sd: nand:"  ;
 
+: secure-startup  ( -- )
+   in-factory?  if
+      button-check button-x or  button-o or  button-square or  button-rotate or  ( mask )
+      game-key-mask =  if  exit  then
+   then
 
-: secure-startup  ( -- )
    ['] noop to ?show-device
    ['] noop to load-done
    ['] noop to load-started
 
    set-alternate
 
-   button-rotate game-key?  if  show-warnings  then
+\    button-rotate game-key?  if  show-warnings  then
    show-child
 
    ?force-secure
@@ -788,18 +780,58 @@
 
    persistent-devkey?  if  true to security-off?  visible  exit  then
 
-   get-my-sn  if  visible  ." No serial number" cr     show-sad  security-failure  then
+   get-my-sn  if  " No serial number" .security-failure  then
 
-   get-date   current-seconds earliest d<  if
+   date-bad?  if
       \ This is not fatal, because we don't want a brick if the RTC battery fails
-      visible  ." Invalid system date" cr  show-sad
+      visible  red-letters ." Invalid system date" black-letters cr  show-sad
    then
 
-   load-crypto  if  visible  ." Crytpo load failed" cr  show-sad  security-failure   then       ( )
+   load-crypto  if  " Crytpo load failed" .security-failure   then       ( )
 
    alternate?  if  " \boot-alt"  else  " \boot"  then  pn-buf place
 
    all-devices$ load-from-list  if  exit  then   \ Returns only if no images found
 
-   visible  ." Boot failed" cr  show-sad security-failure
+   " Boot failed" .security-failure
 ;
+
+: efface-md  ( -- )
+   " md" find-tag  0=  if exit then  ( data$ )
+   + 2 +  flash-base -               ( flash-offset )
+   spi-start spi-identify            ( flash-offset )
+   " MD" rot write-spi-flash         ( )
+   spi-reprogrammed                  ( )
+;
+
+: days>seconds  ( n -- seconds )  [ d# 60 d# 60 * d# 24 * ] literal  *  ;
+: ?factory-mode  ( -- )
+   date-bad?  if  efface-md exit  then
+   " md" find-tag  if             ( data$ )
+      0 left-parse-string  2nip   ( time$ )
+      \ Erase the tag if it is invalid
+      expiration-to-seconds   if  efface-md exit  then  ( begin-seconds )
+      dup 3 days>seconds +        ( begin-seconds end-seconds )
+      \ Erase the tag if its time is up
+      current-seconds  -rot within 0=  if  efface-md exit  then  ( )
+      true to in-factory?
+   then
+;
+
+\ iso8601 date construction for activation key
+: .2digits ( .. roll# -- .. ) roll u# u# drop ;
+: >iso8601$ ( s m h d m y -- adr len )
+  push-decimal
+  <#
+  [char] Z hold 5 .2digits 4 .2digits 3 .2digits
+  [char] T hold 2 .2digits 1 .2digits u# u# u# u#
+  u#>
+  pop-base
+;
+
+: factory-mode  ( -- )
+   " md" find-tag  if  ." md tag already exists" cr  2drop exit  then
+   " MD" find-tag  if  ." MD tag already exists" cr  2drop exit  then
+   date-bad?  if  ." The RTC is not set correctly" cr  exit  then
+   time&date >iso8601$  " md" $add-tag
+;




More information about the OpenBIOS mailing list