AMDマイクロコードが更新されていません。

AMDマイクロコードが更新されていません。

私は最近AMD Ryzen 7 1700XにGentoo Linuxをインストールしました。今私は直面しています。再コンパイルのロード中の分割エラーそしてアイドル状態でランダムに再起動

最初のステップとして、現在のマイクロコードバージョンを確認しました。

grep -m 1 microcode /proc/cpuinfo
microcode       : 0x8001126

しかし、それによるとこのテーブル最新のマイクロコードは0x08001129でなければなりません。したがって、CPUのマイクロコードを更新するのが良い考えのようです。

だから私は現れ=sys-kernel/linux-firmware-20180730ました/lib/firmware/amd-ucode/microcode_amd_fam17h.bin。また、カーネルで次のオプションを有効にしました。

CONFIG_MICROCODE=y
CONFIG_MICROCODE_AMD=y

再起動後、マイクロコードを手動でロードしてみました(最新のマイクロコードアップデート)。

echo 1 > /sys/devices/system/cpu/microcode/reload

ただし、これを行うと新しい行が表示されませんdmesg

dmesg | grep microcode
[    0.465121] microcode: CPU0: patch_level=0x08001126
[    0.465514] microcode: CPU1: patch_level=0x08001126
[    0.465932] microcode: CPU2: patch_level=0x08001126
[    0.466394] microcode: CPU3: patch_level=0x08001126
[    0.466772] microcode: CPU4: patch_level=0x08001126
[    0.467159] microcode: CPU5: patch_level=0x08001126
[    0.467537] microcode: CPU6: patch_level=0x08001126
[    0.467908] microcode: CPU7: patch_level=0x08001126
[    0.468268] microcode: CPU8: patch_level=0x08001126
[    0.468653] microcode: CPU9: patch_level=0x08001126
[    0.468999] microcode: CPU10: patch_level=0x08001126
[    0.469409] microcode: CPU11: patch_level=0x08001126
[    0.469744] microcode: CPU12: patch_level=0x08001126
[    0.470136] microcode: CPU13: patch_level=0x08001126
[    0.470455] microcode: CPU14: patch_level=0x08001126
[    0.470757] microcode: CPU15: patch_level=0x08001126
[    0.471092] microcode: Microcode Update Driver: v2.2.

私は同様のことを期待したmicrocode: CPU0: new patch_level=0x08001129。私がここで何を見逃しているのでしょうか?いくつかのカーネルCONFIG_オプション?一種のデバッグ情報をオンにできますか?または、より良い方法は、提供されているマイクロコードバージョンをどのようにリストしますかmicrocode_amd_fam17h.bin

ベストアンサー1

次のように試すことができます。

CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_MICROCODE=y
# CONFIG_MICROCODE_INTEL is not set
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_FW_LOADER=y
CONFIG_EXTRA_FIRMWARE="amd-ucode/microcode_amd_fam17h.bin"
CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
# CONFIG_FW_LOADER_USER_HELPER is not set

(複数のファイルをリストするにはCONFIG_EXTRA_FIRMWAREスペースで区切る必要があり、そのパスは相対パスでなければなりませんCONFIG_EXTRA_FIRMWARE_DIR。)

ただし、これは機能しない可能性があります(グラフィックスとネットワークファームウェアのみを使用している場合は効果があり、CPUファームウェアでは試していません)。したがって、他のアプローチを試してみてください。CONFIG_EXTRA_FIRMWARE上記の値を無視してください(つまり、設定しないでください。ただし、他の値はそうかもしれません)。まだ必要ですが、わからない)試してみてください初期マイクロコードローディングCPUマイクロコードファイルをinitramfsファイルに追加すると、次のようになります(Gentooから):

/etc/kernel/postinst.d/25-glue_cpu_microcode_to_kernel:

#!/bin/bash

bootdir='/bewt'
initramfsfname="initramfs"
initramfs="$( realpath -- "/${bootdir}/${initramfsfname}" )"
vmlinuz="/${bootdir}/kernel"

prepend_microcode () {
  echo "prepending CPU microcode to ${initramfs}"
  local destfirst="/tmp/initrd/"
  local destmc="${destfirst}/kernel/x86/microcode/"
#  mkdir -p "${destmc}"
    install -dm644 "${destmc}"

  #this will replace the symlink /bewt/initramfs (on gentoo) with the file!
  #but this makes genkernel fail as such: 
  #ln: failed to create symbolic link 'initramfs.old' -> '': No such file or directory
  #even though it doesn't touch the .old file!
  # so to fix this, we'll use realpath above!

  ( cp -f "/lib/firmware/amd-ucode/microcode_amd.bin" "${destmc}/AuthenticAMD.bin" && cd "${destfirst}" && find . | cpio -o -H newc > "../ucode.cpio" 2>/dev/null && cd .. && cat "ucode.cpio" "${initramfs}" > "/tmp/${initramfsfname}" && chmod a-rwx "/tmp/${initramfsfname}" && mv -f "/tmp/${initramfsfname}" "${initramfs}" )
    local ec=$?
    if [[ $ec -eq 0 ]]; then
        echo "success."
    else
        #TODO: make errors be red so it's more obvious
        echo "failed!"
    fi
    return $ec
}

prepend_microcode

ただし、genkernel(まだ?3年が経っても)ファイルが無視される可能性があります/etc/kernel/postinst.d/(または2015年にのみ発生し、修正されたか、他の理由で)。つまり、手動でファイルを実行する必要がありますgenkernel(カーネルをコンパイルするには)。 )、次にスクリプト内のすべての項目を手動で実行します。展示する/etc/kernel/postinst.d/、そうすれば次のようになりますこれ:

echo "!! Running genkernel..." time genkernel all --bootdir="/bewt" --install --symlink --no-splash --no-mountboot --makeopts="-j4 V=0" --no-keymap --lvm --no-mdadm --no-dmraid --no-zfs --no-multipath --no-iscsi --disklabel --luks --no-gpg --no-netboot --no-unionfs --no-firmware --no-integrated-initramfs --compress-initramfs --compress-initrd --compress-initramfs-type=best --loglevel=5 --color --no-mrproper --no-clean --no-postclear --oldconfig ec="$?" if test "$ec" -ne "0"; then echo "!! genkernel failed $ec" exit "$ec" fi echo "!! Done genkernel" list=( `find /etc/kernel/postinst.d -type f -executable | sort --general-numeric-sort` ) echo "!! Found executables: ${list[@]}" for i in ${list[@]}; do ec="-1" while test "0" -ne "$ec"; do echo "!! Executing: '$i'" time $i ec="$?" echo "!! Exit code: $ec" if test "$ec" -ne "0"; then echo "!! something went wrong, fix it then press Enter to retry executing '$i' or press C-c now." #exit $ec time read -p -s "!! Press Enter to re-execute that or C-c to cancel" fi done done

(注:上記のブートディレクトリではない/bewtため、/boot少なくともこれを変更する必要があるかもしれません。上記の文字列microcode_amd.binもユーザーの文字列に置き換える必要がありますmicrocode_amd_fam17h.bin。)
That list=and forare not正しい方法スペース、改行などがない場合を除き、ファイル名を処理します。これは明らかに上記で想定したものです。

.config以前にロードされたCPUファームウェアを含む以前の4.1.7カーネルを表示するには、次を参照してください。これ

おすすめ記事