diff mbox series

[XEN,v3] xen/arm32: head: Replace load_paddr with adr_l when they are equivalent

Message ID 20231027180715.3484439-1-ayan.kumar.halder@amd.com (mailing list archive)
State Superseded
Headers show
Series [XEN,v3] xen/arm32: head: Replace load_paddr with adr_l when they are equivalent | expand

Commit Message

Ayan Kumar Halder Oct. 27, 2023, 6:07 p.m. UTC
Before the MMU is turned on, PC uses physical address. Thus, one can use adr_l
instead of load_paddr to obtain the physical address of a symbol.

The only exception (for this replacement) is create_table_entry() which is
called before and after MMU is turned on.

Also, in lookup_processor_type() "r10" is no longer used. The reason being
__lookup_processor_type uses adr_l (thus r10 is no longer used to obtain the
physical address offset). Consequently, there is no need to save/restore r10.

Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
---
Refer https://lists.archive.carbon60.com/xen/devel/682900 for details.

Changes from :-

v1 :- 1. No need to modify create_table_entry().
2. Remove "mov   r10, #0 " in lookup_processor_type().

v2 :- 1. No need to save/restore r10 in lookup_processor_type().
2. Update the commit message title.

 xen/arch/arm/arm32/head.S | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

Comments

Michal Orzel Oct. 30, 2023, 8:28 a.m. UTC | #1
Hi Ayan,

