Files
android_kernel_xiaomi_sm8450/arch/mips/kernel
Huacai Chen 2e5767a273 MIPS: Remove BUG_ON(!is_fpu_owner()) in do_ade()
In do_ade(), is_fpu_owner() isn't preempt-safe. For example, when an
unaligned ldc1 is executed, do_cpu() is called and then FPU will be
enabled (and TIF_USEDFPU will be set for the current process). Then,
do_ade() is called because the access is unaligned.  If the current
process is preempted at this time, TIF_USEDFPU will be cleard.  So when
the process is scheduled again, BUG_ON(!is_fpu_owner()) is triggered.

This small program can trigger this BUG in a preemptible kernel:

int main (int argc, char *argv[])
{
        double u64[2];

        while (1) {
                asm volatile (
                        ".set push \n\t"
                        ".set noreorder \n\t"
                        "ldc1 $f3, 4(%0) \n\t"
                        ".set pop \n\t"
                        ::"r"(u64):
                );
        }

        return 0;
}

V2: Remove the BUG_ON() unconditionally due to Paul's suggestion.

Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Jie Chen <chenj@lemote.com>
Signed-off-by: Rui Wang <wangr@lemote.com>
Cc: <stable@vger.kernel.org>
Cc: John Crispin <john@phrozen.org>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2014-07-30 21:30:22 +02:00
..
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2014-05-24 00:07:01 +02:00
2014-05-24 00:07:01 +02:00
2014-05-24 00:07:01 +02:00
2011-12-07 22:03:45 +00:00
2014-05-24 00:07:01 +02:00
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2013-02-01 10:00:22 +01:00
2012-12-13 16:46:47 +01:00
2014-05-30 21:01:09 +02:00
2014-05-24 00:07:01 +02:00
2014-05-24 00:07:01 +02:00
2013-02-01 10:00:22 +01:00
2014-06-16 12:47:47 +01:00
2014-05-02 16:39:10 +01:00
2014-05-24 00:07:01 +02:00
2014-05-30 21:01:09 +02:00
2013-02-01 10:00:22 +01:00
2014-05-24 00:07:01 +02:00
2014-01-22 20:19:02 +01:00
2014-05-13 17:57:33 +02:00
2014-05-13 17:57:33 +02:00
2014-05-13 17:57:33 +02:00
2014-05-13 17:57:33 +02:00
2014-05-24 00:07:01 +02:00
2014-05-24 00:07:01 +02:00
2009-06-24 18:34:40 +01:00
2012-03-23 16:58:42 -07:00
2014-05-24 00:07:01 +02:00