scripts/update-intel-ucode-defs.py

Source file repositories/reference/linux-study-clean/scripts/update-intel-ucode-defs.py

File Facts

System
Linux kernel
Corpus path
scripts/update-intel-ucode-defs.py
Extension
.py
Size
4214 bytes
Lines
131
Domain
Support Tooling And Documentation
Bucket
scripts
Inferred role
Support Tooling And Documentation: scripts
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
import argparse
import re
import shutil
import subprocess
import sys
import os

script = os.path.relpath(__file__)

DESCRIPTION = f"""
For Intel CPUs, update the microcode revisions that determine
X86_BUG_OLD_MICROCODE.

This script is intended to be run in response to releases of the
official Intel microcode GitHub repository:
https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files.git

It takes the Intel microcode files as input and uses iucode-tool to
extract the revision information. It prints the output in the format
expected by intel-ucode-defs.h.

Usage:
    ./{script} /path/to/microcode/files > /path/to/intel-ucode-defs.h

Typically, someone at Intel would see a new public release, wait for at
least three months to ensure the update is stable, run this script to
refresh the intel-ucode-defs.h file, and send a patch upstream to update
the mainline and stable versions.

Any exception to this process should be supported with an appropriate
justification.
"""

SIG_RE = re.compile(r'sig (0x[0-9a-fA-F]+)')
PFM_RE = re.compile(r'pf_mask (0x[0-9a-fA-F]+)')
REV_RE = re.compile(r'rev (0x[0-9a-fA-F]+)')

# Functions to extract family, model, and stepping
def bits(val, bottom, top):
    mask = (1 << (top + 1 - bottom)) - 1
    return (val >> bottom) & mask

def family(sig):
    if bits(sig, 8, 11) == 0xf:
        return bits(sig, 8, 11) + bits(sig, 20, 27)
    return bits(sig, 8, 11)

def model(sig):
    return bits(sig, 4, 7) | (bits(sig, 16, 19) << 4)

def step(sig):
    return bits(sig, 0, 3)

class Ucode:
    def __init__(self, sig, pfm, rev):
        self.family = family(sig)
        self.model = model(sig)
        self.steppings = 1 << step(sig)
        self.platforms = pfm
        self.rev = rev

        self.key = (self.family, self.model, self.steppings, self.platforms)

    def __eq__(self, other):
        return self.key == other.key

    def __hash__(self):
        return hash(self.key)

Annotation

Implementation Notes