From owner-FreeBSD-tech-jp@jp.freebsd.org  Thu Jun  8 03:30:01 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id DAA52341;
	Thu, 8 Jun 2000 03:30:01 +0900 (JST)
	(envelope-from owner-FreeBSD-tech-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id DAA52332
	for <FreeBSD-tech-jp@jp.freebsd.org>; Thu, 8 Jun 2000 03:30:01 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdn49.imasy.or.jp [202.227.24.241])
	by tasogare.imasy.or.jp (8.10.1+3.3W/3.7W-tasogare/smtpfeed 1.04) with ESMTP id e57ITxP34169;
	Thu, 8 Jun 2000 03:29:59 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
To: FreeBSD-tech-jp@jp.freebsd.org, sumitani@bd2.hnes.nec.co.jp
In-Reply-To: <393E0572.42E69A00@bd2.hnes.nec.co.jp>
References: <393C7CC6.D04F45A2@bd2.hnes.nec.co.jp>
	<393E0572.42E69A00@bd2.hnes.nec.co.jp>
X-Mailer: Mew version 1.94.1 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <20000608032958W.iwasaki@jp.FreeBSD.org>
Date: Thu, 08 Jun 2000 03:29:58 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 20000228(IM140)
Lines: 97
Reply-To: FreeBSD-tech-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-tech-jp 2809
Subject: [FreeBSD-tech-jp 2809] Re: SMP + APM panic on 4.0-RELEASE
Errors-To: owner-FreeBSD-tech-jp@jp.freebsd.org
Sender: owner-FreeBSD-tech-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

$B$$$o$5$-$H?=$7$^$9(B

> send-pr$B$9$k$D$b$j$G$O$$$?$N$G$9$,!"$$$o$5$-$5$s$,"-$N$h$&$K%Q%C%A$rAw$C$F(B
> $B2<$5$C$?$N$G2#Ce$7$?$$$H;W$$$^$9!#(B

$B$I$b$I$b!#(B
$B@h$[$I(B CURRENT $B$NJ}$X$O(B commit $B$7$^$7$?(B :-)
$BMh=5$K$O(B STABLE $B$X$b;}$C$F$$$/M=Dj$K$7$F$*$j!":G0-$G$b(B 
4.1-RELEASE (July 15) $B$K$O(B power-off $B$rF~$l$F$*$-$?$$$H;W$C$F$$$^$9!#(B

$B$G!"(Bsuspend/resume $B$NJ}$G$9$,!"(B

> $B$?$@!"(B
> 
> > Subject: Re: SMP + APM = panic -> fixed!
> > From: Boris Popov <bp@butya.kz>
> > 
> >         Yes, this fixes panic and even 'halt -p' works as expected. 'zzz'
> > command works too, but machine never come back from the suspend mode
> > (looks like interrupt controller programmed incorrectly or something
> > like this).
> 
> $B$J$s$F8@$C$F$$$k$N$G!"(Bpower-off$B0J30$O$d$a$F$*$$$?$[$&$,NI$5$=$&$G$9!#(B
> 
> $B;d$O(Bpower-off$B$G$-$l$PK~B-$@$7!"(BAPM$B$G(Bresume$B$9$k$"$?$j$OJY6/$7$F$J$$$N$G(B
> $B$3$NJU$G$d$a$F$*$-$^$9!#(B

$B$A$g$C$H;W$C$?$N$,!"(Bsuspend $B$9$k;~$K;HMQ$7$F$$$k(B CPU $B$H(B
resume $B$N=hM}$r<B9T$9$k(B CPU $B$C$F!"$b$7$+$7$FF1$8$G$"$k(B
$BJ]>Z$C$FL5$$$s$8$c$J$$$+$J$!!#0c$C$?>l9g!"(Bresume $B;~$K(B
$B;HMQ$5$l$k(B CPU $BMQ$N(B GDT $B$O(B APM $BMQ$K@_Dj$,$5$l$F$$$J$$$N$G!"(B
$BHa$7$$$3$H$K(B...$B$H$$$&LQA[$7$F$^$9!#(B
$B$H$$$&$3$H$G!"$I$N(B CPU $B$,(B resume $B;~$K;HMQ$5$l$F$bBg>fIW$J(B
$B$h$&$K(B GDT $B$r@_Dj$9$k%Q%C%A$G$9!#K\<AE*$K(B 4.0-CURRENT $B;~Be$K(B
$B$&$^$/$$$C$F$$$?$i$7$$%3!<%I$HF1Ey$K$J$C$F$$$k$O$:$G$9!#(B
$B;DG0$J$,$i<j85$N(B SMP box $B$O$9$_$?$K$5$s$N%Q%C%A$G(B suspend/resume
$B$G$-$F!"$+$o$j$K(B power-off $B$G$-$J$$$d$D$J$N$G!"Js9p$5$l$F$$$k(B
$B>I>u$HF1$8(B SMP box $B$r;}$C$F$$$kJ}!"%F%9%H$N6(NO$*4j$$$7$^$9!#(B
$B:G?7$N$$$C$3A0$N%j%S%8%g%sMQ$N%Q%C%A$G$9!#$=$l0JA0$N$b$N$O!"(B
NCPU $B$,L$Dj5A$K$J$k$N$G!"$"$?$^$N$[$&$K(B
#include "opt_smp.h"
$B$,I,MW$K$J$k$H;W$$$^$9!#(B

Index: bios.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/bios.c,v
retrieving revision 1.32
diff -u -r1.32 bios.c
--- bios.c	2000/05/17 19:44:16	1.32
+++ bios.c	2000/06/07 18:06:16
@@ -249,6 +249,7 @@
 void
 set_bios_selectors(struct bios_segments *seg, int flags)
 {
+    int	cpu;
     struct soft_segment_descriptor ssd = {
 	0,			/* segment base address (overwritten) */
 	0,			/* length (overwritten) */
@@ -261,12 +262,8 @@
     };
     union descriptor *p_gdt;
 
-#ifdef SMP
-    p_gdt = &gdt[cpuid];
-#else
     p_gdt = gdt;
-#endif
-	
+
     ssd.ssd_base = seg->code32.base;
     ssd.ssd_limit = seg->code32.limit;
     ssdtosd(&ssd, &p_gdt[GBIOSCODE32_SEL].sd);
@@ -296,6 +293,23 @@
 	ssd.ssd_limit = seg->args.limit;
 	ssdtosd(&ssd, &p_gdt[GBIOSARGS_SEL].sd);
     }
+#ifdef SMP
+    for (cpu = 1; cpu < NCPU; cpu++) {
+	gdt[cpu * NGDT + GBIOSCODE32_SEL].sd = p_gdt[GBIOSCODE32_SEL].sd;
+	if (flags & BIOSCODE_FLAG) {
+	    gdt[cpu * NGDT + GBIOSCODE16_SEL].sd = p_gdt[GBIOSCODE16_SEL].sd;
+	}
+	if (flags & BIOSDATA_FLAG) {
+	    gdt[cpu * NGDT + GBIOSDATA_SEL].sd = p_gdt[GBIOSDATA_SEL].sd;
+	}
+	if (flags & BIOSUTIL_FLAG) {
+	    gdt[cpu * NGDT + GBIOSUTIL_SEL].sd = p_gdt[GBIOSUTIL_SEL].sd;
+	}
+	if (flags & BIOSARGS_FLAG) {
+	    gdt[cpu * NGDT + GBIOSARGS_SEL].sd = p_gdt[GBIOSARGS_SEL].sd;
+	}
+    }
+#endif
 }
 
 extern int vm86pa;