On 27/10/2023 20:07, Ayan Kumar Halder wrote:
> Before the MMU is turned on, PC uses physical address. Thus, one can use adr_l
> instead of load_paddr to obtain the physical address of a symbol.
> 
> The only exception (for this replacement) is create_table_entry() which is
> called before and after MMU is turned on.
> 
> Also, in lookup_processor_type() "r10" is no longer used. The reason being
> __lookup_processor_type uses adr_l (thus r10 is no longer used to obtain the
> physical address offset). Consequently, there is no need to save/restore r10.
> 
> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
> ---
> Refer https://lists.archive.carbon60.com/xen/devel/682900 for details.
> 
> Changes from :-
> 
> v1 :- 1. No need to modify create_table_entry().
> 2. Remove "mov   r10, #0 " in lookup_processor_type().
> 
> v2 :- 1. No need to save/restore r10 in lookup_processor_type().
> 2. Update the commit message title.
> 
>  xen/arch/arm/arm32/head.S | 19 ++++++++-----------
>  1 file changed, 8 insertions(+), 11 deletions(-)
> 
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 33b038e7e0..1fcc6f745e 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -171,7 +171,7 @@ past_zImage:
>  
>          /* Using the DTB in the .dtb section? */
>  .ifnes CONFIG_DTB_FILE,""
> -        load_paddr r8, _sdtb
> +        adr_l r8, _sdtb
>  .endif
>  
>          /* Initialize the UART if earlyprintk has been enabled. */
> @@ -213,7 +213,7 @@ GLOBAL(init_secondary)
>          mrc   CP32(r1, MPIDR)
>          bic   r7, r1, #(~MPIDR_HWID_MASK) /* Mask out flags to get CPU ID */
>  
> -        load_paddr r0, smp_up_cpu
> +        adr_l r0, smp_up_cpu
>          dsb
>  2:      ldr   r1, [r0]
>          cmp   r1, r7
> @@ -479,7 +479,7 @@ create_page_tables:
>           * create_table_entry_paddr() will clobber the register storing
>           * the physical address of the table to point to.
>           */
> -        load_paddr r5, boot_third
> +        adr_l r5, boot_third
>          mov_w r4, XEN_VIRT_START
>  .rept XEN_NR_ENTRIES(2)
>          mov   r0, r5                        /* r0 := paddr(l3 table) */
> @@ -578,7 +578,7 @@ enable_mmu:
>          flush_xen_tlb_local r0
>  
>          /* Write Xen's PT's paddr into the HTTBR */
> -        load_paddr r0, boot_pgtable
> +        adr_l r0, boot_pgtable
>          mov   r1, #0                 /* r0:r1 is paddr (boot_pagetable) */
>          mcrr  CP64(r0, r1, HTTBR)
>          isb
> @@ -876,11 +876,10 @@ putn:   mov   pc, lr
>  
>  /* This provides a C-API version of __lookup_processor_type */
>  ENTRY(lookup_processor_type)
> -        stmfd sp!, {r4, r10, lr}
> -        mov   r10, #0                   /* r10 := offset between virt&phys */
> +        stmfd sp!, {r4, lr}
>          bl    __lookup_processor_type
>          mov r0, r1
> -        ldmfd sp!, {r4, r10, pc}
> +        ldmfd sp!, {r4, pc}
>  
>  /*
>   *  Read processor ID register (CP#15, CR0), and Look up in the linker-built
> @@ -888,8 +887,6 @@ ENTRY(lookup_processor_type)
>   * the __proc_info lists since we aren't running with the MMU on (and therefore,
>   * we are not in correct address space). We have to calculate the offset.
In v2, I mentioned that this comment needs to be tweaked as well. We no longer use load_paddr
thus we don't care about the offset. I would remove the comment starting from "Note that...".
to avoid confusion or add a proper explanation if you want to keep it.
With that addressed:
Reviewed-by: Michal Orzel <michal.orzel@amd.com>

~Michal
Julien Grall Nov. 16, 2023, 2:07 p.m. UTC | #2
On 30/10/2023 08:28, Michal Orzel wrote:
> Hi Ayan,
> 
> On 27/10/2023 20:07, Ayan Kumar Halder wrote:
>> Before the MMU is turned on, PC uses physical address. Thus, one can use adr_l
>> instead of load_paddr to obtain the physical address of a symbol.
>>
>> The only exception (for this replacement) is create_table_entry() which is
>> called before and after MMU is turned on.
>>
>> Also, in lookup_processor_type() "r10" is no longer used. The reason being
>> __lookup_processor_type uses adr_l (thus r10 is no longer used to obtain the
>> physical address offset). Consequently, there is no need to save/restore r10.
>>
>> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
>> ---
>> Refer https://lists.archive.carbon60.com/xen/devel/682900 for details.
>>
>> Changes from :-
>>
>> v1 :- 1. No need to modify create_table_entry().
>> 2. Remove "mov   r10, #0 " in lookup_processor_type().
>>
>> v2 :- 1. No need to save/restore r10 in lookup_processor_type().
>> 2. Update the commit message title.
>>
>>   xen/arch/arm/arm32/head.S | 19 ++++++++-----------
>>   1 file changed, 8 insertions(+), 11 deletions(-)
>>
>> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
>> index 33b038e7e0..1fcc6f745e 100644
>> --- a/xen/arch/arm/arm32/head.S
>> +++ b/xen/arch/arm/arm32/head.S
>> @@ -171,7 +171,7 @@ past_zImage:
>>   
>>           /* Using the DTB in the .dtb section? */
>>   .ifnes CONFIG_DTB_FILE,""
>> -        load_paddr r8, _sdtb
>> +        adr_l r8, _sdtb
>>   .endif
>>   
>>           /* Initialize the UART if earlyprintk has been enabled. */
>> @@ -213,7 +213,7 @@ GLOBAL(init_secondary)
>>           mrc   CP32(r1, MPIDR)
>>           bic   r7, r1, #(~MPIDR_HWID_MASK) /* Mask out flags to get CPU ID */
>>   
>> -        load_paddr r0, smp_up_cpu
>> +        adr_l r0, smp_up_cpu
>>           dsb
>>   2:      ldr   r1, [r0]
>>           cmp   r1, r7
>> @@ -479,7 +479,7 @@ create_page_tables:
>>            * create_table_entry_paddr() will clobber the register storing
>>            * the physical address of the table to point to.
>>            */
>> -        load_paddr r5, boot_third
>> +        adr_l r5, boot_third
>>           mov_w r4, XEN_VIRT_START
>>   .rept XEN_NR_ENTRIES(2)
>>           mov   r0, r5                        /* r0 := paddr(l3 table) */
>> @@ -578,7 +578,7 @@ enable_mmu:
>>           flush_xen_tlb_local r0
>>   
>>           /* Write Xen's PT's paddr into the HTTBR */
>> -        load_paddr r0, boot_pgtable
>> +        adr_l r0, boot_pgtable
>>           mov   r1, #0                 /* r0:r1 is paddr (boot_pagetable) */
>>           mcrr  CP64(r0, r1, HTTBR)
>>           isb
>> @@ -876,11 +876,10 @@ putn:   mov   pc, lr
>>   
>>   /* This provides a C-API version of __lookup_processor_type */
>>   ENTRY(lookup_processor_type)
>> -        stmfd sp!, {r4, r10, lr}
>> -        mov   r10, #0                   /* r10 := offset between virt&phys */
>> +        stmfd sp!, {r4, lr}
>>           bl    __lookup_processor_type
>>           mov r0, r1
>> -        ldmfd sp!, {r4, r10, pc}
>> +        ldmfd sp!, {r4, pc}
>>   
>>   /*
>>    *  Read processor ID register (CP#15, CR0), and Look up in the linker-built
>> @@ -888,8 +887,6 @@ ENTRY(lookup_processor_type)
>>    * the __proc_info lists since we aren't running with the MMU on (and therefore,
>>    * we are not in correct address space). We have to calculate the offset.
> In v2, I mentioned that this comment needs to be tweaked as well. We no longer use load_paddr
> thus we don't care about the offset. I would remove the comment starting from "Note that...".
> to avoid confusion or add a proper explanation if you want to keep it.
> With that addressed:
> Reviewed-by: Michal Orzel <michal.orzel@amd.com>

I have committed with the following diff:

diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index 1fcc6f745e31..bbbdf7daf89e 100644
--- a/xen/arch/arm/arm32/head.S
+++ b/xen/arch/arm/arm32/head.S
@@ -882,10 +882,8 @@ ENTRY(lookup_processor_type)
          ldmfd sp!, {r4, pc}

  /*
- *  Read processor ID register (CP#15, CR0), and Look up in the 
linker-built
- * supported processor list. Note that we can't use the absolute 
addresses for
- * the __proc_info lists since we aren't running with the MMU on (and 
therefore,
- * we are not in correct address space). We have to calculate the offset.
+ * Read processor ID register (CP#15, CR0), and Look up in the linker-built
+ * supported processor list.
   *
   * Returns:
   * r0: CPUID

Note that I took the opportunity to remove the extra space on the first 
line of the comment.

> 
> ~Michal
Julien Grall Nov. 16, 2023, 2:10 p.m. UTC | #3
On 16/11/2023 14:07, Julien Grall wrote:
> On 30/10/2023 08:28, Michal Orzel wrote:
>> Hi Ayan,
>>
>> On 27/10/2023 20:07, Ayan Kumar Halder wrote:
>>> Before the MMU is turned on, PC uses physical address. Thus, one can 
>>> use adr_l
>>> instead of load_paddr to obtain the physical address of a symbol.
>>>
>>> The only exception (for this replacement) is create_table_entry() 
>>> which is
>>> called before and after MMU is turned on.
>>>
>>> Also, in lookup_processor_type() "r10" is no longer used. The reason 
>>> being
>>> __lookup_processor_type uses adr_l (thus r10 is no longer used to 
>>> obtain the
>>> physical address offset). Consequently, there is no need to 
>>> save/restore r10.
>>>
>>> Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
>>> ---
>>> Refer https://lists.archive.carbon60.com/xen/devel/682900 for details.
>>>
>>> Changes from :-
>>>
>>> v1 :- 1. No need to modify create_table_entry().
>>> 2. Remove "mov   r10, #0 " in lookup_processor_type().
>>>
>>> v2 :- 1. No need to save/restore r10 in lookup_processor_type().
>>> 2. Update the commit message title.
>>>
>>>   xen/arch/arm/arm32/head.S | 19 ++++++++-----------
>>>   1 file changed, 8 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
>>> index 33b038e7e0..1fcc6f745e 100644
>>> --- a/xen/arch/arm/arm32/head.S
>>> +++ b/xen/arch/arm/arm32/head.S
>>> @@ -171,7 +171,7 @@ past_zImage:
>>>           /* Using the DTB in the .dtb section? */
>>>   .ifnes CONFIG_DTB_FILE,""
>>> -        load_paddr r8, _sdtb
>>> +        adr_l r8, _sdtb
>>>   .endif
>>>           /* Initialize the UART if earlyprintk has been enabled. */
>>> @@ -213,7 +213,7 @@ GLOBAL(init_secondary)
>>>           mrc   CP32(r1, MPIDR)
>>>           bic   r7, r1, #(~MPIDR_HWID_MASK) /* Mask out flags to get 
>>> CPU ID */
>>> -        load_paddr r0, smp_up_cpu
>>> +        adr_l r0, smp_up_cpu
>>>           dsb
>>>   2:      ldr   r1, [r0]
>>>           cmp   r1, r7
>>> @@ -479,7 +479,7 @@ create_page_tables:
>>>            * create_table_entry_paddr() will clobber the register 
>>> storing
>>>            * the physical address of the table to point to.
>>>            */
>>> -        load_paddr r5, boot_third
>>> +        adr_l r5, boot_third
>>>           mov_w r4, XEN_VIRT_START
>>>   .rept XEN_NR_ENTRIES(2)
>>>           mov   r0, r5                        /* r0 := paddr(l3 
>>> table) */
>>> @@ -578,7 +578,7 @@ enable_mmu:
>>>           flush_xen_tlb_local r0
>>>           /* Write Xen's PT's paddr into the HTTBR */
>>> -        load_paddr r0, boot_pgtable
>>> +        adr_l r0, boot_pgtable
>>>           mov   r1, #0                 /* r0:r1 is paddr 
>>> (boot_pagetable) */
>>>           mcrr  CP64(r0, r1, HTTBR)
>>>           isb
>>> @@ -876,11 +876,10 @@ putn:   mov   pc, lr
>>>   /* This provides a C-API version of __lookup_processor_type */
>>>   ENTRY(lookup_processor_type)
>>> -        stmfd sp!, {r4, r10, lr}
>>> -        mov   r10, #0                   /* r10 := offset between 
>>> virt&phys */
>>> +        stmfd sp!, {r4, lr}
>>>           bl    __lookup_processor_type
>>>           mov r0, r1
>>> -        ldmfd sp!, {r4, r10, pc}
>>> +        ldmfd sp!, {r4, pc}
>>>   /*
>>>    *  Read processor ID register (CP#15, CR0), and Look up in the 
>>> linker-built
>>> @@ -888,8 +887,6 @@ ENTRY(lookup_processor_type)
>>>    * the __proc_info lists since we aren't running with the MMU on 
>>> (and therefore,
>>>    * we are not in correct address space). We have to calculate the 
>>> offset.
>> In v2, I mentioned that this comment needs to be tweaked as well. We 
>> no longer use load_paddr
>> thus we don't care about the offset. I would remove the comment 
>> starting from "Note that...".
>> to avoid confusion or add a proper explanation if you want to keep it.
>> With that addressed:
>> Reviewed-by: Michal Orzel <michal.orzel@amd.com>
> 
> I have committed with the following diff:
> 
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 1fcc6f745e31..bbbdf7daf89e 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -882,10 +882,8 @@ ENTRY(lookup_processor_type)
>           ldmfd sp!, {r4, pc}
> 
>   /*
> - *  Read processor ID register (CP#15, CR0), and Look up in the 
> linker-built
> - * supported processor list. Note that we can't use the absolute 
> addresses for
> - * the __proc_info lists since we aren't running with the MMU on (and 
> therefore,
> - * we are not in correct address space). We have to calculate the offset.
> + * Read processor ID register (CP#15, CR0), and Look up in the 
> linker-built
> + * supported processor list.
>    *
>    * Returns:
>    * r0: CPUID
> 
> Note that I took the opportunity to remove the extra space on the first 
> line of the comment.

Oh I didn't realize there was a v4 sent. Looking at it this was this 
only change. So I will not revert.

Sorry for that.

Cheers,
diff mbox series

Patch

diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index 33b038e7e0..1fcc6f745e 100644
--- a/xen/arch/arm/arm32/head.S
+++ b/xen/arch/arm/arm32/head.S
@@ -171,7 +171,7 @@  past_zImage:
 
         /* Using the DTB in the .dtb section? */
 .ifnes CONFIG_DTB_FILE,""
