Wo sind die Linux Experten ?

Started by mce2222, 03. Feb 2008, 01:05

previous topic - next topic
Go Down

mce2222

ich hab in den letzten Tagen mal wieder etwas gebastelt ;)

nun kann ich einen Linux Kernel per tool in ein NK.BIN verpacken, so das die x300t das akzeptiert und startet...
den patcher hab ich so umgebaut das er nicht die nk.bin startet sondern lx.bin .. damit kann man dann bei starten entscheiden ob man linux oder wince starten will.... das macht das testen deutlich angenehmer ;)

so... das waren die guten Nachrichten .... jetzt die schlechten:

ich hab die firmware der dune-hd box  (sehr ähnlich wie die popcorn hour) auseinander genommen und hab
probiert deren uCodes beim booten zu laden.   
komischer weise klappt das nicht .. obwohl es eigentlich gehen sollte.
ich vermute das hier die IPTV uCodes schon geladen wurden, und damit ein neues laden blockiert ist...

aber das ist ein nicht ganz so wichtiges Problem.

viel böser ist, dass ich beim Starten des Kernels ein Kernel Panic bekomme und ich hab keine Ahnung warum das passiert.
die logausgaben sehen bis zum Kernel Panic genau so aus wie bei ner Popcorn hour.
hier ist der ganze output... also wenn da einer ne idee hat, lasst es mich wissen

Code: [Select]

Microsoft IPTV Bootloader, Build (1051)
Built by BM-DELL-167, Sep 11 2006 16:54:12
>
**********************************
* SMP863x zboot start ...
* Version: 2.2.0-2.7.167.0
* Started at 0x91000000.
* Configurations (chip revision: 6):
*    Use 8KB DRAM as stack.
*    Support XLoad format.
*    Enabled BIST mode.
*    Enabled memory test mode.
*    Use internal memory for stage0/1.
**********************************
Boot from flash (0x48000000) mapped to 0xac000000.
Found XENV block at 0xac000000.
CPU clock frequency: 297.00MHz.
System clock frequency: 198.00MHz.
DRAM0 dunit_cfg/delay0_ctrl (0xe34111ba/0x00094344).
DRAM1 dunit_cfg/delay0_ctrl (0xe34111ba/0x00093444).
Using UART port 0 as console.
Board ID.: "KMM3210-TG-A"
Chip Revision: 0x8634:0x82 .. Mismatched.
Setting up H/W from XENV block at 0xac000000.
  Setting <SYSCLK premux> to 0x00000603.
  Setting <SYSCLK avclk_mux> to 0x00000000.
  Setting <SYSCLK hostclk_mux> to 0x00000100.
  Setting <IRQ rise edge trigger lo> to 0xff28ca00.
  Setting <IRQ fall edge trigger lo> to 0x0000c000.
  Setting <IRQ rise edge trigger hi> to 0x000001ff.
  Setting <IRQ fall edge trigger hi> to 0x00000000.
  Setting <IRQ GPIO map> to 0x0d090800.
  Setting <PB default timing> to 0x01090008.
  Setting <PB timing0> to 0x01090008.
  Setting <PB Use timing0> to 0x000003fc.
  Setting <PB timing1> to 0x00110101.
  Setting <PB Use timing1> to 0x000003f3.
  PB cs config: 0x000c10c0 (use 0x000c10c0)
  Enabled Devices: 0x00023efe
    BM/IDE PCIHost Ethernet IR FIP I2CM I2CS USB PCIDev1 PCIDev2 PCIDev3 PCIDev4
