1#ifndef X86_MATANEL_HAL_H
2#define X86_MATANEL_HAL_H
26#define IDT_ENTRIES 256
30#define IRQL_VECTOR_BASE 0x40
44#define CALC_VECTOR(pri) (IRQL_VECTOR_BASE + (pri << 4))
47#define VECTOR_DPC CALC_VECTOR(TPR_DPC)
48#define VECTOR_APC CALC_VECTOR(TPR_APC)
49#define VECTOR_IPI CALC_VECTOR(TPR_IPI)
50#define LAPIC_TIMER_VECTOR 0xEF
52static inline unsigned int priority_to_vector(uint8_t pri) {
53 if (pri > 15) pri = 15;
335 uint8_t AcpiProcessorId;
382 uint16_t io_map_base;
403#define AP_TRAMP_PHYS 0x7000ULL
404#define AP_TRAMP_SIZE 0x1000UL
405#define AP_TRAMP_APMAIN_OFFSET 0x1000ULL
406#define AP_TRAMP_PML4_OFFSET 0x2000ULL
407#define AP_TRAMP_CPUS_OFFSET 0x2500ULL
409#define LAPIC_ID 0x020
410#define SMP_MAGIC 0x4D4154414E454C00
411#define IST_SIZE (16*1024)
412#define IST_ALIGNMENT 16
414#define CPUID_VENDOR_AMD "AuthenticAMD"
415#define CPUID_VENDOR_AMD_OLD "AMDisbetter!"
416#define CPUID_VENDOR_INTEL "GenuineIntel"
417#define CPUID_VENDOR_VIA "VIA VIA VIA "
418#define CPUID_VENDOR_TRANSMETA "GenuineTMx86"
419#define CPUID_VENDOR_TRANSMETA_OLD "TransmetaCPU"
420#define CPUID_VENDOR_CYRIX "CyrixInstead"
421#define CPUID_VENDOR_CENTAUR "CentaurHauls"
422#define CPUID_VENDOR_NEXGEN "NexGenDriven"
423#define CPUID_VENDOR_UMC "UMC UMC UMC "
424#define CPUID_VENDOR_SIS "SiS SiS SiS "
425#define CPUID_VENDOR_NSC "Geode by NSC"
426#define CPUID_VENDOR_RISE "RiseRiseRise"
427#define CPUID_VENDOR_VORTEX "Vortex86 SoC"
428#define CPUID_VENDOR_AO486 "MiSTer AO486"
429#define CPUID_VENDOR_AO486_OLD "GenuineAO486"
430#define CPUID_VENDOR_ZHAOXIN " Shanghai "
431#define CPUID_VENDOR_HYGON "HygonGenuine"
432#define CPUID_VENDOR_ELBRUS "E2K MACHINE "
435#define CPUID_VENDOR_QEMU "TCGTCGTCGTCG"
436#define CPUID_VENDOR_KVM " KVMKVMKVM "
437#define CPUID_VENDOR_VMWARE "VMwareVMware"
438#define CPUID_VENDOR_VIRTUALBOX "VBoxVBoxVBox"
439#define CPUID_VENDOR_XEN "XenVMMXenVMM"
440#define CPUID_VENDOR_HYPERV "Microsoft Hv"
441#define CPUID_VENDOR_PARALLELS " prl hyperv "
442#define CPUID_VENDOR_PARALLELS_ALT " lrpepyh vr "
443#define CPUID_VENDOR_BHYVE "bhyve bhyve "
444#define CPUID_VENDOR_QNX " QNXQVMBSQG "
480static inline int getCpuModel(
void) {
482 __cpuid(0, unused, ebx, unused, unused);
489 unsigned int eax, ebx, ecx, edx;
490 __cpuid(1, eax, ebx, ecx, edx);
491 return edx & (1 << 9);
496 unsigned int regs[4];
499 for (
unsigned int i = 0; i < 3; i++) {
500 __cpuid(0x80000002 + i, regs[0], regs[1], regs[2], regs[3]);
501 kmemcpy(p, regs,
sizeof(regs));
514 bool schedulerEnabled,
uint8_t apic_list[MAX_CPUS]
void(* DebugCallback)(void *)
void lapic_timer_calibrate(void)
void MiBreakpoint(PTRAP_FRAME trap)
struct _PAGE_PARAMETERS PAGE_PARAMETERS
enum _CPU_EXCEPTIONS CPU_EXCEPTIONS
void lapic_mmio_write(uint32_t off, uint32_t val)
void MiNoCoprocessor(PTRAP_FRAME trap)
struct _IDT_ENTRY_64 IDT_ENTRY64
@ CPU_ACTION_DO_DEFERRED_ROUTINES
@ CPU_ACTION_WRITE_DEBUG_REGS
@ CPU_ACTION_CLEAR_DEBUG_REGS
@ CPU_ACTION_PERFORM_TLB_SHOOTDOWN
int init_lapic_timer(uint32_t hz)
FORCEINLINE bool checkApic(void)
void APMain(void)
---------------— FUNCTIONS ---------------—
void MiBoundsCheck(PTRAP_FRAME trap)
struct _IPI_PARAMS IPI_PARAMS
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
void MiAlignmentCheck(PTRAP_FRAME trap)
@ EXCEPTION_FLOATING_POINT_ERROR
@ EXCEPTION_STACK_SEGMENT_OVERRUN
@ EXCEPTION_INVALID_OPCODE
@ EXCEPTION_SEVERE_MACHINE_CHECK
@ EXCEPTION_NON_MASKABLE_INTERRUPT
@ EXCEPTION_NO_COPROCESSOR
@ EXCEPTION_SEGMENT_SELECTOR_NOTPRESENT
@ EXCEPTION_GENERAL_PROTECTION_FAULT
@ EXCEPTION_COPROCESSOR_SEGMENT_OVERRUN
@ EXCEPTION_DIVIDE_BY_ZERO
@ EXCEPTION_ALIGNMENT_CHECK
void MiDebugTrap(PTRAP_FRAME trap)
@ CPUID_FEAT_ECX_HYPERVISOR
void lapic_send_ipi(uint8_t apic_id, uint8_t vector, uint32_t flags)
void MhRebootComputer(void)
void MhRequestSoftwareInterrupt(IN IRQL RequestIrql)
void MiInvalidTss(IN PTRAP_FRAME trap)
void init_interrupts(void)
void MiInvalidOpcode(PTRAP_FRAME trap)
void MiStackSegmentOverrun(PTRAP_FRAME trap)
enum _INTERRUPT_LIST INTERRUPT_LIST
void lapic_init_siv(void)
@ MADT_INTERUPT_SOURCE_OVERRIDE
@ MADT_NON_MASKABLE_INTERRUPT
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
void MiMachineCheck(PTRAP_FRAME trap)
void(* DebugCallback)(void *)
struct _SMP_BOOTINFO SMP_BOOTINFO
void MiPageFault(IN PTRAP_FRAME trap)
MTSTATUS MhParseLAPICs(uint8_t *buffer, size_t maxCPUs, uint32_t *cpuCount, uint32_t *lapicAddress)
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
void lapic_init_cpu(void)
void MhInitializeSMP(uint8_t *apic_list, uint32_t cpu_count, uint32_t lapicAddress)
void pit_sleep_ms(uint32_t ms)
void MiLapicInterrupt(bool schedulerEnabled, PTRAP_FRAME trap)
MTSTATUS MhInitializeACPI(void)
void MiGeneralProtectionFault(PTRAP_FRAME trap)
void set_idt_gate(int n, unsigned long int handler)
void MiDivideByZero(PTRAP_FRAME trap)
FORCEINLINE void getCpuName(char *name)
void MiFloatingPointError(PTRAP_FRAME trap)
void MiOverflow(PTRAP_FRAME trap)
void MhHandleInterrupt(IN int vec_num, IN PTRAP_FRAME trap)
void MiInterprocessorInterrupt(void)
struct _DEBUG_REGISTERS DEBUG_REGISTERS
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
uint32_t lapic_mmio_read(uint32_t off)
enum _CPU_ACTION CPU_ACTION
void MiSegmentSelectorNotPresent(PTRAP_FRAME trap)
FORCEINLINE void * kmemcpy(void *dest, const void *src, size_t len)
uint32_t GlobalSystemInterruptBase
uint32_t AcpiProcessorUid
uint32_t GlobalSystemInterrupt
GenericAddressStructure X_PM2ControlBlock
GenericAddressStructure X_PM1aEventBlock
GenericAddressStructure X_GPE0Block
GenericAddressStructure X_PM1aControlBlock
GenericAddressStructure X_PM1bControlBlock
uint32_t PM1aControlBlock
GenericAddressStructure X_PMTimerBlock
struct _ACPI_SDT_HEADER h
GenericAddressStructure X_GPE1Block
uint32_t PM1bControlBlock
GenericAddressStructure X_PM1bEventBlock
uint16_t BootArchitectureFlags
GenericAddressStructure ResetReg
uint64_t X_FirmwareControl
uint8_t PreferredPowerManagementProfile
struct _PAGE_PARAMETERS pageParams
struct _DEBUG_REGISTERS debugRegs
struct _ACPI_SDT_HEADER h
uint64_t addressToInvalidate
uint64_t kernel_pml4_phys
struct _ACPI_SDT_HEADER h