[PATCH] target/riscv: Fix satp write

LIU Zhiwei posted 1 patch 2 years, 7 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210901124539.222868-1-zhiwei_liu@c-sky.com
Maintainers: Palmer Dabbelt <palmer@dabbelt.com>, Alistair Francis <alistair.francis@wdc.com>, Bin Meng <bin.meng@windriver.com>
target/riscv/csr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] target/riscv: Fix satp write
Posted by LIU Zhiwei 2 years, 7 months ago
These variables should be target_ulong. If truncated to int,
the bool conditions they indicate will be wrong.

As satp is very important for Linux, this bug almost fails every boot.

Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
---
 target/riscv/csr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index 50a2c3a3b4..ba9818f6a5 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -986,7 +986,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
 static RISCVException write_satp(CPURISCVState *env, int csrno,
                                  target_ulong val)
 {
-    int vm, mask, asid;
+    target_ulong vm, mask, asid;
 
     if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
         return RISCV_EXCP_NONE;
-- 
2.25.1


Re: [PATCH] target/riscv: Fix satp write
Posted by Alistair Francis 2 years, 7 months ago
On Wed, Sep 1, 2021 at 10:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
> These variables should be target_ulong. If truncated to int,
> the bool conditions they indicate will be wrong.
>
> As satp is very important for Linux, this bug almost fails every boot.
>
> Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>

Thanks!

Applied to riscv-to-apply.next

Alistair

> ---
>  target/riscv/csr.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 50a2c3a3b4..ba9818f6a5 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -986,7 +986,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
>  static RISCVException write_satp(CPURISCVState *env, int csrno,
>                                   target_ulong val)
>  {
> -    int vm, mask, asid;
> +    target_ulong vm, mask, asid;
>
>      if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
>          return RISCV_EXCP_NONE;
> --
> 2.25.1
>
>

Re: [PATCH] target/riscv: Fix satp write
Posted by Bin Meng 2 years, 7 months ago
On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
> These variables should be target_ulong. If truncated to int,
> the bool conditions they indicate will be wrong.
>
> As satp is very important for Linux, this bug almost fails every boot.

Could you please describe which Linux configuration is broken? I have
a 64-bit 5.10 kernel and it boots fine.

Please add:

Fixes: 419ddf00ed78 ("target/riscv: Remove the hardcoded SATP_MODE macro")

> Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
> ---
>  target/riscv/csr.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 50a2c3a3b4..ba9818f6a5 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -986,7 +986,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
>  static RISCVException write_satp(CPURISCVState *env, int csrno,
>                                   target_ulong val)
>  {
> -    int vm, mask, asid;
> +    target_ulong vm, mask, asid;
>
>      if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
>          return RISCV_EXCP_NONE;

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

Re: [PATCH] target/riscv: Fix satp write
Posted by LIU Zhiwei 2 years, 7 months ago
On 2021/9/1 下午9:05, Bin Meng wrote:
> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>> These variables should be target_ulong. If truncated to int,
>> the bool conditions they indicate will be wrong.
>>
>> As satp is very important for Linux, this bug almost fails every boot.
> Could you please describe which Linux configuration is broken?

I use the image from:

https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/

>   I have
> a 64-bit 5.10 kernel and it boots fine.

The login is mostly OK for me. But the busybox can't run properly.

Thanks,
Zhiwei

> Please add:
>
> Fixes: 419ddf00ed78 ("target/riscv: Remove the hardcoded SATP_MODE macro")
>
>> Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
>> ---
>>   target/riscv/csr.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
>> index 50a2c3a3b4..ba9818f6a5 100644
>> --- a/target/riscv/csr.c
>> +++ b/target/riscv/csr.c
>> @@ -986,7 +986,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
>>   static RISCVException write_satp(CPURISCVState *env, int csrno,
>>                                    target_ulong val)
>>   {
>> -    int vm, mask, asid;
>> +    target_ulong vm, mask, asid;
>>
>>       if (!riscv_feature(env, RISCV_FEATURE_MMU)) {
>>           return RISCV_EXCP_NONE;
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

Re: [PATCH] target/riscv: Fix satp write
Posted by Bin Meng 2 years, 7 months ago
On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
>
> On 2021/9/1 下午9:05, Bin Meng wrote:
> > On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >> These variables should be target_ulong. If truncated to int,
> >> the bool conditions they indicate will be wrong.
> >>
> >> As satp is very important for Linux, this bug almost fails every boot.
> > Could you please describe which Linux configuration is broken?
>
> I use the image from:
>
> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
>
> >   I have
> > a 64-bit 5.10 kernel and it boots fine.
>
> The login is mostly OK for me. But the busybox can't run properly.

Which kernel version is this? Could you please investigate and
indicate in the commit message?

I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
distro user space.

Regards,
Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by LIU Zhiwei 2 years, 7 months ago
On 2021/9/2 上午9:59, Bin Meng wrote:
> On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>
>> On 2021/9/1 下午9:05, Bin Meng wrote:
>>> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>> These variables should be target_ulong. If truncated to int,
>>>> the bool conditions they indicate will be wrong.
>>>>
>>>> As satp is very important for Linux, this bug almost fails every boot.
>>> Could you please describe which Linux configuration is broken?
>> I use the image from:
>>
>> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
>>
>>>    I have
>>> a 64-bit 5.10 kernel and it boots fine.
>> The login is mostly OK for me. But the busybox can't run properly.
> Which kernel version is this?
5.10.4
> Could you please investigate and
> indicate in the commit message?
>
> I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
> distro user space.

Very strange.  This will cause tlb_flush can't be called in this function.

Thanks,
Zhiwei

>
> Regards,
> Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by Bin Meng 2 years, 7 months ago
On Thu, Sep 2, 2021 at 10:44 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
>
> On 2021/9/2 上午9:59, Bin Meng wrote:
> > On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >>
> >> On 2021/9/1 下午9:05, Bin Meng wrote:
> >>> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >>>> These variables should be target_ulong. If truncated to int,
> >>>> the bool conditions they indicate will be wrong.
> >>>>
> >>>> As satp is very important for Linux, this bug almost fails every boot.
> >>> Could you please describe which Linux configuration is broken?
> >> I use the image from:
> >>
> >> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
> >>
> >>>    I have
> >>> a 64-bit 5.10 kernel and it boots fine.
> >> The login is mostly OK for me. But the busybox can't run properly.
> > Which kernel version is this?
> 5.10.4
> > Could you please investigate and
> > indicate in the commit message?
> >
> > I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
> > distro user space.
>
> Very strange.  This will cause tlb_flush can't be called in this function.
>

Did your kernel enable asid?

Regards,
Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by LIU Zhiwei 2 years, 7 months ago
On 2021/9/2 上午10:47, Bin Meng wrote:
> On Thu, Sep 2, 2021 at 10:44 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>
>> On 2021/9/2 上午9:59, Bin Meng wrote:
>>> On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>> On 2021/9/1 下午9:05, Bin Meng wrote:
>>>>> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>>>> These variables should be target_ulong. If truncated to int,
>>>>>> the bool conditions they indicate will be wrong.
>>>>>>
>>>>>> As satp is very important for Linux, this bug almost fails every boot.
>>>>> Could you please describe which Linux configuration is broken?
>>>> I use the image from:
>>>>
>>>> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
>>>>
>>>>>     I have
>>>>> a 64-bit 5.10 kernel and it boots fine.
>>>> The login is mostly OK for me. But the busybox can't run properly.
>>> Which kernel version is this?
>> 5.10.4
>>> Could you please investigate and
>>> indicate in the commit message?
>>>
>>> I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
>>> distro user space.
>> Very strange.  This will cause tlb_flush can't be called in this function.
>>
> Did your kernel enable asid?

Yes. Is it matter?

Thanks,
Zhiwei

>
> Regards,
> Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by Bin Meng 2 years, 7 months ago
On Mon, Sep 6, 2021 at 11:23 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>
>
> On 2021/9/2 上午10:47, Bin Meng wrote:
> > On Thu, Sep 2, 2021 at 10:44 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >>
> >> On 2021/9/2 上午9:59, Bin Meng wrote:
> >>> On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >>>> On 2021/9/1 下午9:05, Bin Meng wrote:
> >>>>> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >>>>>> These variables should be target_ulong. If truncated to int,
> >>>>>> the bool conditions they indicate will be wrong.
> >>>>>>
> >>>>>> As satp is very important for Linux, this bug almost fails every boot.
> >>>>> Could you please describe which Linux configuration is broken?
> >>>> I use the image from:
> >>>>
> >>>> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
> >>>>
> >>>>>     I have
> >>>>> a 64-bit 5.10 kernel and it boots fine.
> >>>> The login is mostly OK for me. But the busybox can't run properly.
> >>> Which kernel version is this?
> >> 5.10.4
> >>> Could you please investigate and
> >>> indicate in the commit message?
> >>>
> >>> I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
> >>> distro user space.
> >> Very strange.  This will cause tlb_flush can't be called in this function.
> >>
> > Did your kernel enable asid?
>
> Yes. Is it matter?

Not sure, the tbl_flush is on the ASID path. I suspect the kernel we
(Alistair and me) tested did not enable ASID.

Regards,
Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by LIU Zhiwei 2 years, 7 months ago
On 2021/9/6 上午11:26, Bin Meng wrote:
> On Mon, Sep 6, 2021 at 11:23 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>
>> On 2021/9/2 上午10:47, Bin Meng wrote:
>>> On Thu, Sep 2, 2021 at 10:44 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>> On 2021/9/2 上午9:59, Bin Meng wrote:
>>>>> On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>>>> On 2021/9/1 下午9:05, Bin Meng wrote:
>>>>>>> On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
>>>>>>>> These variables should be target_ulong. If truncated to int,
>>>>>>>> the bool conditions they indicate will be wrong.
>>>>>>>>
>>>>>>>> As satp is very important for Linux, this bug almost fails every boot.
>>>>>>> Could you please describe which Linux configuration is broken?
>>>>>> I use the image from:
>>>>>>
>>>>>> https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
>>>>>>
>>>>>>>      I have
>>>>>>> a 64-bit 5.10 kernel and it boots fine.
>>>>>> The login is mostly OK for me. But the busybox can't run properly.
>>>>> Which kernel version is this?
>>>> 5.10.4
>>>>> Could you please investigate and
>>>>> indicate in the commit message?
>>>>>
>>>>> I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
>>>>> distro user space.
>>>> Very strange.  This will cause tlb_flush can't be called in this function.
>>>>
>>> Did your kernel enable asid?
>> Yes. Is it matter?
> Not sure, the tbl_flush is on the ASID path. I suspect the kernel we
> (Alistair and me) tested did not enable ASID.
In my opinion, if the ASID is open, we should not flush tlb when ASID 
changes in most cases.
If ASID is not open.
> Regards,
> Bin

Re: [PATCH] target/riscv: Fix satp write
Posted by Alistair Francis 2 years, 7 months ago
On Thu, Sep 2, 2021 at 11:59 AM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> On Thu, Sep 2, 2021 at 9:02 AM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> >
> >
> > On 2021/9/1 下午9:05, Bin Meng wrote:
> > > On Wed, Sep 1, 2021 at 8:51 PM LIU Zhiwei <zhiwei_liu@c-sky.com> wrote:
> > >> These variables should be target_ulong. If truncated to int,
> > >> the bool conditions they indicate will be wrong.
> > >>
> > >> As satp is very important for Linux, this bug almost fails every boot.
> > > Could you please describe which Linux configuration is broken?
> >
> > I use the image from:
> >
> > https://gitlab.com/c-sky/buildroot/-/jobs/1251564514/artifacts/browse/output/images/
> >
> > >   I have
> > > a 64-bit 5.10 kernel and it boots fine.
> >
> > The login is mostly OK for me. But the busybox can't run properly.
>
> Which kernel version is this? Could you please investigate and
> indicate in the commit message?
>
> I just tested current qemu-system-riscv64 can boot to Ubuntu 20.04
> distro user space.

I also have never seen any issues.

Looking at this `vm` is set from a `static const char
valid_vm_1_10_64` so an int is fine.

It probably is a good idea for `mask` and `asid` to be target_ulong as
they are set by bit operations on target_ulong's. I guess if your host
int is 32-bits SATP64_ASID will overflow that.

Anyway with 128-bit RISC-V and maybe the ability to run 64-bit guests
no 32-bit hosts this seems like a good step

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

>
> Regards,
> Bin
>