mirror of
https://github.com/speed47/spectre-meltdown-checker.git
synced 2026-06-06 14:43:04 +02:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fd7caec415 | |||
| 68116d87fd | |||
| 3f4801e6a7 | |||
| 9a3688b6fd | |||
| c060a2d2c9 | |||
| 0c89d162a3 | |||
| 02fa416bab | |||
| 1c067add59 | |||
| fe0d3f49f4 | |||
| 00bb4a951c | |||
| 43d5b77885 | |||
| 78a6e4a418 | |||
| 5af1a9fec9 | |||
| b93027640f | |||
| 5c27284119 | |||
| f2e5999fc0 | |||
| 25f20b8860 | |||
| 77e3dbd6b2 | |||
| 8a6f9d5d63 | |||
| 73b67b4a80 | |||
| ea6b8efd18 | |||
| 24d92540a7 | |||
| f2d871acff | |||
| 553a9ec60f | |||
| 83ebe2f75f | |||
| 75ad60f42a | |||
| 931c955765 | |||
| c5ef0c488a | |||
| a05f8aab34 | |||
| 99301d1cbb | |||
| f9c3d19f72 | |||
| 8389d9593c | |||
| 3a822fdcf2 |
@@ -0,0 +1,41 @@
|
|||||||
|
name: autoupdate
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '42 9 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
autoupdate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
ref: source
|
||||||
|
- name: Install prerequisites
|
||||||
|
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends iucode-tool sqlite3 unzip shfmt
|
||||||
|
- name: Update microcode versions
|
||||||
|
run: ./scripts/update_mcedb.sh
|
||||||
|
- name: Update Intel models
|
||||||
|
run: ./scripts/update_intel_models.sh
|
||||||
|
- name: Check git diff
|
||||||
|
id: diff
|
||||||
|
run: |
|
||||||
|
echo change="$(git diff | awk '/MCEDB/ { if(V) { print V" to "$4; exit } else { V=$4 } }')" >> "$GITHUB_OUTPUT"
|
||||||
|
echo nbdiff="$(git diff | grep -cE -- '^\+# [AI],')" >> "$GITHUB_OUTPUT"
|
||||||
|
git diff
|
||||||
|
cat "$GITHUB_OUTPUT"
|
||||||
|
- name: Create Pull Request if needed
|
||||||
|
if: steps.diff.outputs.nbdiff != '0'
|
||||||
|
uses: peter-evans/create-pull-request@v7
|
||||||
|
with:
|
||||||
|
branch: autoupdate-fwdb
|
||||||
|
commit-message: "update: fwdb from ${{ steps.diff.outputs.change }}, ${{ steps.diff.outputs.nbdiff }} microcode changes"
|
||||||
|
title: "[Auto] Update fwdb from ${{ steps.diff.outputs.change }}"
|
||||||
|
body: |
|
||||||
|
Automated PR to update fwdb from ${{ steps.diff.outputs.change }}
|
||||||
|
Detected ${{ steps.diff.outputs.nbdiff }} microcode changes
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
name: 'Manage stale issues and PRs'
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '37 7 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
action:
|
||||||
|
description: "dry-run"
|
||||||
|
required: true
|
||||||
|
default: "dryrun"
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- dryrun
|
||||||
|
- apply
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v10
|
||||||
|
with:
|
||||||
|
any-of-labels: 'needs-more-info,answered'
|
||||||
|
labels-to-remove-when-unstale: 'needs-more-info,answered'
|
||||||
|
days-before-stale: 30
|
||||||
|
days-before-close: 7
|
||||||
|
stale-issue-label: stale
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
debug-only: ${{ case(inputs.action == 'dryrun', true, false) }}
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
name: Online search for vulns
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '42 8 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
model:
|
||||||
|
description: 'Claude model to use (cron runs default to Sonnet)'
|
||||||
|
required: false
|
||||||
|
type: choice
|
||||||
|
default: claude-sonnet-4-6
|
||||||
|
options:
|
||||||
|
- claude-sonnet-4-6
|
||||||
|
- claude-opus-4-7
|
||||||
|
- claude-haiku-4-5-20251001
|
||||||
|
window_hours:
|
||||||
|
description: 'Lookback window in hours (cron runs use 25)'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: '25'
|
||||||
|
reconsider_age_days:
|
||||||
|
description: 'Only reconsider backlog entries last reviewed ≥ N days ago (0 = all, default 7)'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: '7'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: read # needed to list/download previous run artifacts
|
||||||
|
id-token: write # needed by claude-code-action for OIDC auth
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: vuln-watch
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
watch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 20
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# The scripts driving this workflow live on the `vuln-watch` branch so
|
||||||
|
# they don't clutter master (which is what ships to production). The
|
||||||
|
# workflow file itself MUST stay on the default branch, as GitHub only
|
||||||
|
# honors `schedule:` triggers on the default branch.
|
||||||
|
- name: Checkout vuln-watch branch (scripts + prompt)
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
ref: vuln-watch
|
||||||
|
fetch-depth: 1
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.12'
|
||||||
|
|
||||||
|
- name: Install Python dependencies
|
||||||
|
run: python -m pip install --quiet feedparser
|
||||||
|
|
||||||
|
# ---- Load previous state ---------------------------------------------
|
||||||
|
# Find the most recent successful run of THIS workflow (other than the
|
||||||
|
# current one) and pull its `vuln-watch-state` artifact. On the very
|
||||||
|
# first run there will be none — that's fine, we start empty.
|
||||||
|
- name: Find previous successful run id
|
||||||
|
id: prev
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
run_id=$(gh run list \
|
||||||
|
--workflow="${{ github.workflow }}" \
|
||||||
|
--status=success \
|
||||||
|
--limit 1 \
|
||||||
|
--json databaseId \
|
||||||
|
--jq '.[0].databaseId // empty')
|
||||||
|
echo "run_id=${run_id}" >> "$GITHUB_OUTPUT"
|
||||||
|
if [ -n "$run_id" ]; then
|
||||||
|
echo "Found previous successful run: $run_id"
|
||||||
|
else
|
||||||
|
echo "No previous successful run — starting from empty state."
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Download previous state artifact
|
||||||
|
if: steps.prev.outputs.run_id != ''
|
||||||
|
uses: actions/download-artifact@v5
|
||||||
|
continue-on-error: true # tolerate retention expiry
|
||||||
|
with:
|
||||||
|
name: vuln-watch-state
|
||||||
|
path: state/
|
||||||
|
run-id: ${{ steps.prev.outputs.run_id }}
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# ---- Fetch + diff (token-free; runs every time) ---------------------
|
||||||
|
# Performs conditional GETs (ETag / If-Modified-Since) against every
|
||||||
|
# source, parses RSS/Atom/HTML, dedups against state.seen + state.aliases,
|
||||||
|
# applies the time-window filter, and emits new_items.json.
|
||||||
|
# Updates state.sources (HTTP cache metadata + per-source high-water
|
||||||
|
# marks) in place so the cache survives even when Claude doesn't run.
|
||||||
|
- name: Fetch + diff all sources
|
||||||
|
id: diff
|
||||||
|
env:
|
||||||
|
SCAN_DATE: ${{ github.run_started_at }}
|
||||||
|
# Cron runs have no `inputs` context, so the fallback kicks in.
|
||||||
|
WINDOW_HOURS: ${{ inputs.window_hours || '25' }}
|
||||||
|
RECONSIDER_AGE_DAYS: ${{ inputs.reconsider_age_days || '7' }}
|
||||||
|
run: python -m scripts.vuln_watch.fetch_and_diff
|
||||||
|
|
||||||
|
# ---- Fetch checker code so Claude can grep it for coverage ---------
|
||||||
|
# The orphan vuln-watch branch has none of the actual checker code,
|
||||||
|
# so we pull the `test` branch (the dev branch where coded-but-
|
||||||
|
# unreleased CVE checks live) into ./checker/. The prompt tells
|
||||||
|
# Claude this is the canonical source of truth for "is CVE-X already
|
||||||
|
# implemented?". Only fetched on days with something to classify.
|
||||||
|
- name: Checkout checker code (test branch) for coverage grep
|
||||||
|
if: steps.diff.outputs.new_count != '0' || steps.diff.outputs.reconsider_count != '0'
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
ref: test
|
||||||
|
path: checker
|
||||||
|
fetch-depth: 1
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
# ---- Classify new items with Claude (skipped when nothing is new) ---
|
||||||
|
# Model selection: a manual workflow_dispatch run picks from a dropdown
|
||||||
|
# (defaulting to Sonnet). Scheduled cron runs have no `inputs` context,
|
||||||
|
# so the `|| 'claude-sonnet-4-6'` fallback kicks in — cron always uses
|
||||||
|
# Sonnet to keep the daily cost floor low.
|
||||||
|
- name: Run classifier with Claude
|
||||||
|
id: classify
|
||||||
|
if: steps.diff.outputs.new_count != '0' || steps.diff.outputs.reconsider_count != '0'
|
||||||
|
uses: anthropics/claude-code-action@v1
|
||||||
|
env:
|
||||||
|
SCAN_DATE: ${{ github.run_started_at }}
|
||||||
|
with:
|
||||||
|
prompt: |
|
||||||
|
Read the full task instructions from scripts/daily_vuln_watch_prompt.md
|
||||||
|
and execute them end-to-end. Your input is new_items.json (already
|
||||||
|
deduped, windowed, and pre-filtered — do NOT re-fetch sources).
|
||||||
|
Write the three watch_${TODAY}_*.md files and classifications.json.
|
||||||
|
Use $SCAN_DATE as the canonical timestamp.
|
||||||
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||||
|
# model + tool allowlist pass through claude_args (v1 dropped the
|
||||||
|
# dedicated `model:` and `allowed_tools:` inputs). Job-level
|
||||||
|
# `timeout-minutes: 20` above bounds total runtime.
|
||||||
|
claude_args: |
|
||||||
|
--model ${{ inputs.model || 'claude-sonnet-4-6' }}
|
||||||
|
--allowedTools "Read,Write,Edit,Bash,Grep,Glob,WebFetch"
|
||||||
|
|
||||||
|
- name: Upload Claude execution log
|
||||||
|
if: ${{ always() && steps.classify.outputs.execution_file != '' }}
|
||||||
|
uses: actions/upload-artifact@v5
|
||||||
|
with:
|
||||||
|
name: claude-execution-log-${{ github.run_id }}
|
||||||
|
path: ${{ steps.classify.outputs.execution_file }}
|
||||||
|
retention-days: 30
|
||||||
|
if-no-files-found: warn
|
||||||
|
|
||||||
|
# ---- Merge classifications back into state --------------------------
|
||||||
|
# Also writes stub watch_*.md files if the classify step was skipped, so
|
||||||
|
# the report artifact is consistent across runs.
|
||||||
|
- name: Merge classifications into state
|
||||||
|
if: always()
|
||||||
|
env:
|
||||||
|
SCAN_DATE: ${{ github.run_started_at }}
|
||||||
|
run: python -m scripts.vuln_watch.merge_state
|
||||||
|
|
||||||
|
- name: Upload new state artifact
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v5
|
||||||
|
with:
|
||||||
|
name: vuln-watch-state
|
||||||
|
path: state/seen.json
|
||||||
|
retention-days: 90
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Upload daily report
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v5
|
||||||
|
with:
|
||||||
|
name: vuln-watch-report-${{ github.run_id }}
|
||||||
|
path: |
|
||||||
|
watch_*.md
|
||||||
|
current_toimplement.md
|
||||||
|
current_tocheck.md
|
||||||
|
new_items.json
|
||||||
|
classifications.json
|
||||||
|
retention-days: 90
|
||||||
|
if-no-files-found: warn
|
||||||
@@ -188,18 +188,6 @@ Observable timing discrepancy in some Intel processors allows an authenticated u
|
|||||||
|
|
||||||
**Why out of scope:** Like CVE-2020-24511, this is a microcode-only fix with no Linux kernel sysfs entry, no CPUID bit, no MSR, and no kernel configuration option. Detection would require a per-CPU-stepping microcode version lookup table. The vulnerability has low severity (CVSS 2.8) and practical exploitation is limited. Intel dropped microcode support for Sandy Bridge and Ivy Bridge, leaving those generations permanently vulnerable.
|
**Why out of scope:** Like CVE-2020-24511, this is a microcode-only fix with no Linux kernel sysfs entry, no CPUID bit, no MSR, and no kernel configuration option. Detection would require a per-CPU-stepping microcode version lookup table. The vulnerability has low severity (CVSS 2.8) and practical exploitation is limited. Intel dropped microcode support for Sandy Bridge and Ivy Bridge, leaving those generations permanently vulnerable.
|
||||||
|
|
||||||
## CVE-2021-26314 / CVE-2021-26313 — Floating-Point Value Injection (FPVI) and Speculative Code Store Bypass (SCSB)
|
|
||||||
|
|
||||||
- **Bulletin:** [AMD-SB-1003](https://www.amd.com/en/resources/product-security/bulletin/amd-sb-1003.html) (FPVI and SCSB); [AMD-SB-7050](https://www.amd.com/en/resources/product-security/bulletin/amd-sb-7050.html) (FPVI variant, informational)
|
|
||||||
- **Intel advisory:** [Floating Point Value Injection](https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/advisory-guidance/floating-point-value-injection.html)
|
|
||||||
- **Research paper:** [Rage Against the Machine Clear (FPVI/SCSB) — VUSec, USENIX Security '21](https://www.vusec.net/projects/fpvi-scsb/)
|
|
||||||
- **Affected CPUs:** All supported AMD CPU products; Intel CPUs (FPVI)
|
|
||||||
- **CVSS:** 5.5 (Medium) for both
|
|
||||||
|
|
||||||
FPVI (CVE-2021-26314) lets an attacker inject arbitrary floating-point values into the transient execution window opened by a floating-point machine clear, so that dependent operations transiently compute on attacker-influenced values that can then be inferred through a microarchitectural covert channel. SCSB (CVE-2021-26313) is the companion vulnerability where overwritten instructions may still be executed speculatively. AMD-SB-7050 documents an FPVI variant (from the "TREVEX" detection-framework paper) that can be triggered without denormal inputs; AMD considers it to fall within the existing scope of CVE-2021-26314 and assigned it no new CVE, classifying it as informational only.
|
|
||||||
|
|
||||||
**Why out of scope:** The mitigation responsibility falls on individual software, not on the kernel or microcode. Both AMD and Intel recommend that software vendors analyze their code for vulnerable speculative floating-point sequences and insert an `LFENCE` to serialize execution. No microcode update, no CPUID flag, no MSR, and no kernel configuration option was issued, and there is no `/sys/devices/system/cpu/vulnerabilities/` entry for FPVI or SCSB — the kernel never added one, because the fix is not a kernel-level control. This is the same situation as [SLAM (CVE-2020-12965)](#cve-2020-12965--transient-execution-of-non-canonical-accesses-slam) and "Take A Way": the vendor's guidance is "software inserts LFENCE in its own code," leaving nothing for this tool to check. The AMD-SB-7050 variant adds nothing detectable, as it is informational and reuses the existing (software-only) FPVI guidance.
|
|
||||||
|
|
||||||
## CVE-2021-26318 — AMD Prefetch Attacks through Power and Time
|
## CVE-2021-26318 — AMD Prefetch Attacks through Power and Time
|
||||||
|
|
||||||
- **Issue:** [#412](https://github.com/speed47/spectre-meltdown-checker/issues/412)
|
- **Issue:** [#412](https://github.com/speed47/spectre-meltdown-checker/issues/412)
|
||||||
@@ -320,17 +308,6 @@ Exploits a synchronization failure in the AMD stack engine via an undocumented M
|
|||||||
|
|
||||||
**Why out of scope:** Not a transient/speculative execution side channel. This is an architectural attack on AMD SEV-SNP confidential computing that requires hypervisor access, which is outside the threat model of this tool.
|
**Why out of scope:** Not a transient/speculative execution side channel. This is an architectural attack on AMD SEV-SNP confidential computing that requires hypervisor access, which is outside the threat model of this tool.
|
||||||
|
|
||||||
## CVE-2025-52533 — AMD On-Chip Debug Interface Improper Access Control
|
|
||||||
|
|
||||||
- **Advisory:** [NVD CVE-2025-52533](https://nvd.nist.gov/vuln/detail/CVE-2025-52533)
|
|
||||||
- **Affected CPUs:** AMD (various; on-chip debug/test interface)
|
|
||||||
- **CVSS:** 8.7 (High)
|
|
||||||
- **CWE:** [CWE-1191 (On-Chip Debug and Test Interface With Improper Access Control)](https://cwe.mitre.org/data/definitions/1191.html)
|
|
||||||
|
|
||||||
Improper access control in an on-chip debug interface could allow a privileged attacker to enable a debug interface and potentially compromise data confidentiality or integrity.
|
|
||||||
|
|
||||||
**Why out of scope:** Not a transient or speculative execution vulnerability — this is an access-control flaw in a hardware debug/test interface (CWE-1191), with no side-channel or speculative execution component, and it requires a privileged attacker. There is no Linux kernel sysfs entry, no CPUID flag, and no kernel-side mitigation: the fix is delivered as platform/PSP firmware and proven via remote attestation against AMD's Key Distribution Service (KDS), with several SKUs marked "no fix planned." None of this is detectable by this tool, which inspects OS-loadable microcode revisions, CPUID/MSR bits, kernel capabilities, and sysfs.
|
|
||||||
|
|
||||||
## No CVE — Jump Conditional Code (JCC) Erratum
|
## No CVE — Jump Conditional Code (JCC) Erratum
|
||||||
|
|
||||||
- **Issue:** [#329](https://github.com/speed47/spectre-meltdown-checker/issues/329)
|
- **Issue:** [#329](https://github.com/speed47/spectre-meltdown-checker/issues/329)
|
||||||
|
|||||||
+15
-31
@@ -13,7 +13,7 @@
|
|||||||
#
|
#
|
||||||
# Stephane Lesimple
|
# Stephane Lesimple
|
||||||
#
|
#
|
||||||
VERSION='26.36.0606454'
|
VERSION='26.36.0601873'
|
||||||
|
|
||||||
# --- Common paths and basedirs ---
|
# --- Common paths and basedirs ---
|
||||||
readonly VULN_SYSFS_BASE="/sys/devices/system/cpu/vulnerabilities"
|
readonly VULN_SYSFS_BASE="/sys/devices/system/cpu/vulnerabilities"
|
||||||
@@ -3936,18 +3936,11 @@ parse_cpu_details() {
|
|||||||
# cpu_variant_list and cpu_revision_list are consumed by ARM64 errata affection checks
|
# cpu_variant_list and cpu_revision_list are consumed by ARM64 errata affection checks
|
||||||
# that need to match a specific revision range.
|
# that need to match a specific revision range.
|
||||||
if grep -q 'CPU implementer' "$g_procfs/cpuinfo"; then
|
if grep -q 'CPU implementer' "$g_procfs/cpuinfo"; then
|
||||||
# keep these single-line (space-separated) so consumers and outputs (JSON, prometheus)
|
cpu_impl_list=$(awk '/CPU implementer/ {print $4}' "$g_procfs/cpuinfo")
|
||||||
# don't end up with embedded newlines; per-core order is preserved for the errata checks
|
cpu_part_list=$(awk '/CPU part/ {print $4}' "$g_procfs/cpuinfo")
|
||||||
cpu_impl_list=$(awk '/CPU implementer/ {print $4}' "$g_procfs/cpuinfo" | tr '\n' ' ')
|
cpu_arch_list=$(awk '/CPU architecture/ {print $3}' "$g_procfs/cpuinfo")
|
||||||
cpu_impl_list=${cpu_impl_list% }
|
cpu_variant_list=$(awk '/CPU variant/ {print $4}' "$g_procfs/cpuinfo")
|
||||||
cpu_part_list=$(awk '/CPU part/ {print $4}' "$g_procfs/cpuinfo" | tr '\n' ' ')
|
cpu_revision_list=$(awk '/CPU revision/ {print $4}' "$g_procfs/cpuinfo")
|
||||||
cpu_part_list=${cpu_part_list% }
|
|
||||||
cpu_arch_list=$(awk '/CPU architecture/ {print $3}' "$g_procfs/cpuinfo" | tr '\n' ' ')
|
|
||||||
cpu_arch_list=${cpu_arch_list% }
|
|
||||||
cpu_variant_list=$(awk '/CPU variant/ {print $4}' "$g_procfs/cpuinfo" | tr '\n' ' ')
|
|
||||||
cpu_variant_list=${cpu_variant_list% }
|
|
||||||
cpu_revision_list=$(awk '/CPU revision/ {print $4}' "$g_procfs/cpuinfo" | tr '\n' ' ')
|
|
||||||
cpu_revision_list=${cpu_revision_list% }
|
|
||||||
fi
|
fi
|
||||||
# Map first-seen implementer to cpu_vendor; note that heterogeneous systems
|
# Map first-seen implementer to cpu_vendor; note that heterogeneous systems
|
||||||
# (e.g. DynamIQ with ARM+Kryo cores) would all map to one vendor here, but
|
# (e.g. DynamIQ with ARM+Kryo cores) would all map to one vendor here, but
|
||||||
@@ -5058,12 +5051,6 @@ check_kernel_info() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Collapse a whitespace-separated list to its unique values, preserving first-seen order.
|
|
||||||
# Used to prettify the per-core ARM lists for display (e.g. "0x41 0x41 0x41 0x41" -> "0x41").
|
|
||||||
_uniq_list() {
|
|
||||||
echo "$1" | awk '{ for (i = 1; i <= NF; i++) if (!seen[$i]++) printf "%s%s", (n++ ? " " : ""), $i }'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Display hardware-level CPU mitigation support (microcode features, ARCH_CAPABILITIES, etc.)
|
# Display hardware-level CPU mitigation support (microcode features, ARCH_CAPABILITIES, etc.)
|
||||||
check_cpu() {
|
check_cpu() {
|
||||||
local capabilities ret spec_ctrl_msr codename ucode_str
|
local capabilities ret spec_ctrl_msr codename ucode_str
|
||||||
@@ -5073,13 +5060,13 @@ check_cpu() {
|
|||||||
pr_info " * Vendor: $cpu_vendor"
|
pr_info " * Vendor: $cpu_vendor"
|
||||||
pr_info " * Model name: $cpu_friendly_name"
|
pr_info " * Model name: $cpu_friendly_name"
|
||||||
if [ -n "${cpu_impl_list:-}" ]; then
|
if [ -n "${cpu_impl_list:-}" ]; then
|
||||||
pr_info " * Implementer(s): $(_uniq_list "$cpu_impl_list")"
|
pr_info " * Implementer(s): $cpu_impl_list"
|
||||||
fi
|
fi
|
||||||
if [ -n "${cpu_part_list:-}" ]; then
|
if [ -n "${cpu_part_list:-}" ]; then
|
||||||
pr_info " * Part(s): $(_uniq_list "$cpu_part_list")"
|
pr_info " * Part(s): $cpu_part_list"
|
||||||
fi
|
fi
|
||||||
if [ -n "${cpu_arch_list:-}" ]; then
|
if [ -n "${cpu_arch_list:-}" ]; then
|
||||||
pr_info " * Architecture(s): $(_uniq_list "$cpu_arch_list")"
|
pr_info " * Architecture(s): $cpu_arch_list"
|
||||||
fi
|
fi
|
||||||
if has_runtime; then
|
if has_runtime; then
|
||||||
pr_info_nol " * Running as VM guest: "
|
pr_info_nol " * Running as VM guest: "
|
||||||
@@ -13133,7 +13120,7 @@ exit 0 # ok
|
|||||||
# with X being either I for Intel, or A for AMD
|
# with X being either I for Intel, or A for AMD
|
||||||
# When the date is unknown it defaults to 20000101
|
# When the date is unknown it defaults to 20000101
|
||||||
|
|
||||||
# %%% MCEDB v350+i20260512+1cce
|
# %%% MCEDB v349+i20260512+1cce
|
||||||
# I,0x00000611,0xFF,0x00000B27,19961218
|
# I,0x00000611,0xFF,0x00000B27,19961218
|
||||||
# I,0x00000612,0xFF,0x000000C6,19961210
|
# I,0x00000612,0xFF,0x000000C6,19961210
|
||||||
# I,0x00000616,0xFF,0x000000C6,19961210
|
# I,0x00000616,0xFF,0x000000C6,19961210
|
||||||
@@ -13552,7 +13539,6 @@ exit 0 # ok
|
|||||||
# I,0x000A06D0,0xFF,0x10000680,20240818
|
# I,0x000A06D0,0xFF,0x10000680,20240818
|
||||||
# I,0x000A06D1,0x20,0x0A000142,20260129
|
# I,0x000A06D1,0x20,0x0A000142,20260129
|
||||||
# I,0x000A06D1,0x95,0x01000423,20260129
|
# I,0x000A06D1,0x95,0x01000423,20260129
|
||||||
# I,0x000A06E0,0xFF,0x80000953,20240902
|
|
||||||
# I,0x000A06E1,0x97,0x01000307,20260226
|
# I,0x000A06E1,0x97,0x01000307,20260226
|
||||||
# I,0x000A06F0,0xFF,0x80000360,20240130
|
# I,0x000A06F0,0xFF,0x80000360,20240130
|
||||||
# I,0x000A06F3,0x01,0x030003A3,20260130
|
# I,0x000A06F3,0x01,0x030003A3,20260130
|
||||||
@@ -13582,10 +13568,8 @@ exit 0 # ok
|
|||||||
# I,0x000C06C3,0x90,0x0000011B,20260324
|
# I,0x000C06C3,0x90,0x0000011B,20260324
|
||||||
# I,0x000C06F1,0x87,0x210002E0,20251217
|
# I,0x000C06F1,0x87,0x210002E0,20251217
|
||||||
# I,0x000C06F2,0x87,0x210002E0,20251217
|
# I,0x000C06F2,0x87,0x210002E0,20251217
|
||||||
# I,0x000D0650,0xFF,0x00000008,20260208
|
# I,0x000D0670,0xFF,0x00000003,20250825
|
||||||
# I,0x000D0651,0xFF,0x00000008,20260208
|
# I,0x000D06D0,0xFF,0x00000340,20250807
|
||||||
# I,0x000D0670,0xFF,0x00000137,20260218
|
|
||||||
# I,0x000D06D0,0xFF,0x80000370,20250917
|
|
||||||
# I,0x00FF0671,0xFF,0x0000010E,20220907
|
# I,0x00FF0671,0xFF,0x0000010E,20220907
|
||||||
# I,0x00FF0672,0xFF,0x0000000D,20210816
|
# I,0x00FF0672,0xFF,0x0000000D,20210816
|
||||||
# I,0x00FF0675,0xFF,0x0000000D,20210816
|
# I,0x00FF0675,0xFF,0x0000000D,20210816
|
||||||
@@ -13682,7 +13666,7 @@ exit 0 # ok
|
|||||||
# A,0x00880F40,0xFF,0x08804005,20210312
|
# A,0x00880F40,0xFF,0x08804005,20210312
|
||||||
# A,0x00890F00,0xFF,0x08900007,20200921
|
# A,0x00890F00,0xFF,0x08900007,20200921
|
||||||
# A,0x00890F01,0xFF,0x08900103,20201105
|
# A,0x00890F01,0xFF,0x08900103,20201105
|
||||||
# A,0x00890F02,0xFF,0x08900208,20241219
|
# A,0x00890F02,0xFF,0x08900203,20230915
|
||||||
# A,0x00890F10,0xFF,0x08901003,20230919
|
# A,0x00890F10,0xFF,0x08901003,20230919
|
||||||
# A,0x008A0F00,0xFF,0x08A0000B,20241125
|
# A,0x008A0F00,0xFF,0x08A0000B,20241125
|
||||||
# A,0x00A00F00,0xFF,0x0A000033,20200413
|
# A,0x00A00F00,0xFF,0x0A000033,20200413
|
||||||
@@ -13727,11 +13711,11 @@ exit 0 # ok
|
|||||||
# A,0x00B00F00,0xFF,0x0B00004D,20240318
|
# A,0x00B00F00,0xFF,0x0B00004D,20240318
|
||||||
# A,0x00B00F10,0xFF,0x0B001016,20240318
|
# A,0x00B00F10,0xFF,0x0B001016,20240318
|
||||||
# A,0x00B00F20,0xFF,0x0B002032,20241003
|
# A,0x00B00F20,0xFF,0x0B002032,20241003
|
||||||
# A,0x00B00F21,0xFF,0x0B002162,20251105
|
# A,0x00B00F21,0xFF,0x0B002161,20251105
|
||||||
# A,0x00B00F80,0xFF,0x0B008011,20241211
|
# A,0x00B00F80,0xFF,0x0B008011,20241211
|
||||||
# A,0x00B00F81,0xFF,0x0B008121,20251020
|
# A,0x00B00F81,0xFF,0x0B008121,20251020
|
||||||
# A,0x00B10F00,0xFF,0x0B10000F,20240320
|
# A,0x00B10F00,0xFF,0x0B10000F,20240320
|
||||||
# A,0x00B10F10,0xFF,0x0B101059,20251105
|
# A,0x00B10F10,0xFF,0x0B101058,20251105
|
||||||
# A,0x00B20F40,0xFF,0x0B204037,20251019
|
# A,0x00B20F40,0xFF,0x0B204037,20251019
|
||||||
# A,0x00B40F00,0xFF,0x0B400034,20240318
|
# A,0x00B40F00,0xFF,0x0B400034,20240318
|
||||||
# A,0x00B40F40,0xFF,0x0B404035,20251020
|
# A,0x00B40F40,0xFF,0x0B404035,20251020
|
||||||
|
|||||||
Reference in New Issue
Block a user