[osy] Re: problem s panicem

  • From: Jaroslav Keznikl <jaroslav.keznikl@xxxxxxxxx>
  • To: osy@xxxxxxxxxxxxx
  • Date: Sat, 01 Nov 2008 22:31:16 +0100

Ahoj
precetl jsem si to az ted.
Dneska uz mi to moc nemysli, takze se na to vrhnu az zitra. Treba neco vymyslim ale myslim ze tvoje aktualni implementace prosla testem....
J.K.

Jiri Horky napsal(a):
Ahoj,

prave jsem 2.5 hodiny ve vlaku zkousel implementovat nejak inteligentne panic tak, aby opravdu vsechny registy (az na jeden) zustaly pri vypsani tak jak opravdu byly. Zda se, ze uz jsem schopny si to spravne ulozit, ale zaboha se mi nedari to loadnout a uz si nevim rady :/ Budu vdecny za kazdy tip.

Nastinim situaci:
Ukladani registru na presne danou adresu (stejna jako pro tbl funkce, prijde zmenit), provadeni funkce store_cpu_registers: (head.S)
processor p0
  0 00000000   at 00000000   v0 1000FF00   v1 FFFFFFFE   a0 80004118
 a1 90000000   a2 00000000   a3 00000000   t0 00000000   t1 00000000
 t2 00000000   t3 00000000   t4 00000000   t5 00000000   t6 00000000
 t7 00000000   s0 00000000   s1 00000000   s2 00000000   s3 80000000
 s4 80000000   s5 00000000   s6 00000000   s7 00000000   t8 00000000
 t9 00000000   k0 1000FF01   k1 00000000   gp 80000000   sp 800061AC
 fp 00000000   ra 8000329C   pc 800032BC   lo 00000000   hi 00000000

   800032BC    d_trace
   800032C0    jal   +0x2f84           # 0x2f84=12164,
                                       # ra: 0x8000329c->0x800032c8
   800032C4    nop
   80002F84    lui   k1, 0x8000        # 0x8000=32768, k1: 0x0->0x80000000
   80002F88    ori   k1, k1, 0x0368    # 0x368h=872,
                                       # k1: 0x80000000->0x80000368
   80002F8C    sw    0, (k1)
   80002F90    sw    at, 0x4(k1)
   80002F94    sw    v0, 0x8(k1)
   80002F98    sw    v1, 0xc(k1)       # 0xc=12
   80002F9C    sw    a0, 0x10(k1)      # 0x10=16
   80002FA0    sw    a1, 0x14(k1)      # 0x14=20
   80002FA4    sw    a2, 0x18(k1)      # 0x18=24
   80002FA8    sw    a3, 0x1c(k1)      # 0x1c=28
   80002FAC    sw    t0, 0x20(k1)      # 0x20=32
   80002FB0    sw    t1, 0x24(k1)      # 0x24=36
   80002FB4    sw    t2, 0x28(k1)      # 0x28=40
   80002FB8    sw    t3, 0x2c(k1)      # 0x2c=44
   80002FBC    sw    t4, 0x30(k1)      # 0x30=48
   80002FC0    sw    t5, 0x34(k1)      # 0x34=52
   80002FC4    sw    t6, 0x38(k1)      # 0x38=56
   80002FC8    sw    t7, 0x3c(k1)      # 0x3c=60
   80002FCC    sw    t8, 0x40(k1)      # 0x40=64
   80002FD0    sw    t9, 0x44(k1)      # 0x44=68
   80002FD4    sw    s0, 0x48(k1)      # 0x48=72
   80002FD8    sw    s1, 0x4c(k1)      # 0x4c=76
   80002FDC    sw    s2, 0x50(k1)      # 0x50=80
   80002FE0    sw    s3, 0x54(k1)      # 0x54=84
   80002FE4    sw    s4, 0x58(k1)      # 0x58=88
   80002FE8    sw    s5, 0x5c(k1)      # 0x5c=92
   80002FEC    sw    s6, 0x60(k1)      # 0x60=96
   80002FF0    sw    s7, 0x64(k1)      # 0x64=100
   80002FF4    sw    gp, 0x70(k1)      # 0x70=112
   80002FF8    sw    fp, 0x74(k1)      # 0x74=116
   80002FFC    sw    ra, 0x7c(k1)      # 0x7c=124
   80003000    mflo  t0
   80003004    sw    t0, 0x80(k1)      # 0x80=128
   80003008    mfhi  t0
   8000300C    sw    t0, 0x84(k1)      # 0x84=132
   80003010    mfc0  t0, status        # t0: 0x0->0x1000ff00
   80003014    sw    t0, 0x94(k1)      # 0x94=148
   80003018    lw    t0, 0x20(k1)      # 0x20=32, t0: 0x1000ff00->0x0
   8000301C    jr    ra
   80003020    no

