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