[SLOF] [PATCH v3 1/6] Link libnet code to Paflof and add a wrapper for netboot()

Thomas Huth thuth at redhat.com
Fri Oct 14 05:04:09 AEDT 2016


On 13.10.2016 01:41, Alexey Kardashevskiy wrote:
> On 12/10/16 21:44, Thomas Huth wrote:
>> Now that all necessary functions are provided by Paflof, too,
>> we can finally link the libnet code to this binary. To be able
>> to call the netboot() function from the Forth code now, we also
>> add a wrapper that takes the parameter string from the obp-tftp
>> package and converts it to an argv array that is expected by
>> the netboot() function.
> 
> This breaks my netboot setup.
[...]
> What I get:
> ==============================================
> Trying to load:  from: /pci at 800000020000000/ethernet at 2 ...
>  Initializing NIC
>   Reading MAC address from device: c0:41:49:4b:00:00
>   Requesting information via DHCP: done
>   Using IPv4 address: 10.61.191.0
>   Requesting file "image.aiktest0" via TFTP from 10.61.2.7
>   Receiving data:  270 KBytes
>   TFTP: Received image.aiktest0 (270 KBytes)
>   Successfully loaded
> 
> Try to netboot
> 
>  Initializing NIC
>   Reading MAC address from device: c0:41:49:4b:00:00
>   Requesting information via DHCP:  010writemethod 'load' failed fffffbbc
> Error, can't read config file

Bummer! I can reproduce this problem here. And I can fix it with the
following patch:

-----------------------------------------------------------------------
diff a/slof/ppc64.c b/slof/ppc64.c
--- a/slof/ppc64.c
+++ b/slof/ppc64.c
@@ -180,7 +180,10 @@ int recv(int fd, void *buf, int len, int flags)
 	forth_push((unsigned long)buf);
 	forth_push(len);

-	return forth_eval_pop("read");
+	forth_push((unsigned long)"read");
+	forth_push(4);
+	forth_push(fd_array[fd].ih);
+	return forth_eval_pop("$call-method");
 }

 /**
@@ -200,7 +203,10 @@ int send(int fd, const void *buf, int len, int flags)
 	forth_push((unsigned long)buf);
 	forth_push(len);

-	return forth_eval_pop("write");
+	forth_push((unsigned long)"write");
+	forth_push(5);
+	forth_push(fd_array[fd].ih);
+	return forth_eval_pop("$call-method");
 }

 /**
-----------------------------------------------------------------------

i.e. I must not assume that the NIC device tree node is still the
current one when the send() and recv() functions are called.

Unfortunately this slows down the network boot again - all the nice
speed-up is gone, it's as slow again as the booting via the net-snk :-(

I'll try to find a solution for that slowdown ... maybe it's possible to
cache the execution token of the corresponding Forth words or something
similar...

 Thomas



More information about the SLOF mailing list