diff mbox series

[1/3] target/mips: Set CP0St_{KX, SX, UX} for Loongson-2F

Message ID 20221029020030.13936-2-jiaxun.yang@flygoat.com
State New
Headers show
Series MIPS system emulation miscellaneous fixes | expand

Commit Message

Jiaxun Yang Oct. 29, 2022, 2 a.m. UTC
As per "Loongson-2F processor user manual", CP0St_{KX, SX, UX}
should is not writeable and hardcoded to 1.

Without those bits set, kernel is unable to access XKPHYS address
segmant. So just set them up on CPU reset.

Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
---
 target/mips/cpu.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Philippe Mathieu-Daudé Oct. 29, 2022, 5:44 p.m. UTC | #1
On 29/10/22 04:00, Jiaxun Yang wrote:
> As per "Loongson-2F processor user manual", CP0St_{KX, SX, UX}
> should is not writeable and hardcoded to 1.
> 
> Without those bits set, kernel is unable to access XKPHYS address
> segmant. So just set them up on CPU reset.
> 
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
>   target/mips/cpu.c | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/target/mips/cpu.c b/target/mips/cpu.c
> index d0a76b95f7..a870901bfa 100644
> --- a/target/mips/cpu.c
> +++ b/target/mips/cpu.c
> @@ -304,6 +304,12 @@ static void mips_cpu_reset(DeviceState *dev)
>       env->CP0_EntryHi_ASID_mask = (env->CP0_Config5 & (1 << CP0C5_MI)) ?
>               0x0 : (env->CP0_Config4 & (1 << CP0C4_AE)) ? 0x3ff : 0xff;
>       env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
> +    if (env->insn_flags & INSN_LOONGSON2F) {
> +        /* Loongson-2F has those bits hardcoded to 1 */
> +        env->CP0_Status |= (1 << CP0St_KX) | (1 << CP0St_SX) |
> +                            (1 << CP0St_UX);
> +    }

Don't we want to update CP0_Status_rw_bitmask in Loongson-2F
entry in mips_defs[] instead?
Jiaxun Yang Oct. 29, 2022, 7:50 p.m. UTC | #2
> 2022年10月29日 18:44,Philippe Mathieu-Daudé <philmd@linaro.org> 写道:
> 
> On 29/10/22 04:00, Jiaxun Yang wrote:
>> As per "Loongson-2F processor user manual", CP0St_{KX, SX, UX}
>> should is not writeable and hardcoded to 1.
>> Without those bits set, kernel is unable to access XKPHYS address
>> segmant. So just set them up on CPU reset.
>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>> ---
>>  target/mips/cpu.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>> diff --git a/target/mips/cpu.c b/target/mips/cpu.c
>> index d0a76b95f7..a870901bfa 100644
>> --- a/target/mips/cpu.c
>> +++ b/target/mips/cpu.c
>> @@ -304,6 +304,12 @@ static void mips_cpu_reset(DeviceState *dev)
>>      env->CP0_EntryHi_ASID_mask = (env->CP0_Config5 & (1 << CP0C5_MI)) ?
>>              0x0 : (env->CP0_Config4 & (1 << CP0C4_AE)) ? 0x3ff : 0xff;
>>      env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
>> +    if (env->insn_flags & INSN_LOONGSON2F) {
>> +        /* Loongson-2F has those bits hardcoded to 1 */
>> +        env->CP0_Status |= (1 << CP0St_KX) | (1 << CP0St_SX) |
>> +                            (1 << CP0St_UX);
>> +    }
> 
> Don't we want to update CP0_Status_rw_bitmask in Loongson-2F
> entry in mips_defs[] instead?

Write to those bits is already disabled by CP0_Status_rw_bitmask. However real hardware
had those bits set to 1 but QEMU default them to 0…

Enable writing to those bits can also make kernel work but it mismatches actual hardware
behavior.

