::log.2008
[ TOP | Recently ]
STR8132 / LAN EVOLUTION memo / LAN EVOLUTION / ゆっくり / ssh-reuse-agent / gcscaudio と AC97 と ALC655 / amd_geode.c / NetBSD i386/pci/gcscaudio / 隅田川花火大会 / recvfromto, sendfromto. / NSLU2 / source to dot w/graphviz / apache LogFormat in JSON / Amusement Package!! / sys/queue.h / cofilint#2 / cofilint / マクロスFRONTIER / queue / stdio like mbuf utils#2 / stdio like mbuf utils / raidframeチューニング#3 / raidframeチューニング#2 / raidframeチューニング / umsとタッチパネル / SA5SX04AのHDD / Geode LX の MSR レジスタ / Xorg 1024x600 on SA5SX04A / SA5SX04A / SA5SX04A / GeodeLXマシン / Passage
2008-12-22 STR8132
STR8xxxはOrion ARMとはまた違うのか…。資料がぜんぜん見つからないなぁ。
STR9104ならこのへんか。
linuxのパッチもあったのでがんばればいけるかな。
NSLU2が5000円で買えるのに、労力の割に得るものが少なそうだなぁ。
STR9104ならこのへんか。
linuxのパッチもあったのでがんばればいけるかな。
NSLU2が5000円で買えるのに、労力の割に得るものが少なそうだなぁ。
2008-12-19 LAN EVOLUTION memo
整理。
Memory 0x00000000 〜 0x02000000 (32Mbyte)
U-Boot が 0x00000000 〜 0x00F00000 まで使っている? IRQ Stack は 0x00Exxxxx
Flash#0: 30000000 to 3002FFFF
Flash#1: 30030000 to 3003FFFF
Flash#2: 30040000 to 3023FFFF
Flash#3: 30240000 to 307FFFFF
通常起動は 0x30040000 から 2Mbyte を 0x0cf00000 にコピーして 0x0cf00000 へ jump している。
0x0cf00000 は 0x00f00000 と同じ領域が見える。何で 0x0c を付けているんだろう。non cache?
0x00000000
: U-Boot text
0x00DFFFFF
0x00E00000
: U-Boot stack
0x00EFFFFF
0x00F00000
: compressed kernel load area
0x02000000
一旦0x00F00000にkernelをロードしてから、irq disable にして 0x00000000 に展開 && jumpするのかな。
Memory 0x00000000 〜 0x02000000 (32Mbyte)
U-Boot が 0x00000000 〜 0x00F00000 まで使っている? IRQ Stack は 0x00Exxxxx
Flash#0: 30000000 to 3002FFFF
Flash#1: 30030000 to 3003FFFF
Flash#2: 30040000 to 3023FFFF
Flash#3: 30240000 to 307FFFFF
通常起動は 0x30040000 から 2Mbyte を 0x0cf00000 にコピーして 0x0cf00000 へ jump している。
0x0cf00000 は 0x00f00000 と同じ領域が見える。何で 0x0c を付けているんだろう。non cache?
0x00000000
: U-Boot text
0x00DFFFFF
0x00E00000
: U-Boot stack
0x00EFFFFF
0x00F00000
: compressed kernel load area
0x02000000
一旦0x00F00000にkernelをロードしてから、irq disable にして 0x00000000 に展開 && jumpするのかな。
2008-12-19 LAN EVOLUTION
なんとなくlinuxぽいので買ってきた。
電源入れる前にバラしてみた。
STR8132 - ARM926 250MHzらしい。
シリアルっぽいホールがあったのでピンを付けて繋げてみる。
(電源入れる前)
38400bps でコンソールとれた。
基板の5pinの真ん中がVcc、両端がGND、残りがTXD、RXD。MAX232使ったので、9-KEで拾えるかどうかは未確認。
linux kernelは何もメッセージ出さないのかな。つまらん。
販社のサイト探したけど、ソースがどこにも見あたりません。
GPL! GPL!
ふと思いついてタクトスイッチ押しながらbootしたらU-Bootのプロンプトに入れた。
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < NetBSDまだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |


38400bps でコンソールとれた。
基板の5pinの真ん中がVcc、両端がGND、残りがTXD、RXD。MAX232使ったので、9-KEで拾えるかどうかは未確認。
U-Boot 1.1.4 (Nov 27 2007 - 09:29:18) U-Boot code: 00000000 -> 0001AF80 BSS: -> 0001FEF4 IRQ Stack: 00e6ff7c FIQ Stack: 00e6ef7c RAM Configuration: Bank #0: 00000000 32 MB Flash Manufacturer: ST Flash: 8 MB In: serial Out: serial Err: serial PLL clock at 250MHz CPU clock at 250MHz AHB clock at 125MHz APB clock at 62MHz ## Starting application at 0x0CF00000 ... Uncompressing Linux................................................................................................................... done, booting the kernel.
linux kernelは何もメッセージ出さないのかな。つまらん。
販社のサイト探したけど、ソースがどこにも見あたりません。
GPL! GPL!
ふと思いついてタクトスイッチ押しながらbootしたらU-Bootのプロンプトに入れた。
U-Boot 1.1.4 (Nov 27 2007 - 09:29:18) U-Boot code: 00000000 -> 0001AF80 BSS: -> 0001FEF4 IRQ Stack: 00e6ff7c FIQ Stack: 00e6ef7c RAM Configuration: Bank #0: 00000000 32 MB Flash Manufacturer: ST Flash: 8 MB In: serial Out: serial Err: serial PLL clock at 250MHz CPU clock at 250MHz AHB clock at 125MHz APB clock at 62MHz Star Equuleus # ? ? - alias for 'help' autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootm - boot application image from memory bootp - boot image via network using BootP/TFTP protocol cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation echo - echo args to console erase - erase FLASH memory firstboot- first boot the device for mass production flinfo - print FLASH memory information go - start application at address 'addr' help - print online help iminfo - print header information for application image imls - list all images found in flash itest - return true/false on integer compare loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loop - infinite loop on address range md - memory display mm - memory modify (auto-incrementing) mtest - simple RAM test mw - memory write (fill) nfs - boot image via network using NFS protocol nm - memory modify (constant address) pci - list and access PCI Configuration Space printenv- print environment variables protect - enable or disable FLASH write protection rarpboot- boot image via network using RARP/TFTP protocol reset - Perform RESET of the CPU run - run commands in an environment variable saveenv - save environment variables to persistent storage setenv - set environment variables sleep - delay execution for some time tftpboot- boot image via network using TFTP protocol version - print monitor version Star Equuleus # version U-Boot 1.1.4 (Nov 27 2007 - 09:29:18) Star Equuleus #
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < NetBSDまだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
2008-11-07 ssh-reuse-agent
ssh-reuse-agent
eval `ssh-reuse-agent`
ps して ssh-agent が見つからなかったら ssh-agent を立ち上げ、
既に起動されている ssh-agent が存在したら、そいつを捕みなおす。
似たようなのみんな作ってると思ったけどそうでもないのね。
eval `ssh-reuse-agent`
ps して ssh-agent が見つからなかったら ssh-agent を立ち上げ、
既に起動されている ssh-agent が存在したら、そいつを捕みなおす。
似たようなのみんな作ってると思ったけどそうでもないのね。
2008-07-29 gcscaudio と AC97 と ALC655
一応鳴るようになった。
しかし工人舎ノートに付いてる AC97 codec の ALC655 は、48kHz の FIXED_RATE って マ ジ デ ス カ…
aurateconvで44100Hzを48000Hzに変換して鳴らすという非エコ仕様。
ALC655のデータシートを見る限りどうしようもなさそうだなぁ。
だめか。
しかし工人舎ノートに付いてる AC97 codec の ALC655 は、48kHz の FIXED_RATE って マ ジ デ ス カ…
aurateconvで44100Hzを48000Hzに変換して鳴らすという非エコ仕様。
ALC655のデータシートを見る限りどうしようもなさそうだなぁ。
だめか。
2008-07-28 amd_geode.c
フイタ
8k alignとかでも同じことする気なんだろうか。
if(pAllocInfo->PhysicalAddress & 0x0000001F) { OS_DbgMsg("DMA Memory is not 32-byte aligned! : 0x%08X\n", pAllocInfo->PhysicalAddress); while (pAllocInfo->PhysicalAddress & 0x0000001F) { pAllocInfo->VirtualAddress++; pAllocInfo->PhysicalAddress++; } OS_DbgMsg("Fixed to: 0x%08X.\n", pAllocInfo->PhysicalAddress); }
8k alignとかでも同じことする気なんだろうか。
2008-07-28 NetBSD i386/pci/gcscaudio
NetBSD 4.99.70 (KOHJINSHA_AUDIO) #24: Mon Jul 28 04:10:21 JST 2008 ryo@moveq.execsw.org:/usr/src/sys/arch/i386/compile/KOHJINSHA_AUDIO total memory = 1007 MB avail memory = 982 MB timecounter: Timecounters tick every 10.000 msec timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100 KOHJINSHA Co.,Ltd SA Series (Rev 1.00) mainbus0 (root) cpu0 at mainbus0: AMD 586-class, 498MHz, id 0x5a2 : : gcscaudio0 at pci0 dev 15 function 3: AMD Geode CS5536 Audio gcscaudio0: interrupting at irq 5 gcscaudio0: ac97: Avance Logic ALC655 codec; no 3D stereo gcscaudio0: ac97: ext id 9c4<AC97_23,LDAC,SDAC,CDAC,SPDIF> audio0 at gcscaudio0: full duplex, independent :
レジスタまわりは終わり。あとはDMA。
雑音なら鳴るようになったので、もうちょっとだな。
2008-07-26 隅田川花火大会


