smp.h revision 25499
1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5 * can do whatever you want with this stuff. If we meet some day, and you think 6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7 * ---------------------------------------------------------------------------- 8 * 9 * $Id: smp.h,v 1.5 1997/05/03 18:05:31 fsmp Exp $ 10 * 11 */ 12 13#ifndef _MACHINE_SMP_H_ 14#define _MACHINE_SMP_H_ 15 16#ifdef KERNEL 17 18#include "opt_smp.h" 19 20#if defined(SMP) && !defined(NCPU) 21# define NCPU 2 22#endif /* SMP && NCPU */ 23 24#if defined(SMP) || defined(APIC_IO) 25 26/* global data in mpboot.s */ 27extern int bootMP_size; 28 29/* functions in mpboot.s */ 30void bootMP __P((void)); 31 32/* global data in mplock.s */ 33extern u_int mp_lock; 34 35/* functions in mplock.s */ 36void get_mplock __P((void)); 37void rel_mplock __P((void)); 38void try_mplock __P((void)); 39 40/* global data in mp_machdep.c */ 41extern struct proc* SMPcurproc[NCPU]; 42extern struct pcb* SMPcurpcb[NCPU]; 43extern struct timeval SMPruntime[NCPU]; 44extern int mp_ncpus; 45extern int mp_naps; 46extern int mp_nbusses; 47extern int mp_napics; 48extern int mp_picmode; 49extern int mpenabled; 50extern int boot_cpu_id; 51extern vm_offset_t cpu_apic_address; 52extern vm_offset_t io_apic_address[]; 53extern u_int32_t cpu_apic_versions[]; 54extern u_int32_t io_apic_versions[]; 55extern int cpu_num_to_apic_id[]; 56extern int io_num_to_apic_id[]; 57extern int apic_id_to_logical[]; 58 59/* functions in mp_machdep.c */ 60u_int mp_bootaddress __P((u_int)); 61void mp_start __P((void)); 62void mp_announce __P((void)); 63int get_isa_apic_irq __P((int)); 64u_int get_isa_apic_mask __P((u_int)); 65int undirect_isa_irq __P((int)); 66int get_eisa_apic_irq __P((int)); 67int get_pci_apic_irq __P((int, int, int)); 68int undirect_pci_irq __P((int)); 69int apic_bus_type __P((int)); 70int apic_src_bus_id __P((int, int)); 71int apic_src_bus_irq __P((int, int)); 72int apic_int_type __P((int, int)); 73int apic_trigger __P((int, int)); 74int apic_polarity __P((int, int)); 75void configure_local_apic __P((void)); 76void init_secondary __P((void)); 77void smp_invltlb __P((void)); 78 79/* global data in mpapic.c */ 80extern volatile u_int* apic_base; 81 82#if defined(MULTIPLE_IOAPICS) 83#error MULTIPLE_IOAPICSXXX 84#else 85extern volatile u_int* io_apic_base; 86#endif /* MULTIPLE_IOAPICS */ 87 88/* functions in mpapic.c */ 89void apic_initialize __P((int)); 90int apic_ipi __P((int, int, int)); 91int selected_apic_ipi __P((u_int, int, int)); 92int io_apic_setup __P((int)); 93int ext_int_setup __P((int, int)); 94void write_io_apic_mask24 __P((int, u_int32_t)); 95 96#if defined(READY) 97void clr_io_apic_mask24 __P((int, u_int32_t)); 98void set_io_apic_mask24 __P((int, u_int32_t)); 99#endif /* READY */ 100 101void set_apic_timer __P((int)); 102int read_apic_timer __P((void)); 103void u_sleep __P((int)); 104 105/* global data in init_smp.c */ 106extern int smp_active; 107extern int invltlb_ok; 108 109/* in pmap.c FIXME: belongs in pmap.h??? */ 110void pmap_bootstrap_apics __P((void)); 111void pmap_bootstrap2 __P((void)); 112 113#if 0 114/* chicken and egg problem... */ 115static __inline unsigned 116cpunumber(void) 117{ 118 return (unsigned)ID_TO_CPU((apic_base[APIC_ID] & APIC_ID_MASK) >> 24); 119} 120#else 121/* 122 * we 'borrow' this info from apic.h 123 * this will go away soon... 124 */ 125static __inline unsigned 126cpunumber(void) 127{ 128 return (unsigned)(apic_id_to_logical[(apic_base[8] & 0x0f000000) >> 24]); 129} 130#endif /* 0 */ 131 132#endif /* SMP || APIC_IO */ 133#endif /* KERNEL */ 134#endif /* _MACHINE_SMP_H_ */ 135