0d2a298904
- This is heavily derived from John Baldwin's apic/pci cleanup on i386. - I have completely rewritten or drastically cleaned up some other parts. (in particular, bootstrap) - This is still a WIP. It seems that there are some highly bogus bioses on nVidia nForce3-150 boards. I can't stress how broken these boards are. I have a workaround in mind, but right now the Asus SK8N is broken. The Gigabyte K8NPro (nVidia based) is also mind-numbingly hosed. - Most of my testing has been with SCHED_ULE. SCHED_4BSD works. - the apic and acpi components are 'standard'. - If you have an nVidia nForce3-150 board, you are stuck with 'device atpic' in addition, because they somehow managed to forget to connect the 8254 timer to the apic, even though its in the same silicon! ARGH! This directly violates the ACPI spec.
76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
/*
|
|
* ----------------------------------------------------------------------------
|
|
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
* <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
|
|
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* $FreeBSD$
|
|
*
|
|
*/
|
|
|
|
#ifndef _MACHINE_SMP_H_
|
|
#define _MACHINE_SMP_H_
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#ifdef SMP
|
|
|
|
#ifndef LOCORE
|
|
|
|
#include <sys/bus.h>
|
|
#include <machine/frame.h>
|
|
#include <machine/intr_machdep.h>
|
|
#include <machine/apicvar.h>
|
|
|
|
/* global symbols in mpboot.S */
|
|
extern char mptramp_start[];
|
|
extern char mptramp_end[];
|
|
extern u_int32_t mptramp_pagetables;
|
|
|
|
/* global data in mp_machdep.c */
|
|
extern int mp_naps;
|
|
extern int boot_cpu_id;
|
|
extern struct pcb stoppcbs[];
|
|
extern struct mtx smp_tlb_mtx;
|
|
|
|
/* IPI handlers */
|
|
inthand_t
|
|
IDTVEC(invltlb), /* TLB shootdowns - global */
|
|
IDTVEC(invlpg), /* TLB shootdowns - 1 page */
|
|
IDTVEC(invlrng), /* TLB shootdowns - page range */
|
|
IDTVEC(hardclock), /* Forward hardclock() */
|
|
IDTVEC(statclock), /* Forward statclock() */
|
|
IDTVEC(cpuast), /* Additional software trap on other cpu */
|
|
IDTVEC(cpustop), /* CPU stops & waits to be restarted */
|
|
IDTVEC(rendezvous), /* handle CPU rendezvous */
|
|
IDTVEC(lazypmap); /* handle lazy pmap release */
|
|
|
|
/* functions in mp_machdep.c */
|
|
void cpu_add(u_int apic_id, char boot_cpu);
|
|
void init_secondary(void);
|
|
void ipi_selected(u_int cpus, u_int ipi);
|
|
void ipi_all(u_int ipi);
|
|
void ipi_all_but_self(u_int ipi);
|
|
void ipi_self(u_int ipi);
|
|
void forward_statclock(void);
|
|
void forwarded_statclock(struct clockframe frame);
|
|
void forward_hardclock(void);
|
|
void forwarded_hardclock(struct clockframe frame);
|
|
u_int mp_bootaddress(u_int);
|
|
int mp_grab_cpu_hlt(void);
|
|
void smp_invlpg(vm_offset_t addr);
|
|
void smp_masked_invlpg(u_int mask, vm_offset_t addr);
|
|
void smp_invlpg_range(vm_offset_t startva, vm_offset_t endva);
|
|
void smp_masked_invlpg_range(u_int mask, vm_offset_t startva,
|
|
vm_offset_t endva);
|
|
void smp_invltlb(void);
|
|
void smp_masked_invltlb(u_int mask);
|
|
|
|
#endif /* !LOCORE */
|
|
#endif /* SMP */
|
|
|
|
#endif /* _KERNEL */
|
|
#endif /* _MACHINE_SMP_H_ */
|