Hi all,
My question on stackoverflow contained many questions so it was closed (I was 
going to split the questions).
Here I put the original question. I would be really grateful if someone gives 
me some clarification. Thanks!
--------------------
There are too much to read but too small amount of time always.. so forgive me 
my asking without enough study.   
This is an assembly code from linux arm64 (arch/arm64/kernel/head.S).(kernel 
source 5.4.21)   

    __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
    
I'll try to understand it here..(I have a book that may have some explanation 
for this part, but left it at work.. and I'm home now..)  
line 1 : x4 = (page address of init_thread_union). I found init_thread_union is 
a variable in the kernel linkerscrip.(arch/arm64/kernel/vmlinux.lds.S).   
line 2 : sp = (x4 + #THREAD_SIZE). looks like setting the stack pointer for the 
init thread info?   
line 3 : x5 = (address of init_task), I found init_task is a task_struct for 
init task.(in init/init_task.c). so this is the thread info.   
line 4 : sp_el0 = x5.  why set the stack pointer of exeption level0 with the 
thread_info? 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)
line 5 : x8 = (address of trap vectors) I couldn't find where 'vectors' is 
defied in the kernel source.
line 6 : set the x8 value to vbar_el1 system register.  
line 7 : instruction synch barrier. why is it needed here?  
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.  
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..  
ah.. there are so many questions. Please someone give me the explanation or 
correct my understanding if I'm wrong.  
-----------

> -----Original Message-----
> From: Wonhyuk Yang <[email protected]>
> Sent: Monday, November 30, 2020 9:13 AM
> To: [email protected]
> Cc: kernelnewbies <[email protected]>
> Subject: Re: question about arm64 __primary_switched code
> 
> On Sun, Nov 29, 2020 at 7:52 PM <[email protected]> wrote:
> >
> > I’ll grateful if someone gives me some comments or answers. (it’s
> > about understanding arm64 assembly code)
> >
> > https://stackoverflow.com/questions/65051120/understanding-arm64-assem
> > bly-adr-l-ldr-l-str-l-in-a-linux-kernel-code?noredirect=1#comment11501
> > 2976_65051120
> >
> 
> Hi,
> Your link doesn't work. Also, I think attaching the contents of the link
> to the mail will make it easier for others to see.





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

Reply via email to