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

Alexey Kardashevskiy aik at ozlabs.ru
Tue Oct 10 13:23:15 AEDT 2017


On 10/10/17 04:28, Segher Boessenkool wrote:
> On Mon, Oct 09, 2017 at 01:06:08PM +1100, Alexey Kardashevskiy wrote:
>> This is the mail I wanted you to comment on. Thanks!
> 
> Ah ok, thanks.
> 
>>>> 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?
> 
> Yes, this is just a description of what the core code (engine.in) does.
> You do not actually want these words, certainly not in node.fs .

Even declaring these is bad? Elsewhere you suggested:

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

How bad is replacing an absolutely magic 'cell+' with a kinda documented
'wid>names'?


> 
> For example, "whatever>next" is just a no-op: writing it as no code at
> all is faster, this is quite hot code.

Sure, wid>next and name>next are useless in the code but they still serve a
documentation purpose, and other struct fields are no no-op.


> 
>>>> : 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.
> 
> Yeah, engine.in is mostly like Forth syntax (ignoring all the immediate
> fields, and the words headers ("col" etc.)
> 
>>> btw what does 'lfa' stand for in stack comments?
> 
> lfa is "link field address".  nfa is "name field address".  xt is
> "execution token".  SLOF uses a very traditional dictionary structure.
> Each word is laid out like this:
> 
> lfa:	cell, a pointer to the previous word in this list.
> nfa:	at least one cell; a flags field, and the name of the word as
> 	a counted string, and padding to the next word boundary.

So "nfa" is name>next + name>flags + name>count + name>chars + padding. Ok.


> xt:	the "body" of the word, starting with the code field, and then
> 	for e.g. colon words a list of (mostly) xts, etc.


So it is a wordlist where the very first word has the node's name and its
xt returns the raw date (pointer + len), and other words do some other
stuff (.print-xxxx?), is that correct? Where is that very first word
compiled to the xt which returns the raw data?




> 
>>> So, after 'link>', the stack is:
>>> 			( properties-names-next end-of-name )
> 
> : link> ( lfa -- xt )
> 
>>> '>name' simply goes backwards to the beginning of the name, right (if I am
>>> reading the beginning of slof/fs/base.fs correctly)?
> 
> Yes, but it guesses: it searches back to a byte that could be the
> correct length byte.  It is also slow.  You do not want to use it
> (unless you have to, to get a name when only knowing the xt: it's
> really only for debugging things).
> 
>>> btw '.property' still does search, what is that - room for a little
>>> improvement or I am missing something again?
> 
> Probably, yes.  Seems it could just use   link>name   instead of
> link> >name   .
> Well, it is   link> dup >name name>string   so it could do
> link>name dup name> swap name>string   or something like that.

Aha! :)


> 
>>>> : fdt-property ( link -- )
>>>>    dup link> execute rot link>name name>string fdt-prop ;
>>>
>>> Without stack comments, I'll forget this in 2 months maximum.
> 
> (There is a stack comment :-P )
> 
> I don't write "what is on the stack" after every word, certainly not
> in short phrases, where it should be obvious.
> 
> I suspect your problem reading this is that you do not know the stack
> signatures of link> etc. by heart.


Exactly :(


>>>> : 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 :(
> 
> A bit better factored then?
> 
> : (fdt-properties) ( lfa -- )
>    BEGIN dup WHILE dup fdt-property @ REPEAT drop ;
> : fdt-properties ( phandle -- )
>    dup encode-int s" phandle" fdt-prop
>    node>properties @ cell+ @ (fdt-properties) ;

May be... I'll do this but I am still struggling with a single line loops.
Why exactly is this style bad?

: fdt-add-properties ( phandle -- )
    dup encode-int s" phandle" fdt-prop

    node>properties @ wid>names @
    BEGIN
        dup
    WHILE
        dup fdt-add-property
        @
    REPEAT
    drop
;


> 
>>>> (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 ;)
> 
> It certainly does work like that!  Coming up with good names is the
> hardest part of programming (and a very important part).

You have a better idea what is a good forth name ;)

> Maybe just names like "make-fdt-properties"?


I have now fdt-add-properties and fdt-add-property, too bad?


> 
> Cheers, HTH,
> 
> 
> Segher
> 


-- 
Alexey


More information about the SLOF mailing list