xref: /freebsd/sys/amd64/include/smp.h (revision 0d2a2989048c676030afdcf7ba3aae9713738395)
1477a642cSPeter Wemm /*
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 
160d2a2989SPeter Wemm #ifdef _KERNEL
170d2a2989SPeter Wemm 
180d2a2989SPeter Wemm #ifdef SMP
190d2a2989SPeter Wemm 
200d2a2989SPeter Wemm #ifndef LOCORE
210d2a2989SPeter Wemm 
220d2a2989SPeter Wemm #include <sys/bus.h>
230d2a2989SPeter Wemm #include <machine/frame.h>
240d2a2989SPeter Wemm #include <machine/intr_machdep.h>
250d2a2989SPeter Wemm #include <machine/apicvar.h>
260d2a2989SPeter Wemm 
270d2a2989SPeter Wemm /* global symbols in mpboot.S */
280d2a2989SPeter Wemm extern char			mptramp_start[];
290d2a2989SPeter Wemm extern char			mptramp_end[];
300d2a2989SPeter Wemm extern u_int32_t		mptramp_pagetables;
310d2a2989SPeter Wemm 
320d2a2989SPeter Wemm /* global data in mp_machdep.c */
330d2a2989SPeter Wemm extern int			mp_naps;
340d2a2989SPeter Wemm extern int			boot_cpu_id;
350d2a2989SPeter Wemm extern struct pcb		stoppcbs[];
360d2a2989SPeter Wemm extern struct mtx		smp_tlb_mtx;
370d2a2989SPeter Wemm 
380d2a2989SPeter Wemm /* IPI handlers */
390d2a2989SPeter Wemm inthand_t
400d2a2989SPeter Wemm 	IDTVEC(invltlb),	/* TLB shootdowns - global */
410d2a2989SPeter Wemm 	IDTVEC(invlpg),		/* TLB shootdowns - 1 page */
420d2a2989SPeter Wemm 	IDTVEC(invlrng),	/* TLB shootdowns - page range */
430d2a2989SPeter Wemm 	IDTVEC(hardclock),	/* Forward hardclock() */
440d2a2989SPeter Wemm 	IDTVEC(statclock),	/* Forward statclock() */
450d2a2989SPeter Wemm 	IDTVEC(cpuast),		/* Additional software trap on other cpu */
460d2a2989SPeter Wemm 	IDTVEC(cpustop),	/* CPU stops & waits to be restarted */
470d2a2989SPeter Wemm 	IDTVEC(rendezvous),	/* handle CPU rendezvous */
480d2a2989SPeter Wemm 	IDTVEC(lazypmap);	/* handle lazy pmap release */
490d2a2989SPeter Wemm 
500d2a2989SPeter Wemm /* functions in mp_machdep.c */
510d2a2989SPeter Wemm void	cpu_add(u_int apic_id, char boot_cpu);
520d2a2989SPeter Wemm void	init_secondary(void);
530d2a2989SPeter Wemm void	ipi_selected(u_int cpus, u_int ipi);
540d2a2989SPeter Wemm void	ipi_all(u_int ipi);
550d2a2989SPeter Wemm void	ipi_all_but_self(u_int ipi);
560d2a2989SPeter Wemm void	ipi_self(u_int ipi);
570d2a2989SPeter Wemm void	forward_statclock(void);
580d2a2989SPeter Wemm void	forwarded_statclock(struct clockframe frame);
590d2a2989SPeter Wemm void	forward_hardclock(void);
600d2a2989SPeter Wemm void	forwarded_hardclock(struct clockframe frame);
610d2a2989SPeter Wemm u_int	mp_bootaddress(u_int);
620d2a2989SPeter Wemm int	mp_grab_cpu_hlt(void);
630d2a2989SPeter Wemm void	smp_invlpg(vm_offset_t addr);
640d2a2989SPeter Wemm void	smp_masked_invlpg(u_int mask, vm_offset_t addr);
650d2a2989SPeter Wemm void	smp_invlpg_range(vm_offset_t startva, vm_offset_t endva);
660d2a2989SPeter Wemm void	smp_masked_invlpg_range(u_int mask, vm_offset_t startva,
670d2a2989SPeter Wemm 	    vm_offset_t endva);
680d2a2989SPeter Wemm void	smp_invltlb(void);
690d2a2989SPeter Wemm void	smp_masked_invltlb(u_int mask);
700d2a2989SPeter Wemm 
710d2a2989SPeter Wemm #endif /* !LOCORE */
720d2a2989SPeter Wemm #endif /* SMP */
730d2a2989SPeter Wemm 
740d2a2989SPeter Wemm #endif /* _KERNEL */
75477a642cSPeter Wemm #endif /* _MACHINE_SMP_H_ */
76