diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-13 17:32:20 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-13 17:35:29 -0400 |
commit | 2f1902f6e554f6bc36b5a3e4cf8add8c3e5197cc (patch) | |
tree | 3e1720cc21a662601627022fa8fac7143f612d5d /sys/arch/amd64 | |
parent | cc6c52ec2732652824788549fccf97268be24d22 (diff) |
kernel/amd64: Get CPU family + model
The CPU family ID and model number are sometimes useful in order to
detect the presence of certain CPU features as well as detecting CPU
specific quirks.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/arch/amd64')
-rw-r--r-- | sys/arch/amd64/amd64/machdep.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c index 123f95b..40950f9 100644 --- a/sys/arch/amd64/amd64/machdep.c +++ b/sys/arch/amd64/amd64/machdep.c @@ -189,7 +189,8 @@ enable_simd(void) static void cpu_get_info(struct cpu_info *ci) { - uint32_t unused, ebx; + uint32_t eax, ebx, unused; + uint8_t ext_model, ext_family; /* Extended features */ CPUID(0x07, unused, ebx, unused, unused); @@ -197,6 +198,33 @@ cpu_get_info(struct cpu_info *ci) ci->feat |= CPU_FEAT_SMEP; if (ISSET(ebx, BIT(20))) ci->feat |= CPU_FEAT_SMAP; + + /* + * Processor info and feature bits + */ + CPUID(0x01, eax, unused, unused, unused); + ci->model = (eax >> 4) & 0xF; + ci->family = (eax >> 8) & 0xF; + + /* + * If the family ID is 15 then the actual family + * ID is the sum of the extended family and the + * family ID fields. + */ + if (ci->family == 0xF) { + ext_family = (eax >> 20) & 0xFF; + ci->family += ext_family; + } + + /* + * If the family has the value of either 6 or 15, + * then the extended model number would be used. + * Slap them together if this is the case. + */ + if (ci->family == 6 || ci->family == 15) { + ext_model = (eax >> 16) & 0xF; + ci->model |= (ext_model << 4); + } } void |