smp.h revision 183344
1169689Skan/*-
2169689Skan * ----------------------------------------------------------------------------
3169689Skan * "THE BEER-WARE LICENSE" (Revision 42):
4169689Skan * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5169689Skan * can do whatever you want with this stuff. If we meet some day, and you think
6169689Skan * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7169689Skan * ----------------------------------------------------------------------------
8169689Skan *
9169689Skan * $FreeBSD: head/sys/i386/include/smp.h 183344 2008-09-25 07:09:50Z kmacy $
10169689Skan *
11169689Skan */
12169689Skan
13169689Skan#ifndef _MACHINE_SMP_H_
14169689Skan#define _MACHINE_SMP_H_
15169689Skan
16169689Skan#ifdef _KERNEL
17169689Skan
18169689Skan#ifdef SMP
19169689Skan
20169689Skan#ifndef LOCORE
21169689Skan
22169689Skan#include <sys/bus.h>
23169689Skan#include <machine/frame.h>
24169689Skan#include <machine/intr_machdep.h>
25169689Skan#include <machine/apicvar.h>
26169689Skan#include <machine/pcb.h>
27169689Skan
28169689Skan/* global data in mpboot.s */
29169689Skanextern int			bootMP_size;
30169689Skan
31169689Skan/* functions in mpboot.s */
32169689Skanvoid	bootMP(void);
33169689Skan
34169689Skan/* global data in mp_machdep.c */
35169689Skanextern int			mp_naps;
36169689Skanextern int			boot_cpu_id;
37extern struct pcb		stoppcbs[];
38extern int			cpu_apic_ids[];
39#ifdef COUNT_IPIS
40extern u_long *ipi_invltlb_counts[MAXCPU];
41extern u_long *ipi_invlrng_counts[MAXCPU];
42extern u_long *ipi_invlpg_counts[MAXCPU];
43extern u_long *ipi_invlcache_counts[MAXCPU];
44extern u_long *ipi_rendezvous_counts[MAXCPU];
45extern u_long *ipi_lazypmap_counts[MAXCPU];
46#endif
47
48/* global data in identcpu.c */
49extern int			cpu_cores;
50extern int			cpu_logical;
51
52/* IPI handlers */
53inthand_t
54	IDTVEC(invltlb),	/* TLB shootdowns - global */
55	IDTVEC(invlpg),		/* TLB shootdowns - 1 page */
56	IDTVEC(invlrng),	/* TLB shootdowns - page range */
57	IDTVEC(invlcache),	/* Write back and invalidate cache */
58	IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */
59	IDTVEC(cpustop),	/* CPU stops & waits to be restarted */
60	IDTVEC(rendezvous),	/* handle CPU rendezvous */
61	IDTVEC(lazypmap);	/* handle lazy pmap release */
62
63/* functions in mp_machdep.c */
64void	cpu_add(u_int apic_id, char boot_cpu);
65void	cpustop_handler(void);
66void	init_secondary(void);
67void	ipi_selected(u_int cpus, u_int ipi);
68void	ipi_all(u_int ipi);
69void	ipi_all_but_self(u_int ipi);
70void	ipi_self(u_int ipi);
71void 	ipi_bitmap_handler(struct trapframe frame);
72u_int	mp_bootaddress(u_int);
73int	mp_grab_cpu_hlt(void);
74void	smp_cache_flush(void);
75void	smp_invlpg(vm_offset_t addr);
76void	smp_masked_invlpg(u_int mask, vm_offset_t addr);
77void	smp_invlpg_range(vm_offset_t startva, vm_offset_t endva);
78void	smp_masked_invlpg_range(u_int mask, vm_offset_t startva,
79	    vm_offset_t endva);
80void	smp_invltlb(void);
81void	smp_masked_invltlb(u_int mask);
82
83#ifdef STOP_NMI
84int	ipi_nmi_handler(void);
85#endif
86#ifdef XEN
87void ipi_to_irq_init(void);
88#endif
89#endif /* !LOCORE */
90#endif /* SMP */
91
92#endif /* _KERNEL */
93#endif /* _MACHINE_SMP_H_ */
94