Tato cast se mi zda ok. Pak se vola: print_registers() (debug.h), kde potrebuju lokalni promennou typu context_t presmerovat na to pevne dane misto v kernelu. Volam tam toto:
  context_t * context = (context_t *) 1000;

printk("context: %p\n", context);
  printk("&context: %p\n", &context);
  msim_trace_on();
  load_cpu_registers(&context);
  msim_trace_off();
  msim_trace_on();

a co to dela:

context: 0x3e8
&context: 0x800061b8
processor p0
  0 00000000   at 00000000   v0 00000015   v1 00000070   a0 90000000
 a1 8000613B   a2 00000038   a3 00000008   t0 00000000   t1 00000000
 t2 00000000   t3 00000000   t4 00000000   t5 00000000   t6 00000000
 t7 00000000   s0 800061B8   s1 80000000   s2 80000000   s3 80000000
 s4 80000000   s5 00000000   s6 00000000   s7 00000000   t8 00000000
 t9 00000000   k0 1000FF01   k1 80000368   gp 80000000   sp 8000619C
 fp 00000000   ra 800032E8   pc 800032E8   lo 00000000   hi 00000000

   800032E8    d_trace
   800032EC    jal   +0x3024           # 0x3024=12324,
                                       # ra: 0x800032e8->0x800032f4
   800032F0    addu  a0, s0, 0         # a0: 0x90000000->0x800061b8
   80003024    sw    k1, (a0)
   80003028    nop
   8000302C    nop
   80003030    jr    ra
   80003034    addiu sp, sp, 0xff68    # sp: 0x8000619c->0x80006104
processor p0
  0 00000000   at 00000000   v0 00000015   v1 00000070   a0 800061B8
 a1 8000613B   a2 00000038   a3 00000008   t0 00000000   t1 00000000
 t2 00000000   t3 00000000   t4 00000000   t5 00000000   t6 00000000
 t7 00000000   s0 800061B8   s1 80000000   s2 80000000   s3 80000000
 s4 80000000   s5 00000000   s6 00000000   s7 00000000   t8 00000000
 t9 00000000   k0 1000FF01   k1 80000368   gp 80000000   sp 80006104
 fp 00000000   ra 800032F4   pc 800032F8   lo 00000000   hi 00000000

   800032F8    d_trace
context: (nil)
&context: 0x800061b8

---> nastavi mi to moji promennou context na 0. ALE NECHAPU PROC, protoze tam ta instrukce:
  80003024    sw    k1, (a0)
proste je a v k1 je nejaka (ta spravna) nenulova adresa.....

Uz jsem tim zabil fakt hodne casu a vylozene me to mrda :/ Pac resit par radku zasraneho assembleru cely den me neba. Zitra to nakodim nejak skarede a funkce, ale docela by me zajimalo co delam spatne.

Kdyby mel nekdo chvilku a mrkl se na to, budu mu vdecny. Jinak doporucuju volat ./tests.sh debug0, ktery jenom vola panic().
Commitnul jsem to tam.


Jirka H.




Other related posts: