/* * Copyright 2008, Dustin Howett, dustin.howett@gmail.com. All rights reserved. * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. * Distributed under the terms of the NewOS License. */ #ifndef _KERNEL_ARCH_x86_ARCH_SMP_H #define _KERNEL_ARCH_x86_ARCH_SMP_H #define MP_FLOATING_SIGNATURE '_PM_' #define MP_CONFIG_TABLE_SIGNATURE 'PCMP' /* #define IPI_CACHE_FLUSH 0x40 #define IPI_INV_TLB 0x41 #define IPI_INV_PTE 0x42 #define IPI_INV_RESCHED 0x43 #define IPI_STOP 0x44 */ struct mp_config_table { uint32 signature; /* "PCMP" */ uint16 base_table_length; /* length of the base table entries and this structure */ uint8 spec_revision; /* spec supported, 1 for 1.1 or 4 for 1.4 */ uint8 checksum; /* checksum, all bytes add up to zero */ char oem[8]; /* oem identification, not null-terminated */ char product[12]; /* product name, not null-terminated */ void *oem_table; /* addr of oem-defined table, zero if none */ uint16 oem_length; /* length of oem table */ uint16 num_base_entries; /* number of entries in base table */ uint32 apic; /* address of apic */ uint16 ext_length; /* length of extended section */ uint8 ext_checksum; /* checksum of extended table entries */ uint8 reserved; }; struct mp_floating_struct { uint32 signature; /* "_MP_" */ struct mp_config_table *config_table; /* address of mp configuration table */ uint8 config_length; /* length of the table in 16-byte units */ uint8 spec_revision; /* spec supported, 1 for 1.1 or 4 for 1.4 */ uint8 checksum; /* checksum, all bytes add up to zero */ uint8 mp_feature_1; /* mp system configuration type if no mpc */ uint8 mp_feature_2; /* imcrp */ uint8 mp_feature_3, mp_feature_4, mp_feature_5; /* reserved */ }; /* base config entry types */ enum { MP_BASE_PROCESSOR = 0, MP_BASE_BUS, MP_BASE_IO_APIC, MP_BASE_IO_INTR, MP_BASE_LOCAL_INTR, }; struct mp_base_processor { uint8 type; uint8 apic_id; uint8 apic_version; uint8 cpu_flags; uint32 signature; /* stepping, model, family, each four bits */ uint32 feature_flags; uint32 res1, res2; }; struct mp_base_ioapic { uint8 type; uint8 ioapic_id; uint8 ioapic_version; uint8 ioapic_flags; uint32 *addr; }; struct mp_base_bus { uint8 type; uint8 bus_id; char name[6]; }; struct mp_base_interrupt { uint8 type; uint8 interrupt_type; uint16 polarity : 2; uint16 trigger_mode : 2; uint16 _reserved : 12; uint8 source_bus_id; uint8 source_bus_irq; uint8 dest_apic_id; uint8 dest_apic_int; }; enum { MP_INTR_TYPE_INT = 0, MP_INTR_TYPE_NMI, MP_INTR_TYPE_SMI, MP_INTR_TYPE_ExtINT, }; #ifdef __cplusplus extern "C" { #endif uint32 x86_get_cpu_apic_id(int32 cpu); #ifdef __cplusplus } #endif #endif /* _KERNEL_ARCH_x86_ARCH_SMP_H */