2023年8月18日金曜日

[備忘録] XilinxのISE 14.7 on VMをインストールできないとき

xsetup.exeを実行してインストールを始めてすぐに、"Installation cannot be performed, please fix the issue before installing. Virtualization is not enabled in BIOS. please enable before installing"と表示されてインストールが進められないときは・・・



 
  • インストールパッケージのbin/validate_virtualization_enabled.ps1スクリプトの3行目あたりを下記のように書き換えておく
    
    # Detect if BIOS is setup to enable virtualization
    #$is_vm_enabled = Get-CimInstance -ClassName win32_processor | select-object -expand VirtualizationFirmwareEnabled
    $is_vm_enabled = $TRUE
    
    if ($is_vm_enabled)
    {
        "Virtualization is enabled"
        $host.SetShouldExit(0)
        exit
    }
    else
    {
        # if hyper-v is enabled windows will report that virtualization is disabled
        # check whether hyper-v is enabled
        $hyperv_enabled = (Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Hypervisor").State -eq "Enabled"
        if ($hyperv_enabled)
        {
            "Hyper-V is enabled, please disable before installing."
            $host.SetShouldExit(2)
            exit
        }
        else
        {
            "Virtualization is not enabled in BIOS, please enable before installing."
            $host.SetShouldExit(2)
            exit
        }
    }
    
    

BIOS/UEFI上でvirtualizationはenableにしているし、Windowsのtask managerでも仮想化=有効となっている。実際、DockerもWSLも使えている。なのに、XilinxのISEインストーラはVirtualization機能が有効になっていないと言って、インストールが進められなかった。

原因は、PCのWin32_ProcessorクラスにあるVirtualizationFirmwareEnabledが何故かFalseを返していたせい。別のPCで確認しても(もちろん、そのPCも仮想化には対応していて、BIOS/タスクマネージャは有効を示しており、Docker&WSLも使えている)、同様にこの値はFalseを返していた。
ネットで調べると、こういう機種は多く、仮想化機能の有効化をチェックする方法としてVirtualizationFirmwareEnableをチェックする方法は不適切&不確実らしい。このせいで、世界中の多くのISEユーザーは苦しんでいるに違いない。

なので、自己判断で仮想化はちゃんと使えるはず!と思うならば、上記のvalidate_virtualization_enabled.ps1スクリプトファイルを書き換えてしまおう。幸いにも、読めばすぐに理解できるスクリプトファイルで判定しているようなので、書き換えは容易だった。もし、コンパイル済みのバイナリ実行コード中でこのような確認処理が行われていたなら、見つけられなかっただろう。

2023年8月16日水曜日

[備忘録] OpenOCDをLPC18xx(LPC1800系LPC1857)で使う

  • OpenOCDに含まれるコンフィグレーションファイルlpc1xxx.cfgは使えそうに見えるが使えない
  • コンフィグレーションファイル中のflash bankの設定では"auto"ではなく"lpc4300"を明示的に指定する

OpenOCDはLPC18xxをサポートしているが、LPC17xxなどのように各品種を包括的にサポートする(ほぼできそうな)lpc1xxx.cfgのようなコンフィグレーションファイルは存在しないようだ。わずかに、lpc1850.cfgのような一部のみサポートするコンフィグレーションは存在するが、flash bankやworkareaといった定義・設定がないか、不十分だと考えられる。

また、lpc1xxx.cfgで使用されている

# flash bank <name> lpc2000 <base> <size> 0 0 <target#> <variant> <clock> [calc checksum] [iap entry]
set _IAP_ENTRY 0
if { [info exists IAP_ENTRY] } {
    set _IAP_ENTRY $IAP_ENTRY
}
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME lpc2000 0x0 0 0 0 $_TARGETNAME \
    auto $_CCLK calc_checksum $_IAP_ENTRY


というflash romの定義は"auto"とあることからLPC18xxでも使えそうな気がするが、実際には"auto"は機能しない。OpenOCDのソースコードを見て分かったのは、"auto"設定で対応可能なのはIAP(In-Application Programming)のテーブルアドレスが0x1fff1ff1に置かれているLPCデバイスに限られる。
一方、LPC18xxのIAPテーブルアドレスは0x10400100に書いてあるアドレスを読み出すことで得られる。この方式はLPC43xxシリーズと同じ方法で、実際のところflashのバンク構成などもLPC43xxの方が近い。Cortex-m3(LPC18xx)とCortex-m4(LPC43xx)の違いはあるが、どちらかというとLPC43xx用のコンフィグレーションを参考にして、LPC18xx用のコンフィグレーションを一から書いた方が早そうである。