[openfirmware] [commit] r3350 - cpu/arm/olpc/1.75 forth/lib

repository service svn at openfirmware.info
Wed Oct 3 23:50:57 CEST 2012


Author: wmb
Date: Wed Oct  3 23:50:56 2012
New Revision: 3350
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3350

Log:
OLPC XO-1.75 - support old OS releases from OFW with new device tree layout.

Added:
   cpu/arm/olpc/1.75/dtcompat.fth
Modified:
   cpu/arm/olpc/1.75/fw.bth
   forth/lib/substrin.fth

Added: cpu/arm/olpc/1.75/dtcompat.fth
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ cpu/arm/olpc/1.75/dtcompat.fth	Wed Oct  3 23:50:56 2012	(r3350)
@@ -0,0 +1,34 @@
+purpose: Hack to make old kernels boot with new device tree layout
+
+\ The problem this solves is that older OS releases for XO-1.75
+\ a) Require ATAGS info instead of flattened device tree (kernel), and
+\ b) Require MMC pathnames of the form /sd at d4280000/disk at N instead of
+\    the new form /sd/sdhci at d428nnnn/disk (initrd).
+\ In order to boot those old OS releases, when we detect an old release,
+\ we use ATAGS and rewrite the "bootpath" property in /chosen to the old
+\ form.
+
+
+\ If "bootpath" (whose underlying storage is load-path) matches newpath$,
+\ replace it with oldpath$ .
+: $replaced?  ( oldpath$ newpath$ -- flag )
+   load-path cscount  substring?  if   ( oldpath$ )
+      load-path place-cstr             ( )
+      true                             ( flag )
+   else                                ( oldpath$ )
+      2drop false                      ( flag )
+   then                                ( flag )
+;
+
+: fixup-bootpath  ( -- )
+   disable-interrupts
+   /ramdisk 0=  if  exit  then
+   " $bootpath in"n"t"t/sd@"  ramdisk-adr /ramdisk  $sindex  nip  if   ( )
+      false to use-fdt?
+      " /sd at d4280000/disk at 1:/" " /sd/sdhci at d4280000/disk" $replaced?  ?exit
+      " /sd at d4280000/disk at 2:/" " /sd/sdhci at d4280800/disk" $replaced?  ?exit
+      " /sd at d4280000/disk at 3:/" " /sd/sdhci at d4281000/disk" $replaced?  ?exit
+   then
+;
+
+patch fixup-bootpath disable-interrupts linux-fixup

Modified: cpu/arm/olpc/1.75/fw.bth
==============================================================================
--- cpu/arm/olpc/1.75/fw.bth	Wed Oct  3 23:40:57 2012	(r3349)
+++ cpu/arm/olpc/1.75/fw.bth	Wed Oct  3 23:50:56 2012	(r3350)
@@ -31,5 +31,6 @@
 fload ${BP}/cpu/arm/olpc/1.75/testinstructions.fth
 fload ${BP}/cpu/arm/olpc/gpio-gamekeys.fth
 fload ${BP}/cpu/arm/olpc/test-tweaks.fth
+fload ${BP}/cpu/arm/olpc/1.75/dtcompat.fth
 
 fload ${BP}/cpu/arm/olpc/save-fw.fth

Modified: forth/lib/substrin.fth
==============================================================================
--- forth/lib/substrin.fth	Wed Oct  3 23:40:57 2012	(r3349)
+++ forth/lib/substrin.fth	Wed Oct  3 23:50:56 2012	(r3350)
@@ -31,6 +31,20 @@
       r> 1+ >r
    again
 ;
+
+\ This version is faster (due to bscan being a code word) and arguably more convenient than sindex
+: $sindex  ( small$ big$ -- rem$ )
+   2 pick 0=  if  4drop 0  then  \ Null string is initial substring of anything
+   3 pick c@  >r                 ( small$ big$  r: firstchar )
+   begin  r@  bscan  dup while   ( small$ rem$  r: firstchar )
+      4dup substring?  if        ( small$ rem$  r: firstchar )
+         2swap r> 3drop  exit    ( -- rem$ )
+      then                       ( small$ rem$  r: firstchar )
+      1 /string                  ( small$ rem$'  r: firstchar )
+   repeat                        ( small$ rem$  r: firstchar )
+   2swap r> 3drop                ( rem$ )
+;
+
 only forth also definitions
 
 \ LICENSE_BEGIN



More information about the openfirmware mailing list