SCARD
  MAC: 00:00:de:ad:be:ef
  PCI IRQ routing:
    IDSEL 1: INTA(#14) INTB(#14) INTC(#14) INTD(#14)
    IDSEL 2: INTA(#14) INTB(#14) INTC(#14) INTD(#14)
    IDSEL 3: INTA(#14) INTB(#14) INTC(#14) INTD(#14)
    IDSEL 4: INTA(#15) INTB(#15) INTC(#15) INTD(#15)
  Smartcard pin assignments:
    OFF pin = 0
    5V pin = 1
    CMD pin = 2
  Setting up Clean Divider 2 to 96000000Hz.
  Setting up Clean Divider 4 to 33333333Hz.
  GPIO dir/data = 0x00000000/0x00000000
  UART0 GPIO mode/dir/data = 0x6e/0x00/0x00
  UART1 GPIO mode/dir/data = 0x6e/0x00/0x00
XENV block processing completed.
Found existing memcfg: DRAM0(0x04000000), DRAM1(0x04000000)
Heap/Temp/Temp1/Dest start at 0x12400000/0x11800000/0x11e00000/0x13000000.
Default boot index: 0
processing zboot record at 0xac000000 (0xac000000) .. index 0Scanning ROMFS imag
e at 0x90800000.. Found.
ROMFS found at 0x90800000, Volume name = mce2222
Found 4 file(s) to be processed in ROMFS.
Processing 10xrpc_xload_audio_ucode_SMP8634_2.7.176sybs1.7972x_GCC4_facsprod.bin
(start: 0x90800200, size: 0x000d7264)
  Checking zboot file signature .. Not found.
  Trying xrpc_xload format .. Failed (not an xrpc_xload file)
Processing 11xrpc_xload_video_ucode_SMP8634_2.7.176sybs1.7972x_GCC4_facsprod.bin
(start: 0x908d7600, size: 0x0004fb64)
  Checking zboot file signature .. Not found.
  Trying xrpc_xload format .. Failed (not an xrpc_xload file)
Processing 12xrpc_xload_demux_ucode_SMP8634_2.7.176sybs1.7972x_GCC4_facsprod.bin
(start: 0x90927200, size: 0x00007804)
  Checking zboot file signature .. Not found.
  Trying xrpc_xload format .. Failed (not an xrpc_xload file)
Processing 33xrpc_xload_irq_handler_SMP8634_2.7.176sybs1.7972x_GCC4_facsprod.bin
(start: 0x9092ec00, size: 0x0002e454)
  Checking zboot file signature .. Not found.
  Trying xrpc_xload format .. Failed (not an xrpc_xload file)
Done with fixed container
  Execute final at 0x90020000 ..
Linux version 2.6.15-sigma (rolandhii@venus) (gcc version 4.0.4) #118 PREEMPT We
d Jan 23 10:43:14 CST 2008
Configured for SMP8634 (revision ES6/RevA), detected SMP8634 (revision ES6/RevA)
.
SMP863x/SMP865x Enabled Devices under Linux/XENV 0x48000000 = 0x00023efe
BM/IDE PCIHost Ethernet IR FIP I2CM I2CS USB PCIDev1 PCIDev2 PCIDev3 PCIDev4 SC
ARD
Valid MEMCFG found at 0x10000fc0.
CPU revision is: 00019068
Determined physical RAM map:
memory: 05ee0000 @ 10020000 (usable)
On node 0 totalpages: 89856
  DMA zone: 89856 pages, LIFO batch:15
  DMA32 zone: 0 pages, LIFO batch:0
  Normal zone: 0 pages, LIFO batch:0
  HighMem zone: 0 pages, LIFO batch:0
Built 1 zonelists
Kernel command line: pci=disabled ip=dhcp root=/dev/nfs noinitrd
Primary instruction cache 16kB, physically tagged, 2-way, linesize 16 bytes.
Primary data cache 16kB, 2-way, linesize 16 bytes.
Synthesized TLB refill handler (20 instructions).
Synthesized TLB load handler fastpath (32 instructions).
Synthesized TLB store handler fastpath (32 instructions).
Synthesized TLB modify handler fastpath (31 instructions).
PID hash table entries: 2048 (order: 11, 32768 bytes)
Using 148.500 MHz high precision timer.
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 86656k/97152k available (3399k kernel code, 10476k reserved, 536k data,
3108k init, 0k highmem)
Calibrating delay loop... 293.88 BogoMIPS (lpj=146944)
Mount-cache hash table entries: 512
Checking for 'wait' instruction...  available.
CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc ==
9006aea0, ra == 9036dd88
Oops[#1]:
Cpu 0
$ 0   : 00000000 00000001 90a7f87c 00000000
$ 4   : 95e88d38 90a7f870 00000001 00000000
$ 8   : 90702b80 90700000 90a7b000 00000000
$12   : 90a7e000 95e88cc0 00000012 00000010
$16   : 90a6df70 95e88d34 90a75be8 95e88d38
$20   : 90420000 90700000 00000030 90420000
$24   : 00000001 00000000
$28   : 90a7e000 90a7f860 90380000 9036dd88
Hi    : 2a8b2775
Lo    : 355f2140
epc   : 9006aea0     Not tainted
ra    : 9036dd88 Status: 10001c02    KERNEL EXL
Cause : 7080800c
BadVA : 00000000
PrId  : 00019068
Modules linked in:
Process swapper (pid: 1, threadinfo=90a7e000, task=90a75be8)
Stack : 00000000 00000000 00000001 00000000 00000001 90a75be8 90047cd0 95e88d38
        00000000 00000001 90a6df70 95e88d34 90700000 00007948 90420000 9009a838
        90a7b000 00007948 90420000 90700000 00001846 900b4d60 00000000 00000000
        900c9ec4 90a7b000 00000000 90a7f908 90a7b000 900b87c8 90a6df70 00000000
        90710000 00000000 00000000 00000000 00000000 9009a8e8 90420000 90700000
        ...
Call Trace: [<90047cd0>]  [<9009a838>]  [<900b4d60>]  [<900c9ec4>]  [<900b87c8>]
  [<9009a8e8>]  [<9009a900>]  [<903fa270>]  [<903fa2ec>]  [<903faa64>]  [<903700
00>]  [<903fb10c>]  [<903fb92c>]  [<903fc5f0>]  [<90053b74>]  [<90053b44>]  [<90
0204d0>]  [<90026bdc>]  [<90026bcc>]

Code: 24a2000c  aca4000c  ac820004 <ace20000> ac470004  10c00002  41606000  4160
6020  000000c0
Kernel panic - not syncing: Attempted to kill init!




robert_s

Ich würde mal spontan sagen der Befehl an Adresse 0x9006aea0 dereferenziert einen NULL-Pointer. Disassemble doch mal, was da gemacht wird...

mce2222

tja...
leider ist diese subroutine recht klein und gibt nicht viel hinweise.
ich hab leider noch nicht den ganzen kernel diassembliert... das dauert sehr lange, weils irgendwie nicht automatisch geht.

in der Nähe diese methode hab ich hinweise gesehen wo es um Kernel-Threads und Timer ging.
aber ob das nun weiterhilft weiss ich nicht.

grundsätzlich ist ja eher die Frage... wieso läuft genau dieser Kenel auf einer anderen box, aber nicht auf der x300t.



sub_9006AE6C:                            # CODE XREF: sub_9036DD30+50p
RAM:9006AE6C                                          # RAM:9036DEE4p
RAM:9006AE6C                 lw      $v0, 0($a1)
RAM:9006AE70                 ori     $v0, 1
RAM:9006AE74                 sw      $v0, 0($a1)
RAM:9006AE78                 di      $a2
RAM:9006AE7C                 andi    $a2, 1
RAM:9006AE80                 ehb
RAM:9006AE84                 lw      $v0, 0x14($gp)
RAM:9006AE88                 addiu   $v0, 1
RAM:9006AE8C                 sw      $v0, 0x14($gp)
RAM:9006AE90                 lw      $a3, 4($a0)
RAM:9006AE94                 addiu   $v0, $a1, 0xC
RAM:9006AE98                 sw      $a0, 0xC($a1)
RAM:9006AE9C                 sw      $v0, 4($a0)
RAM:9006AEA0                 sw      $v0, 0($a3)
RAM:9006AEA4                 sw      $a3, 4($v0)
RAM:9006AEA8                 beqz    $a2, loc_9006AEB4
RAM:9006AEAC                 di
RAM:9006AEB0                 ei

robert_s

sub_9006AE6C:                            # CODE XREF: sub_9036DD30+50p

Von da ist die Routine aufgerufen worden (0x9036DD80), mit dem Pointer-Parameter $a0, der auf irgendein Objekt zeigt

RAM:9006AE90                 lw      $a3, 4($a0)

Und an Offset 4 des Objekts soll ein weiter Pointer gespeichert sein

RAM:9006AEA0                 sw      $v0, 0($a3)

der aber leider NULL ist, weswegen dieser Befehl zum Absturz führt.

Jetzt musst Du an 0x9036DD80 gucken, wo $a0 herkommt und wo/wie dieses Objekt initialisiert wird. Vielleicht soll da irgendeine Boardkomponente initialisiert werden, die beim X300T nicht vorhanden ist...?

badsurfer

Morgen,

Leute ihr seid genial. Irgendwie bekomm ich leicht das Gefühl das die Box doch nicht verstauben muss. Klar is noch viel zu tun aber ich denke das ist zu schaffen.

@mce2222 Vielleicht könntest du den geänderten Bootloader, das Tool zum verpacken des Kernels sowie die Firmware (als lx.bin und disassembliert) mal hochladen.

Gibt es ein bestimmten Grund warum du die Dune-HD Firmware genommen hast? Vielleicht sollte man es mal mit der Popcornhourfirmware probieren. Ich weiß is der selbe Kernel aber vielleicht gestalten sich ein paar Speicherzugriffe anders...

mce2222

also eigentlich ist bei der popcornhour nur der SMP und sonst gar nichts drauf. von daher kann ich mir eigentlich nicht vorstellen, das da irgendwas initialisiert wird was es bei der x300t nicht gibt.

theoretisch könnte natürlich an den GPIO Leitungen irgendwas verschaltet sein was abgetestet wird ... würde mich aber wundern.

und die methode wird mindestens noch von 2 anderen Stellen aufgerufen, hab aber auch erst 5% vom kernel disassembliert.
also sooo einfach ist das nicht.


hochladen der tools könnte ich nachher mal machen, mit dem kernel und romfs siehts aber schlecht aus... da ist zeugs mit copyright drin....
das ist ein grundsätzliches Problem mit dem Linux-ansatz... legal wird man da nichts hinbekommen.
schon paradox dass man mit einem MS Betriebsystem weniger Stress wegen copyrights hat :(


und warum ich das kernel der dune-hd genommen hab... tja weil mit dem kernel der popcornhour gar nichts passiert. also entweder ist da die serielle ausgabe abgeschaltet oder der stürzt sofort ab ohne eine zeile zu loggen.

robert_s


und die methode wird mindestens noch von 2 anderen Stellen aufgerufen, hab aber auch erst 5% vom kernel disassembliert.
also sooo einfach ist das nicht.


Aber bei dem eingetretenen Crash wurde sie von 0x9036DD80 aufgerufen. Weitere Aufrufe sollten sich durch den Stack Trace zurückverfolgen lassen. Die Informationen sind da, man muss sie nur auswerten... ;)

smplasma

Könnte man für bestimmte uploads nicht eines der vielen Premiere Uploadcenter missbrauchen.

Metrex

Ich denke die Popcornhourfirmware läuft deshalb nicht weil sie für den SMP8635 compiliert wurde und nicht den von der X300T verwendeten SMP8634. Ich kenne zwar die genauen Unterschiede zwischen den beiden nicht, könnte aber ein Grund sein.
Und die Dune HD hat halt ein DVD-Laufwerk, vielleicht versucht er beim Booten das zu Mounten? (Dürfte aber keine Kernel-Panic auslösen)

mce2222


Könnte man für bestimmte uploads nicht eines der vielen Premiere Uploadcenter missbrauchen.


könnte man sicher .. ich werde es aber ganz sicher nicht tun :P 


Ich denke die Popcornhourfirmware läuft deshalb nicht weil sie für den SMP8635 compiliert wurde und nicht den von der X300T verwendeten SMP8634. Ich kenne zwar die genauen Unterschiede zwischen den beiden nicht, könnte aber ein Grund sein.


der einzige Unterschied zwischen SMP8634 und 8635 ist das der 8634 eine Macrovision protection eingebaut hat. bzw. dafür lizensiert ist...  also daran sollte es nicht liegen.


Und die Dune HD hat halt ein DVD-Laufwerk, vielleicht versucht er beim Booten das zu Mounten? (Dürfte aber keine Kernel-Panic auslösen)

da das mounten der Laufwerke erst viel später passiert, glaub ich nicht das es was mit dem dvd laufwerk zu tun hat.


mce2222


Aber bei dem eingetretenen Crash wurde sie von 0x9036DD80 aufgerufen. Weitere Aufrufe sollten sich durch den Stack Trace zurückverfolgen lassen. Die Informationen sind da, man muss sie nur auswerten... ;)


ich werd aus dem stacktrace nich schlau... die addressen die da gelistet sind haben zumindest auf den ersten blick überhaupt nichts mit einander zu tun. sehr eigenartig.

mich würde aber viel eher interessieren ob an der Stelle wo der Panic auftritt schon irgendetwas aus dem ramfs ausgeführt wird oder nicht.


Paul

nur ne vermutung aber denke nicht das da was im ram läuft.
Code: [Select]
Determined physical RAM map:
memory: 05ee0000 @ 10020000 (usable)

Code: [Select]
0k highmem

Hoernchen

Hat eigentlich schonmal jemand versucht einen der smp863x Kernel mit Qemu zu booten ?
bringer of linux, conqueror of hdmi, jack of all trades.

mce2222

ich habs jedenfalls noch nicht probiert

mce2222

#14
10. Feb 2008, 22:14 Last Edit: 10. Feb 2008, 22:41 by mce2222
neues kernel... neuer stand
inzwischen hab ich rausgefunden wie man die linux kernel parameter setzt ;)
damit bekomme ich nun auch beim kernel der popcornhour Ausgaben... aber leider komm ich da genausoweit wie mit dem kernel vom Dune-HD

besser siehts mit dem kernel der MagicTV box aus. Zumindest kommt das log deutlich weiter, und hängt dann wenn das finale Root FS gemoutet werden soll. Dummerweise hat der kernel nur JFFS2 und CRAM support eingebaut, was es etwas schwierig
macht ein Root FS zu mounten.

ich hab nun probiert das initramfs image was im kernel mit eingebunden ist zu verändern, aber das Ergebnis ist
Quote

Checking for 'wait' instruction...  available.
Kernel panic - not syncing: invalid compressed format (err=1)


(interessanterweise genau an der Stelle wo beim Popcornhour Kernel die Paging Exception kommt)

hat jemand n Plan ob es irgendwie möglich ist das initramfs image zu modifizieren, so das der Kernel es auch annimmt ?


ich vermute es liegt daran, das der Kernel nicht weiss ab wo der freie Speicher beginnt, und beim entpacken des initramfs wird dann das komprimierte cpio image überschrieben :(

Go Up