[OSy] Zapisana hodnota sa neprecita spravne

Peter Júnoš petoju at gmail.com
Thu Dec 13 23:24:52 CET 2012


Zdravim,
msim sa mi chova divne a pravdepodobne to nepredpoklada ani
GCC, viac info v komentaroch v kusku trace z msimu.

Pravdepodobne ja a GCC necakame nejake zakladne veci, ktore sa tam deju
- mozete mi objasnit hlavne posledny riadok a ako to, ze sa tam
neprecitalo to iste co sa tam skor zapisalo?

Cele to bolo ziskane pomocou msim_stop(); v prilohe je vykopirovany
relevatny kusok - tieto "divne" udaje ale potom ako divne vstupuju aj
do vypoctov. Sync by nemal robit nic (je to bariera, ked mi to stale
neslo); bug sa prejavoval aj predtym.

Za tymto kodom nasledovalo scitanie registrov a ich ulozenie niekam, kde
sa objavoval nespravny vysledok. Podla manualu load delay slot pri
najhorsom vyzaduje dodatocne cykly, ale ma fungovat aj ked sa GCC /
uzivatel nestara.

ASM je generovany GCC z C kodu; sam by som to takto nenapisal.

Dakujem za napad, co tam moze byt zle
-- 
Peter Júnoš

-------------- next part --------------
 0  8000D850    ori   v0, 0, 0xbeef     # v0: 0x0->0xbeef, v1: 0x0->0x1, a0: 0x0->0x80233000, a1: 0x0->0x1000, a2: 0x0->0x1, a3: 0x0->0x80229000, t0: 0x0->0x20ffb, t1: 0x0->0x232000, t2: 0x0->0x232000, t3: 0x0->0xa, t4: 0x0->0x80019cbc, t5: 0x0->0x2, t6: 0x0->0xffffe000, t7: 0x0->0x80027a84, s0: 0x0->0x80233000, s1: 0x0->0x1000, s2: 0x0->0x80233ff8, s3: 0x0->0x1000, s4: 0x0->0x1, s5: 0x0->0x80229000, s6: 0x0->0x80229000, s7: 0x0->0x80011e54, t8: 0x0->0x1, t9: 0x0->0x50001000, k0: 0x0->0x400, gp: 0x0->0x80000000, sp: 0x0->0x800006f8, fp: 0x0->0xa000, ra: 0x0->0x8000e0a4, cp0_entrylo1: 0x00000000->0x00000001, cp0_status: 0x00000000->0x00400004, cp0_prid: 0x00000000->0x00000400, loreg: 0x0->0x80010000
 0  8000D854    sw    v0, 0x1c(sp)      # 0x1c=28					 //uloz 0xbeef
 0  8000D858    sync                              
 0  8000D85C    sw    a1, 0x18(sp)      # 0x18=24
 0  8000D860    sync                      
 0  8000D864    sw    a1, (s0)                  					 //uloz 0x1000 na adresu 0x80233000
 0  8000D868    sync                      
 0  8000D86C    lw    v1, 0x18(sp)      # 0x18=24, v1: 0x1->0x1000	 //nacitaj si zhodou okolnosti prave 0x1000 z adresy 0x800006f8+0x18=80000710
 0  8000D870    lw    v0, (a0)          # v0: 0xbeef->0xffffffff     //nahraj 0xffffffff z adresy 0x80233000 - kde sa to tam zobralo behom tych 2 instrukcii?


More information about the NSWI004 mailing list