diff mbox series

RISC-V: mm: Fix set_satp_mode() for platform not having Sv57

Message ID 20220412033335.1384230-1-apatel@ventanamicro.com (mailing list archive)
State New, archived
Headers show
Series RISC-V: mm: Fix set_satp_mode() for platform not having Sv57 | expand

Commit Message

Anup Patel April 12, 2022, 3:33 a.m. UTC
When Sv57 is not available the satp.MODE test in set_satp_mode() will
fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
will fail as well due to pre-existing pgdir entry used for Sv57 and as
a result kernel fails to boot on RISC-V platform not having Sv57.

To fix above issue, we should clear the pgdir memory in set_satp_mode()
before re-programming.

Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
---
 arch/riscv/mm/init.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Qinglin Pan April 15, 2022, 4:47 a.m. UTC | #1
Hi Anup,

&gt; 
&gt; When Sv57 is not available the satp.MODE test in set_satp_mode() will
&gt; fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
&gt; will fail as well due to pre-existing pgdir entry used for Sv57 and as
&gt; a result kernel fails to boot on RISC-V platform not having Sv57.
&gt; 
&gt; To fix above issue, we should clear the pgdir memory in set_satp_mode()
&gt; before re-programming.
&gt; 
&gt; Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
&gt; Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
&gt; Signed-off-by: Anup Patel <apatel@ventanamicro.com>
&gt; ---
&gt;  arch/riscv/mm/init.c | 1 +
&gt;  1 file changed, 1 insertion(+)
&gt; 
&gt; diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
&gt; index 9535bea8688c..b0793dc0c291 100644
&gt; --- a/arch/riscv/mm/init.c
&gt; +++ b/arch/riscv/mm/init.c
&gt; @@ -718,6 +718,7 @@ static __init void set_satp_mode(void)
&gt;  		if (!check_l4) {
&gt;  			disable_pgtable_l5();
&gt;  			check_l4 = true;
&gt; +			memset(early_pg_dir, 0, PAGE_SIZE);
&gt;  			goto retry;
&gt;  		}
&gt;  		disable_pgtable_l4();
&gt; -- 


I find it that the set_satp_mode function is in .init.text section which begins at 0x80800000.
And its pgd_index in both Sv48 and Sv57 will be 0. So it may not be necessary to clear the 
early_pg_dir when the kernel find Sv57 is not supported? And may I get the steps of reproduction
from you?
 
Yours,
Qinglin
</apatel@ventanamicro.com></mchitale@ventanamicro.com>
Anup Patel April 15, 2022, 4:53 a.m. UTC | #2
On Fri, Apr 15, 2022 at 10:18 AM 潘庆霖 <panqinglin2020@iscas.ac.cn> wrote:
>
> Hi Anup,
>
> &gt;
> &gt; When Sv57 is not available the satp.MODE test in set_satp_mode() will
> &gt; fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
> &gt; will fail as well due to pre-existing pgdir entry used for Sv57 and as
> &gt; a result kernel fails to boot on RISC-V platform not having Sv57.
> &gt;
> &gt; To fix above issue, we should clear the pgdir memory in set_satp_mode()
> &gt; before re-programming.
> &gt;
> &gt; Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
> &gt; Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
> &gt; Signed-off-by: Anup Patel <apatel@ventanamicro.com>
> &gt; ---
> &gt;  arch/riscv/mm/init.c | 1 +
> &gt;  1 file changed, 1 insertion(+)
> &gt;
> &gt; diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> &gt; index 9535bea8688c..b0793dc0c291 100644
> &gt; --- a/arch/riscv/mm/init.c
> &gt; +++ b/arch/riscv/mm/init.c
> &gt; @@ -718,6 +718,7 @@ static __init void set_satp_mode(void)
> &gt;            if (!check_l4) {
> &gt;                    disable_pgtable_l5();
> &gt;                    check_l4 = true;
> &gt; +                  memset(early_pg_dir, 0, PAGE_SIZE);
> &gt;                    goto retry;
> &gt;            }
> &gt;            disable_pgtable_l4();
> &gt; --
>
>
> I find it that the set_satp_mode function is in .init.text section which begins at 0x80800000.
> And its pgd_index in both Sv48 and Sv57 will be 0. So it may not be necessary to clear the
> early_pg_dir when the kernel find Sv57 is not supported? And may I get the steps of reproduction
> from you?

We can't assume that it will be the same pgd_index for Sv48 and Sv57.

For example, some hypothetical SoC might have RAM starting after 1TB space.

We should ensure that early_pg_dir is cleaned entirely for detecting the next
mode.

Regards,
Anup

>
> Yours,
> Qinglin
> </apatel@ventanamicro.com></mchitale@ventanamicro.com>
Qinglin Pan April 15, 2022, 5:10 a.m. UTC | #3
Hi Anup,

