smp.h revision 138528
125164Speter/* 225164Speter * ---------------------------------------------------------------------------- 325164Speter * "THE BEER-WARE LICENSE" (Revision 42): 425164Speter * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you 525164Speter * can do whatever you want with this stuff. If we meet some day, and you think 625164Speter * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 725164Speter * ---------------------------------------------------------------------------- 825164Speter * 950477Speter * $FreeBSD: head/sys/i386/include/smp.h 138528 2004-12-07 20:15:01Z ups $ 1025164Speter * 1125164Speter */ 1225164Speter 1325164Speter#ifndef _MACHINE_SMP_H_ 1425164Speter#define _MACHINE_SMP_H_ 1525164Speter 1655205Speter#ifdef _KERNEL 1725164Speter 18121996Sjhb#ifdef SMP 1925517Sfsmp 2027728Sfsmp#ifndef LOCORE 2127728Sfsmp 2227002Sfsmp/* 2327002Sfsmp * For sending values to POST displays. 2427252Sfsmp * XXX FIXME: where does this really belong, isa.h/isa.c perhaps? 2527002Sfsmp */ 2627252Sfsmpextern int current_postcode; /** XXX currently in mp_machdep.c */ 2727252Sfsmp#define POSTCODE(X) current_postcode = (X), \ 2827252Sfsmp outb(0x80, current_postcode) 2927252Sfsmp#define POSTCODE_LO(X) current_postcode &= 0xf0, \ 3027252Sfsmp current_postcode |= ((X) & 0x0f), \ 3127252Sfsmp outb(0x80, current_postcode) 3227252Sfsmp#define POSTCODE_HI(X) current_postcode &= 0x0f, \ 3327252Sfsmp current_postcode |= (((X) << 4) & 0xf0), \ 3427252Sfsmp outb(0x80, current_postcode) 3527002Sfsmp 36121996Sjhb#include <sys/bus.h> 3776078Sjhb#include <machine/frame.h> 38121996Sjhb#include <machine/intr_machdep.h> 39121996Sjhb#include <machine/apicvar.h> 4026269Sfsmp 4125164Speter/* global data in mpboot.s */ 4225164Speterextern int bootMP_size; 4325164Speter 4425164Speter/* functions in mpboot.s */ 4593018Sbdevoid bootMP(void); 4625164Speter 4725164Speter/* global data in mp_machdep.c */ 4825164Speterextern int mp_naps; 4925164Speterextern int boot_cpu_id; 5036135Steggeextern struct pcb stoppcbs[]; 51121996Sjhbextern struct mtx smp_tlb_mtx; 5225164Speter 53121996Sjhb/* IPI handlers */ 54121996Sjhbinthand_t 55121996Sjhb IDTVEC(invltlb), /* TLB shootdowns - global */ 56121996Sjhb IDTVEC(invlpg), /* TLB shootdowns - 1 page */ 57121996Sjhb IDTVEC(invlrng), /* TLB shootdowns - page range */ 58138528Sups IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */ 59121996Sjhb IDTVEC(cpustop), /* CPU stops & waits to be restarted */ 60121996Sjhb IDTVEC(rendezvous), /* handle CPU rendezvous */ 61121996Sjhb IDTVEC(lazypmap); /* handle lazy pmap release */ 62121996Sjhb 6325164Speter/* functions in mp_machdep.c */ 64121996Sjhbvoid cpu_add(u_int apic_id, char boot_cpu); 6593018Sbdevoid init_secondary(void); 66121996Sjhbvoid ipi_selected(u_int cpus, u_int ipi); 67121996Sjhbvoid ipi_all(u_int ipi); 68121996Sjhbvoid ipi_all_but_self(u_int ipi); 69121996Sjhbvoid ipi_self(u_int ipi); 7093018Sbdevoid forward_statclock(void); 7193018Sbdevoid forward_hardclock(void); 72138528Supsvoid ipi_bitmap_handler(struct clockframe frame); 73121996Sjhbu_int mp_bootaddress(u_int); 74121996Sjhbint mp_grab_cpu_hlt(void); 75123431Sjeffvoid mp_topology(void); 7699862Spetervoid smp_invlpg(vm_offset_t addr); 7799862Spetervoid smp_masked_invlpg(u_int mask, vm_offset_t addr); 7899862Spetervoid smp_invlpg_range(vm_offset_t startva, vm_offset_t endva); 7999862Spetervoid smp_masked_invlpg_range(u_int mask, vm_offset_t startva, 8099862Speter vm_offset_t endva); 8199862Spetervoid smp_invltlb(void); 8299862Spetervoid smp_masked_invltlb(u_int mask); 8325164Speter 8427728Sfsmp#endif /* !LOCORE */ 85121996Sjhb#endif /* SMP */ 8658755Sdillon 8755205Speter#endif /* _KERNEL */ 8825164Speter#endif /* _MACHINE_SMP_H_ */ 89