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 noTato 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.