[SLOF] [PATCH v3] boot: do not use catpad to concatenate strings

Nikunj A Dadhania nikunj at linux.vnet.ibm.com
Fri Dec 8 16:32:51 AEDT 2017


The catpad size is 1K size, which can be hit easily hit with around 20 devices
with bootindex.

Open code EVALUATE such that concatenation is not required. Replace usage of
$cat with a dynamically allocated buffer(16K) here.

Reported here: https://github.com/qemu/SLOF/issues/3

Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>

---

qemu-system-ppc64 -nographic -nodefaults -serial stdio -monitor pty -m 2G \
-device virtio-scsi-pci    \
`for ((i=2;i<=50;i++)) ; \
do echo -n "  -drive file=/tmp/storage$i.qcow2,if=none,id=drive$i,format=qcow2 \
-device
scsi-hd,drive=drive$i,id=disk$i,channel=0,scsi-id=0,lun=$i,bootindex=$i"; \
done;` \
-drive file=guest.disk,if=none,id=drv1,format=qcow2,cache=none \
-device scsi-hd,drive=drv1,bootindex=1 -boot menu=on,splash-time=3000,strict=on
---
 slof/fs/boot.fs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 48 insertions(+), 5 deletions(-)

diff --git a/slof/fs/boot.fs b/slof/fs/boot.fs
index 1fd7439..6d16c54 100644
--- a/slof/fs/boot.fs
+++ b/slof/fs/boot.fs
@@ -15,8 +15,27 @@
 VARIABLE state-valid false state-valid !
 CREATE go-args 2 cells allot go-args 2 cells erase
 
+4000 CONSTANT bootdev-size
+0 VALUE bootdev-buf
+
 \ \\\\\\\\\\\\\\ Structure/Implementation Dependent Methods
 
+: alloc-bootdev-buf ( -- )
+   bootdev-size alloc-mem ?dup 0= ABORT" Unable to allocate bootdev buffer!"
+   dup bootdev-size erase
+   to bootdev-buf
+;
+
+: free-bootdev-buf ( -- )
+   bootdev-buf bootdev-size free-mem
+   0 to bootdev-buf
+;
+
+: bootdev-string-cat ( addr1 len1 addr2 len2 -- addr1 len1+len2 )
+   dup 3 pick + bootdev-size > ABORT" bootdev size too big!"
+   string-cat
+;
+
 : $bootargs
    bootargs 2@ ?dup IF
    ELSE s" diagnostic-mode?" evaluate and IF s" diag-file" evaluate
@@ -24,14 +43,23 @@ CREATE go-args 2 cells allot go-args 2 cells erase
 ;
 
 : $bootdev ( -- device-name len )
-   bootdevice 2@ dup IF s"  " $cat THEN
+   alloc-bootdev-buf
+   bootdevice 2@ ?dup IF
+      swap bootdev-buf 2 pick move
+      bootdev-buf swap s"  " bootdev-string-cat
+   ELSE
+      \ use bootdev-buf for concatenating diag mode/boot-device if any
+      drop bootdev-buf 0
+   THEN
    s" diagnostic-mode?" evaluate IF
       s" diag-device" evaluate
    ELSE
       s" boot-device" evaluate
    THEN
-   $cat \ prepend bootdevice setting from vpd-bootlist
+   ( bootdev len str len1 )
+   bootdev-string-cat \ concatenate both
    strdup
+   free-bootdev-buf
    ?dup 0= IF
       disable-watchdog
       drop true ABORT" No boot device!"
@@ -51,7 +79,14 @@ CREATE go-args 2 cells allot go-args 2 cells erase
 ' (set-boot-device) to set-boot-device
 
 : (add-boot-device) ( str len -- )	\ Concatenate " str" to "bootdevice"
-   bootdevice 2@ ?dup IF $cat-space ELSE drop THEN set-boot-device
+   bootdevice 2@ ?dup IF
+      alloc-bootdev-buf
+      swap bootdev-buf 2 pick move
+      bootdev-buf swap s"  " bootdev-string-cat
+      2swap bootdev-string-cat
+   ELSE drop THEN
+   set-boot-device
+   bootdev-buf 0 <> IF free-bootdev-buf THEN
 ;
 
 ' (add-boot-device) to add-boot-device
@@ -221,11 +256,19 @@ defer go ( -- )
    ELSE
       drop
    THEN
-   set-boot-args s" parse-load " $bootdev $cat strdup evaluate
+   set-boot-args
+   save-source  -1 to source-id
+   $bootdev dup #ib ! span ! to ib
+   0 >in !
+   ['] parse-load catch restore-source throw
 ;
 
 : load-next ( -- success )	\ Continue after go failed
-   load-list 2@ ?dup IF s" parse-load " 2swap $cat strdup evaluate
+   load-list 2@ ?dup IF
+      save-source  -1 to source-id
+      dup #ib ! span ! to ib
+      0 >in !
+      ['] parse-load catch restore-source throw
    ELSE drop false THEN
 ;
 
-- 
2.13.6



More information about the SLOF mailing list