Module Name: src Committed By: rmind Date: Mon Mar 30 22:28:40 UTC 2009
Modified Files: src/sys/arch/amd64/conf: files.amd64 src/sys/arch/i386/conf: files.i386 src/sys/arch/x86/x86: ipi.c Removed Files: src/sys/arch/amd64/amd64: ipifuncs.c src/sys/arch/i386/i386: ipifuncs.c Log Message: Merge i386 and amd64 ipifuncs.c into x86. No functional changes intended. XXX: fpu #ifdefs are ugly (should be revisited at some point). To generate a diff of this commit: cvs rdiff -u -r1.21 -r0 src/sys/arch/amd64/amd64/ipifuncs.c cvs rdiff -u -r1.64 -r1.65 src/sys/arch/amd64/conf/files.amd64 cvs rdiff -u -r1.346 -r1.347 src/sys/arch/i386/conf/files.i386 cvs rdiff -u -r1.28 -r0 src/sys/arch/i386/i386/ipifuncs.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/x86/x86/ipi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/conf/files.amd64 diff -u src/sys/arch/amd64/conf/files.amd64:1.64 src/sys/arch/amd64/conf/files.amd64:1.65 --- src/sys/arch/amd64/conf/files.amd64:1.64 Mon Mar 30 22:20:55 2009 +++ src/sys/arch/amd64/conf/files.amd64 Mon Mar 30 22:28:39 2009 @@ -1,4 +1,4 @@ -# $NetBSD: files.amd64,v 1.64 2009/03/30 22:20:55 rmind Exp $ +# $NetBSD: files.amd64,v 1.65 2009/03/30 22:28:39 rmind Exp $ # # new style config file for amd64 architecture # @@ -52,7 +52,6 @@ file dev/cons.c file arch/amd64/amd64/mptramp.S multiprocessor -file arch/amd64/amd64/ipifuncs.c multiprocessor # # Machine-independent SCSI drivers Index: src/sys/arch/i386/conf/files.i386 diff -u src/sys/arch/i386/conf/files.i386:1.346 src/sys/arch/i386/conf/files.i386:1.347 --- src/sys/arch/i386/conf/files.i386:1.346 Mon Mar 30 22:20:55 2009 +++ src/sys/arch/i386/conf/files.i386 Mon Mar 30 22:28:39 2009 @@ -1,4 +1,4 @@ -# $NetBSD: files.i386,v 1.346 2009/03/30 22:20:55 rmind Exp $ +# $NetBSD: files.i386,v 1.347 2009/03/30 22:28:39 rmind Exp $ # # new style config file for i386 architecture # @@ -87,7 +87,6 @@ file dev/cons.c file arch/i386/i386/mptramp.S multiprocessor -file arch/i386/i386/ipifuncs.c multiprocessor file arch/i386/i386/pmc.c perfctrs Index: src/sys/arch/x86/x86/ipi.c diff -u src/sys/arch/x86/x86/ipi.c:1.13 src/sys/arch/x86/x86/ipi.c:1.14 --- src/sys/arch/x86/x86/ipi.c:1.13 Sun May 11 21:48:02 2008 +++ src/sys/arch/x86/x86/ipi.c Mon Mar 30 22:28:40 2009 @@ -1,7 +1,7 @@ -/* $NetBSD: ipi.c,v 1.13 2008/05/11 21:48:02 ad Exp $ */ +/* $NetBSD: ipi.c,v 1.14 2009/03/30 22:28:40 rmind Exp $ */ /*- - * Copyright (c) 2000, 2008 The NetBSD Foundation, Inc. + * Copyright (c) 2000, 2008, 2009 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -32,7 +32,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ipi.c,v 1.13 2008/05/11 21:48:02 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipi.c,v 1.14 2009/03/30 22:28:40 rmind Exp $"); + +#include "opt_mtrr.h" #include <sys/param.h> #include <sys/device.h> @@ -41,12 +43,66 @@ #include <sys/intr.h> #include <sys/cpu.h> +#ifdef MULTIPROCESSOR + +#include <machine/cpufunc.h> #include <machine/cpuvar.h> #include <machine/i82093var.h> #include <machine/i82489reg.h> #include <machine/i82489var.h> +#include <machine/mtrr.h> +#include <machine/gdt.h> + +#include <x86/cpu_msr.h> + +#include "acpi.h" + +#ifdef __x86_64__ +#include <machine/fpu.h> +static void x86_ipi_synch_fpu(struct cpu_info *); +#else +/* XXXfpu */ +#include "npx.h" +#if NNPX > 0 +static void x86_ipi_synch_fpu(struct cpu_info *); +#define fpusave_cpu(x) npxsave_cpu(x) +#else +#define x86_ipi_synch_fpu NULL +#endif +#endif + +static void x86_ipi_halt(struct cpu_info *); +static void x86_ipi_kpreempt(struct cpu_info *); + +#ifdef MTRR +static void x86_ipi_reload_mtrr(struct cpu_info *); +#else +#define x86_ipi_reload_mtrr NULL +#endif + +#if NACPI > 0 +void acpi_cpu_sleep(struct cpu_info *); +#else +#define acpi_cpu_sleep NULL +#endif + +void (*ipifunc[X86_NIPI])(struct cpu_info *) = +{ + x86_ipi_halt, + NULL, + NULL, + x86_ipi_synch_fpu, + x86_ipi_reload_mtrr, + gdt_reload_cpu, + msr_write_ipi, + acpi_cpu_sleep, + x86_ipi_kpreempt +}; + +/* + * x86 IPI interface. + */ -#ifdef MULTIPROCESSOR int x86_send_ipi(struct cpu_info *ci, int ipimask) { @@ -122,7 +178,56 @@ (*ipifunc[bit])(ci); } } + +/* + * Common x86 IPI handlers. + */ + +static void +x86_ipi_halt(struct cpu_info *ci) +{ + + x86_disable_intr(); + atomic_and_32(&ci->ci_flags, ~CPUF_RUNNING); + + for(;;) { + x86_hlt(); + } +} + +#if defined(__x86_64__) || NNPX > 0 /* XXXfpu */ +static void +x86_ipi_synch_fpu(struct cpu_info *ci) +{ + + fpusave_cpu(true); +} +#endif + +#ifdef MTRR +static void +x86_ipi_reload_mtrr(struct cpu_info *ci) +{ + + if (mtrr_funcs != NULL) { + /* + * mtrr_reload_cpu() is a macro in mtrr.h which picks + * the appropriate function to use. + */ + mtrr_reload_cpu(ci); + } +} +#endif + +static void +x86_ipi_kpreempt(struct cpu_info *ci) +{ + + softint_trigger(1 << SIR_PREEMPT); +} + #else + int x86_send_ipi(struct cpu_info *ci, int ipimask) { @@ -141,4 +246,5 @@ { } + #endif