-        load_paddr r8, _sdtb
+        adr_l r8, _sdtb
 .endif
 
         /* Initialize the UART if earlyprintk has been enabled. */
@@ -213,7 +213,7 @@  GLOBAL(init_secondary)
         mrc   CP32(r1, MPIDR)
         bic   r7, r1, #(~MPIDR_HWID_MASK) /* Mask out flags to get CPU ID */
 
-        load_paddr r0, smp_up_cpu
+        adr_l r0, smp_up_cpu
         dsb
 2:      ldr   r1, [r0]
         cmp   r1, r7
@@ -479,7 +479,7 @@  create_page_tables:
          * create_table_entry_paddr() will clobber the register storing
          * the physical address of the table to point to.
          */
-        load_paddr r5, boot_third
+        adr_l r5, boot_third
         mov_w r4, XEN_VIRT_START
 .rept XEN_NR_ENTRIES(2)
         mov   r0, r5                        /* r0 := paddr(l3 table) */
@@ -578,7 +578,7 @@  enable_mmu:
         flush_xen_tlb_local r0
 
         /* Write Xen's PT's paddr into the HTTBR */
-        load_paddr r0, boot_pgtable
+        adr_l r0, boot_pgtable
         mov   r1, #0                 /* r0:r1 is paddr (boot_pagetable) */
         mcrr  CP64(r0, r1, HTTBR)
         isb
