From owner-FreeBSD-tech-jp@jp.FreeBSD.org Tue Nov 16 21:16:02 2004
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) id iAGCG2e50682;
	Tue, 16 Nov 2004 21:16:02 +0900 (JST)
	(envelope-from owner-FreeBSD-tech-jp@jp.FreeBSD.org)
Received: from mail501.nifty.com (mail501.nifty.com [202.248.37.209])
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) with ESMTP/inet id iAGCG1850673
	for <FreeBSD-tech-jp@jp.FreeBSD.org>; Tue, 16 Nov 2004 21:16:01 +0900 (JST)
	(envelope-from CQG00620@nifty.ne.jp)
Received: from nifty.ne.jp (ntceast030101.east.dup.ppp.infoweb.ne.jp [220.209.219.101])by mail501.nifty.com with ESMTP id iAGCFuol010273
	for <FreeBSD-tech-jp@jp.FreeBSD.org>; Tue, 16 Nov 2004 21:15:56 +0900
Message-Id: <200411161215.iAGCFuol010273@mail501.nifty.com>
From: Watanabe Kazuhiro <CQG00620@nifty.ne.jp>
To: FreeBSD-tech-jp@jp.FreeBSD.org
In-Reply-To: <200411141432.iAEEWOGG068066@sana.init-main.com>
References: <200411141137.iAEBbfWn001953@mail503.nifty.com>	<200411141432.iAEEWOGG068066@sana.init-main.com>
User-Agent: Wanderlust/2.10.1 (Watching The Wheels) SEMI/1.14.5
 (Awara-Onsen) FLIM/1.14.5 (Demachiyanagi) APEL/10.6 Emacs/20.7
 (i386--freebsd) MULE/4.0 (HANANOEN)
MIME-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen")
Content-Type: text/plain; charset=ISO-2022-JP
Reply-To: FreeBSD-tech-jp@jp.FreeBSD.org
Precedence: list
Date: Tue, 16 Nov 2004 21:18:49 +0900
X-Sequence: FreeBSD-tech-jp 3460
Subject: [FreeBSD-tech-jp 3460] Re: PCTel HSP MicroModem driver for FreeBSD
Sender: owner-FreeBSD-tech-jp@jp.FreeBSD.org
X-Originator: CQG00620@nifty.ne.jp
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+041115

$BEOJU0l42$G$9!#(B

