Last Update: "2007/07/08 11:45:33 makoto"
build.sh
20070616
ehci.c
161bd0: 48 18 a4 51 bl 2ec020 <.usb_setup_reserve>
161bd4: 60 00 00 00 nop
161bd8: e9 7f 04 d8 ld r11,1240(r31)
161bdc: 81 3f 04 e8 lwz r9,1256(r31)
161be0: 38 00 00 00 li r0,0
161be4: 7c 0b 49 2e stwx r0,r11,r9
161be8: 7c 00 06 ac eieio
161bec: 7c 00 04 ac sync
161bf0: 38 80 00 01 li r4,1
161bf4: 7f e3 fb 78 mr r3,r31
161bf8: 48 18 ae 39 bl 2eca30 <.usb_delay_ms>
この 161be4: 7c 0b 49 2e stwx r0,r11,r9
で trap 600 が起きている。trap 600 は powerp64/trap.h によれば
#define EXC_ALI 0x0600 /* Alignment Interrupt */
それで、
376 usb_setup_reserve(sc, &sc->sc_dma_reserve, sc->sc_bus.dmatag,
377 USB_MEM_RESERVE);
378
379 /* Reset the controller */
380 DPRINTF(("%s: resetting\n", USBDEVNAME(sc->sc_bus.bdev)));
381 EOWRITE4(sc, EHCI_USBCMD, 0); /* Halt controller */
382 usb_delay_ms(&sc->sc_bus, 1);
383 EOWRITE4(sc, EHCI_USBCMD, EHCI_CMD_HCRESET);
384 for (i = 0; i < 100; i++) {
385 usb_delay_ms(&sc->sc_bus, 1);
386 hcr = EOREAD4(sc, EHCI_USBCMD) & EHCI_CMD_HCRESET;
387 if (!hcr)
388 break;
389 }
この EOWRITE4 は次のように定義されている
#define EOWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
stwx r0,r11,r9
は r11 + r9 に r0 を保存する。この場合 r0 は 0、
この r11 + r9 が 64 bit aligned ではない、
ということかな。そのようなことって 32 bit のコードでは保証する訳がない ?
以上の件は sys/dev/usb/ehci.c の変更が正しく行なわれていないことが原因
でした。
uplcom
2f9a60: 4b f1 4d d1 bl 20e830 <.malloc>
2f9a64: 60 00 00 00 nop
2f9a68: 2f a3 00 00 cmpdi cr7,r3,0
2f9a6c: f8 7f 00 30 std r3,48(r31)
2f9a70: 41 9e 00 74 beq- cr7,2f9ae4 <.ucons_usbd_transfer+0xe4>
2f9a74: 89 3f 00 38 lbz r9,56(r31)
2f9a78: 61 20 00 10 ori r0,r9,16
2f9a7c: 98 1f 00 38 stb r0,56(r31)
2f9a80: 7c 09 03 78 mr r9,r0
2f9a84: a0 1f 00 18 lhz r0,24(r31)
2f9a88: 78 0b 07 e1 clrldi. r11,r0,63
2f9a8c: 41 82 00 84 beq- 2f9b10 <.ucons_usbd_transfer+0x110>
2f9a90: e9 7c 00 30 ld r11,48(r28)
2f9a94: 7f e3 fb 78 mr r3,r31
2f9a98: e9 2b 00 00 ld r9,0(r11)
2f9a9c: e8 09 00 00 ld r0,0(r9)
2f9aa0: f8 41 00 28 std r2,40(r1)
src/sys/arch/powerpc64/include/trap.h:
#define EXC_DSEG 0x0380 /* Data Segment miss */
この問題は、「ucons はとりあえず手持の USB serial で動けばいい」ということで
作ったプログラムなので、別の USB serial では動かない、ということだそうです。
include/machine
/export/20070616/checkout/src/obj/destdir.ps3/usr/include/machine
これが違っていた。これを設定するのはどこ ?
src/sys/arch/ps3/include
src/sys/arch/powerpc64/include
src/obj/destdir.ps3/usr/include/ps3/
src/obj/destdir.ps3/usr/include/powerpc64/
の関係 .. 単純な場合は、
src/sys/arch/ps3/include
が
src/obj/destdir.ps3/usr/include/ps3/
に install される
単純な場合でなくても、
src/sys/arch/${MACHINE}/include が
src/obj/destdir.${MACHINE}/usr/include/${MACHINE}
に install される
/usr/include/machine はどこをさすのが正解 ? machine
というくらいで /usr/include/ps3
記録に次のような部分がある
includes ===> sys/arch
# install /export/20070616/checkout/src/obj/destdir.ps3/usr/include/machine
..
includes ===> sys/arch/ps3
includes ===> sys/arch/ps3/include
|