I know I believe in nothing but it is my sweet nothing.:2008年05月10日分

2008/05/10(Sat)

[NetBSD] ThinkPad s30 + piixpcib(4)

うーむpiixpcib(4)で凍るようになっちまってますやね。
r1.15でdevice_t化される前はvesafb(4)でvga_is_console()で落ちるのを
回避すれば動いてたんだけど。

dmesg見る限りspeedstep_configure()まで進んでないのね。
多分vga_is_console()と同件で、どっかでメモリ破壊起きてて
device_private()から壊れたsoftcが返されてしまい
pcibattach()内で落ちてるととりあえず予想してみる。

違った、speedstep_configure()まで動いてて最後、"SpeedStep SMI enabled"を
aprint_verbose_dev()で出力する時、何故かsc->sc_devがNULLになっとるせいで
刺さってる模様、うーむ。

[NetBSD] 続 ThinkPad s30 + piixpcib(4)

piixpcib(4)はattach()時にgenericなpicb(4)のattach()を呼ぶのだけども
piixpcib_softcと src/sys/arch/x86/pci/pcib.cの方のpcib_softcの
構造体って互換性無くなっちまってるな、これが原因臭。

[NetBSD] ThinkPad s30 + piixpcib(4) その3

あんまりキレイなやりかたじゃないけど、いちおpatch。

Index: sys/arch/x86/pci/pcib.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/pci/pcib.c,v
retrieving revision 1.4
diff -u -r1.4 pcib.c
--- sys/arch/x86/pci/pcib.c	28 Apr 2008 20:23:40 -0000	1.4
+++ sys/arch/x86/pci/pcib.c	10 May 2008 11:49:53 -0000
@@ -49,6 +49,8 @@
 #include "isa.h"
 
 struct pcib_softc {
+	device_t		sc_dev;
+
 	pci_chipset_tag_t	sc_pc;
 	pcitag_t		sc_tag;
 };
@@ -202,6 +204,7 @@
 	aprint_normal_dev(self, "%s (rev. 0x%02x)\n", devinfo,
 	    PCI_REVISION(pa->pa_class));
 
+	sc->sc_dev = self;
 	sc->sc_pc = pa->pa_pc;
 	sc->sc_tag = pa->pa_tag;
 

本当はpiixpcib.cの方を直すべきなんだろけど。
vga_is_console()で落ちる件も調べた後にでもsend-prすっか。

[NetBSD] ThinkPad s30 + piixpcib(4) その4

vga_is_console問題は再現しなかったのでsend-prしてきた。
でもpiixpcib_softcからpcib_softcへの変換がcastってダサくね?
今回のバグってJavaで書くなら

class A {
   ...
}
class B extend A {
   ...
}

A a;
B b;
a = (A)b;

のように、class A(=pcib)とその派生class B(=piixpcib)という
関係をCで実装するのに

struct A {
    ...
} *a;
struct B {
    ...
} *b;

a = (struct A *)b;

と書いた挙句、仕様変更時にAに追加したメンバを
Bに追加し忘れますた、ちゅーことなのだよね。

やっぱCならこうHAS-Aで書いた方が安全だよな。

struct A {
   ...
} *a;
struct B {
    struct A super;
    ...
} *b;

a = &b->super;
a = (struct A *)b; /* 全くお勧めしないけどこれでも動く */

softc構造体は各bus間ではdevice_tというopaque objectで
実装を隠蔽してるんだけども、piixpcibとpcibは隠蔽するような関係じゃないとオモ。

[NetBSD] multi-locale その5

newlocale(3)のcategory_maskの実装について。

これまでのsetlocale(3)だと

setlocale(LC_ALL, "");
setlocale(LC_CTYPE, "");

のように、全てのカテゴリあるいはどれか1つを指定するのだけど
newlocale(3)では

newlocale(LC_ALL_MASK, "", base);
newlocale(LC_COLLATE_MASK|LC_CTYPE_MASK, "", base);

のようにOR使って細かく指定できるようになったのよな。

んでsetlocale(3)のidentifierって実装依存なのだがNetBSDの場合

$ cat >test.c
#include <locale.h>
#include <stdio.h>
main()
{
    setlocale(LC_ALL, "C/ja_JP.eucJP/C/C/C/C");
    printf("%s\n", setlocale(LC_ALL,  NULL));
}
^D
$ make test
$ ./test
C/ja_JP.eucJP/C/C/C/C

のよに、LC_ALLの場合はスラッシュ区切りで各カテゴリを
設定/表示する仕様なのだけども、multil-localeではORが使えるので

printf("%s\n", querylocale(LC_COLLATE_MASK|LC_CTYPE_MASK, locale));

とかした場合、どういう結果が返るのがいいのかね。

C/ja_JP.eucJP

のよに、指定されたcategoryだけを設定 or 表示すると判りづらいよな。

glibc2の場合はsetlocale(3)のコードを実行すると

LC_CTYPE=ja_JP.eucJP;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

となるけど、querylocale(3)はglibc2にはにゃいので結果が判らん。

TODO: MacOS Xのquerylocale(3)がどういう結果を返すか、調べに電器屋へいくこと。
うちのDuo230にTiger入んねぇかな。