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