⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smp-imps.h

📁 i386的bootloader源码grub
💻 H
字号:
/* *  <Insert copyright here : it must be BSD-like so everyone can use it> * *  Author:  Erich Boleyn  <erich@uruk.org>   http://www.uruk.org/~erich/ * *  Header file implementing Intel MultiProcessor Specification (MPS) *  version 1.1 and 1.4 SMP hardware control for Intel Architecture CPUs, *  with hooks for running correctly on a standard PC without the hardware. * *  This file was created from information in the Intel MPS version 1.4 *  document, order number 242016-004, which can be ordered from the *  Intel literature center. */#ifndef _SMP_IMPS_H#define _SMP_IMPS_H/* make sure "apic.h" is included */#ifndef _APIC_H#error		Must include "apic.h" before "smp-imps.h"#endif /* !_APIC_H *//* *  Defines used. */#ifdef IMPS_DEBUG#define IMPS_DEBUG_PRINT(x)  KERNEL_PRINT(x)#else /* !IMPS_DEBUG */#define IMPS_DEBUG_PRINT(x)#endif /* !IMPS_DEBUG */#define IMPS_MAX_CPUS			APIC_BROADCAST_ID/* *  Defines representing limitations on values usable in different *  situations.  This mostly depends on whether the APICs are old *  (82489DX) or new (SIO or Pentium/Pentium Pro integrated APICs). * *  NOTE:  It appears that the APICs must either be all old or all new, *    or broadcasts won't work right. *  NOTE #2:  Given that, the maximum ID which can be sent to predictably *    is 14 for new APICs and 254 for old APICs.  So, this all implies that *    a maximum of 15 processors is supported with the new APICs, and a *    maximum of 255 processors with the old APICs. */#define IMPS_APIC_ID(x)							\  ( imps_any_new_apics ? APIC_NEW_ID(x) : APIC_OLD_ID(x) )/* *  This is the value that must be in the "sig" member of the MP *  Floating Pointer Structure. */#define IMPS_FPS_SIGNATURE	('_' | ('M'<<8) | ('P'<<16) | ('_'<<24))#define IMPS_FPS_IMCRP_BIT	0x80#define IMPS_FPS_DEFAULT_MAX	7/* *  This is the value that must be in the "sig" member of the MP *  Configuration Table Header. */#define IMPS_CTH_SIGNATURE	('P' | ('C'<<8) | ('M'<<16) | ('P'<<24))/* *  These are the "type" values for Base MP Configuration Table entries. */#define		IMPS_FLAG_ENABLED	1#define IMPS_BCT_PROCESSOR		0#define		IMPS_CPUFLAG_BOOT	2#define IMPS_BCT_BUS			1#define IMPS_BCT_IOAPIC			2#define IMPS_BCT_IO_INTERRUPT		3#define IMPS_BCT_LOCAL_INTERRUPT	4#define		IMPS_INT_INT		0#define		IMPS_INT_NMI		1#define		IMPS_INT_SMI		2#define		IMPS_INT_EXTINT		3/* *  Typedefs and data item definitions done here. */typedef struct imps_fps imps_fps;	/* MP floating pointer structure */typedef struct imps_cth imps_cth;	/* MP configuration table header */typedef struct imps_processor imps_processor;typedef struct imps_bus imps_bus;typedef struct imps_ioapic imps_ioapic;typedef struct imps_interrupt imps_interrupt;/* *  Data structures defined here *//* *  MP Floating Pointer Structure (fps) * *  Look at page 4-3 of the MP spec for the starting definitions of *  this structure. */struct imps_fps  {    unsigned sig;    imps_cth *cth_ptr;    unsigned char length;    unsigned char spec_rev;    unsigned char checksum;    unsigned char feature_info[5];  };/* *  MP Configuration Table Header  (cth) * *  Look at page 4-5 of the MP spec for the starting definitions of *  this structure. */struct imps_cth  {    unsigned sig;    unsigned short base_length;    unsigned char spec_rev;    unsigned char checksum;    char oem_id[8];    char prod_id[12];    unsigned oem_table_ptr;    unsigned short oem_table_size;    unsigned short entry_count;    unsigned lapic_addr;    unsigned short extended_length;    unsigned char extended_checksum;    char reserved[1];  };/* *  Base MP Configuration Table Types.  They are sorted according to *  type (i.e. all of type 0 come first, etc.).  Look on page 4-6 for *  the start of the descriptions. */struct imps_processor  {    unsigned char type;		/* must be 0 */    unsigned char apic_id;    unsigned char apic_ver;    unsigned char flags;    unsigned signature;    unsigned features;    char reserved[8];  };struct imps_bus  {    unsigned char type;		/* must be 1 */    unsigned char id;    char bus_type[6];  };struct imps_ioapic  {    unsigned char type;		/* must be 2 */    unsigned char id;    unsigned char ver;    unsigned char flags;    unsigned addr;  };struct imps_interrupt  {    unsigned char type;		/* must be 3 or 4 */    unsigned char int_type;    unsigned short flags;    unsigned char source_bus_id;    unsigned char source_bus_irq;    unsigned char dest_apic_id;    unsigned char dest_apic_intin;  };/* *  Exported globals here. *//* *  "imps_any_new_apics" is non-zero if any of the APICS (local or I/O) *  are *not* an 82489DX.  This is useful to determine if more than 15 *  CPUs can be supported (true if zero). */extern int imps_any_new_apics;/* *  "imps_enabled" is non-zero if the probe sequence found IMPS *  information and was successful. */extern int imps_enabled;/* *  This contains the local APIC hardware address. */extern unsigned imps_lapic_addr;/* *  This represents the number of CPUs found. */extern int imps_num_cpus;/* *  These map from virtual cpu numbers to APIC id's and back. */extern unsigned char imps_cpu_apic_map[IMPS_MAX_CPUS];extern unsigned char imps_apic_cpu_map[IMPS_MAX_CPUS];/* *  This is the primary function for probing for Intel MPS 1.1/1.4 *  compatible hardware and BIOS information.  While probing the CPUs *  information returned from the BIOS, this also starts up each CPU *  and gets it ready for use. * *  Call this during the early stages of OS startup, before memory can *  be messed up. * *  Returns 1 if IMPS information was found and is valid, else 0. */int imps_probe (void);/* *  Defines that use variables */#define IMPS_LAPIC_READ(x)  (*((volatile unsigned *) (imps_lapic_addr+(x))))#define IMPS_LAPIC_WRITE(x, y)   \   (*((volatile unsigned *) (imps_lapic_addr+(x))) = (y))#endif /* !_SMP_IMPS_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -