kernel: load cpu microcode update if loaded by the bootloader

add optional fields for microcode in kernel_args.

Change-Id: Ic5fb54cf6c9f489a2d1cdda00f63980c11dcdaeb
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2264
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Jérôme Duval
2020-03-16 06:41:16 +00:00
parent 4657aba9da
commit 56bb1bd5c9
5 changed files with 246 additions and 3 deletions
@@ -34,9 +34,12 @@
// MSR registers (possibly Intel specific)
#define IA32_MSR_TSC 0x10
#define IA32_MSR_PLATFORM_ID 0x17
#define IA32_MSR_APIC_BASE 0x1b
#define IA32_MSR_SPEC_CTRL 0x48
#define IA32_MSR_PRED_CMD 0x49
#define IA32_MSR_UCODE_WRITE 0x79 // IA32_BIOS_UPDT_TRIG
#define IA32_MSR_UCODE_REV 0x8b // IA32_BIOS_SIGN_ID
#define IA32_MSR_PLATFORM_INFO 0xce
#define IA32_MSR_MPERF 0xe7
#define IA32_MSR_APERF 0xe8
@@ -431,6 +434,7 @@ typedef struct arch_cpu_info {
int stepping;
int model;
int extended_model;
uint32 patch_level;
uint32 logical_apic_id;
@@ -448,6 +452,37 @@ typedef struct arch_cpu_info {
} arch_cpu_info;
// Reference Intel SDM Volume 3 9.11 "Microcode Update Facilities"
// https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf
// 9.11.1 Table 9-7. Microcode Update Field Definitions
struct intel_microcode_header {
uint32 header_version;
uint32 update_revision;
uint32 date;
uint32 processor_signature;
uint32 checksum;
uint32 loader_revision;
uint32 processor_flags;
uint32 data_size;
uint32 total_size;
uint32 reserved[3];
};
struct intel_microcode_extended_signature_header {
uint32 extended_signature_count;
uint32 extended_checksum;
uint32 reserved[3];
};
struct intel_microcode_extended_signature {
uint32 processor_signature;
uint32 processor_flags;
uint32 checksum;
};
#define nop() __asm__ ("nop"::)
#define x86_read_cr0() ({ \
@@ -105,6 +105,15 @@ typedef struct kernel_args {
// bootsplash data
FixedWidthPointer<uint8> boot_splash;
// optional microcode
FixedWidthPointer<void> ucode_data;
uint32 ucode_data_size;
} _PACKED kernel_args;
const size_t kernel_args_size_v1 = sizeof(kernel_args)
- sizeof(FixedWidthPointer<void>) - sizeof(uint32);
#endif /* KERNEL_BOOT_KERNEL_ARGS_H */