&gt; 
&gt; We can't assume that it will be the same pgd_index for Sv48 and Sv57.
&gt; 
&gt; For example, some hypothetical SoC might have RAM starting after 1TB space.
&gt; 
&gt; We should ensure that early_pg_dir is cleaned entirely for detecting the next
&gt; mode.
&gt; 

Got it. Your idea is really more stable. Thank you for pointing out that!

Yours,
Qinglin
Atish Patra April 15, 2022, 5:47 a.m. UTC | #4
On Mon, Apr 11, 2022 at 8:34 PM Anup Patel <apatel@ventanamicro.com> wrote:
>
> When Sv57 is not available the satp.MODE test in set_satp_mode() will
> fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
> will fail as well due to pre-existing pgdir entry used for Sv57 and as
> a result kernel fails to boot on RISC-V platform not having Sv57.
>
> To fix above issue, we should clear the pgdir memory in set_satp_mode()
> before re-programming.
>
> Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
> Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
> ---
>  arch/riscv/mm/init.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index 9535bea8688c..b0793dc0c291 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -718,6 +718,7 @@ static __init void set_satp_mode(void)
>                 if (!check_l4) {
>                         disable_pgtable_l5();
>                         check_l4 = true;
> +                       memset(early_pg_dir, 0, PAGE_SIZE);
>                         goto retry;
>                 }
>                 disable_pgtable_l4();
> --
> 2.25.1
>

Reviewed-by: Atish Patra <atishp@rivosinc.com>
Anup Patel April 21, 2022, 9:30 a.m. UTC | #5
Hi Palmer,

On Tue, Apr 12, 2022 at 9:04 AM Anup Patel <apatel@ventanamicro.com> wrote:
>
> When Sv57 is not available the satp.MODE test in set_satp_mode() will
> fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
> will fail as well due to pre-existing pgdir entry used for Sv57 and as
> a result kernel fails to boot on RISC-V platform not having Sv57.
>
> To fix above issue, we should clear the pgdir memory in set_satp_mode()
> before re-programming.
>
> Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
> Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
> Signed-off-by: Anup Patel <apatel@ventanamicro.com>

Can this be considered for 5.18-rcX ?

Regards,
Anup

> ---
>  arch/riscv/mm/init.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index 9535bea8688c..b0793dc0c291 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -718,6 +718,7 @@ static __init void set_satp_mode(void)
>                 if (!check_l4) {
>                         disable_pgtable_l5();
>                         check_l4 = true;
> +                       memset(early_pg_dir, 0, PAGE_SIZE);
>                         goto retry;
>                 }
>                 disable_pgtable_l4();
> --
> 2.25.1
>
Palmer Dabbelt April 21, 2022, 9:12 p.m. UTC | #6
On Thu, 21 Apr 2022 02:30:05 PDT (-0700), apatel@ventanamicro.com wrote:
> Hi Palmer,
>
> On Tue, Apr 12, 2022 at 9:04 AM Anup Patel <apatel@ventanamicro.com> wrote:
>>
>> When Sv57 is not available the satp.MODE test in set_satp_mode() will
>> fail and lead to pgdir re-programming for Sv48. The pgdir re-programming
>> will fail as well due to pre-existing pgdir entry used for Sv57 and as
>> a result kernel fails to boot on RISC-V platform not having Sv57.
>>
>> To fix above issue, we should clear the pgdir memory in set_satp_mode()
>> before re-programming.
>>
>> Fixes: 011f09d12052 ("riscv: mm: Set sv57 on defaultly")
>> Reported-by: Mayuresh Chitale <mchitale@ventanamicro.com>
>> Signed-off-by: Anup Patel <apatel@ventanamicro.com>
>
> Can this be considered for 5.18-rcX ?

Sorry, there's a queue but I just say this one at the top and it's super 
simple so I'm going to take it now -- IRC is good to ping this sort of 
stuff.

It's in fixes.

Thanks!

>
> Regards,
> Anup
>
>> ---
>>  arch/riscv/mm/init.c | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
>> index 9535bea8688c..b0793dc0c291 100644
>> --- a/arch/riscv/mm/init.c
>> +++ b/arch/riscv/mm/init.c
>> @@ -718,6 +718,7 @@ static __init void set_satp_mode(void)
>>                 if (!check_l4) {
>>                         disable_pgtable_l5();
>>                         check_l4 = true;
>> +                       memset(early_pg_dir, 0, PAGE_SIZE);
>>                         goto retry;
>>                 }
>>                 disable_pgtable_l4();
>> --
>> 2.25.1
>>
diff mbox series

Patch

diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index 9535bea8688c..b0793dc0c291 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -718,6 +718,7 @@  static __init void set_satp_mode(void)
 		if (!check_l4) {
 			disable_pgtable_l5();
 			check_l4 = true;
+			memset(early_pg_dir, 0, PAGE_SIZE);
 			goto retry;
 		}
 		disable_pgtable_l4();