Thanks.
---
Jiaxun Yang
Jiaxun Yang Oct. 30, 2022, 12:05 a.m. UTC | #3
> 2022年10月30日 00:19,Philippe Mathieu-Daudé <philmd@linaro.org> 写道:
> 
> On 29/10/22 21:50, Jiaxun Yang wrote:
>>> 2022年10月29日 18:44,Philippe Mathieu-Daudé <philmd@linaro.org> 写道:
>>> 
>>> On 29/10/22 04:00, Jiaxun Yang wrote:
>>>> As per "Loongson-2F processor user manual", CP0St_{KX, SX, UX}
>>>> should is not writeable and hardcoded to 1.
>>>> Without those bits set, kernel is unable to access XKPHYS address
>>>> segmant. So just set them up on CPU reset.
>>>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>>>> ---
>>>>  target/mips/cpu.c | 6 ++++++
>>>>  1 file changed, 6 insertions(+)
>>>> diff --git a/target/mips/cpu.c b/target/mips/cpu.c
>>>> index d0a76b95f7..a870901bfa 100644
>>>> --- a/target/mips/cpu.c
>>>> +++ b/target/mips/cpu.c
>>>> @@ -304,6 +304,12 @@ static void mips_cpu_reset(DeviceState *dev)
>>>>      env->CP0_EntryHi_ASID_mask = (env->CP0_Config5 & (1 << CP0C5_MI)) ?
>>>>              0x0 : (env->CP0_Config4 & (1 << CP0C4_AE)) ? 0x3ff : 0xff;
>>>>      env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
>>>> +    if (env->insn_flags & INSN_LOONGSON2F) {
>>>> +        /* Loongson-2F has those bits hardcoded to 1 */
>>>> +        env->CP0_Status |= (1 << CP0St_KX) | (1 << CP0St_SX) |
>>>> +                            (1 << CP0St_UX);
>>>> +    }
>>> 
>>> Don't we want to update CP0_Status_rw_bitmask in Loongson-2F
>>> entry in mips_defs[] instead?
>> Write to those bits is already disabled by CP0_Status_rw_bitmask. However real hardware
>> had those bits set to 1 but QEMU default them to 0…
>> Enable writing to those bits can also make kernel work but it mismatches actual hardware
>> behavior.
> 
> On "龙芯 2F 处理器用户手册 (0.1 版, 2007 年 8 月)"
> Section 5.10 Status 寄存器(12) (page 57),
> CP0_Status bits 5..7 are 0.
> 
> Can you share your "Loongson-2F processor user manual" doc?

Ah sorry the document was marked as “company confidential” so I’m not sure if I can share
the whole doc. It was updated in 2016 with version 1.8. The latest document I can find in wild
Is version 1.5 [1] but it didn’t cover newer chip reversions.

There is a footnote saying value of those bits was changed in later chips, to translate it says:

"Since LS2F04 those bits was refined to 1. As in LS2F we had implemented a single 64 bit addressing
model and it is mostly compatible with MIPS64 64 bit addressing model.”

It is obvious that without KX and UX bit 64 bit kernel won’t work but my Lemote Fuloong box is running
64 bit kernel along with n64 AOSC/Retro [2] user-space rootfs. For SX bit as LS2F supports XSSEG it
should work as well, though nobody take MIPS supervisor mode serious :-)

[1]: https://github.com/loongson-community/docs/tree/master/2F
[2]: https://wiki.aosc.io/aosc-os/retro/intro/
---
Jiaxun Yang
Richard Henderson Oct. 31, 2022, 12:04 a.m. UTC | #4
On 10/29/22 13:00, Jiaxun Yang wrote:
> As per "Loongson-2F processor user manual", CP0St_{KX, SX, UX}
> should is not writeable and hardcoded to 1.
> 
> Without those bits set, kernel is unable to access XKPHYS address
> segmant. So just set them up on CPU reset.
> 
> Signed-off-by: Jiaxun Yang<jiaxun.yang@flygoat.com>
> ---
>   target/mips/cpu.c | 6 ++++++
>   1 file changed, 6 insertions(+)

Based on down-thread discussion of the manual:
Acked-by: Richard Henderson <richard.henderson@linaro.org>


r~
diff mbox series

Patch

diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index d0a76b95f7..a870901bfa 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -304,6 +304,12 @@  static void mips_cpu_reset(DeviceState *dev)
     env->CP0_EntryHi_ASID_mask = (env->CP0_Config5 & (1 << CP0C5_MI)) ?
             0x0 : (env->CP0_Config4 & (1 << CP0C4_AE)) ? 0x3ff : 0xff;
     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
+    if (env->insn_flags & INSN_LOONGSON2F) {
+        /* Loongson-2F has those bits hardcoded to 1 */
+        env->CP0_Status |= (1 << CP0St_KX) | (1 << CP0St_SX) |
+                            (1 << CP0St_UX);
+    }
+
     /*
      * Vectored interrupts not implemented, timer on int 7,
      * no performance counters.