At Sun, 14 Nov 2004 23:32:24 +0900,
Takanori Watanabe wrote:
> >$B$3$l$O!"$I$&$$$&>uBV$K$J$C$F$7$^$C$F$$$k$N$G$7$g$&$+!"$H$$$&$N$,(B
> >$B<ALd$G$9!#(B
> 
> $BIbF0>.?tE@1i;;$O!"(B($BB?$/$N%W%m%;%9$G$O;HMQ$7$J$$$3$H$N$NJ}$,B?$$$N$G(B)
> $B%W%m%;%9%9%$%C%A;~$KIbF0>.?tE@%l%8%9%?$r%;!<%V$7$F$+$i;HMQ$r6X;_$7$F$*$-!"(B
> $BIbF0>.?tE@1i;;$,;HMQ$5$l$?$H$-$K%H%i%C%W$,5/$-$k$h$&$K$7$F$*$$$?(B
> $B;~$K8F$P$l$k%k!<%A%s$G$9!#(B

$B$J$kDx!"$=$&$$$&;EAH$_$K$J$C$F$$$k$s$G$9$+!#(B


> $B$A$g$C$H(Bdsp.a$B$r%@%s%W$7$F$_$?$H$3$m%*%V%8%'%/%H$N0UL#$"$j$2$J>l=j$K(B
> $B$KIbF0>.?tE@L?Na$,$"$k$h$&$K8+$($^$9!#%+!<%M%k$NCf$GIbF0>.?tE@$r07$&$N$O(B
> $B4pK\E*$K$O6X;_$5$l$F$*$j!"I,MW$J$H$-$K$O<+J,$GB`HrEy$NA`:n$,I,MW$K$J$j$^$9!#(B

$B$3$C$A$N$[$&$O$=$l$J$j$KCN<1$H$7$F$"$j$^$7$?!#(BLinux$B$N%I%i%$%P%=!<%9$G(B
$B$b3d$j9~$_%O%s%I%i$G(Bfnsave/frstor$B$7$F$$$?$N$G!"$=$l$r$[$\??;w$F$$$^$9!#(B
$B$R$g$C$H$9$k$H(BLinux$B$G$O5vMF$5$l$F$b!"(BFreeBSD$B$G$O$^$:$$%3!<%I$K$J$C$F$$(B
$B$k$+$bCN$l$^$;$s!#(B

Linux$B$N(B pctel-0.9.7-9/src/ptserial-2.4.7.c $B$G$O<!$N$h$&$K$J$C$F$^$9!#(B

| void pctel_interrupt(int irq, void *dev_id, struct pt_regs *regs)
| {
|   static union i387_union i387;
|   static unsigned long flags;
| 
|   if (!HAL_DoInterrupt()) return;
| 
|   save_flags(flags);
|   cli();
| 
|   /* make sure to update GlobalTimer */
|   GlobalTimer = HAL_GetTimer();
| 
|   __asm__ __volatile__("fnsave %0\n\t"
|                                            "fwait"
|                                            : "=m" (i387));
| 
|   dspMain();
|   modem_main();
| 
| #ifdef AUDIO_ROUTING
(PCT789T$B$G$OL$Dj5A$H$J$k$N$G>JN,(B)
| #endif /*  AUDIO_ROUTING */
| 
|   __asm__ __volatile__("frstor %0": :"m" (i387));
| 
|   rs_interrupt_single(irq, dev_id, regs);
| 
|   sti();
|   restore_flags(flags);
| }

$B$G!"(Bptmdm-0.3/sys/dev/ptmdm/ptmdmsio.c $B$G$O<!$N$h$&$K$7$F$$$^$9!#(B

| static void
| siointr(void *arg)
| {
|     int s;
| /*    static union i387_union i387; */
|     static union savefpu i387;
| 
|     if(!HAL_DoInterrupt()) return;
| /*    COM_LOCK(); */
| #ifdef PCTEL
|     s=splfunc();
|     GlobalTimer = HAL_GetTimer();
| 
|     __asm__ __volatile__("fnsave %0\n\t"
|                                              "fwait"
|                                              : "=m" (i387));
| 
|     dspMain();
|     modem_main();
| 
|     __asm__ __volatile__("frstor %0": :"m" (i387));
| 
|     splx(s);
| #endif
|     COM_LOCK();
|     siointr1((struct com_s *) arg);
|     COM_UNLOCK();
| }

$B$3$3$G(Bsplfunc()$B$O(B4.x$B$G$O(Bspltty()$B$K$J$j$^$9!#$^$?(BCOM_LOCK()$B$O:G=i%3%a%s(B
$B%H9T$K$7$?0LCV$K$"$C$?$N$G$9$,!"$3$l$@$H(B5.2.1R$B$G$O!V(Bkernel trap 22 with
interrupts disabled$B!W$,1d!9$H=P$F$7$^$&$N$G!"8e$m$N$[$&$K0\F0$7$F$$$^(B
$B$9!#(B

$B%+!<%M%k%=!<%9$r$$$^$$$AFI$_$-$l$F$$$J$$$N$G$9$,!"(B4.x$B$G$O(B
COM_LOCK/COM_UNLOCK$B$O2?$b$7$J$$$h$&$J5$$,$7$^$9!#$G$b0lEYBe$o$j$K(B
splfunc()$B$G%m%C%/$r$+$1$F$_$?$N$G$9$,!"JQ2=L5$7$G$7$?!#$^$?(Bsplx(s)$B$r(B
COM_UNLOCK$B$N2<$K;}$C$F$-$F$b$_$^$7$?$,!"$3$l$bJQ2=L5$7$G$7$?!#(B


$B<B:]$N$H$3$m!"0\?"$K$"$?$C$F0lHVF,$rG:$^$;$?$N$O$3$N3d$j9~$_%O%s%I%i$G!"(B
$B$3$s$J$s$G$$$$$N$+IT0B$G$9!#(Bunion$B9=B$BN$N7?$b$3$l$G$$$$$N$+$J(B...$B$^$!!"(B
$B%"%;%s%V%i%3!<%I$,=P$F$-$?;~E@$GL$CN$N@$3&$J$s$G$9$,!#(B

# FPU$BL?Na$K$D$$$F$O0J2<$N%Z!<%8$r;29M$K$7$F$$$^$9!#(B
# $B!V(BSimply FPU$B!W(B
# http://masmforum.com/website/tutorials/fptute/index.html


$B$=$l$G$b(B5.2.1R$B$GF0$$$F$$$k$N$G!"$=$&%O%:$7$F$O$$$J$$$O$:$@$H;W$C$F$$$k(B
$B$N$G$9$,!"C1$K%F%9%HITB-$GO*8+$7$F$$$J$$$@$1$+$bCN$l$^$;$s!#(B

$B$^$?(B5.2.1R$B$N(Bnpx.c$B$G$O!"(B

| int
| npxdna()
| {
|         struct pcb *pcb;
|         register_t s;
|         u_short control;
| 
|         if (!npx_exists)
|                 return (0);
|         if (PCPU_GET(fpcurthread) == curthread) {
|                 printf("npxdna: fpcurthread == curthread %d times\n",
|                     ++err_count);
|                 stop_emulating();
|                 return (1);
|         }

$B$H$J$C$F$$$F!"(Bfpcurthread == curthread$B$G$b%a%C%;!<%8$r=P$9$@$1$GFC$KLd(B
$BBj$K$7$J$$$h$&$G$9!#(B5.2.1R$B$G2?$4$H$b$J$/F0$$$F$$$k$h$&$K8+$($k$N$O$3$N(B
$B0Y$G$7$g$&$+!#$G$b$3$N%a%C%;!<%8$9$i=P$J$$$s$G$9$h$M$'(B...$B!#(B
---
Watanabe Kazuhiro (CQG00620@nifty.ne.jp)
