[SLOF] [PATCH slof v3 5/5] fdt: Pass the resulting device tree to QEMU

Alexey Kardashevskiy aik at ozlabs.ru
Thu Oct 5 14:26:50 AEDT 2017


On 05/10/17 03:40, Segher Boessenkool wrote:
> On Tue, Oct 03, 2017 at 11:13:51PM +1100, Alexey Kardashevskiy wrote:
>>> +: fdt-properties ( phandle -- )
>>> +    dup encode-int s" phandle" fdt-prop
>>> +    >r
>>> +    s" "
>>> +    BEGIN
>>> +        r@ next-property
>>> +    WHILE
>>> +        2dup
>>> +        2dup r@ get-property
>>> +        not IF
>>> +            2swap fdt-prop
>>> +        THEN
>>> +    REPEAT
>>> +    r>
>>> +    drop
>>> +;
>>
>>
>> Doing as below still works but brings the time for the huge guest (256
>> CPUs, 256 E1000) down to 366ms as it does not search for properties every
>> time but just iterates through them, I picked this from ".properties". So
>> we are back in business :) But I'd really love someone to explain me how
>> that works as I am unable to parse this kind of internals myself... Segher,
>> please.
> 
> I'll try.
> 
> : link>name  cell+ ;
> : name>string  char+ count ;
> 
> A wordlist is a linked list, offset 0 of each record is a pointer to
> the next.  At offset 1 cell is the per-name data: a flags byte, a byte
> that is the number of chars in the name, and the actual chars.
> 
> Well.  The wordlists are themselves a linked list; offset 0 holds the
> address of the next wordlist, and offset 1 cell holds the address of
> the first name record.  Like:
> 
> STRUCT
>   cell FIELD wid>next
>   cell FIELD wid>names \ the head of the list of name records
> END-STRUCT
> 
> STRUCT
>   cell FIELD name>next
>   char FIELD name>flags
>   char FIELD name>count
>   0    FIELD name>chars
> END-STRUCT


These do not exist in the existing SLOF code, you just typed them here, right?

I want to put these into slof/fs/node.fs right after the node struct
definition with some comments about what points to what.


> 
> 
> The default (find) implementation (from engine.in):
> 
> : ((find))  ( str len head -- 0 | link )
>    BEGIN dup WHILE
>       >r 2dup r@ link>name name>string string=ci IF \ if found the name:
>          2drop r> EXIT THEN \ return a pointer to this name record
>       r> @ \ follow the linked list
>    REPEAT
>    3drop false ; \ nope, not found
> 
> 
>> : fdt-properties ( phandle -- )
>>     dup encode-int s" phandle" fdt-prop
>>
>>     node>properties @ cell+ @
> 
> "properties" in a node struct is a wordlist, which is just a pointer
> to the first name record in that wordlist.

			( phandle )
node>properties @	( properties-wordlist )
cell+ @			( properties-names-next )

And properties-names-next points to the first 'name>next' thingy. Ok.

> 
>>     BEGIN
>>         dup
>>     WHILE
>>         dup
>>
>>         link>
> 
> : link>  link>name name> ;

Ahhh. I was searching for 'LINK_X3E' but it is:
col(LINK> LINK>NAME NAME>)

Ok. Another confusion was that 'NAME' here does not point to a string but
to 'name>flags'. Ok.

btw what does 'lfa' stand for in stack comments?


So, after 'link>', the stack is:
			( properties-names-next end-of-name )


And after that end-of-name there is/are what? One 'xt' there returns
data+len, where does that token come from? I assume next one is 'xt' which
prints from 'ls', right? All I am getting it all wrong and there is just
one xt?


> where name> moves to after the name (cell-aligned):
>
> : name>  char+ dup c@ 1+ chars+ aligned ;
> (skip the flags byte, get the char count byte, skip that many bytes
> (and the count byte itself), align).
> 
>>         dup >name name>string 2>r
>>         execute
>>         2r>
>>         fdt-prop
> 
>> name tries to find the name, given an xt.  You do not need it here.


Well, with this new knowledge - sounds like the name is right there between
 properties-names-next and what 'link>' returns so I do not need extra work
to extract it.

'>name' simply goes backwards to the beginning of the name, right (if I am
reading the beginning of slof/fs/base.fs correctly)?

btw '.property' still does search, what is that - room for a little
improvement or I am missing something again?


> 
>>
>>         @
>>     REPEAT
>>
>>     drop
>> ;
> 
> So maybe more like
> 
> : fdt-property ( link -- )
>    dup link> execute rot link>name name>string fdt-prop ;

Without stack comments, I'll forget this in 2 months maximum.

> : fdt-properties ( phandle -- )
>    dup encode-int s" phandle" fdt-prop
>    node>properties @ cell+ @ BEGIN dup WHILE dup fdt-property @ REPEAT drop ;


With this formatting and missing stack comments I will stop understanding
it in a week :(


> (and maybe better names?  Something that makes clear it is copying
> properties to the flat tree).

It does not work like this, if you do not like the name - do not just say
it, suggest a better one ;)



and thanks for the lesson!


-- 
Alexey


More information about the SLOF mailing list