My Project
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// Priority Levels (0-15)
33// With Base 0x40, the Max Priority allowed is 11 (0x40 + 11<<4 = 240).
34// If we need 12, we must lower IRQL_VECTOR_BASE to 0x20.
35// But we are good with 11 from now.
37#define TPR_PASSIVE 0
38#define TPR_APC 3
39#define TPR_DPC 8 // Vector: 0x40 + 0x80 = 0xC0 (192)
40#define TPR_PROFILE 10
41#define TPR_IPI 11
42
43// The Math Macros
44#define CALC_VECTOR(pri) (IRQL_VECTOR_BASE + (pri << 4))
45
46// Calculated Vectors
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
51
52static inline unsigned int priority_to_vector(uint8_t pri) {
53 if (pri > 15) pri = 15;
54 return CALC_VECTOR(pri);
55}
57// ------------------ ENUMERATORS ------------------
59//** Exception Definitions **/
81
83typedef enum _INTERRUPT_LIST {
84 TIMER_INTERRUPT = 32, // Unused, PIC.
85 KEYBOARD_INTERRUPT = 33, // Unused, PS/2 Keyboard
86 ATA_INTERRUPT = 46, // Might be used for driver, ATA.
87 LAPIC_INTERRUPT = 0xEF, // LAPIC Timer.
88 LAPIC_SIV_INTERRUPT = 0xFF, // LAPIC Spurious interrupt vector.
90
100
108
109enum {
141
172};
173
174// ------------------ STRUCTURES ------------------
175
176#pragma pack(push, 1)
177typedef struct _IDT_PTR {
178 uint16_t limit;
179 uint64_t base;
181
182typedef struct _IDT_ENTRY_64 {
183 uint16_t offset_low;
184 uint16_t selector;
185 uint8_t ist;
186 uint8_t type_attr;
187 uint16_t offset_mid;
188 uint32_t offset_high;
189 uint32_t zero;
191#pragma pack(pop)
192
193typedef struct _RSDP_Descriptor {
194 char Signature[8];
195 uint8_t Checksum;
196 char OemId[6];
197 uint8_t Revision;
198 uint32_t RsdtAddress; // legacy 32bit.
199 // acpi 2.0 fields
200 uint32_t Length;
201 uint64_t XsdtAddress; // The one we use.
203 uint8_t Reserved[3];
204} __attribute__((packed)) RSDP_Descriptor;
205
206typedef struct _ACPI_SDT_HEADER {
207 char Signature[4];
208 uint32_t Length;
209 uint8_t Revision;
210 uint8_t Checksum;
211 char OemId[6];
212 char OemTableId[8];
213 uint32_t OemRevision;
214 uint32_t CreatorId;
216} __attribute__((packed)) ACPI_SDT_HEADER;
217
218typedef struct _XSDT {
220 uint64_t Entries[]; // Array of 64-bit physical addresses to other tables
221} __attribute__((packed)) XSDT;
222
224{
226 uint8_t BitWidth;
227 uint8_t BitOffset;
228 uint8_t AccessSize;
229 uint64_t Address;
230} __attribute__((packed)) GenericAddressStructure;
231
232typedef struct _FADT
233{
235 uint32_t FirmwareCtrl;
236 uint32_t Dsdt;
237
238 // field used in ACPI 1.0; no longer in use, for compatibility only
239 uint8_t Reserved;
240
244 uint8_t AcpiEnable;
245 uint8_t AcpiDisable;
246 uint8_t S4BIOS_REQ;
253 uint32_t PMTimerBlock;
254 uint32_t GPE0Block;
255 uint32_t GPE1Block;
260 uint8_t GPE0Length;
261 uint8_t GPE1Length;
262 uint8_t GPE1Base;
266 uint16_t FlushSize;
267 uint16_t FlushStride;
268 uint8_t DutyOffset;
269 uint8_t DutyWidth;
270 uint8_t DayAlarm;
271 uint8_t MonthAlarm;
272 uint8_t Century;
273
274 // reserved in ACPI 1.0; used since ACPI 2.0+
276
277 uint8_t Reserved2;
278 uint32_t Flags;
279
280 // 12 byte structure; see below for details
281 GenericAddressStructure ResetReg;
282
283 uint8_t ResetValue;
284 uint8_t Reserved3[3];
285
286 // 64bit pointers - Available on ACPI 2.0+
288 uint64_t X_Dsdt;
289
290 GenericAddressStructure X_PM1aEventBlock;
291 GenericAddressStructure X_PM1bEventBlock;
292 GenericAddressStructure X_PM1aControlBlock;
293 GenericAddressStructure X_PM1bControlBlock;
294 GenericAddressStructure X_PM2ControlBlock;
295 GenericAddressStructure X_PMTimerBlock;
296 GenericAddressStructure X_GPE0Block;
297 GenericAddressStructure X_GPE1Block;
298} __attribute__((packed)) FADT;
299
300typedef struct _MADT {
302 uint32_t lapicAddress;
303 uint32_t flags;
304} __attribute__((packed)) MADT;
305
306typedef struct {
307 uint8_t Type; // 0
308 uint8_t Length; // 8
310 uint8_t ApicId;
311 uint32_t Flags; // Bit 0 = enabled, Bit 1 = online-capable
312} __attribute__((packed)) MADT_LOCAL_APIC;
313
314typedef struct {
315 uint8_t Type; // 1
316 uint8_t Length; // 12
317 uint8_t IoApicId;
318 uint8_t Reserved; // must be 0
319 uint32_t IoApicAddress; // physical address
321} __attribute__((packed)) MADT_IO_APIC;
322
323typedef struct {
324 uint8_t Type; // 2
325 uint8_t Length; // 10
326 uint8_t Bus; // 0 = ISA
327 uint8_t Source; // IRQ source
329 uint16_t Flags;
330} __attribute__((packed)) MADT_INTERRUPT_OVERRIDE;
331
332typedef struct {
333 uint8_t Type; // 4
334 uint8_t Length; // 6
335 uint8_t AcpiProcessorId; // 0xFF = all processors
336 uint16_t Flags;
337 uint8_t Lint; // LINTn pin (0 or 1)
338} __attribute__((packed)) MADT_NMI;
339
340typedef struct {
341 uint8_t Type; // 9
342 uint8_t Length; // 16
343 uint16_t Reserved;
344 uint32_t X2ApicId;
345 uint32_t Flags; // same as local APIC flags
347} __attribute__((packed)) MADT_LOCAL_X2APIC;
348
349typedef struct _SMP_BOOTINFO {
350 uint64_t magic;
351 uint64_t kernel_pml4_phys; // from boot_info_local.Pml4Phys
352 uint64_t ap_entry_virt; // kernel virtual address of ap_main()
353 uint32_t cpu_count;
354 uint32_t lapic_base;
356
357typedef struct __attribute__((packed)) _GDTEntry64 {
358 uint16_t limit_low;
359 uint16_t base_low;
360 uint8_t base_middle;
361 uint8_t access;
362 uint8_t granularity;
363 uint8_t base_high;
364 uint32_t base_upper;
365 uint32_t reserved;
367
368typedef struct __attribute__((packed)) _GDTPtr {
369 uint16_t limit;
370 uint64_t base;
372
373typedef struct __attribute__((packed)) _TSS {
374 uint32_t reserved0;
375 uint64_t rsp0;
376 uint64_t rsp1;
377 uint64_t rsp2;
378 uint64_t reserved1;
379 uint64_t ist[7]; // This is the Interrupt Stack Table
380 uint32_t reserved2;
381 uint16_t reserved3;
382 uint16_t io_map_base;
384
385typedef void (*DebugCallback)(void*);
386
392
396
401
402// ------------------ MACROS ------------------
403#define AP_TRAMP_PHYS 0x7000ULL
404#define AP_TRAMP_SIZE 0x1000UL // single page
405#define AP_TRAMP_APMAIN_OFFSET 0x1000ULL
406#define AP_TRAMP_PML4_OFFSET 0x2000ULL
407#define AP_TRAMP_CPUS_OFFSET 0x2500ULL
408#define MAX_CPUS 32
409#define LAPIC_ID 0x020
410#define SMP_MAGIC 0x4D4154414E454C00 // MATANEL\0
411#define IST_SIZE (16*1024) // 16 KiB
412#define IST_ALIGNMENT 16
413// Vendor strings from CPUs.
414#define CPUID_VENDOR_AMD "AuthenticAMD"
415#define CPUID_VENDOR_AMD_OLD "AMDisbetter!" // Early engineering samples of AMD K5 processor
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 "
433
434// Vendor strings from hypervisors.
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 " // Sometimes Parallels incorrectly encodes "prl hyperv" as "lrpepyh vr" due to an endianness mismatch.
443#define CPUID_VENDOR_BHYVE "bhyve bhyve "
444#define CPUID_VENDOR_QNX " QNXQVMBSQG "
445
447
448void APMain(void);
449void MhInitializeSMP(uint8_t* apic_list, uint32_t cpu_count, uint32_t lapicAddress);
450void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter);
451
452extern int smp_cpu_count;
453extern bool smpInitialized;
454extern bool allApsInitialized;
455
456// Didn't get rename yet.
457void set_idt_gate(int n, unsigned long int handler);
458void install_idt(void);
459void init_interrupts(void);
460
461void lapic_init_cpu(void); // call once on BSP early
462void lapic_enable(void);
463uint32_t lapic_mmio_read(uint32_t off);
464void lapic_mmio_write(uint32_t off, uint32_t val);
465void lapic_eoi(void);
466// lapic spurious interrupt vector, protects against faulty interrupts.
467void lapic_init_siv(void);
468// send IPI to APIC id
469// apic_id - APICId of the CPU.
470// vector - IDT Vector number
471// flags - specified cpu flags, 0 for none.
472void lapic_send_ipi(uint8_t apic_id, uint8_t vector, uint32_t flags);
473int init_lapic_timer(uint32_t hz); // calibrate + start periodic timer at `hz` (returns 0 on success)
474void pit_sleep_ms(uint32_t ms);
475void lapic_timer_calibrate(void);
476
477extern bool checkcpuid(void);
478
479// Get CPU Model number
480static inline int getCpuModel(void) {
481 int ebx, unused;
482 __cpuid(0, unused, ebx, unused, unused);
483 return ebx;
484}
485
486// Check for APIC Availability
488bool checkApic(void) {
489 unsigned int eax, ebx, ecx, edx;
490 __cpuid(1, eax, ebx, ecx, edx);
491 return edx & (1 << 9); // bit 9 = APIC
492}
493
495void getCpuName(char* name) {
496 unsigned int regs[4];
497 char* p = name;
498
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));
502 p += sizeof(regs);
503 }
504 *p = '\0'; // Null-terminate
505}
506
507void
509 IN int vec_num,
510 IN PTRAP_FRAME trap
511);
512
514 bool schedulerEnabled,
515 PTRAP_FRAME trap
516);
517
518void MiBreakpoint(
519 PTRAP_FRAME trap
520);
521
523void
525 PTRAP_FRAME trap
526);
527
528void
530 PTRAP_FRAME trap
531);
532
533void
535 PTRAP_FRAME trap
536);
537
539void
541 IN PTRAP_FRAME trap
542);
543
544void
546 void
547);
548
549void
551 IN PTRAP_FRAME trap
552);
553
554void
556 IN PTRAP_FRAME trap
557);
558
559void
561 PTRAP_FRAME trap
562);
563
564void
566 PTRAP_FRAME trap
567);
568
569void
571 PTRAP_FRAME trap
572);
573
574void
576 PTRAP_FRAME trap
577);
578
579void
581 PTRAP_FRAME trap
582);
583
584void
586 PTRAP_FRAME trap
587);
588
589void
591 PTRAP_FRAME trap
592);
593
594void
596 PTRAP_FRAME trap
597);
598
599void
601 PTRAP_FRAME trap
602);
603
604void
606 PTRAP_FRAME trap
607);
608
609void
611 PTRAP_FRAME trap
612);
613
614void
616 IN IRQL RequestIrql
617);
618
620MTSTATUS MhParseLAPICs(uint8_t* buffer, size_t maxCPUs, uint32_t* cpuCount, uint32_t* lapicAddress);
621
622void
624 void
625);
626
627#endif
#define FORCEINLINE
Definition annotations.h:22
#define NORETURN
Definition annotations.h:13
#define IN
Definition annotations.h:7
bool smpInitialized
Definition kernel.c:146
enum _IRQL IRQL
TRAP_FRAME * PTRAP_FRAME
Definition core.h:54
uint8_t apic_list[MAX_CPUS]
Definition kernel.c:143
uint32_t cpu_count
Definition kernel.c:144
void(* DebugCallback)(void *)
Definition me.h:139
void lapic_timer_calibrate(void)
Definition apic.c:171
void MiBreakpoint(PTRAP_FRAME trap)
Definition handlers.c:392
bool checkcpuid(void)
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:429
struct _IDT_ENTRY_64 IDT_ENTRY64
_CPU_ACTION
Definition mh.h:91
@ CPU_ACTION_DO_DEFERRED_ROUTINES
Definition mh.h:97
@ CPU_ACTION_WRITE_DEBUG_REGS
Definition mh.h:95
@ CPU_ACTION_STOP
Definition mh.h:92
@ CPU_ACTION_CLEAR_DEBUG_REGS
Definition mh.h:96
@ CPU_ACTION_FLUSH_CR3
Definition mh.h:98
@ CPU_ACTION_PERFORM_TLB_SHOOTDOWN
Definition mh.h:94
@ CPU_ACTION_PRINT_ID
Definition mh.h:93
int init_lapic_timer(uint32_t hz)
Definition apic.c:179
FORCEINLINE bool checkApic(void)
Definition mh.h:488
void APMain(void)
---------------— FUNCTIONS ---------------—
Definition ap_main.c:35
void MiBoundsCheck(PTRAP_FRAME trap)
Definition handlers.c:420
struct _IPI_PARAMS IPI_PARAMS
void install_idt(void)
Definition idt.c:24
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
Definition handlers.c:362
void MiAlignmentCheck(PTRAP_FRAME trap)
Definition handlers.c:468
_CPU_EXCEPTIONS
Definition mh.h:60
@ EXCEPTION_FLOATING_POINT_ERROR
Definition mh.h:77
@ EXCEPTION_INVALID_TSS
Definition mh.h:71
@ EXCEPTION_STACK_SEGMENT_OVERRUN
Definition mh.h:73
@ EXCEPTION_INVALID_OPCODE
Definition mh.h:67
@ EXCEPTION_SEVERE_MACHINE_CHECK
Definition mh.h:79
@ EXCEPTION_SINGLE_STEP
Definition mh.h:62
@ EXCEPTION_NON_MASKABLE_INTERRUPT
Definition mh.h:63
@ EXCEPTION_DOUBLE_FAULT
Definition mh.h:69
@ EXCEPTION_NO_COPROCESSOR
Definition mh.h:68
@ EXCEPTION_RESERVED
Definition mh.h:76
@ EXCEPTION_SEGMENT_SELECTOR_NOTPRESENT
Definition mh.h:72
@ EXCEPTION_GENERAL_PROTECTION_FAULT
Definition mh.h:74
@ EXCEPTION_COPROCESSOR_SEGMENT_OVERRUN
Definition mh.h:70
@ EXCEPTION_DIVIDE_BY_ZERO
Definition mh.h:61
@ EXCEPTION_OVERFLOW
Definition mh.h:65
@ EXCEPTION_ALIGNMENT_CHECK
Definition mh.h:78
@ EXCEPTION_BREAKPOINT
Definition mh.h:64
@ EXCEPTION_PAGE_FAULT
Definition mh.h:75
@ EXCEPTION_BOUNDS_CHECK
Definition mh.h:66
void MiDebugTrap(PTRAP_FRAME trap)
Definition handlers.c:298
@ CPUID_FEAT_EDX_TM
Definition mh.h:169
@ CPUID_FEAT_ECX_RDRAND
Definition mh.h:139
@ CPUID_FEAT_ECX_TSC
Definition mh.h:133
@ CPUID_FEAT_EDX_IA64
Definition mh.h:170
@ CPUID_FEAT_ECX_EST
Definition mh.h:117
@ CPUID_FEAT_EDX_DS
Definition mh.h:161
@ CPUID_FEAT_ECX_DS_CPL
Definition mh.h:114
@ CPUID_FEAT_EDX_CLFLUSH
Definition mh.h:160
@ CPUID_FEAT_ECX_HYPERVISOR
Definition mh.h:140
@ CPUID_FEAT_EDX_TSC
Definition mh.h:146
@ CPUID_FEAT_ECX_DCA
Definition mh.h:127
@ CPUID_FEAT_EDX_PAE
Definition mh.h:148
@ CPUID_FEAT_EDX_CX8
Definition mh.h:150
@ CPUID_FEAT_ECX_F16C
Definition mh.h:138
@ CPUID_FEAT_ECX_OSXSAVE
Definition mh.h:136
@ CPUID_FEAT_ECX_X2APIC
Definition mh.h:130
@ CPUID_FEAT_ECX_PCID
Definition mh.h:126
@ CPUID_FEAT_EDX_FXSR
Definition mh.h:164
@ CPUID_FEAT_ECX_SSSE3
Definition mh.h:119
@ CPUID_FEAT_EDX_PSE
Definition mh.h:145
@ CPUID_FEAT_EDX_MTRR
Definition mh.h:153
@ CPUID_FEAT_EDX_VME
Definition mh.h:143
@ CPUID_FEAT_ECX_XTPR
Definition mh.h:124
@ CPUID_FEAT_ECX_SSE4_1
Definition mh.h:128
@ CPUID_FEAT_EDX_SEP
Definition mh.h:152
@ CPUID_FEAT_EDX_DE
Definition mh.h:144
@ CPUID_FEAT_EDX_MSR
Definition mh.h:147
@ CPUID_FEAT_ECX_MONITOR
Definition mh.h:113
@ CPUID_FEAT_ECX_VMX
Definition mh.h:115
@ CPUID_FEAT_ECX_POPCNT
Definition mh.h:132
@ CPUID_FEAT_ECX_AVX
Definition mh.h:137
@ CPUID_FEAT_EDX_APIC
Definition mh.h:151
@ CPUID_FEAT_ECX_AES
Definition mh.h:134
@ CPUID_FEAT_ECX_PDCM
Definition mh.h:125
@ CPUID_FEAT_EDX_PSE36
Definition mh.h:158
@ CPUID_FEAT_ECX_FMA
Definition mh.h:122
@ CPUID_FEAT_ECX_XSAVE
Definition mh.h:135
@ CPUID_FEAT_EDX_CMOV
Definition mh.h:156
@ CPUID_FEAT_ECX_SSE3
Definition mh.h:110
@ CPUID_FEAT_ECX_DTES64
Definition mh.h:112
@ CPUID_FEAT_ECX_PCLMUL
Definition mh.h:111
@ CPUID_FEAT_EDX_PSN
Definition mh.h:159
@ CPUID_FEAT_EDX_SSE
Definition mh.h:165
@ CPUID_FEAT_EDX_SSE2
Definition mh.h:166
@ CPUID_FEAT_ECX_SMX
Definition mh.h:116
@ CPUID_FEAT_EDX_FPU
Definition mh.h:142
@ CPUID_FEAT_EDX_PAT
Definition mh.h:157
@ CPUID_FEAT_ECX_SSE4_2
Definition mh.h:129
@ CPUID_FEAT_ECX_MOVBE
Definition mh.h:131
@ CPUID_FEAT_EDX_MMX
Definition mh.h:163
@ CPUID_FEAT_EDX_HTT
Definition mh.h:168
@ CPUID_FEAT_EDX_MCA
Definition mh.h:155
@ CPUID_FEAT_ECX_TM2
Definition mh.h:118
@ CPUID_FEAT_ECX_CX16
Definition mh.h:123
@ CPUID_FEAT_EDX_MCE
Definition mh.h:149
@ CPUID_FEAT_EDX_PBE
Definition mh.h:171
@ CPUID_FEAT_EDX_SS
Definition mh.h:167
@ CPUID_FEAT_EDX_ACPI
Definition mh.h:162
@ CPUID_FEAT_ECX_SDBG
Definition mh.h:121
@ CPUID_FEAT_EDX_PGE
Definition mh.h:154
@ CPUID_FEAT_ECX_CID
Definition mh.h:120
#define CALC_VECTOR(pri)
Definition mh.h:44
void lapic_send_ipi(uint8_t apic_id, uint8_t vector, uint32_t flags)
Definition apic.c:129
TSS
Definition mh.h:383
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:439
void init_interrupts(void)
Definition isr.c:168
void MiInvalidOpcode(PTRAP_FRAME trap)
Definition handlers.c:425
void MiStackSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:451
typedef __attribute__
Definition fat32.h:63
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:101
@ MADT_IOAPIC
Definition mh.h:103
@ MADT_INTERUPT_SOURCE_OVERRIDE
Definition mh.h:104
@ MADT_LAPIC
Definition mh.h:102
@ MADT_X2APIC
Definition mh.h:106
@ MADT_NON_MASKABLE_INTERRUPT
Definition mh.h:105
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:434
void MiMachineCheck(PTRAP_FRAME trap)
Definition handlers.c:478
void(* DebugCallback)(void *)
Definition mh.h:385
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:130
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
Definition handlers.c:226
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:65
MTSTATUS MhInitializeACPI(void)
Definition acpi.c:164
_INTERRUPT_LIST
Definition mh.h:83
@ KEYBOARD_INTERRUPT
Definition mh.h:85
@ LAPIC_SIV_INTERRUPT
Definition mh.h:88
@ ATA_INTERRUPT
Definition mh.h:86
@ TIMER_INTERRUPT
Definition mh.h:84
@ LAPIC_INTERRUPT
Definition mh.h:87
void MiGeneralProtectionFault(PTRAP_FRAME trap)
Definition handlers.c:457
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:258
FORCEINLINE void getCpuName(char *name)
Definition mh.h:495
GDTPtr
Definition mh.h:371
void MiFloatingPointError(PTRAP_FRAME trap)
Definition handlers.c:462
void MiOverflow(PTRAP_FRAME trap)
Definition handlers.c:416
void MhHandleInterrupt(IN int vec_num, IN PTRAP_FRAME trap)
Definition isr.c:27
void MiInterprocessorInterrupt(void)
Definition handlers.c:70
uint32_t lapicAddress
Definition mh.h:1
uint32_t Flags
Definition mh.h:44
GDTEntry64
Definition mh.h:366
struct _DEBUG_REGISTERS DEBUG_REGISTERS
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
Definition smp.c:212
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:445
uint32_t Length
Definition mh.h:6
FORCEINLINE void * kmemcpy(void *dest, const void *src, size_t len)
Definition mm.h:554
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:319
uint32_t GlobalSystemInterruptBase
Definition mh.h:320
uint32_t AcpiProcessorUid
Definition mh.h:346
uint8_t Lint
Definition mh.h:337
uint8_t ApicId
Definition mh.h:310
uint8_t Length
Definition mh.h:308
uint8_t Bus
Definition mh.h:326
uint8_t AcpiProcessorId
Definition mh.h:309
uint32_t GlobalSystemInterrupt
Definition mh.h:328
uint8_t Source
Definition mh.h:327
uint8_t Reserved
Definition mh.h:318
uint32_t X2ApicId
Definition mh.h:344
uint32_t Flags
Definition mh.h:311
uint8_t Type
Definition mh.h:307
uint8_t IoApicId
Definition mh.h:317
char OemTableId[8]
Definition mh.h:212
uint8_t Revision
Definition mh.h:209
char OemId[6]
Definition mh.h:211
uint32_t CreatorId
Definition mh.h:214
uint32_t OemRevision
Definition mh.h:213
uint32_t CreatorRevision
Definition mh.h:215
char Signature[4]
Definition mh.h:207
uint8_t Checksum
Definition mh.h:210
uint32_t Length
Definition mh.h:208
uint64_t address
Definition mh.h:389
uint64_t dr7
Definition mh.h:388
DebugCallback callback
Definition mh.h:390
Definition mh.h:233
uint64_t X_Dsdt
Definition mh.h:288
GenericAddressStructure X_PM2ControlBlock
Definition mh.h:294
uint8_t DutyWidth
Definition mh.h:269
uint8_t Reserved3[3]
Definition mh.h:284
uint8_t PMTimerLength
Definition mh.h:259
uint32_t PM1aEventBlock
Definition mh.h:248
uint32_t FirmwareCtrl
Definition mh.h:235
uint8_t DutyOffset
Definition mh.h:268
uint32_t SMI_CommandPort
Definition mh.h:243
uint16_t WorstC2Latency
Definition mh.h:264
uint16_t FlushStride
Definition mh.h:267
uint8_t Century
Definition mh.h:272
uint8_t GPE1Length
Definition mh.h:261
uint8_t MonthAlarm
Definition mh.h:271
GenericAddressStructure X_PM1aEventBlock
Definition mh.h:290
GenericAddressStructure X_GPE0Block
Definition mh.h:296
uint32_t PM2ControlBlock
Definition mh.h:252
GenericAddressStructure X_PM1aControlBlock
Definition mh.h:292
uint8_t DayAlarm
Definition mh.h:270
uint8_t Reserved
Definition mh.h:239
uint8_t GPE1Base
Definition mh.h:262
uint16_t FlushSize
Definition mh.h:266
uint32_t Dsdt
Definition mh.h:236
GenericAddressStructure X_PM1bControlBlock
Definition mh.h:293
uint8_t CStateControl
Definition mh.h:263
uint16_t WorstC3Latency
Definition mh.h:265
uint8_t S4BIOS_REQ
Definition mh.h:246
uint32_t PM1aControlBlock
Definition mh.h:250
uint32_t PMTimerBlock
Definition mh.h:253
uint32_t GPE0Block
Definition mh.h:254
uint32_t PM1bEventBlock
Definition mh.h:249
GenericAddressStructure X_PMTimerBlock
Definition mh.h:295
struct _ACPI_SDT_HEADER h
Definition mh.h:234
GenericAddressStructure X_GPE1Block
Definition mh.h:297
uint8_t Reserved2
Definition mh.h:277
uint16_t SCI_Interrupt
Definition mh.h:242
uint32_t GPE1Block
Definition mh.h:255
uint8_t GPE0Length
Definition mh.h:260
uint32_t PM1bControlBlock
Definition mh.h:251
GenericAddressStructure X_PM1bEventBlock
Definition mh.h:291
uint16_t BootArchitectureFlags
Definition mh.h:275
uint8_t AcpiDisable
Definition mh.h:245
uint8_t ResetValue
Definition mh.h:283
uint8_t AcpiEnable
Definition mh.h:244
uint8_t PM1ControlLength
Definition mh.h:257
uint8_t PSTATE_Control
Definition mh.h:247
uint8_t PM2ControlLength
Definition mh.h:258
uint32_t Flags
Definition mh.h:278
GenericAddressStructure ResetReg
Definition mh.h:281
uint64_t X_FirmwareControl
Definition mh.h:287
uint8_t PM1EventLength
Definition mh.h:256
uint8_t PreferredPowerManagementProfile
Definition mh.h:241
uint8_t AddressSpace
Definition mh.h:225
uint16_t offset_low
Definition mh.h:183
uint16_t selector
Definition mh.h:184
uint8_t ist
Definition mh.h:185
uint16_t offset_mid
Definition mh.h:187
uint8_t type_attr
Definition mh.h:186
uint32_t zero
Definition mh.h:189
uint32_t offset_high
Definition mh.h:188
Definition mh.h:177
uint16_t limit
Definition mh.h:178
uint64_t base
Definition mh.h:179
struct _PAGE_PARAMETERS pageParams
Definition mh.h:399
struct _DEBUG_REGISTERS debugRegs
Definition mh.h:398
Definition mh.h:300
uint32_t flags
Definition mh.h:303
struct _ACPI_SDT_HEADER h
Definition mh.h:301
uint32_t lapicAddress
Definition mh.h:302
uint64_t addressToInvalidate
Definition mh.h:394
uint8_t Revision
Definition mh.h:197
uint32_t RsdtAddress
Definition mh.h:198
char OemId[6]
Definition mh.h:196
char Signature[8]
Definition mh.h:194
uint8_t Reserved[3]
Definition mh.h:203
uint64_t XsdtAddress
Definition mh.h:201
uint8_t ExtendedChecksum
Definition mh.h:202
uint8_t Checksum
Definition mh.h:195
uint32_t Length
Definition mh.h:200
uint32_t lapic_base
Definition mh.h:354
uint64_t kernel_pml4_phys
Definition mh.h:351
uint64_t magic
Definition mh.h:350
uint32_t cpu_count
Definition mh.h:353
uint64_t ap_entry_virt
Definition mh.h:352
Definition mh.h:218
struct _ACPI_SDT_HEADER h
Definition mh.h:219
uint64_t Entries[]
Definition mh.h:220