undefined instruction d5380001 (arm64 mrs emulation)
Matthias Brugger
mbrugger at suse.com
Fri Oct 6 05:05:09 PDT 2017
Hi Catalin,
On 10/05/2017 06:16 PM, Catalin Marinas wrote:
> Hi Matthias,
>
> On Thu, Oct 05, 2017 at 04:54:09PM +0200, Matthias Brugger wrote:
>> On 10/04/2017 11:11 AM, Matwey V. Kornilov wrote:
>>> The patch helps to overcome the issue, Probably it should be applied
>>> to all stable releases affected by this behaviour.
>>> modprobe in initrd may load quite required things.
>>>
>>> 2017-10-02 18:56 GMT+03:00 Suzuki K Poulose <Suzuki.Poulose at arm.com>:
>>>> On Mon, Oct 02, 2017 at 03:11:18PM +0100, James Morse wrote:
>>>>> On 02/10/17 12:24, Dave Martin wrote:
>>>>>> On Fri, Sep 29, 2017 at 10:23:54PM +0300, Matwey V. Kornilov wrote:
>>>>>>> I am running 4.13.3 on rockchip 3328 platform(aarch64) with glibc 2.26
>>>>>>> and see the following at booting:
>>>>>>>
>>>>>>> [ 11.152061] modprobe[93]: undefined instruction: pc=0000ffff8ca48ff4
>>>>>>> [ 11.152707] Code: d503201f 8a180320 92750001 365ffc20 (d5380001)
>>>>>>> [ 11.154347] modprobe[94]: undefined instruction: pc=0000ffff94243ff4
>>>>>>> [ 11.154991] Code: d503201f 8a180320 92750001 365ffc20 (d5380001)
>>>>>>> [ 11.157070] modprobe[97]: undefined instruction: pc=0000ffff839a0ff4
>>>>>>> [ 11.157715] Code: d503201f 8a180320 92750001 365ffc20 (d5380001)
>>>>>>> [ 11.159265] modprobe[98]: undefined instruction: pc=0000ffffb0591ff4
>>>>>>> [ 11.159908] Code: d503201f 8a180320 92750001 365ffc20 (d5380001)
>>>>>>>
>>>>>>> As far as I understand d5380001 should be emulated in cpufeature.c but
>>>>>>> it is not. What could be wrong here?
>>>>>>
>>>>>> The whole sequence is
>>>>>>
>>>>>> 0: d503201f nop
>>>>>> 4: 8a180320 and x0, x25, x24
>>>>>> 8: 92750001 and x1, x0, #0x800
>>>>>> c: 365ffc20 tbz w0, #11, 0xffffffffffffff90
>>>>>> 10:* d5380001 mrs x1, midr_el1 <-- trapping instruction
>>>>>
>>>>> This looks the same as:
>>>>> https://bugzilla.redhat.com/show_bug.cgi?id=1496209
>>>>>
>>>>> [...]
>>>>>
>>>>>> What should happen here is that the do_undefinstr() in
>>>>>> arch/arm64/kernel/traps.c should call registered undef hooks until it
>>>>>> finds one that accepts the faulting instruction.
>>>>>>
>>>>>> So, either the cpufeatures undef hook is not getting called, or it is
>>>>>> failing the instruction somewhere, possibly in
>>>>>> cpufeatures.c:emulate_id_reg() or emulate_sys_reg().
>>>>>>
>>>>>>
>>>>>> Can you add some trace to those functions to see what's happening?
>>>>>
>>>>> I couldn't reproduce this with linux-stable's v4.13.3 defconfig on Seattle or Juno.
>>>>>
>>>>> What distribution are you running? Could you also try [0] to see if this is
>>>>> something specific to your version of modprobe?
>>>>
>>>>
>>>> It is worth noting that we register the MRS instruction handler as late_init call.
>>>> Now the question is how late that could be. Given that we are hitting it with
>>>> modprobe, which could be used for requesting modules from initrd. Also which explains
>>>> why it we can't reproduce it by simple testcases, after it was registered.
>>>>
>>>> Now the question is, how early do we want to push this. Since it doesn't depend really
>>>> on any other subsystem, we could move it as early as "early". Or for keeping it in
>>>> line with other "arch" specific init calls, we could simply make it arch_initcall.
>>>>
>>>> Matwey,
>>>>
>>>> Please could you check if the following patch fixes the issue for you:
>>>>
>>>> Cheers
>>>> Suzuki
>>>>
>>>> ----8>----
>>>>
>>>> arm64: Enable MRS emulation early enough in the boot sequence
>>>>
>>>> Make sure the MRS emulation is enabled early enough that the
>>>> early userspace applications (e.g, those run from initrd) could
>>>> run without any trouble.
>>>>
>>>> Signed-off-by: Suzuki K Poulose <suzuki.poulose at arm.com>
>>>>
>>>> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
>>>> index 9f9e0064c8c1..048f5469531f 100644
>>>> --- a/arch/arm64/kernel/cpufeature.c
>>>> +++ b/arch/arm64/kernel/cpufeature.c
>>>> @@ -1294,4 +1294,4 @@ static int __init enable_mrs_emulation(void)
>>>> return 0;
>>>> }
>>>>
>>>> -late_initcall(enable_mrs_emulation);
>>>> +arch_initcall(enable_mrs_emulation);
>>>> ---
>>
>> I realized this patch did not land in v4.13.5
>> Did it got forgotten or are there any concerns?
>>
>> We also hit this bug in openSUSE Tumbleweed:
>> https://bugzilla.suse.com/show_bug.cgi?id=1061188
>
> As Mark replied, we are still debating why this happens and whether the
> above fix is sufficient. As we were digging further, we realised there
> is no clear init level after which user space can be invoked, which
> means Suzuki's patch may not always be sufficient.
>
> I proposed something as a way of spotting this issue early [1] but I
> need to post it on the linux-arch to get some consensus.
>
> Can you post the full kernel log somewhere? I'm trying to figure out
> what trigged the modprobe during the kernel boot.
>
You can find the kernel log here:
https://bugzilla.suse.com/attachment.cgi?id=743311
Regards,
Matthias
> Thanks,
>
> Catalin
>
> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2017-October/534465.html
>
More information about the linux-arm-kernel
mailing list