smp.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 230 行
H
230 行
#ifndef __ASM_SMP_H#define __ASM_SMP_H/* * We need the APIC definitions automatically as part of 'smp.h' */#include <linux/config.h>#ifdef CONFIG_X86_LOCAL_APIC#ifndef ASSEMBLY#include <asm/fixmap.h>#include <asm/i82489.h>#include <asm/bitops.h>#endif#endif#ifdef __SMP__#ifndef ASSEMBLY#include <linux/tasks.h>#include <linux/ptrace.h>/* * Support definitions for SMP machines following the intel multiprocessing * specification *//* * This tag identifies where the SMP configuration * information is. */ #define SMP_MAGIC_IDENT (('_'<<24)|('P'<<16)|('M'<<8)|'_')struct intel_mp_floating{ char mpf_signature[4]; /* "_MP_" */ unsigned long mpf_physptr; /* Configuration table address */ unsigned char mpf_length; /* Our length (paragraphs) */ unsigned char mpf_specification;/* Specification version */ unsigned char mpf_checksum; /* Checksum (makes sum 0) */ unsigned char mpf_feature1; /* Standard or configuration ? */ unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */ unsigned char mpf_feature3; /* Unused (0) */ unsigned char mpf_feature4; /* Unused (0) */ unsigned char mpf_feature5; /* Unused (0) */};struct mp_config_table{ char mpc_signature[4];#define MPC_SIGNATURE "PCMP" unsigned short mpc_length; /* Size of table */ char mpc_spec; /* 0x01 */ char mpc_checksum; char mpc_oem[8]; char mpc_productid[12]; unsigned long mpc_oemptr; /* 0 if not present */ unsigned short mpc_oemsize; /* 0 if not present */ unsigned short mpc_oemcount; unsigned long mpc_lapic; /* APIC address */ unsigned long reserved;};/* Followed by entries */#define MP_PROCESSOR 0#define MP_BUS 1#define MP_IOAPIC 2#define MP_INTSRC 3#define MP_LINTSRC 4struct mpc_config_processor{ unsigned char mpc_type; unsigned char mpc_apicid; /* Local APIC number */ unsigned char mpc_apicver; /* Its versions */ unsigned char mpc_cpuflag;#define CPU_ENABLED 1 /* Processor is available */#define CPU_BOOTPROCESSOR 2 /* Processor is the BP */ unsigned long mpc_cpufeature; #define CPU_STEPPING_MASK 0x0F#define CPU_MODEL_MASK 0xF0#define CPU_FAMILY_MASK 0xF00 unsigned long mpc_featureflag; /* CPUID feature value */ unsigned long mpc_reserved[2];};struct mpc_config_bus{ unsigned char mpc_type; unsigned char mpc_busid; unsigned char mpc_bustype[6] __attribute((packed));};#define BUSTYPE_EISA "EISA"#define BUSTYPE_ISA "ISA"#define BUSTYPE_INTERN "INTERN" /* Internal BUS */#define BUSTYPE_MCA "MCA"#define BUSTYPE_VL "VL" /* Local bus */#define BUSTYPE_PCI "PCI"#define BUSTYPE_PCMCIA "PCMCIA"/* We don't understand the others */struct mpc_config_ioapic{ unsigned char mpc_type; unsigned char mpc_apicid; unsigned char mpc_apicver; unsigned char mpc_flags;#define MPC_APIC_USABLE 0x01 unsigned long mpc_apicaddr;};struct mpc_config_intsrc{ unsigned char mpc_type; unsigned char mpc_irqtype; unsigned short mpc_irqflag; unsigned char mpc_srcbus; unsigned char mpc_srcbusirq; unsigned char mpc_dstapic; unsigned char mpc_dstirq;};#define MP_INT_VECTORED 0#define MP_INT_NMI 1#define MP_INT_SMI 2#define MP_INT_EXTINT 3#define MP_IRQDIR_DEFAULT 0#define MP_IRQDIR_HIGH 1#define MP_IRQDIR_LOW 3struct mpc_config_intlocal{ unsigned char mpc_type; unsigned char mpc_irqtype; unsigned short mpc_irqflag; unsigned char mpc_srcbusid; unsigned char mpc_srcbusirq; unsigned char mpc_destapic; #define MP_APIC_ALL 0xFF unsigned char mpc_destapiclint;};/* * Default configurations * * 1 2 CPU ISA 82489DX * 2 2 CPU EISA 82489DX no IRQ 8 or timer chaining * 3 2 CPU EISA 82489DX * 4 2 CPU MCA 82489DX * 5 2 CPU ISA+PCI * 6 2 CPU EISA+PCI * 7 2 CPU MCA+PCI *//* * Private routines/data */ extern int smp_found_config;extern void init_smp_config(void);extern unsigned long smp_alloc_memory(unsigned long mem_base);extern unsigned char boot_cpu_id;extern unsigned long cpu_present_map;extern unsigned long cpu_online_map;extern volatile int cpu_number_map[NR_CPUS];extern volatile unsigned long smp_invalidate_needed;extern void smp_flush_tlb(void);extern volatile unsigned long cpu_callin_map[NR_CPUS];extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);extern void smp_send_reschedule(int cpu);extern unsigned long ipi_count;extern void smp_invalidate_rcv(void); /* Process an NMI */extern void smp_local_timer_interrupt(struct pt_regs * regs);extern void (*mtrr_hook) (void);extern void setup_APIC_clock (void);extern volatile int __cpu_logical_map[NR_CPUS];extern inline int cpu_logical_map(int cpu){ return __cpu_logical_map[cpu];}/* * General functions that each host system must provide. */ extern void smp_callin(void);extern void smp_boot_cpus(void);extern void smp_store_cpu_info(int id); /* Store per CPU info (like the initial udelay numbers *//* * This function is needed by all SMP systems. It must _always_ be valid * from the initial startup. We map APIC_BASE very early in page_setup(), * so this is correct in the x86 case. */#define smp_processor_id() (current->processor)extern __inline int hard_smp_processor_id(void){ /* we don't want to mark this access volatile - bad code generation */ return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID));}#endif /* !ASSEMBLY */#define NO_PROC_ID 0xFF /* No processor magic marker *//* * This magic constant controls our willingness to transfer * a process across CPUs. Such a transfer incurs misses on the L1 * cache, and on a P6 or P5 with multiple L2 caches L2 hits. My * gut feeling is this will vary by board in value. For a board * with separate L2 cache it probably depends also on the RSS, and * for a board with shared L2 cache it ought to decay fast as other * processes are run. */ #define PROC_CHANGE_PENALTY 15 /* Schedule penalty */#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?