Files
MentOS/mentos/inc/hardware/cpuid.h
T
Enrico Fraccaroli (Galfurian) 1b2bc49d41 Update license and remove unused files.
2022-01-27 15:12:36 -05:00

100 lines
3.0 KiB
C

/// @file cpuid.h
/// @brief Structures and functions to handle the CPUID.
/// @details
/// CPUID instruction (identified by a CPUID opcode) is a processor
/// supplementary instruction (its name derived from CPU IDentification)
/// allowing software to discover details of the processor.
/// @copyright (c) 2014-2022 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "stdint.h"
#include "kernel.h"
/// Dimension of the exc flags.
#define ECX_FLAGS_SIZE 24
/// Dimension of the edx flags.
#define EDX_FLAGS_SIZE 32
/// @brief Contains the information concerning the CPU.
typedef struct cpuinfo_t {
/// The name of the vendor.
char cpu_vendor[13];
/// The type of the CPU.
char *cpu_type;
/// The family of the CPU.
uint32_t cpu_family;
/// The model of the CPU.
uint32_t cpu_model;
/// Identifier for individual cores when the CPU is interrogated by the
/// CPUID instruction.
uint32_t apic_id;
/// Ecx flags.
uint32_t cpuid_ecx_flags[ECX_FLAGS_SIZE];
/// Edx flags.
uint32_t cpuid_edx_flags[EDX_FLAGS_SIZE];
/// TODO: Comment.
int is_brand_string;
/// TODO: Comment.
char *brand_string;
} cpuinfo_t;
/// This will be populated with the information concerning the CPU.
cpuinfo_t sinfo;
/// @brief Main CPUID procedure.
/// @param cpuinfo Structure to fill with CPUID information.
void get_cpuid(cpuinfo_t *cpuinfo);
/// @brief Actual CPUID call.
/// @param registers The registers to fill with the result of the call.
void call_cpuid(pt_regs *registers);
/// @brief Extract vendor string.
/// @param cpuinfo The struct containing the CPUID infos.
/// @param registers The registers.
void cpuid_write_vendor(cpuinfo_t *cpuinfo, pt_regs *registers);
// TODO: doxygen documentation.
/// @brief
/// @param cpuinfo
/// @param registers
/// @details
/// CPUID is called with EAX=1
/// EAX contains Type, Family, Model and Stepping ID
/// EBX contains the Brand Index if supported, and the APIC ID
/// ECX/EDX contains feature information
void cpuid_write_proctype(cpuinfo_t *cpuinfo, pt_regs *registers);
// TODO: doxygen documentation.
/// @brief EAX=1, ECX contains a list of supported features.
/// @param cpuinfo
/// @param ecx
void cpuid_feature_ecx(cpuinfo_t *cpuinfo, uint32_t ecx);
// TODO: doxygen documentation.
/// @brief EAX=1, EDX contains a list of supported features.
/// @param cpuinfo
/// @param edx
void cpuid_feature_edx(cpuinfo_t *cpuinfo, uint32_t edx);
// TODO: doxygen documentation.
/// @brief Extract single byte from a register.
/// @param reg
/// @param position
/// @param value
/// @return
uint32_t cpuid_get_byte(uint32_t reg, uint32_t position, uint32_t value);
/// @brief Index of brand strings. TODO: Document
/// @param f Stack frame.
/// @return The brand string.
char *cpuid_brand_index(pt_regs *f);
/// @brief Brand string is contained in EAX, EBX, ECX and EDX.
/// @param f Stack frame.
/// @return The brand string.
char *cpuid_brand_string(pt_regs *f);