(toppers-users 4744) Re: [SafeG] NT-Linuxでの CPU hotplugについて
Hiromichi Matsumura
matsumura.hiromichi @ meta.co.jp
2018年 3月 12日 (月) 11:18:45 JST
メタテクノの松村です。
本件、自己解決しました。
online処理時、リセット処理と同様のレジスタの初期化を追加することで
解決いたしました。
以上、よろしくお願いいたします。
On Thu, 08 Mar 2018 17:01:15 +0900
Hiromichi Matsumura <matsumura.hiromichi @ meta.co.jp> wrote:
> メタテクノの松村と申します。
>
> SafeGの調査・検討をさせていただいております。
>
> その中で、SafeG環境下で CPU hotplug動作時に例外が発生しており、
> その調査が難航しているため、こちらのメーリングリストに投稿させて
> いただきます。
>
> 以下に詳細を記載しますが、『■現象』の箇所に、例外発生時のログを
> 記載します。
>
> もしこちらのログから何か疑わしき箇所が判りますようでしたら、
> アドバイスをいただけると幸いです。
>
> もしくは、本調査を継続するに当たり、どの辺りを見ると良い、などの
> アドバイスでもいただけると助かります。
>
> なお、以下の『■修正』の箇所に、CPU hotplug対応として
> 修正した内容を記載いたします。
> 私が何か勘違いをしている可能性もございますので、問題がございましたら
> 御指摘いただけると助かります。
>
> 参考までに、CPU hotplugについては、以下のURLを参照ください。
> https://www.kernel.org/doc/html/v4.11/core-api/cpu_hotplug.html
>
>
> ■確認環境
>
> 基板: SABRESD(NXP社)
> SafeG: v1.2.4
> Trust: fmp 1.4.0
> NonTrust: Linux(3.10.53-r0)
>
>
> ■現象
>
> CPU hotplugにて、offline後、online時に例外発生。
>
> root @ imx6qsabresd:~# cd /sys/devices/system/cpu/
> root @ imx6qsabresd:/sys/devices/system/cpu# cat cpu3/online
> 1
> root @ imx6qsabresd:/sys/devices/system/cpu# echo 0 > cpu3/online
> CPU3: shutdown
> root @ imx6qsabresd:/sys/devices/system/cpu# echo 1 > cpu3/online
> ---[ end trace 958f2be79573ff0c ]---
> Kernel panic - not syncing: Attempted to kill the idle task!
> CPU2: stopping
> CPU: 2 PID: 0 Comm: swapper/2 Tainted: G D 3.10.53-1.1.0_ga+g496fbe0 #3
> [<80013b00>] (unwind_backtrace+0x0/0xf4) from [<80011524>] (show_stack+0x10/0x14)
> [<80011524>] (show_stack+0x10/0x14) from [<80012d28>] (handle_IPI+0x108/0x118)
> [<80012d28>] (handle_IPI+0x108/0x118) from [<80008584>] (gic_handle_irq+0x58/0x5c)
> [<80008584>] (gic_handle_irq+0x58/0x5c) from [<8000dc80>] (__irq_svc+0x40/0x70)
> Exception stack(0xa809ff50 to 0xa809ff98)
> ff40: a809ff98 0000004c 056f347c 00000012
> ff60: 056b2806 00000012 815820e0 80cabd68 00000000 00000000 a809e000 a809e000
> ff80: 00000017 a809ff98 8005fe3c 80453cf8 600f0013 ffffffff
> [<8000dc80>] (__irq_svc+0x40/0x70) from [<80453cf8>] (cpuidle_enter_state+0x50/0xe0)
> [<80453cf8>] (cpuidle_enter_state+0x50/0xe0) from [<80453e38>] (cpuidle_idle_call+0xb0/0x148)
> [<80453e38>] (cpuidle_idle_call+0xb0/0x148) from [<8000ec68>] (arch_cpu_idle+0x10/0x54)
> [<8000ec68>] (arch_cpu_idle+0x10/0x54) from [<8005f710>] (cpu_startup_entry+0x104/0x150)
> [<8005f710>] (cpu_startup_entry+0x104/0x150) from [<10665124>] (0x10665124)
> CPU0: stopping
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G D 3.10.53-1.1.0_ga+g496fbe0 #3
> [<80013b00>] (unwind_backtrace+0x0/0xf4) from [<80011524>] (show_stack+0x10/0x14)
> [<80011524>] (show_stack+0x10/0x14) from [<80012d28>] (handle_IPI+0x108/0x118)
> [<80012d28>] (handle_IPI+0x108/0x118) from [<80008584>] (gic_handle_irq+0x58/0x5c)
> [<80008584>] (gic_handle_irq+0x58/0x5c) from [<8000dc80>] (__irq_svc+0x40/0x70)
> Exception stack(0x80c9ff20 to 0x80c9ff68)
> ff20: 80c9ff68 0000004c 056f347c 00000012 056b92cc 00000012 815720e0 80cabd68
> ff40: 00000000 00000000 80c9e000 80c9e000 00000017 80c9ff68 8005fe3c 80453cf8
> ff60: 60000013 ffffffff
> [<8000dc80>] (__irq_svc+0x40/0x70) from [<80453cf8>] (cpuidle_enter_state+0x50/0xe0)
> [<80453cf8>] (cpuidle_enter_state+0x50/0xe0) from [<80453e38>] (cpuidle_idle_call+0xb0/0x148)
> [<80453e38>] (cpuidle_idle_call+0xb0/0x148) from [<8000ec68>] (arch_cpu_idle+0x10/0x54)
> [<8000ec68>] (arch_cpu_idle+0x10/0x54) from [<8005f710>] (cpu_startup_entry+0x104/0x150)
> [<8005f710>] (cpu_startup_entry+0x104/0x150) from [<80c52a9c>] (start_kernel+0x324/0x330)
> [<80013b00>] (unwind_backtrace+0x0/0xf4) from [<80011524>] (show_stack+0x10/0x14)
> [<80011524>] (show_stack+0x10/0x14) from [<80012d28>] (handle_IPI+0x108/0x118)
> [<80012d28>] (handle_IPI+0x108/0x118) from [<80008584>] (gic_handle_irq+0x58/0x5c)
> [<80008584>] (gic_handle_irq+0x58/0x5c) from [<8000dc80>] (__irq_svc+0x40/0x70)
> Exception stack(0xa809df50 to 0xa809df98)
> df40: a809df98 0000004c 056f347c 00000012
> df60: 056b2806 00000012 8157a0e0 80cabd68 00000000 00000000 a809c000 a809c000
> df80: 00000017 a809df98 8005fe3c 80453cf8 60010013 ffffffff
> [<8000dc80>] (__irq_svc+0x40/0x70) from [<80453cf8>] (cpuidle_enter_state+0x50/0xe0)
> [<80453cf8>] (cpuidle_enter_state+0x50/0xe0) from [<80453e38>] (cpuidle_idle_call+0xb0/0x148)
> [<80453e38>] (cpuidle_idle_call+0xb0/0x148) from [<8000ec68>] (arch_cpu_idle+0x10/0x54)
> [<8000ec68>] (arch_cpu_idle+0x10/0x54) from [<8005f710>] (cpu_startup_entry+0x104/0x150)
> [<8005f710>] (cpu_startup_entry+0x104/0x150) from [<10665124>] (0x10665124)
>
>
> ■修正
>
> (1) offline対応
>
> 何も修正しない状態では、offline時に例外が発生します。
>
> 以下の関数で、CP15レジスタによる命令キャッシュの無効化処理や電源モードをDORMANTに
> 移行する処理を行っていますが、Trust側が動作している状態であるため、この関数内の
> 処理を全てコメントアウトしました。
>
> arch/arm/mach-imx/hotplug.c
> cpu_enter_lowpower() 処理をコメントアウト
>
> (2) online対応
>
> online時に以下の処理を行われるように修正しました。
>
> fmp_1.4.0/target/imx6_gcc/target_user.txt
> -------------------------------------------
> ●SafeG使用時
> <snip>
> 7. S : コア1,2,3 : SRC_CPR3,5,7に有効な値が書き込まれるので,NSに遷移
> 8. NS : コア1,2,3 : SRC_CPR3,5,7で指定されたアドレスを実行
> -------------------------------------------
>
> [NT-Linux]
> arch/arm/mach-imx/hotplug.c
> imx_cpu_kill() ジャンプアドレスを 0で初期化
> arch/arm/mach-imx/src.c
> imx_set_cpu_jump() ジャンプアドレスに 0を指定された場合、GPRnに 0を設定
>
> [T-FMP]
> safeg-1.2.4/sample/fmp/sample1/sample1.c
> btask() GPRnが再設定されたら safeg_syscall_setntpc関数を再実行するように変更
>
>
> 以上、よろしくお願いいたします。
>
>
> --------------------------------------------------------
> 株式会社メタテクノ(静岡技術センター)
> 事業本部 コアテクノロジー部
> 松村浩道
> 〒411-0943 静岡県駿東郡長泉町下土狩30-1 山光ビルB棟1階
> Tel: 050-3535-0158 Fax: 055-980-1805
> E-mail: matsumura.hiromichi @ meta.co.jp
> --------------------------------------------------------
--------------------------------------------------------
株式会社メタテクノ(静岡技術センター)
事業本部 コアテクノロジー部
松村浩道
〒411-0943 静岡県駿東郡長泉町下土狩30-1 山光ビルB棟1階
Tel: 050-3535-0158 Fax: 055-980-1805
E-mail: matsumura.hiromichi @ meta.co.jp
--------------------------------------------------------