(toppers-users 4743) [SafeG] NT-Linuxでの CPU hotplugについて

Hiromichi Matsumura matsumura.hiromichi @ meta.co.jp
2018年 3月 8日 (木) 17:01:15 JST


メタテクノの松村と申します。

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
--------------------------------------------------------