人がマターリ2ch見てるとパンパンうるさいので(ぉ 玄関から適当に撮ってみた。
露出時間を長くするとシャッタータイミングにニュータイプ能力が必要。むずい。
写真は多数のゴミ写真の中から、うまく撮れた方二枚。無加工。
一枚目は5秒露出なので煙花の打ち上げ軌跡まで撮れてる。
2008-07-22 recvfromto, sendfromto.
仕事で使うので、NetBSD で IP_PKTINFO を使えるようにした。
そもそもこれはIPV6_PKTINFOを真似して、linuxに実装されたものなのかな。
何をするものかというと、UDP 送信時に src address を指定する方法である。
§
UDPの送受信に関しては、いろいろとめんどくさいことがよく起きる。
例えば昔のbindでよく問題になっていたのが、ある IP address に問い合わせたdns queryの返事が、
違う IP address から帰ってくる現象。
server が複数の IP address を持っている場合、普通に sendto(2) すると、
ルーティングに従って決定された出力ネットワークインターフェイスに付けられているアドレスが
src address に使われてしまうからだ。
これを回避するためには、INADDR_ANY で bind せずに、ネットワークインターフェイスに
付けられているアドレス毎にソケットを作り、bind しなければならない。
alias address が付いていた場合は、さらにそれぞれのアドレスで同じことをする。
これは、ネットワークインターフェイスやaliasが何十個もあるシステムだと、
socket を何十個も作らなければならないという悲惨なことが起きる。
さすがにこれはアホなので、BSD には IP_RECVDSTADDR というソケットオプションがあり、
INADDR_ANY で bind したソケットでも setsockopt IP_RECVDSTADDR することで、
パケット受信時に、送信先アドレスが拾えるようになる。
これには recvfrom(2) ではなく recvmsg(2) を使う。
送受信アドレスを取得できるということは、つまり recvfrom() ではなく、
recvfromto() が実現できるようになるということだ。
しかしこれでもまだ問題がある。受信時の送信先アドレスがわかったので、そのアドレスを src address にして相手に返事を返したくとも、
INADDR_ANY で bind された socket からだと送信元アドレスを選択することができないのである。
しょうがないので BSD では、返事を返す瞬間だけ socket を作って、送信元にしたいアドレスで bind して送ったりする。
やっぱりこれもアホなので、IPv6 では IPV6_PKTINFO というオプションがあり、
sendmsg(2) する時に送信元アドレスを指定できるようになっている。
つまり sendto(2) では不十分なので sendfromto() ができるように、ということだ。
これらは RFC3542 - Advanced Sockets Application Program Interface (API) for IPv6 で詳しく説明されている。
§
というわけで、冒頭のパッチは、IPv4 でも IPV6_PKTINFO のように送信元アドレスを指定できるようにするパッチである。
これで送信時も送信元アドレスが指定できるようになり、IPv4 でも sendfromto() 相当が実現できることになる。
これはLinuxには既に実装されている。が、Linux ではIPv4の受信時の送信先アドレスの取得方法がRFC2292(obsolete)
ベースの方法なのでなんだかちぐはぐである。
まとめ。
というわけで、recvfromto()、sendfromto() の実装例とサンプルプログラム。(参考: racoonのソース)
そもそもこれはIPV6_PKTINFOを真似して、linuxに実装されたものなのかな。
何をするものかというと、UDP 送信時に src address を指定する方法である。
§
UDPの送受信に関しては、いろいろとめんどくさいことがよく起きる。
例えば昔のbindでよく問題になっていたのが、ある IP address に問い合わせたdns queryの返事が、
違う IP address から帰ってくる現象。
server が複数の IP address を持っている場合、普通に sendto(2) すると、
ルーティングに従って決定された出力ネットワークインターフェイスに付けられているアドレスが
src address に使われてしまうからだ。
これを回避するためには、INADDR_ANY で bind せずに、ネットワークインターフェイスに
付けられているアドレス毎にソケットを作り、bind しなければならない。
alias address が付いていた場合は、さらにそれぞれのアドレスで同じことをする。
これは、ネットワークインターフェイスやaliasが何十個もあるシステムだと、
socket を何十個も作らなければならないという悲惨なことが起きる。
さすがにこれはアホなので、BSD には IP_RECVDSTADDR というソケットオプションがあり、
INADDR_ANY で bind したソケットでも setsockopt IP_RECVDSTADDR することで、
パケット受信時に、送信先アドレスが拾えるようになる。
これには recvfrom(2) ではなく recvmsg(2) を使う。
送受信アドレスを取得できるということは、つまり recvfrom() ではなく、
recvfromto() が実現できるようになるということだ。
しかしこれでもまだ問題がある。受信時の送信先アドレスがわかったので、そのアドレスを src address にして相手に返事を返したくとも、
INADDR_ANY で bind された socket からだと送信元アドレスを選択することができないのである。
しょうがないので BSD では、返事を返す瞬間だけ socket を作って、送信元にしたいアドレスで bind して送ったりする。
やっぱりこれもアホなので、IPv6 では IPV6_PKTINFO というオプションがあり、
sendmsg(2) する時に送信元アドレスを指定できるようになっている。
つまり sendto(2) では不十分なので sendfromto() ができるように、ということだ。
これらは RFC3542 - Advanced Sockets Application Program Interface (API) for IPv6 で詳しく説明されている。
§
というわけで、冒頭のパッチは、IPv4 でも IPV6_PKTINFO のように送信元アドレスを指定できるようにするパッチである。
これで送信時も送信元アドレスが指定できるようになり、IPv4 でも sendfromto() 相当が実現できることになる。
これはLinuxには既に実装されている。が、Linux ではIPv4の受信時の送信先アドレスの取得方法がRFC2292(obsolete)
ベースの方法なのでなんだかちぐはぐである。
まとめ。
受信時の送信先アドレス取得方法 | 送信時の送信元アドレス指定方法 | |
---|---|---|
IPv4 (*BSD) | setsockopt(IP_RECVDSTADDR) しておいてrecvmsg(2) | bind(2)のみ |
IPv4 (Linux) | setsockopt(IP_PKTINFO) しておいてrecvmsg(2) | IP_PKTINFOコントロールを指定して sendmsg(2) |
IPv6 (*BSD) | setsockopt(IPV6_RECVPKTINFO) しておいてrecvmsg(2) (RFC3542) | IPV6_PKTINFOコントロールを指定して sendmsg(2) |
IPv6 (Linux) | setsockopt(IPV6_RECVPKTINFO) しておいてrecvmsg(2) (RFC3542) | IPV6_PKTINFOコントロールを指定して sendmsg(2) |
IPv4 (NetBSD、パッチ適用後) | setsockopt(IP_RECVDSTADDR) しておいてrecvmsg(2) or setsockopt(IP_RECVPKTINFO) しておいてrecvmsg(2) or setsockopt(IP_PKTINFO) しておいてrecvmsg(2) (linux compatible API) | IP_PKTINFOコントロールを指定して sendmsg(2) |
というわけで、recvfromto()、sendfromto() の実装例とサンプルプログラム。(参考: racoonのソース)
2008-07-16 NSLU2
msaitoh氏が NSLU2 を個人輸入するというので、相乗りさせてもらった。
とりあえずnfsboot。
RedBoot> ip_address -l 172.31.185.7 -h 172.31.185.65 IP: 172.31.185.7/255.255.255.0, Gateway: 192.168.0.1 Default server: 172.31.185.65, DNS server IP: 0.0.0.0 RedBoot> load -r -b 0x200000 nslu2.bin Using default protocol (TFTP) Raw file loaded 0x00200000-0x004aabcb, assumed entry at 0x00200000 RedBoot> go [ Kernel symbol table missing! ] pmap_postinit: Allocated 9 static L1 descriptor tables Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 4.99.69 (NSLU2) #5: Wed Jul 16 08:20:01 JST 2008 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/NSLU2 total memory = 32768 KB avail memory = 27008 KB mainbus0 (root) cpu0 at mainbus0: IXP425 266MHz rev 1 (XScale core) cpu0: DC enabled IC enabled WB enabled LABT branch prediction enabled cpu0: 32KB/32B 32-way Instruction cache cpu0: 32KB/32B 32-way write-back-locking Data cache ixpsip0 at mainbus0 com0 at ixpsip0 addr 0xc8000000-0xc8000fff: ns16550a, working fifo com0: console ixp425_intr_establish(irq=15, ipl=3, func=c027d8a0, arg=c10bf400) ixpclk0 at ixpsip0 addr 0xc8005000-0xc800502f ixpclk0: IXP425 Interval Timer ixpdog0 at ixpsip0: Watchdog Timer slugiic0 at ixpsip0: I2C bus slugbutt0 at ixpsip0: Power and Reset buttons slugled0 at ixpsip0: LED support ixpio0 at mainbus0 ixpio0: configuring PCI bus pci0 at ixpio0 bus 0 ohci0 at pci0 dev 1 function 0: vendor 0x1033 product 0x0035 (rev. 0x43) ixp425_intr_establish(irq=28, ipl=1, func=c02851d8, arg=c1112000) ohci0: interrupting at INTA ohci0: OHCI version 1.0 usb0 at ohci0: USB revision 1.0 ohci1 at pci0 dev 1 function 1: vendor 0x1033 product 0x0035 (rev. 0x43) ixp425_intr_establish(irq=27, ipl=1, func=c02851d8, arg=c1113000) ohci1: interrupting at INTB ohci1: OHCI version 1.0 usb1 at ohci1: USB revision 1.0 ehci0 at pci0 dev 1 function 2: vendor 0x1033 product 0x00e0 (rev. 0x04) ixp425_intr_establish(irq=26, ipl=1, func=c0286178, arg=c10d7800) ehci0: interrupting at INTC ehci0: companion controllers, 3 ports each: ohci0 ohci1 usb2 at ehci0: USB revision 2.0 ixme0 at mainbus0: IXP4xx MicroEngine Support ixp425_intr_establish(irq=3, ipl=1, func=c03d99ac, arg=c10d9000) ixp425_intr_establish(irq=4, ipl=1, func=c03d99ac, arg=c10d9000) ixpnpe0 at ixme0 NPE-B ixp425_intr_establish(irq=1, ipl=1, func=c03db710, arg=c110c300) npe0 at ixpnpe0: Ethernet co-processor npe0: remember to fix rx q setup npe0: Ethernet address 00:04:5a:**:**:** rlphy0 at npe0 phy 1: RTL8201L 10/100 media interface, rev. 1 rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto clock: hz=100 stathz=0 profhz=0 ixp425_intr_establish(irq=5, ipl=2, func=c03d8bf0, arg=00000000) iic0 at slugiic0: I2C bus xrtc0 at iic0 addr 0x6f: Xicor X1226 Real-time Clock/NVRAM ixp425_intr_establish(irq=22, ipl=1, func=c03de804, arg=c110cc00) ixp425_intr_establish(irq=29, ipl=1, func=c03de798, arg=c110cc00) ixp425_intr_establish(irq=28, ipl=1, func=c03deb8c, arg=c10bf200) ixp425_intr_establish(irq=27, ipl=1, func=c03deae4, arg=c10bf200) ixp425_intr_establish(irq=26, ipl=1, func=c03dea3c, arg=c10bf200) ixp425_intr_establish(irq=5, ipl=2, func=c03de964, arg=00000000) uhub0 at usb1: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub1 at usb2: vendor 0x1033 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 uhub2 at usb0: vendor 0x1033 OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 boot device: <unknown> root device: npe0 dump device: file system (default generic): root on npe0 mountroot: trying ffs... mountroot: trying nfs... nfs_boot: trying DHCP/BOOTP nfs_boot: DHCP next-server: 0.0.0.0 nfs_boot: my_name=nslu2 nfs_boot: my_domain=ice.misakimix.org nfs_boot: my_addr=172.31.185.7 nfs_boot: my_mask=255.255.255.0 nfs_boot: gateway=172.31.185.65 root on 172.31.185.65:/src/boot/nslu2 root time: 0x487d8e2a root file system type: nfs init path (default /sbin/init): init: copying out path `/sbin/init' 11 /etc/rc.conf is not configured. Multiuser boot aborted. Enter pathname of shell or RETURN for /bin/sh: Terminal type? [unknown] Terminal type is unknown. We recommend creating a non-root account and using su(1) for root access. nslu2# uname -a NetBSD nslu2 4.99.69 NetBSD 4.99.69 (NSLU2) #5: Wed Jul 16 08:20:01 JST 2008 ryo@falsie:/src/cvs/NetBSD/sys/arch/evbarm/compile/NSLU2 evbarm
最初何も考えず evbarm/conf/NSLU2 で kernel 作ると ethernet が attach できなくて困る。
http://www.intel.com/design/network/products/npfamily/download_ixp400.htm から microcode を落として kernel とリンクさせなきゃいけないということ教えてもらってことなきを得る。
このへん参照のこと。
で、何に使うんですかコレ?
#どうでもいいけど 9-KE じゃシリアル取れなかった。MAX232でちゃんとしたケーブル作って以下略。
2008-07-06 source to dot w/graphviz
ありそうだけど見つからなかったので作ってみる。
-a を付けるとソースファイル内で完結しない呼び出しも表示。(グラフが大きくなりすぎるかも)
正規表現で関数宣言と関数参照を適当にparseしてるだけなので、Cじゃなくても使えちゃうかも。
上記理由によりマクロ定義は宣言と見なされず、引数付きマクロは関数呼び出しと見なされる。
perl5.8 の Recursive Patterns を使ってるのでperlのバージョンに依存している。
require 5.10; して perl5.10 のちゃんとした Recursive Patterns を使ったほうがいいかな。
dot -Tpng とかやれば画像でも出力できるけど、レンダリングに超時間かかるのと、
表示も大変なのでなんだかんだで pdf が一番扱いやすいかなぁ。
しかし参考にしたこの記事は秀逸だ。http://www.ibm.com/developerworks/jp/linux/library/l-graphvis/index.html call回数を線の太さや色で表すともっといいかも。
gprof2dot も簡単に作れそうなのでそのうち作ろう。

usage: source2dot [-a] prog1.c [prog2.c [...]] source2dot -a /usr/src/bin/cat/cat.c | dot -Tpdf > cat_a.pdf source2dot /usr/src/lib/libc/regex/*.c | dot -Tpdf > regexp.pdf source2dot /usr/src/usr.bin/gzip/*.c | neato -Tpdf > gzip.pdf source2dot -a /usr/src/lib/libc/regex/*.c | dot -Tpdf > regexp_a.pdf source2dot -a /usr/src/usr.bin/gzip/*.c | neato -Tpdf > gzip_a.pdf
-a を付けるとソースファイル内で完結しない呼び出しも表示。(グラフが大きくなりすぎるかも)
正規表現で関数宣言と関数参照を適当にparseしてるだけなので、Cじゃなくても使えちゃうかも。
上記理由によりマクロ定義は宣言と見なされず、引数付きマクロは関数呼び出しと見なされる。
perl5.8 の Recursive Patterns を使ってるのでperlのバージョンに依存している。
require 5.10; して perl5.10 のちゃんとした Recursive Patterns を使ったほうがいいかな。
dot -Tpng とかやれば画像でも出力できるけど、レンダリングに超時間かかるのと、
表示も大変なのでなんだかんだで pdf が一番扱いやすいかなぁ。
しかし参考にしたこの記事は秀逸だ。http://www.ibm.com/developerworks/jp/linux/library/l-graphvis/index.html call回数を線の太さや色で表すともっといいかも。
gprof2dot も簡単に作れそうなのでそのうち作ろう。
2008-06-06 apache LogFormat in JSON
LogFormat "{\ \"date\":\"%{%Y-%m-%dT%H%M%S%z}t\",\ \"REMOTE_HOST\":\"%h\",\ \"REMOTE_ADDR\":\"%a\",\ \"REQUEST_METHOD\":\"%m\",\ \"SERVER_NAME\":\"%v\",\ \"REQUEST_URI\":\"%U\",\ \"PROTOCOL\":\"%H\",\ \"QUERY_STRING\":\"%q\",\ \"HTTP_SIZE\":\"%B\",\ \"HTTP_RESPONSE_TIME\":\"%T\",\ \"HTTP_REQUEST\":\"%r\",\ \"HTTP_STATUS\":\"%s\",\ \"HTTP_USER_AGENT\":\"%{User-Agent}i\",\ \"HTTP_REFERER\":\"%{Referer}i\",\ \"HTTP_PRAGMA\":\"%{Pragma}i\",\ \"HTTP_ACCEPT\":\"%{Accept}i\",\ \"HTTP_ACCEPT_LANGUAGE\":\"%{Accept-Language}i\",\ \"HTTP_ACCEPT_CHARSET\":\"%{Accept-Charset}i\",\ \"HTTP_ACCEPT_ENCODING\":\"%{Accept-Encoding}i\",\ \"HTTP_FORWARDED\":\"%{Forwarded}i\",\ \"HTTP_X_FORWARDED_FOR\":\"%{X-Forwarded-For}i\",\ \"HTTP_VIA\":\"%{Via}i\"\ }" jslog
むふー。これで apache のログを JSON で var apachelog = eval("([" + log + "])"); できる。
2008-04-27 cofilint#2
やっぱり arch/evbm68k を作って、m68k と coldfire (または m68k と m68k/coldfire) を使い分けるほうがしっくりくるなぁ。
というわけで今のうちに切り修し。
・src/sys/arch/evbm68k/include に必要なファイルを作る(8〜9割が別のm68k系archからのコピーでok)
・arc/sys/arch/m68k/coldfire
・src/build.sh に arch を足す
・src/tools/headerlist に arch を足す
というわけで今のうちに切り修し。
・src/sys/arch/evbm68k/include に必要なファイルを作る(8〜9割が別のm68k系archからのコピーでok)
・arc/sys/arch/m68k/coldfire
・src/build.sh に arch を足す
・src/tools/headerlist に arch を足す
2008-04-20 cofilint
http://cofilint.profire.co.jp/ が届いたので繋げていじってみる。
既に ucLinux が flash に焼かれている。電源入れたらVGAまで出た。結構どうでもいい :P
つーかこの linux って nommu なんですか? よくわかりません><
シリアルつなげるとBIOSいじれて、ここからtftpbootやらなんやらできるようになっている。
しかし0x00000000番地にロードすると死ぬよ…
付属のlinuxも0x1000にロードするようになってるようなので、きっと0x00000000番地にロードは無理なんだろう。
NetBSD/amigaやx68kは0番地にロードしてるんだけど、netbsd/cesficみたいに TEXTADDR≠0 にしないとだめぽだなぁ。
ColdFire MCF5475 の serial は 68681 互換…なのだが NetBSD でも 68681 は MI になってない。
amiga とかの MD 部分にはあるみたいだけど。
既に誰かがやってる気もするけど、とりあえずserialで文字出せるようにしよう。
既に ucLinux が flash に焼かれている。電源入れたらVGAまで出た。結構どうでもいい :P
つーかこの linux って nommu なんですか? よくわかりません><
シリアルつなげるとBIOSいじれて、ここからtftpbootやらなんやらできるようになっている。
しかし0x00000000番地にロードすると死ぬよ…
付属のlinuxも0x1000にロードするようになってるようなので、きっと0x00000000番地にロードは無理なんだろう。
NetBSD/amigaやx68kは0番地にロードしてるんだけど、netbsd/cesficみたいに TEXTADDR≠0 にしないとだめぽだなぁ。
ColdFire MCF5475 の serial は 68681 互換…なのだが NetBSD でも 68681 は MI になってない。
amiga とかの MD 部分にはあるみたいだけど。
既に誰かがやってる気もするけど、とりあえずserialで文字出せるようにしよう。
2008-03-30 queue
2008-03-25 stdio like mbuf utils
書いてみた。とりあえずreadのみ。writeはM_EXTがめんどっちいな…
mbf.h mbf_subr.c
むふー。
m_pullupよさらば。
mbf.h mbf_subr.c
struct mbf h; struct in_addr src, dst; uint16_t id; mbf_open(&h, m); mbf_seek(&h, offsetof(struct ip, ip_id), 0); id = mbf_read_2(&h); mbf_seek(&h, offsetof(struct ip, ip_src), 0); src.s_addr = mbf_read_4(&h); dst.s_addr = mbf_read_4(&h); mbf_close(&h);
むふー。
m_pullupよさらば。
2008-03-21 raidframeチューニング#3
ディスク遅杉ということで、いろいろ調べてみる。
raid0.conf は
となっている。キモなのはおそらく START layout の所の 16 である。
HDDは5ヶ、raid5なので、そのうちstripe毎にラウンドロビンでどれか1つがパリティ。
実質4台で1stripeを構成することになる。sector per stripe unit が 16 なので、
HDD1台が16sector*512byte=8kbyteのブロックに分かれ、これが4+1台分で32(+8)kbyte=1stripeとなる。
32kbyte未満でread/writeするとパリティ計算で余計なread/writeが増えるため、newfs -b 32768 等とすれば効率も問題なし…のはずなのだが、なぜか激遅。
同じような構成の別のマシン(こっちはdisk9玉)では、問題なく80Mbyte/secくらい出てるので、NetBSDのraidframeがタコというわけでもない。
なーぜーだーーーーー
sector per stripe unitやらnewfsのブロックサイズやらのパラメータを色々々々々々々々々々いじってみると、10M〜20Mbyte/secまで改善するものの、これでも遅い。
raidframeのソース読んだりパラメータ替えたりraidframe -Iしたりraidframe -Pしたりするが、結局改善せず、原因もわからないまま。うーん…
§ § §
ある日なんとなく思いついて、gptで定義したパーティション開始セクタを64にしてみと、劇的に改善。90Mbyte/secとか出ますよ。やったー。
つまりこういうことだ。
こんな風にアクセスされる訳だが、gpt で定義したパーティションは
であり、/dev/dk0 は
となっていて、raid の 34セクタ目から始まる。
dk0 に対して newfs -b 32768 すると、dk0 に対して 32768バイト(=64sector)毎にread/writeするものの、
あくまでそれは dk0 に対してであり、dk0 の開始セクタが34である以上、アクセスパターンは
となってしまっていたのだ。34〜97なんてブロックでread/writeされると、当然raidのストライプ2つ分をまたぐため、read/writeが二倍になり、劇的に遅くなっていた。
つまり gpt のパーティションを
のように64セクタ(raidのstripe size)から開始するようにすれば、ファイルシステムのアクセスがstripe単位で行われるようになって、万事解決ウマー
これでやっとデータ移行作業に移れる…
raid0.conf は
START array 1 5 0 START disks /dev/wd0a /dev/wd1a /dev/wd2a /dev/wd3a /dev/wd4a START layout # sectPerSU SUsPerParityUnit SUsPerReconUnit RAID_level 16 1 1 5 START queue fifo 100
となっている。キモなのはおそらく START layout の所の 16 である。
HDDは5ヶ、raid5なので、そのうちstripe毎にラウンドロビンでどれか1つがパリティ。
実質4台で1stripeを構成することになる。sector per stripe unit が 16 なので、
HDD1台が16sector*512byte=8kbyteのブロックに分かれ、これが4+1台分で32(+8)kbyte=1stripeとなる。
32kbyte未満でread/writeするとパリティ計算で余計なread/writeが増えるため、newfs -b 32768 等とすれば効率も問題なし…のはずなのだが、なぜか激遅。
同じような構成の別のマシン(こっちはdisk9玉)では、問題なく80Mbyte/secくらい出てるので、NetBSDのraidframeがタコというわけでもない。
なーぜーだーーーーー
sector per stripe unitやらnewfsのブロックサイズやらのパラメータを色々々々々々々々々々いじってみると、10M〜20Mbyte/secまで改善するものの、これでも遅い。
raidframeのソース読んだりパラメータ替えたりraidframe -Iしたりraidframe -Pしたりするが、結局改善せず、原因もわからないまま。うーん…
§ § §
ある日なんとなく思いついて、gptで定義したパーティション開始セクタを64にしてみと、劇的に改善。90Mbyte/secとか出ますよ。やったー。
つまりこういうことだ。
raid0 wd0 wd1 wd2 wd3 wd4 0〜 63 → 0〜15 0〜15 0〜15 0〜15 0〜15 64〜127 → 16〜31 16〜31 16〜31 16〜31 16〜31 128〜191 → 32〜47 32〜47 32〜47 32〜47 32〜47 : → : : : : :
こんな風にアクセスされる訳だが、gpt で定義したパーティションは
# gpt show raid0 start size index contents 0 1 PMBR 1 1 Pri GPT header 2 32 Pri GPT table 34 7814100093 1 GPT part - NetBSD UFS/UFS2 7814100127 32 Sec GPT table 7814100159 1 Sec GPT header
であり、/dev/dk0 は
# dkctl /dev/rraid0d addwedge dk0 34 7814100093 ffs
となっていて、raid の 34セクタ目から始まる。
dk0 に対して newfs -b 32768 すると、dk0 に対して 32768バイト(=64sector)毎にread/writeするものの、
あくまでそれは dk0 に対してであり、dk0 の開始セクタが34である以上、アクセスパターンは
dk0 raid0 wd0 wd1 wd2 wd3 wd4 0〜 63 → 34〜 97 → 0〜15/16〜31 0〜15/16〜31 0〜15/16〜31 0〜15/16〜31 0〜15/16〜31 64〜127 → 98〜161 → 16〜31/32〜47 16〜31/32〜47 16〜31/32〜47 16〜31/32〜47 16〜31/32〜47 128〜191 → 162〜225 → 32〜47/48〜63 32〜47/48〜63 32〜47/48〜63 32〜47/48〜63 32〜47/48〜63 : → : : : : : :
となってしまっていたのだ。34〜97なんてブロックでread/writeされると、当然raidのストライプ2つ分をまたぐため、read/writeが二倍になり、劇的に遅くなっていた。
つまり gpt のパーティションを
# gpt add -b 64 -s 7814100063 raid0 # gpt show raid0 start size index contents 0 1 PMBR 1 1 Pri GPT header 2 32 Pri GPT table 34 30 64 7814100063 1 GPT part - NetBSD UFS/UFS2 7814100127 32 Sec GPT table 7814100159 1 Sec GPT header
のように64セクタ(raidのstripe size)から開始するようにすれば、ファイルシステムのアクセスがstripe単位で行われるようになって、万事解決ウマー
これでやっとデータ移行作業に移れる…
2008-03-20 raidframeチューニング#2
dkctl で 4T の raid5 を作って mount したはいいが、使ってると kernel ごと刺さる。
↓
割り込みの高い所で刺さってるらしく、キーボードでは ddb に落ちれない。
↓
シリアルコンソール継いで、刺さった所で ddb に落とすと、spinlock でぐるぐる回っていた。
↓
kernel option に LOCKDEBUG つけると、今度は別な個所で ddb に落ちやがる。こっちは別の問題だったんで修正したが、それでもやっぱり raid は動かない。
↓
切り分けてみると、raid5 のサイズが2T以上(?)で、なおかつMULTIPROCESSOR の時だけ起こるようだ。raid0 だと平気。謎。
↓
なんかSMPの深い所が原因ぽいが、SMPのlockまわりなんてぜんぜんわからない。
↓
このマシンは Xen の dom0 にする予定なんで、kernel は single processor 構成で問題ないので放置。(multiprocessorは各domUに割当てる)
結論:current のバグだろうということで放置。kernel option から MULTIPROCESSOR を外して使うことにする。
さて、MULTIPROCESSOR でさえなければ、raid5 は 2T over でもとても安定しているのだが、今度は別の問題が…。
dd で計ってみると、4Mbyte/sec くらいしか出ない。何これ? 遅杉。
↓
割り込みの高い所で刺さってるらしく、キーボードでは ddb に落ちれない。
↓
シリアルコンソール継いで、刺さった所で ddb に落とすと、spinlock でぐるぐる回っていた。
↓
kernel option に LOCKDEBUG つけると、今度は別な個所で ddb に落ちやがる。こっちは別の問題だったんで修正したが、それでもやっぱり raid は動かない。
↓
切り分けてみると、raid5 のサイズが2T以上(?)で、なおかつMULTIPROCESSOR の時だけ起こるようだ。raid0 だと平気。謎。
↓
なんかSMPの深い所が原因ぽいが、SMPのlockまわりなんてぜんぜんわからない。
↓
このマシンは Xen の dom0 にする予定なんで、kernel は single processor 構成で問題ないので放置。(multiprocessorは各domUに割当てる)
結論:current のバグだろうということで放置。kernel option から MULTIPROCESSOR を外して使うことにする。
さて、MULTIPROCESSOR でさえなければ、raid5 は 2T over でもとても安定しているのだが、今度は別の問題が…。
dd で計ってみると、4Mbyte/sec くらいしか出ない。何これ? 遅杉。
2008-03-20 raidframeチューニング
1T×5を買ってきてNetBSDのraidframeでRAID5を組んだはいいが、いろいろハマってしまった。
列挙すると、
といったところ。順に解決していこう。
2T overのdiskはそもそもdisklabelでは管理できないので、別の仕組みが必要。
diskまるごと使うので newfs /dev/rraid0d (whole disk) とすればいい気もするが、そもそも disk type 等の情報が保存できないので、これもできない。
こういう時NetBSDでは gpt と wedge を使う。
gpt で disklabel 以外の方法でパーティション情報を定義してやる。gpt(GUID)についてはこのへん参照 。
NetBSD では、
とすれば確保できる。gpt add で全領域をデフォルトでfilesystemとして確保される。
gpt show の結果は、34セクタ目から7814100093セクタ分がNetBSD用に確保されていることを示している。
(最初と最後にGPT headerがあるのはバックアップらしい)
gpt add しただけだと「GUIDパーティション情報をディスクに書いただけ」なのでまだ使えない。
このパーティション情報とブロックデバイスを紐付けるのが、dk (wedge) である。
とすることで、「rraid0d の 34 セクタから 7814100093 セクタ分を、dk0 (/dev/dk0) に割当てる」ことができる。
ちゃんと disk type 情報等も保持してくれるので、newfs もできるようになる。あとは
で、2T overなディスクでも問題なく使用可能となる。
gptパーティション情報は、disk を attach する時に自動的に見てくれて、一度でも addwedge されていれば disk attach 時に自動的に addwedge してくれる。
ので、一度 gpt を作って addwedge しておけば、次回起動時は手動で dkctl する必要な無い。
逆に、自動的に addwedge されるので、gpt を作りなおしたりする場合は delwedge 忘れ (dkctl /dev/rraid0d delwedge dk0) に注意。
次こそチューニング…
列挙すると、
- 1T*5で4Tのraid5にしたが、そもそも 2T overの時点でdisklabelが書けない。disklabelの総セクタ数は32bitなのです。(512byte/sectorだと、2T=0xFFFFFFFFセクタ)
- NetBSD-current で MULTIPROCESSOR で raid5 を使うと panic (たぶんcurrentのバグ)
- 異様に遅い
といったところ。順に解決していこう。
2T overのdiskはそもそもdisklabelでは管理できないので、別の仕組みが必要。
diskまるごと使うので newfs /dev/rraid0d (whole disk) とすればいい気もするが、そもそも disk type 等の情報が保存できないので、これもできない。
こういう時NetBSDでは gpt と wedge を使う。
gpt で disklabel 以外の方法でパーティション情報を定義してやる。gpt(GUID)についてはこのへん参照 。
NetBSD では、
# gpt create raid0 # gpt add raid0 # gpt show raid0 start size index contents 0 1 PMBR 1 1 Pri GPT header 2 32 Pri GPT table 34 7814100093 1 GPT part - NetBSD UFS/UFS2 7814100127 32 Sec GPT table 7814100159 1 Sec GPT header
とすれば確保できる。gpt add で全領域をデフォルトでfilesystemとして確保される。
gpt show の結果は、34セクタ目から7814100093セクタ分がNetBSD用に確保されていることを示している。
(最初と最後にGPT headerがあるのはバックアップらしい)
gpt add しただけだと「GUIDパーティション情報をディスクに書いただけ」なのでまだ使えない。
このパーティション情報とブロックデバイスを紐付けるのが、dk (wedge) である。
# dkctl /dev/rraid0d addwedge dk0 34 7814100093 ffs
とすることで、「rraid0d の 34 セクタから 7814100093 セクタ分を、dk0 (/dev/dk0) に割当てる」ことができる。
ちゃんと disk type 情報等も保持してくれるので、newfs もできるようになる。あとは
# newfs /dev/rdk0 # mount /dev/dk0 /mnt
で、2T overなディスクでも問題なく使用可能となる。
gptパーティション情報は、disk を attach する時に自動的に見てくれて、一度でも addwedge されていれば disk attach 時に自動的に addwedge してくれる。
ので、一度 gpt を作って addwedge しておけば、次回起動時は手動で dkctl する必要な無い。
逆に、自動的に addwedge されるので、gpt を作りなおしたりする場合は delwedge 忘れ (dkctl /dev/rraid0d delwedge dk0) に注意。
次こそチューニング…
2008-02-25 umsとタッチパネル
SA5SX04A のタッチパネルは普通にUSB Mouseに見えるのだが、NetBSDでは(ソース見た限りその他の*BSDでも)attachでコケる。
どうでもいいが、ums_match() は成功するのに ums_attach() で弾くのはどう考えてもバグだろう。
少くともmatchで弾くようにしないと、uhidにfallbackしてくれない…
kernel config から ums* を削って uhid* で認識させて usbhidctl するとこんな感じ。
Xorgを動かすが、タッチパネル無反応(想定外)
↓
Xorgのwsmouse対応は、絶対座標に対応してないことが判明
↓
Xorgを修正 ↓
動イター。でも座標ずれまくりんぐ(想定の範囲内)
↓
umsにtpcalibを入れる ↓
動イター(いまここ)
uhidev0 at uhub2 port 1 configuration 1 interface 0 uhidev0: DIALOGUE INC PenMount USB, rev 1.00/a4.b4, addr 3, iclass 3/1 ums0 at uhidev0 ums0: X report 0x0002 not supported相対座標マウスしかサポートしてないからのようだ。タッチパネルなので絶対座標が返る(HIO_RELATIVEが付かない)。
どうでもいいが、ums_match() は成功するのに ums_attach() で弾くのはどう考えてもバグだろう。
少くともmatchで弾くようにしないと、uhidにfallbackしてくれない…
kernel config から ums* を削って uhid* で認識させて usbhidctl するとこんな感じ。
# usbhidctl -f 0 -v -r Report descriptor: Input size=6 count=1 Const page=Digitizer usage=Touch_Screen, logical range 0..63 Collection page=Generic_Desktop usage=Mouse Collection page=0x0000 usage=0x0000 Input size=1 count=1 page=Button usage=Button_1, logical range 0..1 Input size=1 count=1 page=Button usage=Button_2, logical range 0..1 Input size=16 count=1 page=Generic_Desktop usage=X, logical range 0..1023, physical range 0..32767 Input size=16 count=1 page=Generic_Desktop usage=Y, logical range 0..1023, physical range 0..32767 Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767 Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767 Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767 Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767 Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767 End collection End collection Total input size 5 bytes Total output size 0 bytes Total feature size 5 bytesusage=0x00ffって何だろうとか思いつつ放置して、umsをタッチパネルに対応させる ↓
Xorgを動かすが、タッチパネル無反応(想定外)
↓
Xorgのwsmouse対応は、絶対座標に対応してないことが判明
↓
Xorgを修正 ↓
動イター。でも座標ずれまくりんぐ(想定の範囲内)
↓
umsにtpcalibを入れる ↓
動イター(いまここ)
2008-02-22 SA5SX04AのHDD
fdiskでシアトル系OSを完全に消したつもりだったが、
fdiskでも見えない場所にリカバリ領域があったようだ…というかinquiryの容量から変えられるのかよ!
4Gを回収。pxeブートさせてtarでバックアップとった後、Hitachi Feature Toolで容量リセット。トータル40Gに。
再びpxeブートして fdisk && disklabel 切り直して、tar で展開して installboot して何事も無く復帰。
そういやOS代も返して欲しいんだけど無理かなぁ。
fdiskでも見えない場所にリカバリ領域があったようだ…というかinquiryの容量から変えられるのかよ!
4Gを回収。pxeブートさせてtarでバックアップとった後、Hitachi Feature Toolで容量リセット。トータル40Gに。
再びpxeブートして fdisk && disklabel 切り直して、tar で展開して installboot して何事も無く復帰。
そういやOS代も返して欲しいんだけど無理かなぁ。
2008-02-21 Geode LX の MSR レジスタ
MSRレジスタが読み書きできるようになると、必然的に CrystalCPUIDがやっているのと同じようにGeodeLXのクロック倍率の動的変更ができるようになる。
というわけで、/dev/cpu/msrをopenして0x4c000014にlseekして07de0000:0000049eを書くと、拍子抜けする程あっさりとクロックアップできた。
ふだんは通常よりクロックを下げておいて、loadavgが上がるとクロックを上げるようにしよう。
というわけで、/dev/cpu/msrをopenして0x4c000014にlseekして07de0000:0000049eを書くと、拍子抜けする程あっさりとクロックアップできた。
ふだんは通常よりクロックを下げておいて、loadavgが上がるとクロックを上げるようにしよう。
2008-02-20 Xorg 1024x600 on SA5SX04A
ひきつづき XorgのAMDドライバを動かすべく修正。こいつはx86のMSRレジスタの読み書きを必要とする。
linuxでは /dev/cpu/0/msr とかで userland から簡単に MSR レジスタを read/write できるのだが、NetBSDにはそんなの無いょ…
でも sys/arch/i386/cpufunc.S には rdmsr() と wrmsr() なる関数があるので、こいつを使えば問題なし! というわけで、あとはインターフェイスの問題。
おそらくちゃんと(NetBSDっぽく)実装するには、sysarch(2) を使って sysarch(X86_GET_MSR,...) みたいに作るのが正解なのだろうが、試しにやってみるだけなのと、read/write用の関数作るのがめんどくさかったので sys/arch/i386/i386/mem.c に minor番号の違うデバイスを作ってやることにした。
(この方法だと xf86-video-amd-2.7.7.6/src/amd_msr.c をほとんど変更せずに済むし…)
適当なマイナー番号を定義して、そいつにアクセスすると rdmsr()/wrmsr() するコードを追加。mknod /dev/cpu/msr c 2 13 して、/dev/cpu/msr で MSR レジスタをちゃんと読み書きできていることを確認しつつ、Xorg 起動…失敗。ううむ。
MSR読み書きの所は進むようになったが、その先で止まってしまった。
色々試してみたら、1024x768 にするとチラつきながらも画面が表示されるので、どうも設定している周波数の問題っぽい。グーグル先生と相談しつつ、Kohjinsha SA1F00 Users groupを見たら Xorg の 1024x600 用の ModeLine があったので、コピペして起動。おー1024x600が表示されたー。
というわけで、良い子は真似してはいけないquick hackと、xorg.conf。
xf86-video-amd-2.7.7.6/src/amd_msr.c は /dev/cpu/0/msr を /dev/cpu/msr にして lseek64 を lseek にすればいいだけなので省略。(z4l.cはmakeする必要なし)
そのうちちゃんと sysarch(2) を使うように書き直そう。
linuxでは /dev/cpu/0/msr とかで userland から簡単に MSR レジスタを read/write できるのだが、NetBSDにはそんなの無いょ…
でも sys/arch/i386/cpufunc.S には rdmsr() と wrmsr() なる関数があるので、こいつを使えば問題なし! というわけで、あとはインターフェイスの問題。
おそらくちゃんと(NetBSDっぽく)実装するには、sysarch(2) を使って sysarch(X86_GET_MSR,...) みたいに作るのが正解なのだろうが、試しにやってみるだけなのと、read/write用の関数作るのがめんどくさかったので sys/arch/i386/i386/mem.c に minor番号の違うデバイスを作ってやることにした。
(この方法だと xf86-video-amd-2.7.7.6/src/amd_msr.c をほとんど変更せずに済むし…)
適当なマイナー番号を定義して、そいつにアクセスすると rdmsr()/wrmsr() するコードを追加。mknod /dev/cpu/msr c 2 13 して、/dev/cpu/msr で MSR レジスタをちゃんと読み書きできていることを確認しつつ、Xorg 起動…失敗。ううむ。
MSR読み書きの所は進むようになったが、その先で止まってしまった。
色々試してみたら、1024x768 にするとチラつきながらも画面が表示されるので、どうも設定している周波数の問題っぽい。グーグル先生と相談しつつ、Kohjinsha SA1F00 Users groupを見たら Xorg の 1024x600 用の ModeLine があったので、コピペして起動。おー1024x600が表示されたー。
というわけで、良い子は真似してはいけないquick hackと、xorg.conf。
xf86-video-amd-2.7.7.6/src/amd_msr.c は /dev/cpu/0/msr を /dev/cpu/msr にして lseek64 を lseek にすればいいだけなので省略。(z4l.cはmakeする必要なし)
そのうちちゃんと sysarch(2) を使うように書き直そう。
2008-02-18 SA5SX04A
pxeブートでNetBSDを起動させつつ環境構築。
/etc/mk.conf に X11_TYPE=modular を追加して、
pkgsrc/x11/modular-xorg-serverでmake。dependencyが沢山あって遅いよ…
んで、XorgのAMD geode用のドライバを入れようとしたが、linuxべったりのソースなのでNetBSDでmakeできねえ。
めんどくさそうなので修正はあとまわしにして、とりあえずvesaドライバで動かしてみる。が、今度はXorgが
で止まってしまう。うぐぅ…
ググってみると、vesabiosのためのx86エミュ部分が、CPUID命令に対応してないせいのようだ。
パッチも一緒にあったのであてると動いた。
SA5SX04Aの液晶は1024x600が表示可能なのだが、vesaはモードが固定なので800x600か1024x768にしかできない。
しょうがないので1024x768で使う。縦に縮小されるのでピクセルがボケるけど、贅沢を言わなければ使える。早いところamdドライバを動かそう…
suspendまわりがあやしいけど、常用できそうなので、HDDのWindowsXPはさっくりと消してNetBSDで上書き。
あと動かさなければならないのは、
くらいかな。
ACPIを有効にするとなぜかキーボード入力ができなくなる原因も調べないと。
/etc/mk.conf に X11_TYPE=modular を追加して、
pkgsrc/x11/modular-xorg-serverでmake。dependencyが沢山あって遅いよ…
んで、XorgのAMD geode用のドライバを入れようとしたが、linuxべったりのソースなのでNetBSDでmakeできねえ。
めんどくさそうなので修正はあとまわしにして、とりあえずvesaドライバで動かしてみる。が、今度はXorgが
c000:0282: A2 ILLEGAL EXTENDED X86 OPCODE!
で止まってしまう。うぐぅ…
ググってみると、vesabiosのためのx86エミュ部分が、CPUID命令に対応してないせいのようだ。
パッチも一緒にあったのであてると動いた。
SA5SX04Aの液晶は1024x600が表示可能なのだが、vesaはモードが固定なので800x600か1024x768にしかできない。
しょうがないので1024x768で使う。縦に縮小されるのでピクセルがボケるけど、贅沢を言わなければ使える。早いところamdドライバを動かそう…
suspendまわりがあやしいけど、常用できそうなので、HDDのWindowsXPはさっくりと消してNetBSDで上書き。
あと動かさなければならないのは、
・Xorg xf86-video-amd を NetBSD で動かす ・無線LANをなんとかする。(usbの先に付いているRalink RT73) Linuxはソースがある? ・タッチパネル (uhidevに見える。linuxで動いてるっぽいので簡単?) ・SD/MMC (OpenBSDでは動いてるっぽいのでもってくればok。使わない気もするけど)
くらいかな。
ACPIを有効にするとなぜかキーボード入力ができなくなる原因も調べないと。
The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 4.99.54 (SA5SX04A) #36: Sun Feb 17 00:48:12 JST 2008 ryo@msr:/usr/src/sys/arch/i386/compile/SA5SX04A total memory = 499 MB avail memory = 483 MB timecounter: Timecounters tick every 10.000 msec timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100 KOHJINSHA Co.,Ltd SA Series (Rev 1.00) mainbus0 (root) cpu0 at mainbus0: (uniprocessor) cpu0: AMD Geode LX (586-class), 498.07 MHz, id 0x5a2 cpu0: features 88a93d<FPU,DE,PSE,TSC,MSR,CX8,SEP> cpu0: features 88a93d<PGE,CMOV,MPC,MMX> cpu0: "Geode(TM) Integrated Processor by AMD PCS" cpu0: I-cache 64 KB 32B/line 16-way, D-cache 64 KB 32B/line 16-way cpu0: L2 cache 128 KB 32B/line 4-way cpu0: ITLB 16 4 KB entries fully associative cpu0: DTLB 16 4 KB entries fully associative cpu0: Initial APIC ID 0 cpu0: 8 page colors vesabios0 at mainbus0: version 2.0, Elpin Systems VGA BIOS GEODE LX vesafb0 at vesabios0: VESA frame buffer vesafb0: fb 800x600x16 @0x50000000 vesafb0: 937 Kb memory reported, 1 screens possible vesafb0: one screen, so hardware scrolling not possible vesafb0: VBE/PM 1.0 wsdisplay0 at vesafb0 kbdmux 1: console (fb, vt100 emulation) wsmux1: connecting to wsdisplay0 pci0 at mainbus0 bus 0: configuration mode 1 pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok pchb0 at pci0 dev 1 function 0 pchb0: Advanced Micro Devices Geode LX Host-PCI Bridge (rev. 0x31) Advanced Micro Devices Geode LX VGA Controller (VGA display) at pci0 dev 1 function 1 not configured glxsb0 at pci0 dev 1 function 2: RNG AES cbb0 at pci0 dev 12 function 0: Texas Instruments product 0x8039 (rev. 0x00) Texas Instruments product 0x803b (miscellaneous mass storage) at pci0 dev 12 function 2 not configured Texas Instruments product 0x803c (SD Host Controller system) at pci0 dev 12 function 3 not configured rtk0 at pci0 dev 13 function 0: Realtek 8139 10/100BaseTX (rev. 0x10) rtk0: interrupting at irq 5 rtk0: Ethernet address ##:##:##:##:##:## rlphy0 at rtk0 phy 7: Realtek internal PHY rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gcscpcib0 at pci0 dev 15 function 0 gcscpcib0: Advanced Micro Devices CS5536 PCI-ISA Bridge (rev. 0x03) timecounter: Timecounter "gcscpcib0" frequency 3579545 Hz quality 1000 gcscpcib0: can't alloc an MFGPT for WDT , GPIO gpio0 at gcscpcib0: 32 pins viaide0 at pci0 dev 15 function 2 viaide0: Advanced Micro Devices CS5536 IDE Controller (rev. 0x01) viaide0: bus-master DMA support present viaide0: primary channel wired to compatibility mode viaide0: primary channel interrupting at irq 14 atabus0 at viaide0 channel 0 viaide0: secondary channel wired to compatibility mode viaide0: secondary channel ignored (disabled) Advanced Micro Devices CS5536 Audio (audio multimedia, revision 0x01) at pci0 dev 15 function 3 not configured ohci0 at pci0 dev 15 function 4: Advanced Micro Devices CS5536 OHCI USB Controller (rev. 0x02) ohci0: interrupting at irq 10 ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 uhub0 at usb0 uhub0: Advanced Micro OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub0: 4 ports with 4 removable, self powered gcscehci0 at pci0 dev 15 function 5: Advanced Micro Devices CS5536 EHCI USB Controller (rev. 0x02) gcscehci0: interrupting at irq 10 gcscehci0: EHCI version 1.0 gcscehci0: companion controller, 4 ports each: ohci0 usb1 at gcscehci0: USB revision 2.0 uhub1 at usb1 uhub1: Advanced Micro Devices EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 uhub1: 4 ports with 4 removable, self powered cbb0: cacheline 0x0 lattimer 0x10 cbb0: bhlc 0x821000 cbb0: interrupting at irq 3 cardslot0 at cbb0 slot 0 flags 0 cardbus0 at cardslot0: bus 1 pcmcia0 at cardslot0 isa0 at gcscpcib0 pckbc0 at isa0 port 0x60-0x64 pckbd0 at pckbc0 (kbd slot) pckbc0: using irq 1 for kbd slot wskbd0 at pckbd0: console keyboard, using wsdisplay0 pms0 at pckbc0 (aux slot) pms0: Synaptics touchpad version 6.3 pms0: Palm detect, Multi-finger pckbc0: using irq 12 for aux slot wsmouse0 at pms0 mux 0 npx0 at isa0 port 0xf0-0xff npx0: reported by CPUID; using exception 16 apm0 at mainbus0: Advanced Power Management BIOS: Power Management spec V1.2 (slowidle) timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0 Kernelized RAIDframe activated pad0: outputs: 44100Hz, 16-bit, stereo audio0 at pad0: half duplex IPsec: Initialized Security Association Processing. uhub2 at uhub1 port 4 uhub2: Standard Microsystems product 0x2503, class 9/0, rev 2.00/0.01, addr 2 uhub2: multiple transaction translators uhub2: 2 ports with 1 removable, self powered uhidev0 at uhub2 port 1 configuration 1 interface 0 uhidev0: DIALOGUE INC PenMount USB, rev 1.00/a4.b4, addr 3, iclass 3/1 ums0 at uhidev0 ums0: X report 0x0002 not supported wd0 at atabus0 drive 0: <Hitachi HTS541640J9AT00> wd0: drive supports 16-sector PIO transfers, LBA48 addressing wd0: 34479 MB, 70053 cyl, 16 head, 63 sec, 512 bytes/sect x 70613476 sectors ugen0 at uhub2 port 2 ugen0: Ralink 802.11 bg WLAN, rev 2.00/0.01, addr 4 wd0: 32-bit data port wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100) wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 5 (Ultra/100) (using DMA)
2008-02-07 SA5SX04A
…を買った。
とりあえずpxeでGENERICを入れてみる…キーボードうごかね。ACPIかな。
必要最低限のデバイスは動く様子。無線LANがralでUSBの先か…これはどうしよう。
しばらくいじって暮らせそうならWindowsはポイしよう。
# dmesg Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 4.99.52 (GENERIC) #0: Thu Feb 7 16:52:13 JST 2008 root@falsie:/usr/src/sys/arch/i386/compile/GENERIC total memory = 503 MB avail memory = 482 MB timecounter: Timecounters tick every 10.000 msec timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100 KOHJINSHA Co.,Ltd SA Series (Rev 1.00) mainbus0 (root) cpu0 at mainbus0: (uniprocessor) cpu0: AMD Geode LX (586-class), 498.08 MHz, id 0x5a2 cpu0: features 88a93d<FPU,DE,PSE,TSC,MSR,CX8,SEP> cpu0: features 88a93d<PGE,CMOV,MPC,MMX> cpu0: "Geode(TM) Integrated Processor by AMD PCS" cpu0: I-cache 64 KB 32B/line 16-way, D-cache 64 KB 32B/line 16-way cpu0: L2 cache 128 KB 32B/line 4-way cpu0: ITLB 16 4 KB entries fully associative cpu0: DTLB 16 4 KB entries fully associative cpu0: Initial APIC ID 0 cpu0: 8 page colors acpi0 at mainbus0: Advanced Configuration and Power Interface acpi0: using Intel ACPI CA subsystem version 20070320 acpi0: X/RSDT: OemId <AMD ,RSDT_000,31303030>, AslId <AMD ,31303030> mpacpi: could not get bus number, assuming bus 0 acpi_pci_link: WARNING: powerhook_establish is deprecated LNKA: ACPI: Found matching pin for 0.1.INTA at func 1: 11 acpi_pci_link: WARNING: powerhook_establish is deprecated LNKB: ACPI: Found matching pin for 0.15.INTB at func 3: 5 acpi_pci_link: WARNING: powerhook_establish is deprecated acpi_pci_link: WARNING: powerhook_establish is deprecated LNKD: ACPI: Found matching pin for 0.15.INTD at func 4: 10 LNKC: ACPI: Found matching pin for 0.12.INTA at func 0: 3 LNKB: ACPI: Found matching pin for 0.13.INTA at func 0: 5 acpi0: SCI interrupting at int 9 acpi0: fixed-feature power button present timecounter: Timecounter "ACPI-Fast" frequency 3579545 Hz quality 1000 ACPI-Fast 32-bit timer CPU0 (ACPI Object Type 'Processor' [0x0c]) at acpi0 not configured acpibut0 at acpi0 (PWRB, PNP0C0C): ACPI Power Button acpibut1 at acpi0 (SLPB, PNP0C0E): ACPI Sleep Button acpilid0 at acpi0 (LID0, PNP0C0D): ACPI Lid Switch LNKA (PNP0C0F) [PCI interrupt link device] at acpi0 not configured LNKB (PNP0C0F) [PCI interrupt link device] at acpi0 not configured LNKC (PNP0C0F) [PCI interrupt link device] at acpi0 not configured LNKD (PNP0C0F) [PCI interrupt link device] at acpi0 not configured PCI0 (PNP0A03) [PCI/PCI-X Host Bridge] at acpi0 not configured acpiacad0 at acpi0 (ADP0, ACPI0003): ACPI AC Adapter acpibat0 at acpi0 (BAT0, PNP0C0A-1): ACPI Battery (Control Method) RTC0 (PNP0B00) [AT Real-Time Clock] at acpi0 not configured attimer1 at acpi0 (TMR, PNP0100): AT Timer attimer1: io 0x40-0x43,0x48-0x4b irq 0 pcppi1 at acpi0 (SPKR, PNP0800) pcppi1: io 0x61 midi0 at pcppi1: PC speaker (CPU-intensive output) sysbeep0 at pcppi1 MEM (PNP0C01) [System Board] at acpi0 not configured PIC (PNP0000) [AT Interrupt Controller] at acpi0 not configured MAD (PNP0200) [AT DMA Controller] at acpi0 not configured npx1 at acpi0 (COPR, PNP0C04) npx1: io 0xf0-0xff irq 13 npx1: reported by CPUID; using exception 16 pckbc1 at acpi0 (PS2K, PNP0303): kbd port pckbc1: io 0x60,0x64 irq 1 pckbc2 at acpi0 (PS2M, SYN1910): aux port pckbc2: irq 12 SYSR (PNP0C02) [Plug and Play motherboard register resources] at acpi0 not configured acpitz0 at acpi0 (TZ00): critical 83.0C hot 81.0C passive 59.0C, passive cooling apm0 at acpi0: Power Management spec V1.2 pcppi1: attached to attimer1 pms0 at pckbc1 (aux slot) pckbc1: using irq 12 for aux slot wsmouse0 at pms0 mux 0 pci0 at mainbus0 bus 0: configuration mode 1 pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok pchb0 at pci0 dev 1 function 0 pchb0: Advanced Micro Devices Geode LX Host-PCI Bridge (rev. 0x31) vga1 at pci0 dev 1 function 1: Advanced Micro Devices Geode LX VGA Controller (rev. 0x00) wsdisplay0 at vga1 kbdmux 1: console (80x25, vt100 emulation) wsmux1: connecting to wsdisplay0 direct rendering for vga1 unsupported glxsb0 at pci0 dev 1 function 2: RNG AES cbb0 at pci0 dev 12 function 0: Texas Instruments product 0x8039 (rev. 0x00) Texas Instruments product 0x803b (miscellaneous mass storage) at pci0 dev 12 function 2 not configured Texas Instruments product 0x803c (SD Host Controller system) at pci0 dev 12 function 3 not configured rtk0 at pci0 dev 13 function 0: Realtek 8139 10/100BaseTX (rev. 0x10) rtk0: interrupting at irq 5 rtk0: Ethernet address **:**:**:**:**:** rlphy0 at rtk0 phy 7: Realtek internal PHY rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto gcscpcib0 at pci0 dev 15 function 0 gcscpcib0: Advanced Micro Devices CS5536 PCI-ISA Bridge (rev. 0x03) timecounter: Timecounter "gcscpcib0" frequency 3579545 Hz quality 1000 gcscpcib0: can't alloc an MFGPT for WDT , GPIO gpio0 at gcscpcib0: 32 pins viaide0 at pci0 dev 15 function 2 viaide0: Advanced Micro Devices CS5536 IDE Controller (rev. 0x01) viaide0: bus-master DMA support present viaide0: primary channel wired to compatibility mode viaide0: primary channel interrupting at irq 14 atabus0 at viaide0 channel 0 viaide0: secondary channel wired to compatibility mode viaide0: secondary channel ignored (disabled) Advanced Micro Devices CS5536 Audio (audio multimedia, revision 0x01) at pci0 dev 15 function 3 not configured ohci0 at pci0 dev 15 function 4: Advanced Micro Devices CS5536 OHCI USB Controller (rev. 0x02) ohci0: interrupting at irq 10 ohci0: OHCI version 1.0, legacy support usb0 at ohci0: USB revision 1.0 uhub0 at usb0 uhub0: Advanced Micro OHCI root hub, class 9/0, rev 1.00/1.00, addr 1 uhub0: 4 ports with 4 removable, self powered gcscehci0 at pci0 dev 15 function 5: Advanced Micro Devices CS5536 EHCI USB Controller (rev. 0x02) gcscehci0: interrupting at irq 10 gcscehci0: EHCI version 1.0 gcscehci0: companion controller, 4 ports each: ohci0 usb1 at gcscehci0: USB revision 2.0 uhub1 at usb1 uhub1: Advanced Micro Devices EHCI root hub, class 9/0, rev 2.00/1.00, addr 1 uhub1: 4 ports with 4 removable, self powered cbb0: cacheline 0x0 lattimer 0x10 cbb0: bhlc 0x821000 cbb0: interrupting at irq 3 cardslot0 at cbb0 slot 0 flags 0 cardbus0 at cardslot0: bus 1 pcmcia0 at cardslot0 isa0 at gcscpcib0 isapnp0 at isa0 port 0x279: ISA Plug 'n Play device support isapnp0: no ISA Plug 'n Play devices found timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0 Kernelized RAIDframe activated pad0: outputs: 44100Hz, 16-bit, stereo audio0 at pad0: half duplex uhub2 at uhub1 port 4 uhub2: vendor 0x0000 product 0x0000, class 9/0, rev 2.00/0.00, addr 2 uhub2: single transaction translator uhub2: 3 ports with 3 removable, bus powered gcscehci0: device addr 3 (config 1) exceeds power budget, 500 mA > 100 mA uhub2: port 1, set config at addr 3 failed uhub2: device problem, disabling port 1 wd0 at atabus0 drive 0: <Hitachi HTS541640J9AT00> wd0: drive supports 16-sector PIO transfers, LBA48 addressing wd0: 34479 MB, 70053 cyl, 16 head, 63 sec, 512 bytes/sect x 70613476 sectors gcscehci0: device addr 3 (config 1) exceeds power budget, 300 mA > 100 mA uhub2: port 2, set config at addr 3 failed uhub2: device problem, disabling port 2 wd0: 32-bit data port wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100) wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 5 (Ultra/100) (using DMA) boot device: rtk0 root on rtk0 root on 172.17.4.40:/src/boot/pxe-netbsd root file system type: nfs warning: no /dev/console acpibat0: battery info: None, Lion, NBP3A61 0030 % /sbin/ifconfig -a rtk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 address: **:**:**:**:**:** media: Ethernet autoselect (100baseTX full-duplex) status: active inet 172.17.4.200 netmask 0xffffff00 broadcast 172.17.4.255 inet6 fe80::2a0:****:****:****%rtk0 prefixlen 64 scopeid 0x1 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
2008-01-27 GeodeLXマシン

https://www.ytw.co.jp/catalog/product_info.php?products_id=78 を金曜にポチったら、土曜に発送メールが来て、今日届いた。(土日関係無いぞ。すごいぞw)
だいぶ前に教えてもらってからずっと買おうとは思ってたんだけど、ケースがずっと在庫切れだったのですよ…
まだ秋月でACアダプタを買ってないので動作はおあずけ。
というか、なんとなく買ったが何に使おうか…
GeodeNX1500ママン(こっちは普通のAT互換機)も余ってるんだよなぁ。
EOF