PS3
  日記
  otheros
  server
  20070717
    __libc_stack_end
    mount_hfs
    named
  build.sh
    20070616
      ehci.c
        uplcom
      include/machine
    20070526
      cannot find -lgcc_eh
      ARCHSUBDIR
    20070420
      (1) ./build.sh
      (2) adbsys.h
      (3) machine/include
      (4)@plt
      (5)`fdesc(__clone)'
      (6) #error PIC
      (7)zlib
      (8) ptrdiff_t
    20070330
    20070319
  gdb

hardware | software | NetBSD 解説
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

Last Update: Sat, 07 Jun 2014 13:16:17 GMT 1.66 2008/03/08