On Mon, Nov 30, 2020 at 10:08 AM <[email protected]> wrote:

>     __primary_switched:
>         adrp    x4, init_thread_union   -- line 1
>         add sp, x4, #THREAD_SIZE        -- line 2
>         adr_l   x5, init_task           -- line 3
>         msr sp_el0, x5          // Save thread_info   -- line 4
>         adr_l   x8, vectors         // load VBAR_EL1 with virtual  -- line5
>         msr vbar_el1, x8            // vector table address  -- line 6
>         isb                    -- line7
>
>         stp xzr, x30, [sp, #-16]!            -- line8
>         mov x29, sp                   -- line9
>
>         str_l   x21, __fdt_pointer, x5      // Save FDT pointer   -- line10
>
> line 2 : sp = (x4 + #THREAD_SIZE). looks like setting the stack pointer for 
> the init thread info?

Yes. Setting the stack and it will be used for C code.

> line 4 : sp_el0 = x5.  why set the stack pointer of exeption level0 with the 
> thread_info?

In early time sp_el0 is not used, so it used just for saving some values.

> and is this sp_el0 different from the sp in line 2? (I guess we are now in el 
> 1, so sp means sp_el1 in line 2)

Yes it is different.

> line 5 : x8 = (address of trap vectors) I couldn't find where 'vectors' is 
> defied in the kernel source.

You can find it in the entry.S.

> line 7 : instruction synch barrier. why is it needed here?

I find it was introduced Commit : 2bf31a4a05f5b. Sadly, I can't understand too.

> line 8 : store 0 to [sp - 16], and store x30 at [sp - 8]. I know x30 is used 
> to keep the address to return after function(called function sets PC with 
> x30). But here zero and x30 is saved in the stack. What is it doing here?
> line 9 : and frame pointer (x29) is set with sp. The stack address obtained 
> in line 2 is set to x29. I think the this is the stack start for this frame 
> and sp grows down as stack is used.

It seems like making stack frame. stp with "!" means the preindex.
stp xzr, x30, [sp, #-16]! is same as,

sp = sp - 0x16
*sp = xzr                  <- frame
*(sp+0x8) = x30       <- return

> line 10 : I know x21 was keeping the device tree address here, so here the 
> address is stored in a global address __fdt_pointer for later use.  I guess 
> str_l is store-relative-long but I can't figure out how x5(addr of init_task) 
> is used here..

x5 is used as a temporary register.

_______________________________________________
Kernelnewbies mailing list
[email protected]
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to