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> 25147ad8d5SJohn Baldwin #include <machine/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[]; 38147ad8d5SJohn Baldwin extern struct mtx smp_tlb_mtx; 394c5bec11SJohn Baldwin extern int cpu_apic_ids[]; 40f0b98139SJohn Baldwin #ifdef COUNT_IPIS 41f0b98139SJohn Baldwin extern u_long *ipi_invltlb_counts[MAXCPU]; 42f0b98139SJohn Baldwin extern u_long *ipi_invlrng_counts[MAXCPU]; 43f0b98139SJohn Baldwin extern u_long *ipi_invlpg_counts[MAXCPU]; 444ac60df5SJohn Baldwin extern u_long *ipi_invlcache_counts[MAXCPU]; 45f0b98139SJohn Baldwin extern u_long *ipi_rendezvous_counts[MAXCPU]; 46f0b98139SJohn Baldwin extern u_long *ipi_lazypmap_counts[MAXCPU]; 47f0b98139SJohn Baldwin #endif 48147ad8d5SJohn Baldwin 49147ad8d5SJohn Baldwin /* IPI handlers */ 50147ad8d5SJohn Baldwin inthand_t 51147ad8d5SJohn Baldwin IDTVEC(invltlb), /* TLB shootdowns - global */ 52147ad8d5SJohn Baldwin IDTVEC(invlpg), /* TLB shootdowns - 1 page */ 53147ad8d5SJohn Baldwin IDTVEC(invlrng), /* TLB shootdowns - page range */ 544ac60df5SJohn Baldwin IDTVEC(invlcache), /* Write back and invalidate cache */ 55f30a4a1cSStephan Uphoff IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */ 56147ad8d5SJohn Baldwin IDTVEC(cpustop), /* CPU stops & waits to be restarted */ 57147ad8d5SJohn Baldwin IDTVEC(rendezvous), /* handle CPU rendezvous */ 58147ad8d5SJohn Baldwin 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); 63b63dc6adSAlfred Perlstein void init_secondary(void); 64b63dc6adSAlfred Perlstein void ipi_selected(u_int cpus, u_int ipi); 65b63dc6adSAlfred Perlstein void ipi_all(u_int ipi); 66b63dc6adSAlfred Perlstein void ipi_all_but_self(u_int ipi); 67b63dc6adSAlfred Perlstein void ipi_self(u_int ipi); 68b439e431SJohn Baldwin void ipi_bitmap_handler(struct trapframe frame); 69147ad8d5SJohn Baldwin u_int mp_bootaddress(u_int); 70147ad8d5SJohn Baldwin int mp_grab_cpu_hlt(void); 7159f3a8e6SJeff Roberson void mp_topology(void); 724ac60df5SJohn Baldwin void smp_cache_flush(void); 73f1b665c8SPeter Wemm void smp_invlpg(vm_offset_t addr); 74f1b665c8SPeter Wemm void smp_masked_invlpg(u_int mask, vm_offset_t addr); 75f1b665c8SPeter Wemm void smp_invlpg_range(vm_offset_t startva, vm_offset_t endva); 76f1b665c8SPeter Wemm void smp_masked_invlpg_range(u_int mask, vm_offset_t startva, 77f1b665c8SPeter Wemm vm_offset_t endva); 78f1b665c8SPeter Wemm void smp_invltlb(void); 79f1b665c8SPeter Wemm void smp_masked_invltlb(u_int mask); 80477a642cSPeter Wemm 8158553b99SJohn Baldwin #ifdef STOP_NMI 82fdc9713bSDoug White int ipi_nmi_handler(void); 83fdc9713bSDoug White #endif 84fdc9713bSDoug White 85412f3e4dSSteve Passe #endif /* !LOCORE */ 86147ad8d5SJohn Baldwin #endif /* SMP */ 87db6a4261SMatthew Dillon 88664a31e4SPeter Wemm #endif /* _KERNEL */ 89477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */ 90