web-dev-qa-db-ja.com

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で提供されるマイクロコードバージョンをリストするにはどうすればよいですか

6
DaBler

あなたはこのようなものを試すことができます:

_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_の値を無視します(つまり、don設定しないでください。ただし、他のものがまだ必要かどうかは不明ですが、代わりに early microcode loading を試してください。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を実行し(カーネルをコンパイルするため)、その後、すべてを手動でスクリプトで実行します present in _/etc/kernel/postinst.d/_、そうすることは this

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

(注:上記で使用されているbootdirは_/bewt_ではなく_/boot_であるため、少なくともそれを変更することをお勧めします。また、上記の文字列_microcode_AMD.bin_を自分のものに置き換える必要があります:_microcode_AMD_fam17h.bin_)
上記の_list=_およびforは、ファイル名を処理するための 適切な方法 ではありません。ただし、上記で想定されているスペースや改行などがない限り、 。

CPUファームウェアの早期ロードを行った古い4.1.7カーネル_.config_を確認したい場合は、 これ を参照してください。

3
user306023