@@ -876,11 +876,10 @@  putn:   mov   pc, lr
 
 /* This provides a C-API version of __lookup_processor_type */
 ENTRY(lookup_processor_type)
-        stmfd sp!, {r4, r10, lr}
-        mov   r10, #0                   /* r10 := offset between virt&phys */
+        stmfd sp!, {r4, lr}
         bl    __lookup_processor_type
         mov r0, r1
-        ldmfd sp!, {r4, r10, pc}
+        ldmfd sp!, {r4, pc}
 
 /*
  *  Read processor ID register (CP#15, CR0), and Look up in the linker-built
@@ -888,8 +887,6 @@  ENTRY(lookup_processor_type)
  * the __proc_info lists since we aren't running with the MMU on (and therefore,
  * we are not in correct address space). We have to calculate the offset.
  *
- * r10: offset between virt&phys
- *
  * Returns:
  * r0: CPUID
  * r1: proc_info pointer
@@ -897,8 +894,8 @@  ENTRY(lookup_processor_type)
  */
 __lookup_processor_type:
         mrc   CP32(r0, MIDR)                /* r0 := our cpu id */
-        load_paddr r1, __proc_info_start
-        load_paddr r2, __proc_info_end
+        adr_l r1, __proc_info_start
+        adr_l r2, __proc_info_end
 1:      ldr   r3, [r1, #PROCINFO_cpu_mask]
         and   r4, r0, r3                    /* r4 := our cpu id with mask */
         ldr   r3, [r1, #PROCINFO_cpu_val]   /* r3 := cpu val in current proc info */