kernel
Loading...
Searching...
No Matches
mh.h
Go to the documentation of this file.
1#ifndef X86_MATANEL_HAL_H
2#define X86_MATANEL_HAL_H
4/*++
6Module Name:
8 mh.h
10Purpose:
12 This module contains the header files & prototypes required for the hardware abstraction layer of MatanelOS.
14Author:
16 slep (Matanel) 2025.
18Revision History:
20--*/
22#include "core.h"
23#include "annotations.h"
24#include "macros.h"
25#include <cpuid.h>
26#define IDT_ENTRIES 256
28#include "mm.h"
30#define IRQL_VECTOR_BASE 0x40
32// Valid IDT vectors range from 0x20 (32) to 0xFF (255).
33// We space them out to give them distinct Priority Classes (Upper 4 bits).
35#define VECTOR_APC 0x30 // Class 3 (Priority 3)
36#define VECTOR_DPC 0x40 // Class 4 (Priority 4)
37#define VECTOR_CLOCK 0xD0 // Class 13 (Priority 13)
38#define VECTOR_IPI 0xE0 // Class 14 (Priority 14)
39
40// Rule: TPR_X must be equal to (VECTOR_X >> 4) to mask that vector.
42#define TPR_PASSIVE 0 // Blocks nothing
43#define TPR_APC 3 // Blocks Vectors 0x30-0x3F and below
44#define TPR_DPC 4 // Blocks Vectors 0x40-0x4F and below
45#define TPR_CLOCK 13 // Blocks Vectors 0xD0-0xDF and below
46#define TPR_IPI 14 // Blocks Vectors 0xE0-0xEF and below
47#define TPR_HIGH 15 // Blocks Everything (NMI is exception)
48
49static inline unsigned int priority_to_vector(uint8_t priority_class) {
50 if (priority_class > 15) priority_class = 15;
51 // Maps class X to the base vector of that class (X << 4)
52 return (priority_class << 4);
55// ------------------ ENUMERATORS ------------------
57//** Exception Definitions **/
79
81typedef enum _INTERRUPT_LIST {
82 TIMER_INTERRUPT = 32, // Unused, PIC.
83 KEYBOARD_INTERRUPT = 33, // Unused, PS/2 Keyboard
84 ATA_INTERRUPT = 46, // Might be used for driver, ATA.
85 LAPIC_SIV_INTERRUPT = 0xFF, // LAPIC Spurious interrupt vector.
87
97
105
106enum {
138
169};
170
171enum MSRs {
172 MSR_EFER = 0xC0000080,
173};
174
175// ------------------ STRUCTURES ------------------
176
177#pragma pack(push, 1)
178typedef struct _IDT_PTR {
179 uint16_t limit;
180 uint64_t base;
182
183typedef struct _IDT_ENTRY_64 {
184 uint16_t offset_low;
185 uint16_t selector;
186 uint8_t ist;
187 uint8_t type_attr;
188 uint16_t offset_mid;
189 uint32_t offset_high;
190 uint32_t zero;
192#pragma pack(pop)
193
194typedef struct _RSDP_Descriptor {
195 char Signature[8];
196 uint8_t Checksum;
197 char OemId[6];
198 uint8_t Revision;
199 uint32_t RsdtAddress; // legacy 32bit.
200 // acpi 2.0 fields
201 uint32_t Length;
202 uint64_t XsdtAddress; // The one we use.
204 uint8_t Reserved[3];
205} __attribute__((packed)) RSDP_Descriptor;
206
207typedef struct _ACPI_SDT_HEADER {
208 char Signature[4];
209 uint32_t Length;
210 uint8_t Revision;
211 uint8_t Checksum;
212 char OemId[6];
213 char OemTableId[8];
214 uint32_t OemRevision;
215 uint32_t CreatorId;
217} __attribute__((packed)) ACPI_SDT_HEADER;
218
219typedef struct _XSDT {
221 uint64_t Entries[]; // Array of 64-bit physical addresses to other tables
222} __attribute__((packed)) XSDT;
223
225{
227 uint8_t BitWidth;
228 uint8_t BitOffset;
229 uint8_t AccessSize;
230 uint64_t Address;
231} __attribute__((packed)) GenericAddressStructure;
232
233typedef struct _FADT
234{
236 uint32_t FirmwareCtrl;
237 uint32_t Dsdt;
238
239 // field used in ACPI 1.0; no longer in use, for compatibility only
240 uint8_t Reserved;
241
245 uint8_t AcpiEnable;
246 uint8_t AcpiDisable;
247 uint8_t S4BIOS_REQ;
254 uint32_t PMTimerBlock;
255 uint32_t GPE0Block;
256 uint32_t GPE1Block;
261 uint8_t GPE0Length;
262 uint8_t GPE1Length;
263 uint8_t GPE1Base;
267 uint16_t FlushSize;
268 uint16_t FlushStride;
269 uint8_t DutyOffset;
270 uint8_t DutyWidth;
271 uint8_t DayAlarm;
272 uint8_t MonthAlarm;
273 uint8_t Century;
274
275 // reserved in ACPI 1.0; used since ACPI 2.0+
277
278 uint8_t Reserved2;
279 uint32_t Flags;
280
281 // 12 byte structure; see below for details
282 GenericAddressStructure ResetReg;
283
284 uint8_t ResetValue;
285 uint8_t Reserved3[3];
286
287 // 64bit pointers - Available on ACPI 2.0+
289 uint64_t X_Dsdt;
290
291 GenericAddressStructure X_PM1aEventBlock;
292 GenericAddressStructure X_PM1bEventBlock;
293 GenericAddressStructure X_PM1aControlBlock;
294 GenericAddressStructure X_PM1bControlBlock;
295 GenericAddressStructure X_PM2ControlBlock;
296 GenericAddressStructure X_PMTimerBlock;
297 GenericAddressStructure X_GPE0Block;
298 GenericAddressStructure X_GPE1Block;
299} __attribute__((packed)) FADT;
300
301typedef struct _MADT {
303 uint32_t lapicAddress;
304 uint32_t flags;
305} __attribute__((packed)) MADT;
306
307typedef struct {
308 uint8_t Type; // 0
309 uint8_t Length; // 8
311 uint8_t ApicId;
312 uint32_t Flags; // Bit 0 = enabled, Bit 1 = online-capable
313} __attribute__((packed)) MADT_LOCAL_APIC;
314
315typedef struct {
316 uint8_t Type; // 1
317 uint8_t Length; // 12
318 uint8_t IoApicId;
319 uint8_t Reserved; // must be 0
320 uint32_t IoApicAddress; // physical address
322} __attribute__((packed)) MADT_IO_APIC;
323
324typedef struct {
325 uint8_t Type; // 2
326 uint8_t Length; // 10
327 uint8_t Bus; // 0 = ISA
328 uint8_t Source; // IRQ source
330 uint16_t Flags;
331} __attribute__((packed)) MADT_INTERRUPT_OVERRIDE;
332
333typedef struct {
334 uint8_t Type; // 4
335 uint8_t Length; // 6
336 uint8_t AcpiProcessorId; // 0xFF = all processors
337 uint16_t Flags;
338 uint8_t Lint; // LINTn pin (0 or 1)
339} __attribute__((packed)) MADT_NMI;
340
341typedef struct {
342 uint8_t Type; // 9
343 uint8_t Length; // 16
344 uint16_t Reserved;
345 uint32_t X2ApicId;
346 uint32_t Flags; // same as local APIC flags
348} __attribute__((packed)) MADT_LOCAL_X2APIC;
349
350typedef struct _SMP_BOOTINFO {
351 uint64_t magic;
352 uint64_t kernel_pml4_phys; // from boot_info_local.Pml4Phys
353 uint64_t ap_entry_virt; // kernel virtual address of ap_main()
354 uint32_t cpu_count;
355 uint32_t lapic_base;
357
358typedef struct __attribute__((packed)) _GDTEntry64 {
359 uint16_t limit_low;
360 uint16_t base_low;
361 uint8_t base_middle;
362 uint8_t access;
363 uint8_t granularity;
364 uint8_t base_high;
365 uint32_t base_upper;
366 uint32_t reserved;
368
369typedef struct __attribute__((packed)) _GDTPtr {
370 uint16_t limit;
371 uint64_t base;
373
374typedef struct __attribute__((packed)) _TSS {
375 uint32_t reserved0;
376 uint64_t rsp0;
377 uint64_t rsp1;
378 uint64_t rsp2;
379 uint64_t reserved1;
380 uint64_t ist[7]; // This is the Interrupt Stack Table
381 uint32_t reserved2;
382 uint16_t reserved3;
383 uint16_t io_map_base;
385
386typedef void (*DebugCallback)(void*);
387
393
397
402
403// ------------------ MACROS ------------------
404#define AP_TRAMP_PHYS 0x7000ULL
405#define AP_TRAMP_SIZE 0x1000UL // single page
406#define AP_TRAMP_APMAIN_OFFSET 0x1000ULL
407#define AP_TRAMP_PML4_OFFSET 0x2000ULL
408#define AP_TRAMP_CPUS_OFFSET 0x2500ULL
409#define MAX_CPUS 32
410#define LAPIC_ID 0x020
411#define SMP_MAGIC 0x4D4154414E454C00 // MATANEL\0
412#define IST_SIZE (16*1024) // 16 KiB
413#define IST_ALIGNMENT 16
414// Vendor strings from CPUs.
415#define CPUID_VENDOR_AMD "AuthenticAMD"
416#define CPUID_VENDOR_AMD_OLD "AMDisbetter!" // Early engineering samples of AMD K5 processor
417#define CPUID_VENDOR_INTEL "GenuineIntel"
418#define CPUID_VENDOR_VIA "VIA VIA VIA "
419#define CPUID_VENDOR_TRANSMETA "GenuineTMx86"
420#define CPUID_VENDOR_TRANSMETA_OLD "TransmetaCPU"
421#define CPUID_VENDOR_CYRIX "CyrixInstead"
422#define CPUID_VENDOR_CENTAUR "CentaurHauls"
423#define CPUID_VENDOR_NEXGEN "NexGenDriven"
424#define CPUID_VENDOR_UMC "UMC UMC UMC "
425#define CPUID_VENDOR_SIS "SiS SiS SiS "
426#define CPUID_VENDOR_NSC "Geode by NSC"
427#define CPUID_VENDOR_RISE "RiseRiseRise"
428#define CPUID_VENDOR_VORTEX "Vortex86 SoC"
429#define CPUID_VENDOR_AO486 "MiSTer AO486"
430#define CPUID_VENDOR_AO486_OLD "GenuineAO486"
431#define CPUID_VENDOR_ZHAOXIN " Shanghai "
432#define CPUID_VENDOR_HYGON "HygonGenuine"
433#define CPUID_VENDOR_ELBRUS "E2K MACHINE "
434
435// Vendor strings from hypervisors.
436#define CPUID_VENDOR_QEMU "TCGTCGTCGTCG"
437#define CPUID_VENDOR_KVM " KVMKVMKVM "
438#define CPUID_VENDOR_VMWARE "VMwareVMware"
439#define CPUID_VENDOR_VIRTUALBOX "VBoxVBoxVBox"
440#define CPUID_VENDOR_XEN "XenVMMXenVMM"
441#define CPUID_VENDOR_HYPERV "Microsoft Hv"
442#define CPUID_VENDOR_PARALLELS " prl hyperv "
443#define CPUID_VENDOR_PARALLELS_ALT " lrpepyh vr " // Sometimes Parallels incorrectly encodes "prl hyperv" as "lrpepyh vr" due to an endianness mismatch.
444#define CPUID_VENDOR_BHYVE "bhyve bhyve "
445#define CPUID_VENDOR_QNX " QNXQVMBSQG "
446
448
449void APMain(void);
450void MhInitializeSMP(uint8_t* apic_list, uint32_t cpu_count, uint32_t lapicAddress);
451void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter);
452
453extern int smp_cpu_count;
454extern bool smpInitialized;
455extern bool allApsInitialized;
456
457// Didn't get rename yet.
458void set_idt_gate(int n, unsigned long int handler);
459void install_idt(void);
460void init_interrupts(void);
461
462void lapic_init_cpu(void); // call once on BSP early
463void lapic_enable(void);
464uint32_t lapic_mmio_read(uint32_t off);
465void lapic_mmio_write(uint32_t off, uint32_t val);
466void lapic_eoi(void);
467// lapic spurious interrupt vector, protects against faulty interrupts.
468void lapic_init_siv(void);
469// send IPI to APIC id
470// apic_id - APICId of the CPU.
471// vector - IDT Vector number
472// flags - specified cpu flags, 0 for none.
473void lapic_send_ipi(uint8_t apic_id, uint8_t vector, uint32_t flags);
474int init_lapic_timer(uint32_t hz); // calibrate + start periodic timer at `hz` (returns 0 on success)
475void pit_sleep_ms(uint32_t ms);
476void lapic_timer_calibrate(void);
477
478extern bool checkcpuid(void);
479
480// Get CPU Model number
481static inline int getCpuModel(void) {
482 int ebx, unused;
483 __cpuid(0, unused, ebx, unused, unused);
484 return ebx;
485}
486
487// Check for APIC Availability
489bool checkApic(void) {
490 unsigned int eax, ebx, ecx, edx;
491 __cpuid(1, eax, ebx, ecx, edx);
492 return edx & (1 << 9); // bit 9 = APIC
493}
494
496void getCpuName(char* name) {
497 unsigned int regs[4];
498 char* p = name;
499
500 for (unsigned int i = 0; i < 3; i++) {
501 __cpuid(0x80000002 + i, regs[0], regs[1], regs[2], regs[3]);
502 kmemcpy(p, regs, sizeof(regs));
503 p += sizeof(regs);
504 }
505 *p = '\0'; // Null-terminate
506}
507
508void
510 IN int vec_num,
511 IN PTRAP_FRAME trap
512);
513
515 bool schedulerEnabled,
516 PTRAP_FRAME trap
517);
518
519void MiBreakpoint(
520 PTRAP_FRAME trap
521);
522
524void
526 PTRAP_FRAME trap
527);
528
529void
531 PTRAP_FRAME trap
532);
533
534void
536 PTRAP_FRAME trap
537);
538
540void
542 IN PTRAP_FRAME trap
543);
544
545void
547 void
548);
549
550void
552 IN PTRAP_FRAME trap
553);
554
555void
557 IN PTRAP_FRAME trap
558);
559
560void
562 PTRAP_FRAME trap
563);
564
565void
567 PTRAP_FRAME trap
568);
569
570void
572 PTRAP_FRAME trap
573);
574
575void
577 PTRAP_FRAME trap
578);
579
580void
582 PTRAP_FRAME trap
583);
584
585void
587 PTRAP_FRAME trap
588);
589
590void
592 PTRAP_FRAME trap
593);
594
595void
597 PTRAP_FRAME trap
598);
599
600void
602 PTRAP_FRAME trap
603);
604
605void
607 PTRAP_FRAME trap
608);
609
610void
612 PTRAP_FRAME trap
613);
614
615void
617 IN IRQL RequestIrql
618);
619
621MTSTATUS MhParseLAPICs(uint8_t* buffer, size_t maxCPUs, uint32_t* cpuCount, uint32_t* lapicAddress);
622
623void
625 void
626);
627
628#endif
#define FORCEINLINE
Definition annotations.h:23
#define NORETURN
Definition annotations.h:14
#define IN
Definition annotations.h:8
bool smpInitialized
Definition kernel.c:149
enum _IRQL IRQL
TRAP_FRAME * PTRAP_FRAME
Definition core.h:56
uint8_t apic_list[MAX_CPUS]
Definition kernel.c:146
uint32_t cpu_count
Definition kernel.c:147
void(* DebugCallback)(void *)
Definition me.h:142
void lapic_timer_calibrate(void)
Definition apic.c:171
void MiBreakpoint(PTRAP_FRAME trap)
Definition handlers.c:421
bool checkcpuid(void)
MSRs
Definition mh.h:171
@ MSR_EFER
Definition mh.h:172
struct _PAGE_PARAMETERS PAGE_PARAMETERS
struct _IDT_PTR IDT_PTR
enum _CPU_EXCEPTIONS CPU_EXCEPTIONS
void lapic_mmio_write(uint32_t off, uint32_t val)
Definition apic.c:45
void MiNoCoprocessor(PTRAP_FRAME trap)
Definition handlers.c:457
struct _IDT_ENTRY_64 IDT_ENTRY64
_CPU_ACTION
Definition mh.h:88
@ CPU_ACTION_DO_DEFERRED_ROUTINES
Definition mh.h:94
@ CPU_ACTION_WRITE_DEBUG_REGS
Definition mh.h:92
@ CPU_ACTION_STOP
Definition mh.h:89
@ CPU_ACTION_CLEAR_DEBUG_REGS
Definition mh.h:93
@ CPU_ACTION_FLUSH_CR3
Definition mh.h:95
@ CPU_ACTION_PERFORM_TLB_SHOOTDOWN
Definition mh.h:91
@ CPU_ACTION_PRINT_ID
Definition mh.h:90
int init_lapic_timer(uint32_t hz)
Definition apic.c:179
FORCEINLINE bool checkApic(void)
Definition mh.h:489
void APMain(void)
---------------— FUNCTIONS ---------------—
Definition ap_main.c:35
void MiBoundsCheck(PTRAP_FRAME trap)
Definition handlers.c:448
struct _IPI_PARAMS IPI_PARAMS
void install_idt(void)
Definition idt.c:24
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
Definition handlers.c:391
void MiAlignmentCheck(PTRAP_FRAME trap)
Definition handlers.c:529
_CPU_EXCEPTIONS
Definition mh.h:58
@ EXCEPTION_FLOATING_POINT_ERROR
Definition mh.h:75
@ EXCEPTION_INVALID_TSS
Definition mh.h:69
@ EXCEPTION_STACK_SEGMENT_OVERRUN
Definition mh.h:71
@ EXCEPTION_INVALID_OPCODE
Definition mh.h:65
@ EXCEPTION_SEVERE_MACHINE_CHECK
Definition mh.h:77
@ EXCEPTION_SINGLE_STEP
Definition mh.h:60
@ EXCEPTION_NON_MASKABLE_INTERRUPT
Definition mh.h:61
@ EXCEPTION_DOUBLE_FAULT
Definition mh.h:67
@ EXCEPTION_NO_COPROCESSOR
Definition mh.h:66
@ EXCEPTION_RESERVED
Definition mh.h:74
@ EXCEPTION_SEGMENT_SELECTOR_NOTPRESENT
Definition mh.h:70
@ EXCEPTION_GENERAL_PROTECTION_FAULT
Definition mh.h:72
@ EXCEPTION_COPROCESSOR_SEGMENT_OVERRUN
Definition mh.h:68
@ EXCEPTION_DIVIDE_BY_ZERO
Definition mh.h:59
@ EXCEPTION_OVERFLOW
Definition mh.h:63
@ EXCEPTION_ALIGNMENT_CHECK
Definition mh.h:76
@ EXCEPTION_BREAKPOINT
Definition mh.h:62
@ EXCEPTION_PAGE_FAULT
Definition mh.h:73
@ EXCEPTION_BOUNDS_CHECK
Definition mh.h:64
void MiDebugTrap(PTRAP_FRAME trap)
Definition handlers.c:327
@ CPUID_FEAT_EDX_TM
Definition mh.h:166
@ CPUID_FEAT_ECX_RDRAND
Definition mh.h:136
@ CPUID_FEAT_ECX_TSC
Definition mh.h:130
@ CPUID_FEAT_EDX_IA64
Definition mh.h:167
@ CPUID_FEAT_ECX_EST
Definition mh.h:114
@ CPUID_FEAT_EDX_DS
Definition mh.h:158
@ CPUID_FEAT_ECX_DS_CPL
Definition mh.h:111
@ CPUID_FEAT_EDX_CLFLUSH
Definition mh.h:157
@ CPUID_FEAT_ECX_HYPERVISOR
Definition mh.h:137
@ CPUID_FEAT_EDX_TSC
Definition mh.h:143
@ CPUID_FEAT_ECX_DCA
Definition mh.h:124
@ CPUID_FEAT_EDX_PAE
Definition mh.h:145
@ CPUID_FEAT_EDX_CX8
Definition mh.h:147
@ CPUID_FEAT_ECX_F16C
Definition mh.h:135
@ CPUID_FEAT_ECX_OSXSAVE
Definition mh.h:133
@ CPUID_FEAT_ECX_X2APIC
Definition mh.h:127
@ CPUID_FEAT_ECX_PCID
Definition mh.h:123
@ CPUID_FEAT_EDX_FXSR
Definition mh.h:161
@ CPUID_FEAT_ECX_SSSE3
Definition mh.h:116
@ CPUID_FEAT_EDX_PSE
Definition mh.h:142
@ CPUID_FEAT_EDX_MTRR
Definition mh.h:150
@ CPUID_FEAT_EDX_VME
Definition mh.h:140
@ CPUID_FEAT_ECX_XTPR
Definition mh.h:121
@ CPUID_FEAT_ECX_SSE4_1
Definition mh.h:125
@ CPUID_FEAT_EDX_SEP
Definition mh.h:149
@ CPUID_FEAT_EDX_DE
Definition mh.h:141
@ CPUID_FEAT_EDX_MSR
Definition mh.h:144
@ CPUID_FEAT_ECX_MONITOR
Definition mh.h:110
@ CPUID_FEAT_ECX_VMX
Definition mh.h:112
@ CPUID_FEAT_ECX_POPCNT
Definition mh.h:129
@ CPUID_FEAT_ECX_AVX
Definition mh.h:134
@ CPUID_FEAT_EDX_APIC
Definition mh.h:148
@ CPUID_FEAT_ECX_AES
Definition mh.h:131
@ CPUID_FEAT_ECX_PDCM
Definition mh.h:122
@ CPUID_FEAT_EDX_PSE36
Definition mh.h:155
@ CPUID_FEAT_ECX_FMA
Definition mh.h:119
@ CPUID_FEAT_ECX_XSAVE
Definition mh.h:132
@ CPUID_FEAT_EDX_CMOV
Definition mh.h:153
@ CPUID_FEAT_ECX_SSE3
Definition mh.h:107
@ CPUID_FEAT_ECX_DTES64
Definition mh.h:109
@ CPUID_FEAT_ECX_PCLMUL
Definition mh.h:108
@ CPUID_FEAT_EDX_PSN
Definition mh.h:156
@ CPUID_FEAT_EDX_SSE
Definition mh.h:162
@ CPUID_FEAT_EDX_SSE2
Definition mh.h:163
@ CPUID_FEAT_ECX_SMX
Definition mh.h:113
@ CPUID_FEAT_EDX_FPU
Definition mh.h:139
@ CPUID_FEAT_EDX_PAT
Definition mh.h:154
@ CPUID_FEAT_ECX_SSE4_2
Definition mh.h:126
@ CPUID_FEAT_ECX_MOVBE
Definition mh.h:128
@ CPUID_FEAT_EDX_MMX
Definition mh.h:160
@ CPUID_FEAT_EDX_HTT
Definition mh.h:165
@ CPUID_FEAT_EDX_MCA
Definition mh.h:152
@ CPUID_FEAT_ECX_TM2
Definition mh.h:115
@ CPUID_FEAT_ECX_CX16
Definition mh.h:120
@ CPUID_FEAT_EDX_MCE
Definition mh.h:146
@ CPUID_FEAT_EDX_PBE
Definition mh.h:168
@ CPUID_FEAT_EDX_SS
Definition mh.h:164
@ CPUID_FEAT_EDX_ACPI
Definition mh.h:159
@ CPUID_FEAT_ECX_SDBG
Definition mh.h:118
@ CPUID_FEAT_EDX_PGE
Definition mh.h:151
@ CPUID_FEAT_ECX_CID
Definition mh.h:117
void lapic_send_ipi(uint8_t apic_id, uint8_t vector, uint32_t flags)
Definition apic.c:129
TSS
Definition mh.h:384
void lapic_eoi(void)
Definition apic.c:136
void MhRebootComputer(void)
Definition acpi.c:83
void MhRequestSoftwareInterrupt(IN IRQL RequestIrql)
Definition apic.c:199
void MiInvalidTss(IN PTRAP_FRAME trap)
Definition handlers.c:467
void init_interrupts(void)
Definition isr.c:185
void MiInvalidOpcode(PTRAP_FRAME trap)
Definition handlers.c:453
void MiStackSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:479
typedef __attribute__
Definition fat32.h:64
enum _INTERRUPT_LIST INTERRUPT_LIST
uint32_t flags
Definition mh.h:2
bool allApsInitialized
Definition kernel.c:20
void lapic_init_siv(void)
Definition apic.c:60
MADT_TYPES
Definition mh.h:98
@ MADT_IOAPIC
Definition mh.h:100
@ MADT_INTERUPT_SOURCE_OVERRIDE
Definition mh.h:101
@ MADT_LAPIC
Definition mh.h:99
@ MADT_X2APIC
Definition mh.h:103
@ MADT_NON_MASKABLE_INTERRUPT
Definition mh.h:102
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:462
void MiMachineCheck(PTRAP_FRAME trap)
Definition handlers.c:539
void(* DebugCallback)(void *)
Definition mh.h:386
struct _SMP_BOOTINFO SMP_BOOTINFO
void MiPageFault(IN PTRAP_FRAME trap)
Definition handlers.c:155
MTSTATUS MhParseLAPICs(uint8_t *buffer, size_t maxCPUs, uint32_t *cpuCount, uint32_t *lapicAddress)
Definition acpi.c:132
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
Definition handlers.c:254
void lapic_init_cpu(void)
Definition apic.c:113
void MhInitializeSMP(uint8_t *apic_list, uint32_t cpu_count, uint32_t lapicAddress)
Definition smp.c:132
void pit_sleep_ms(uint32_t ms)
Definition pit.c:19
void MiLapicInterrupt(bool schedulerEnabled, PTRAP_FRAME trap)
Definition handlers.c:66
MTSTATUS MhInitializeACPI(void)
Definition acpi.c:167
_INTERRUPT_LIST
Definition mh.h:81
@ KEYBOARD_INTERRUPT
Definition mh.h:83
@ LAPIC_SIV_INTERRUPT
Definition mh.h:85
@ ATA_INTERRUPT
Definition mh.h:84
@ TIMER_INTERRUPT
Definition mh.h:82
void MiGeneralProtectionFault(PTRAP_FRAME trap)
Definition handlers.c:485
void set_idt_gate(int n, unsigned long int handler)
Definition idt.c:13
void lapic_enable(void)
Definition apic.c:98
void MiDivideByZero(PTRAP_FRAME trap)
Definition handlers.c:286
FORCEINLINE void getCpuName(char *name)
Definition mh.h:496
GDTPtr
Definition mh.h:372
void MiFloatingPointError(PTRAP_FRAME trap)
Definition handlers.c:523
void MiOverflow(PTRAP_FRAME trap)
Definition handlers.c:444
void MhHandleInterrupt(IN int vec_num, IN PTRAP_FRAME trap)
Definition isr.c:28
void MiInterprocessorInterrupt(void)
Definition handlers.c:71
uint32_t lapicAddress
Definition mh.h:1
uint32_t Flags
Definition mh.h:44
GDTEntry64
Definition mh.h:367
struct _DEBUG_REGISTERS DEBUG_REGISTERS
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
Definition smp.c:231
uint32_t lapic_mmio_read(uint32_t off)
Definition apic.c:36
enum _CPU_ACTION CPU_ACTION
void MiSegmentSelectorNotPresent(PTRAP_FRAME trap)
Definition handlers.c:473
uint32_t Length
Definition mh.h:6
FORCEINLINE void * kmemcpy(void *dest, const void *src, size_t len)
Definition mm.h:669
int32_t MTSTATUS
Definition mtstatus.h:12
POBJECT_TYPE Type
Definition ob.h:5
int smp_cpu_count
Definition smp.c:17
uint32_t IoApicAddress
Definition mh.h:320
uint32_t GlobalSystemInterruptBase
Definition mh.h:321
uint32_t AcpiProcessorUid
Definition mh.h:347
uint8_t Lint
Definition mh.h:338
uint8_t ApicId
Definition mh.h:311
uint8_t Length
Definition mh.h:309
uint8_t Bus
Definition mh.h:327
uint8_t AcpiProcessorId
Definition mh.h:310
uint32_t GlobalSystemInterrupt
Definition mh.h:329
uint8_t Source
Definition mh.h:328
uint8_t Reserved
Definition mh.h:319
uint32_t X2ApicId
Definition mh.h:345
uint32_t Flags
Definition mh.h:312
uint8_t Type
Definition mh.h:308
uint8_t IoApicId
Definition mh.h:318
char OemTableId[8]
Definition mh.h:213
uint8_t Revision
Definition mh.h:210
char OemId[6]
Definition mh.h:212
uint32_t CreatorId
Definition mh.h:215
uint32_t OemRevision
Definition mh.h:214
uint32_t CreatorRevision
Definition mh.h:216
char Signature[4]
Definition mh.h:208
uint8_t Checksum
Definition mh.h:211
uint32_t Length
Definition mh.h:209
uint64_t address
Definition mh.h:390
uint64_t dr7
Definition mh.h:389
DebugCallback callback
Definition mh.h:391
Definition mh.h:234
uint64_t X_Dsdt
Definition mh.h:289
GenericAddressStructure X_PM2ControlBlock
Definition mh.h:295
uint8_t DutyWidth
Definition mh.h:270
uint8_t Reserved3[3]
Definition mh.h:285
uint8_t PMTimerLength
Definition mh.h:260
uint32_t PM1aEventBlock
Definition mh.h:249
uint32_t FirmwareCtrl
Definition mh.h:236
uint8_t DutyOffset
Definition mh.h:269
uint32_t SMI_CommandPort
Definition mh.h:244
uint16_t WorstC2Latency
Definition mh.h:265
uint16_t FlushStride
Definition mh.h:268
uint8_t Century
Definition mh.h:273
uint8_t GPE1Length
Definition mh.h:262
uint8_t MonthAlarm
Definition mh.h:272
GenericAddressStructure X_PM1aEventBlock
Definition mh.h:291
GenericAddressStructure X_GPE0Block
Definition mh.h:297
uint32_t PM2ControlBlock
Definition mh.h:253
GenericAddressStructure X_PM1aControlBlock
Definition mh.h:293
uint8_t DayAlarm
Definition mh.h:271
uint8_t Reserved
Definition mh.h:240
uint8_t GPE1Base
Definition mh.h:263
uint16_t FlushSize
Definition mh.h:267
uint32_t Dsdt
Definition mh.h:237
GenericAddressStructure X_PM1bControlBlock
Definition mh.h:294
uint8_t CStateControl
Definition mh.h:264
uint16_t WorstC3Latency
Definition mh.h:266
uint8_t S4BIOS_REQ
Definition mh.h:247
uint32_t PM1aControlBlock
Definition mh.h:251
uint32_t PMTimerBlock
Definition mh.h:254
uint32_t GPE0Block
Definition mh.h:255
uint32_t PM1bEventBlock
Definition mh.h:250
GenericAddressStructure X_PMTimerBlock
Definition mh.h:296
struct _ACPI_SDT_HEADER h
Definition mh.h:235
GenericAddressStructure X_GPE1Block
Definition mh.h:298
uint8_t Reserved2
Definition mh.h:278
uint16_t SCI_Interrupt
Definition mh.h:243
uint32_t GPE1Block
Definition mh.h:256
uint8_t GPE0Length
Definition mh.h:261
uint32_t PM1bControlBlock
Definition mh.h:252
GenericAddressStructure X_PM1bEventBlock
Definition mh.h:292
uint16_t BootArchitectureFlags
Definition mh.h:276
uint8_t AcpiDisable
Definition mh.h:246
uint8_t ResetValue
Definition mh.h:284
uint8_t AcpiEnable
Definition mh.h:245
uint8_t PM1ControlLength
Definition mh.h:258
uint8_t PSTATE_Control
Definition mh.h:248
uint8_t PM2ControlLength
Definition mh.h:259
uint32_t Flags
Definition mh.h:279
GenericAddressStructure ResetReg
Definition mh.h:282
uint64_t X_FirmwareControl
Definition mh.h:288
uint8_t PM1EventLength
Definition mh.h:257
uint8_t PreferredPowerManagementProfile
Definition mh.h:242
uint8_t AddressSpace
Definition mh.h:226
uint16_t offset_low
Definition mh.h:184
uint16_t selector
Definition mh.h:185
uint8_t ist
Definition mh.h:186
uint16_t offset_mid
Definition mh.h:188
uint8_t type_attr
Definition mh.h:187
uint32_t zero
Definition mh.h:190
uint32_t offset_high
Definition mh.h:189
Definition mh.h:178
uint16_t limit
Definition mh.h:179
uint64_t base
Definition mh.h:180
struct _PAGE_PARAMETERS pageParams
Definition mh.h:400
struct _DEBUG_REGISTERS debugRegs
Definition mh.h:399
Definition mh.h:301
uint32_t flags
Definition mh.h:304
struct _ACPI_SDT_HEADER h
Definition mh.h:302
uint32_t lapicAddress
Definition mh.h:303
uint64_t addressToInvalidate
Definition mh.h:395
uint8_t Revision
Definition mh.h:198
uint32_t RsdtAddress
Definition mh.h:199
char OemId[6]
Definition mh.h:197
char Signature[8]
Definition mh.h:195
uint8_t Reserved[3]
Definition mh.h:204
uint64_t XsdtAddress
Definition mh.h:202
uint8_t ExtendedChecksum
Definition mh.h:203
uint8_t Checksum
Definition mh.h:196
uint32_t Length
Definition mh.h:201
uint32_t lapic_base
Definition mh.h:355
uint64_t kernel_pml4_phys
Definition mh.h:352
uint64_t magic
Definition mh.h:351
uint32_t cpu_count
Definition mh.h:354
uint64_t ap_entry_virt
Definition mh.h:353
Definition mh.h:219
struct _ACPI_SDT_HEADER h
Definition mh.h:220
uint64_t Entries[]
Definition mh.h:221