xref: /freebsd/sys/i386/include/smp.h (revision fa298d5ea837e692c94989cde06a29dc5ecd793b)
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