186cb007fSWarner Losh /*- 2477a642cSPeter Wemm * ---------------------------------------------------------------------------- 3477a642cSPeter Wemm * "THE BEER-WARE LICENSE" (Revision 42): 4477a642cSPeter Wemm * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 5477a642cSPeter Wemm * can do whatever you want with this stuff. If we meet some day, and you think 6477a642cSPeter Wemm * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7477a642cSPeter Wemm * ---------------------------------------------------------------------------- 8477a642cSPeter Wemm * 9c3aac50fSPeter Wemm * $FreeBSD$ 10477a642cSPeter Wemm * 11477a642cSPeter Wemm */ 12477a642cSPeter Wemm 13477a642cSPeter Wemm #ifndef _MACHINE_SMP_H_ 14477a642cSPeter Wemm #define _MACHINE_SMP_H_ 15477a642cSPeter Wemm 16664a31e4SPeter Wemm #ifdef _KERNEL 17477a642cSPeter Wemm 18147ad8d5SJohn Baldwin #ifdef SMP 19477a642cSPeter Wemm 20412f3e4dSSteve Passe #ifndef LOCORE 21412f3e4dSSteve Passe 22147ad8d5SJohn Baldwin #include <sys/bus.h> 236caa8a15SJohn Baldwin #include <machine/frame.h> 24147ad8d5SJohn Baldwin #include <machine/intr_machdep.h> 25*e07ef9b0SJohn Baldwin #include <x86/apicvar.h> 26fa298d5eSAlexander Kabaev #include <machine/pcb.h> 2708942d46SSteve Passe 28477a642cSPeter Wemm /* global data in mpboot.s */ 29477a642cSPeter Wemm extern int bootMP_size; 30477a642cSPeter Wemm 31477a642cSPeter Wemm /* functions in mpboot.s */ 32b63dc6adSAlfred Perlstein void bootMP(void); 33477a642cSPeter Wemm 34477a642cSPeter Wemm /* global data in mp_machdep.c */ 35477a642cSPeter Wemm extern int mp_naps; 36477a642cSPeter Wemm extern int boot_cpu_id; 372f1e7069STor Egge extern struct pcb stoppcbs[]; 384c5bec11SJohn Baldwin extern int cpu_apic_ids[]; 39f0b98139SJohn Baldwin #ifdef COUNT_IPIS 40f0b98139SJohn Baldwin extern u_long *ipi_invltlb_counts[MAXCPU]; 41f0b98139SJohn Baldwin extern u_long *ipi_invlrng_counts[MAXCPU]; 42f0b98139SJohn Baldwin extern u_long *ipi_invlpg_counts[MAXCPU]; 434ac60df5SJohn Baldwin extern u_long *ipi_invlcache_counts[MAXCPU]; 44f0b98139SJohn Baldwin extern u_long *ipi_rendezvous_counts[MAXCPU]; 45b2b45ccaSAttilio Rao extern u_long *ipi_lazypmap_counts[MAXCPU]; 46f0b98139SJohn Baldwin #endif 47147ad8d5SJohn Baldwin 48147ad8d5SJohn Baldwin /* IPI handlers */ 49147ad8d5SJohn Baldwin inthand_t 50147ad8d5SJohn Baldwin IDTVEC(invltlb), /* TLB shootdowns - global */ 51147ad8d5SJohn Baldwin IDTVEC(invlpg), /* TLB shootdowns - 1 page */ 52147ad8d5SJohn Baldwin IDTVEC(invlrng), /* TLB shootdowns - page range */ 534ac60df5SJohn Baldwin IDTVEC(invlcache), /* Write back and invalidate cache */ 54f30a4a1cSStephan Uphoff IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */ 55147ad8d5SJohn Baldwin IDTVEC(cpustop), /* CPU stops & waits to be restarted */ 56e3fd0bc1SMitsuru IWASAKI IDTVEC(cpususpend), /* CPU suspends & waits to be resumed */ 57b2b45ccaSAttilio Rao IDTVEC(rendezvous), /* handle CPU rendezvous */ 58b2b45ccaSAttilio Rao IDTVEC(lazypmap); /* handle lazy pmap release */ 59477a642cSPeter Wemm 60477a642cSPeter Wemm /* functions in mp_machdep.c */ 61147ad8d5SJohn Baldwin void cpu_add(u_int apic_id, char boot_cpu); 62f0b98139SJohn Baldwin void cpustop_handler(void); 63fe756f2aSMitsuru IWASAKI #ifndef XEN 64e3fd0bc1SMitsuru IWASAKI void cpususpend_handler(void); 65fe756f2aSMitsuru IWASAKI #endif 66b63dc6adSAlfred Perlstein void init_secondary(void); 6777c80e2eSMitsuru IWASAKI void ipi_startup(int apic_id, int vector); 68b63dc6adSAlfred Perlstein void ipi_all_but_self(u_int ipi); 697814418aSKip Macy #ifndef XEN 70b439e431SJohn Baldwin void ipi_bitmap_handler(struct trapframe frame); 717814418aSKip Macy #endif 72d9d8d144SJohn Baldwin void ipi_cpu(int cpu, u_int ipi); 73d9d8d144SJohn Baldwin int ipi_nmi_handler(void); 7471a19bdcSAttilio Rao void ipi_selected(cpuset_t cpus, u_int ipi); 75147ad8d5SJohn Baldwin u_int mp_bootaddress(u_int); 764ac60df5SJohn Baldwin void smp_cache_flush(void); 77f1b665c8SPeter Wemm void smp_invlpg(vm_offset_t addr); 7871a19bdcSAttilio Rao void smp_masked_invlpg(cpuset_t mask, vm_offset_t addr); 79f1b665c8SPeter Wemm void smp_invlpg_range(vm_offset_t startva, vm_offset_t endva); 8071a19bdcSAttilio Rao void smp_masked_invlpg_range(cpuset_t mask, vm_offset_t startva, 81f1b665c8SPeter Wemm vm_offset_t endva); 82f1b665c8SPeter Wemm void smp_invltlb(void); 8371a19bdcSAttilio Rao void smp_masked_invltlb(cpuset_t mask); 84477a642cSPeter Wemm 85036dc238SKip Macy #ifdef XEN 86036dc238SKip Macy void ipi_to_irq_init(void); 87036dc238SKip Macy #endif 88412f3e4dSSteve Passe #endif /* !LOCORE */ 89147ad8d5SJohn Baldwin #endif /* SMP */ 90db6a4261SMatthew Dillon 91664a31e4SPeter Wemm #endif /* _KERNEL */ 92477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */ 93