Many changes:
[Marmot.git] / dumpRegs.vp
blobc09afe520a447ff8bbc54f2a13960aa532905afa
1 ; Dump registers
3 (defun rev (n)
4         (| (& 0x00000000000000ff (>> n 56))
5            (& 0x000000000000ff00 (>> n 40))
6            (& 0x0000000000ff0000 (>> n 24))
7            (& 0x00000000ff000000 (>> n 8))
8            (& 0x000000ff00000000 (<< n 8))
9            (& 0x0000ff0000000000 (<< n 24))
10            (& 0x00ff000000000000 (<< n 40))
11            (& 0xff00000000000000 (<< n 56))))
13 (defun dump-regs ()
14   (printf "AX %016x BX %016x CX %016x DX %016x\n"
15           RAX RBX RCX RDX)
16   (printf "SI %016x DI %016x BP %016x SP %016x\n"
17           RSI RDI RBP RSP)
18   (printf "R8 %016x R9 %016x R0 %016x R1 %016x\n"
19           R8 R9 R10 R11)
20   (printf "R2 %016x R3 %016x R4 %016x R5 %016x\n"
21           R12 R13 R14 R15)
22   (printf "IP %016x FLAGS %016x\n"
23           RIP EFLAGS)
24   (printf "CS %04x DS %04x ES %04x FS %04x GS %04x SS %04x\n"
25           CS DS ES FS GS SS)
26   (printf "CR0 %016x CR2 %016x CR3 %016x\n"
27           CR0 CR2 CR3)
28   (printf "CR4 %016x CR8 %016x EFER %016x\n\n"
29           CR4 CR8 EFER))
32 (vprobe GUEST:_start
33         (printf "\n======================================================\n"))
35 (vprobe GUEST:Loader
36         (printf "In the loader (%s)! (%016x)\n"
37                 PROBENAME (getguest 0x8000))
38         (dump-regs))
40 ;(definteger vesa-addr)
41 ;(defstring vesa-str)
43 ; careful - esx4x requires 3-4 args, but ws65 requires 2-3 for get*str.
44 ;(defun set-vesa-str ()
45 ;        (getgueststr vesa-str (| (>> (& vesa-addr 0xffff0000) 12)
46 ;        (getgueststr vesa-str 255 (| (>> (& vesa-addr 0xffff0000) 12)
47 ;                                     (& vesa-addr 0xffff))))
49 ;(defun vesa-modes (max off)
50 ;        (cond ((> max 0)
51 ;               (do (setint vesa-addr (& 0xffff (getguest "VideoModeList" off)))
52 ;                   (printf "    0x%04x (%d)\n" vesa-addr vesa-addr)
53 ;                   (vesa-modes (- max 1) (+ off 2))))))
55 ;(defun dump-vesa ()
56 ;        (printf "VbeSignature:      0x%08x\n"
57 ;                (& 0xffffffff (getguest "VbeSignature")))
58 ;        (printf "VbeVersion:        0x%04x\n"
59 ;                (& 0xffff (getguest "VbeVersion")))
60 ;        (setint vesa-addr (& 0xffffffff (getguest "OemStringPtr")))
61 ;        (set-vesa-str)
62 ;        (printf "OemStringPtr:      0x%08x (%s)\n"
63 ;                vesa-addr vesa-str)
64 ;        (printf "Capabilities:      0x%08x\n"
65 ;                (& 0xffffffff (getguest "Capabilities")))
66 ;        (printf "VideoModePtr:      0x%08x\n"
67 ;                (& 0xffffffff (getguest "VideoModePtr")))
68 ;        (setint vesa-addr (& 0xffff (getguest "TotalMemory")))
69 ;        (printf "TotalMemory:       0x%04x (%dkB)\n"
70 ;                vesa-addr (* 64 vesa-addr))
71 ;        (printf "OemSoftwareRev:    0x%04x\n"
72 ;                (& 0xffff (getguest "OemSoftwareRev")))
73 ;        (setint vesa-addr (& 0xffffffff (getguest "OemVendorNamePtr")))
74 ;        (set-vesa-str)
75 ;        (printf "OemVendorNamePtr   0x%08x (%s)\n"
76 ;                vesa-addr vesa-str)
77 ;        (setint vesa-addr (& 0xffffffff (getguest "OemProductNamePtr")))
78 ;        (set-vesa-str)
79 ;        (printf "OemProductNamePtr: 0x%08x (%s)\n"
80 ;                vesa-addr vesa-str)
81 ;        (setint vesa-addr (& 0xffffffff (getguest "OemProductRevPtr")))
82 ;        (set-vesa-str)
83 ;        (printf "OemProductRevPtr:  0x%08x (%s)\n\n"
84 ;                vesa-addr vesa-str))
87 ;(defun dump-mode-info (o)
88 ;        (cond ((< o 48)
89 ;               (do (printf "   %3d: %016x %016x\n"
90 ;                           o
91 ;                           (rev (getguest "VESAModeInfo" o))
92 ;                           (rev (getguest "VESAModeInfo" (+ o 8))))
93 ;                   (dump-mode-info (+ o 16))))))
95 ;(defun dump-edid-info (o)
96 ;        (cond ((< o 256)
97 ;               (do (printf "   %3d: %016x %016x\n"
98 ;                           o
99 ;                           (rev (getguest "EDIDBlock" o))
100 ;                           (rev (getguest "EDIDBlock" (+ o 8))))
101 ;                   (dump-edid-info (+ o 16))))))
104 ;(vprobe GUEST:HaveVESA
105 ;        (printf "VESA Info:\n")
106 ;        (dump-vesa)
107 ;        (dump-mode-info 0)
108 ;        (dump-edid-info 0)
109 ;        (dump-regs))
111 ;(definteger vesa-scratch)
112 ;(vprobe GUEST:vesa
113 ;        (printf "vesa (%s)\n" PROBENAME)
114 ;        (setint vesa-scratch (getguest "VideoModeList"))
115 ;        (printf "  VideoModeList:\n    %016x" (rev vesa-scratch))
116 ;        (setint vesa-scratch (getguest "VideoModeList" 8))
117 ;        (printf " %016x\n" (rev vesa-scratch))
118 ;        (printf "  VESAModeInfo:\n")
119 ;        (dump-regs))
121 ;(definteger mp-scratch)
122 ;(vprobe GUEST:HaveMPConfig
123 ;        (printf "HaveMPConfig\n")
124 ;        (setint mp-scratch (& 0xffffffff (getguest "MPFloatingPointer")))
125 ;        (printf "   %016x\n" (rev (getguest mp-scratch)))
126 ;        (printf "   %016x\n" (rev (getguest (+ mp-scratch 8))))
127 ;        (dump-regs));
129 (defun conv (m)
130         (cond ((< m 1024)
131                (printf "(%dB)" m))
132               ((< m 1048576)
133                (printf "(%dkiB)" (/ m 1024)))
134               (1
135                (printf "(%dMiB)" (/ m 1048576)))))
138 (defun mem-type (t)
139         (cond ((== t 1)
140                "(RAM)      ")
141               ((== t 2)
142                "(RSVD)     ")
143               ((== t 3)
144                "(ACPI data)")
145               ((== t 4)
146                "(ACPI NVS) ")
147               (1
148                "(????)     ")))
150 (definteger smap-base)
151 (definteger smap-length)
152 (definteger smap-type)
154 (defun e820-entry (n)
155         (setint smap-base (getguest "e820_map" (* n 20)))
156         (setint smap-length (getguest "e820_map" (+ (* n 20) 8)))
157         (setint smap-type (& (getguest "e820_map" (+ (* n 20) 16)) 0xffffffff))
159         (printf "E820 %2d: 0x%016x - 0x%016x %s - "
160                 n smap-base (+ smap-base smap-length)
161                 (mem-type smap-type))
162         (conv smap-length)
163         (printf "\n")
164         (cond ((< n (getguest "e820_entries"))
165                (e820-entry (+ n 1)))))
167 (defun e820-map ()
168         (e820-entry 0)
169         (printf "\n"))
171 (defun dump-gdt ()
172         (printf "GDT:\n")
173         (printf "   %016x\n" (getguest 0x1f00))
174         (printf "   %016x\n" (getguest 0x1f08))
175         (printf "   %016x\n" (getguest 0x1f10))
176         (printf "   %016x\n" (getguest 0x1f18))
177         (printf "   %016x\n" (getguest 0x1f20))
178         (printf "   %016x\n" (getguest 0x1f28)))
181 (vprobe GUEST:RealModeFlamingDeath
182         (printf "Real mode flaming death\n")
183         (dump-regs))
185 (vprobe GUEST:Die
186         (printf "Boot sector called die!!!!\n")
187         (dump-regs))
189 ;(vprobe GUEST:DisplayKeycode
190 ;        (printf "DisplayKeycode (%s)\n   keys %016x\n   keyp %016x\n"
191 ;                PROBENAME (rev (getguest "keys")) (getguest "keyp")))
192 ;(vprobe GUEST:UpdateClock
193 ;        (printf "UpdateClock (%s)\n" PROBENAME)
194 ;        (printf "   ==> TOD: %016x\n" (rev (getguest "tod")))
195 ;        (dump-regs))
198 ;(vprobe GUEST:PrintMessage
199 ;        (printf "PrintMessage\n")
200 ;        (printf "PrintMessage\n  0x%016x\n  0x%016x\n  0x%016x\n  0x%016x\n"
201 ;                (getguest (+ RSP 24))
202 ;                (getguest (+ RSP 16))
203 ;                (getguest (+ RSP 8))
204 ;                (getguest RSP))
205 ;       (printf "  frameBuffer: %016x\n  frameBufferSize: %016x\n"
206 ;               (getguest "frameBuffer") (getguest "frameBufferSize"))
207 ;       (dump-regs))
209 (vprobe GUEST:here
210         (printf "Made it here (%s)\n" PROBENAME)
211         (dump-regs)
212         (e820-map))
214 (vprobe GUEST:IntoProtectedMode
215         (printf "IntoProtectedMode (%s)\n" PROBENAME)
216         (e820-map)
217         (dump-gdt)
218         (dump-regs))
220 (vprobe GUEST:IntoLongMode
221         (printf "IntoLongMode (%s)\n" PROBENAME)
222         (dump-gdt)
223         (dump-regs))
226 (vprobe GUEST:mapped
227         (printf "mapped (%s)\n" PROBENAME)
228         (e820-map))
230 (definteger pciAddress)
231 (definteger pciData)
232 (vprobe GUEST:HavePCI
233         (setint pciAddress (getguest "pciAddress"))
234         (setint pciData (getguest "pciData"))
235         (printf "PCI: %02x:%02x.%1x  %04x:%04x\n"
236                 (& (>> pciAddress 16) 0xff) (& (>> pciAddress 11) 0x1f)
237                 (& (>> pciAddress 8) 0x7)
238                 (& pciData 0xffff) (& (>> pciData 16) 0xffff)))
241 (definteger tmp)
242 (defun dump-irq-routing-table (t o l)
243         (cond ((< o l)
244                (do (setint tmp (getguest (+ t o)))
245                    (printf "   %016x\n" tmp)
246                    (dump-irq-routing-table t (+ o 16) l)))))
248 (definteger table)
249 (definteger tb)
250 (vprobe GUEST:RouteIRQ
251         (setint table (getguest "routingTable"))
252         (setint tb (>> (getguest table) 48))
253         (printf "IRQ Routing (table at %x):\n" table)
254         (cond ((> table 0)
255                (dump-irq-routing-table table 0 tb))))
258 ;(vprobe GUEST:VideoInit (printf "VideoInit: (%s)\n" PROBENAME)(dump-regs))
259 ;(vprobe GUEST:MapIORegion (printf "MapIORegion: (%s)\n" PROBENAME)(dump-regs))
264 (vprobe GUEST:test
265         (printf "test (%s)!\n   tval  = 0x%016x\n   tval2 = 0x%016x\n"
266                 PROBENAME (getguest "tval") (getguest "tval2")))
270 ;        (printf "   bitmap[0]: %016x\n   bitmap[8]: %016x\n"
271 ;                (rev (getguest 0x18000))(rev (getguest 0x18008)))
272 ;        (dump-regs))
274 (definteger pts)
275 (defun dump-pt (addr)
276         (printf "Walking page tables for faulting address %016x\n" addr)
277         (setint pts (getguest (+ (& CR3 0xfffffffffffff000)
278                                  (* 8 (& (>> addr 39) 0x1ff)))))
279         (printf "  => PML4E: %016x\n" pts)
280         (setint pts (getguest (+ (& pts 0x000ffffffffff000)
281                                  (* 8 (& (>> addr 30) 0x1ff)))))
282         (printf "  => PDPE:  %016x\n" pts)
283         (setint pts (getguest (+ (& pts 0x000ffffffffff000)
284                                  (* 8 (& (>> addr 21) 0x1ff)))))
285         (printf "  => PDE:   %016x\n" pts)
286         (setint pts (getguest (+ (& pts 0x000ffffffffff000)
287                                  (* 8 (& (>> addr 12) 0x1ff)))))
288         (printf "  => PTE:   %016x\n" pts))
290 ;(defun print-idt (v)
291 ;        (printf "  %3d: 0x%016x%016x\n"
292 ;                v
293 ;                (getguest (+ 0x1008 (* v 16)))
294 ;                (getguest (+ 0x1000 (* v 16))))
295 ;        (cond ((> v 0)
296 ;               (print-idt (- v 1)))))
297 ;(vprobe GUEST:IDTDone
298 ;        (printf "IDTDone (%s)\n" PROBENAME)
299 ;        (print-idt 48)
300 ;        (dump-regs))
302 ;(defun ptes (n)
303 ;        (printf "  PTE %x: 0x%016x\n"
304 ;                n (getguest (+ 0x5000 (* 8 n))))
305 ;        (cond ((> n 0)
306 ;               (ptes (- n 1)))))
307        
308 ;(vprobe GUEST:PageDone
309 ;        (printf "PageDone (%s)\n  (limit: %08x)\n"
310 ;                PROBENAME (& 0xffffffff (getguest "e820_map" 8)))
311 ;        (printf "  PML4E: 0x%016x\n  PDPTE: 0x%016x\n  PDE:   0x%016x\n"
312 ;                (getguest 0x2000)
313 ;                (getguest 0x3000)
314 ;                (getguest 0x4000))
315 ;        (ptes 10))
318 ;(vprobe GUEST:foo
319 ;        (printf "foo (%s): 0x%08x:0x%08x\n" PROBENAME
320 ;                (& 0xffffffff (getguest RSP))
321 ;                (& 0xffffffff (getguest (+ RSP 4))))
322 ;        (printf "GDT: 00: %016x\n     08: %016x\n     10: %016x\n     18: %016x\n"
323 ;                (getguest 0x1f00)
324 ;                (getguest 0x1f08)
325 ;                (getguest 0x1f10)
326 ;                (getguest 0x1f18))
327 ;        (dump-regs))
329 ;(vprobe GUEST_WRITE:0x1f10
330 ;        (printf "GUEST_WRITE:0x1f10: %s\n" PROBENAME)
331 ;        (dump-regs))
334 ;(defun dump-tss (off)
335 ;        (printf " TSS+%2x: %016x\n" off (getguest "tss_start" off))
336 ;        (cond (off
337 ;               (dump-tss (- off 8)))))
339 ;(vprobe GUEST:EndPopTSS
340 ;        (printf "EndPopTSS (%s), TSS:\n" PROBENAME)
341 ;        (dump-tss 96)
342 ;        (dump-gdt)
343 ;        (dump-regs))
345 ;(vprobe GUEST:PopulateTSS
346 ;        (printf "PopulateTSS: (%s)\nPhysmem bitmask:\n" PROBENAME)
347 ;        (printf "   %016x\n" (rev (getguest 
348         
349 ;(defun dump-cpuid-fun (current max struct)
350 ;        (printf "  %02x: %08x %08x %08x %08x\n" current
351 ;                (& 0xffffffff (getguest struct))
352 ;                (& 0xffffffff (getguest (+ struct 4)))
353 ;                (& 0xffffffff (getguest (+ struct 8)))
354 ;                (& 0xffffffff (getguest (+ struct 12))))
355 ;        (cond ((< current (- max 1))
356 ;               (dump-cpuid-fun (+ current 1) max (+ struct 16)))))
358 ;(definteger cpuid-struct)
359 ;(definteger cpuid-max)
360 ;(definteger cpuid-base)
361 ;(defun dump-cpuid ()
362 ;        (setint cpuid-struct (getguest "CPUIDInfo"))
364         ; Level 0
365 ;        (setint cpuid-max (getguest cpuid-struct))
366 ;        (setint cpuid-base (+ cpuid-struct 24))
368 ;        (printf "  CPUID Info for functions 0 (entries %x)\n" cpuid-max)
369 ;        (cond ((> cpuid-max 0)
370 ;               (dump-cpuid-fun 0 cpuid-max cpuid-base)))
371         ; skip to next level
372 ;        (setint cpuid-base (+ cpuid-base (* cpuid-max 16)))
374         ; Level 4
375 ;        (setint cpuid-max (getguest (+ cpuid-struct 8)))
376 ;        (cond ((> cpuid-max 0)
377 ;               (do (printf "  CPUID Info for functions 4 (entries %x)\n"
378 ;                           cpuid-max)
379 ;                   (dump-cpuid-fun 0 cpuid-max cpuid-base))))
380         ; skip to next level
381 ;        (setint cpuid-base (+ cpuid-base (* cpuid-max 16)))
383         ; Level 8
384 ;        (setint cpuid-max (getguest (+ cpuid-struct 16)))
385 ;        (printf "  CPUID Info for functions 8 (entries %x)\n" cpuid-max)
386 ;        (cond ((> cpuid-max 0)
387 ;               (dump-cpuid-fun 0 cpuid-max cpuid-base))))
389 ;(vprobe GUEST:CPUFeaturesDone
390 ;        (printf "CPUFeaturesDone (%s)\n" PROBENAME)
391 ;        (dump-cpuid))
393 (defun dump-stack (off)
394         (printf " %4x(%%rsp): %016x\n" off (getguest (+ RSP off)))
395         (cond (off
396                (dump-stack (- off 8)))))
398 (vprobe GUEST:Fatal64
399         (printf "Fatal64!\n")
400         (dump-stack 64)
401         (cond (CR2 (dump-pt CR2)))
402         (dump-regs))
404 (defstring stk)
405 (defun badness (a)
406         (printf "Badness (%s): code = 0x%08x!\n  faulting insn = %016x\n  %s\n"
407                 PROBENAME a (rev (getguest RIP)) stk)
408         (dump-stack 64)
409         (dump-gdt)
410         (dump-regs))
412 (vprobe GUEST:HandlePF
413         (printf "HandlePF (%s)\n" PROBENAME)
414         (dump-stack 64)
415         (cond (CR2 (dump-pt CR2)))
416         (dump-regs))
418 (vprobe Guest_UD (badness ARG0))
419 (vprobe Guest_TS (badness ARG0))
420 (vprobe Guest_DF (badness ARG0))
421 (vprobe Guest_SS (badness ARG0))
422 (vprobe Guest_GP (badness ARG0))
423 (vprobe Guest_PF (badness ARG0))
424 (vprobe Guest_TripleFault (badness 0))
426 ;(defaggr mouse 1 0)
427 ;(vprobe Guest_IRQ
428 ;         (cond ((== ARG0 0x2c)
429 ;                (aggr mouse (1) () 1))))
430 ;(vprobe VMM1Hz
431 ;        (printf "\n")
432 ;        (logaggr mouse)
433 ;        (clearaggr mouse))
435 ;(vprobe Guest_IRQ
436 ;        (cond ((!= ARG0 0x20)
437 ;               (do (printf "%s: tick (0x%x)\n" PROBENAME ARG0)
438 ;                   (dump-regs)))))
440 ;(defaggr rip 1 0)
441 ;(vprobe USEC:1001
442 ;        (aggr rip (RIP) () 1))
443 ;(vprobe VMM1Hz
444 ;        (logaggr rip)
445 ;        (clearaggr rip))
447 ;(vprobe GUEST:LBA2CHS (printf "%s:\n" PROBENAME)(dump-regs))
448 ;(vprobe GUEST:LBA2CHS_Done (printf "%s:\n" PROBENAME)(dump-regs))
451 ;(definteger dbt-addr)
452 ;(definteger dbt)
454 ;(defun byte (i b)
455 ;        (& 0xff (>> i b)))
457 ;(defun dump-dbt ()
458 ;        (setint dbt-addr (| (& 0xfffff (<< ES 4)) (& 0xffff RDI)))
459 ;        (setint dbt (getguest dbt-addr))
460 ;        (printf "Disk Base Table (0x%08x)\n" dbt-addr)
461 ;        (printf "00: %02x\n" (byte dbt 0))
462 ;        (printf "01: %02x\n" (byte dbt 1))
463 ;        (printf "02: %02x\n" (byte dbt 2))
464 ;        (printf "03: %02x\n" (byte dbt 3))
465 ;        (printf "04: %02x\n" (byte dbt 4))
466 ;        (printf "05: %02x\n" (byte dbt 5))
467 ;        (printf "06: %02x\n" (byte dbt 6))
468 ;        (printf "07: %02x\n" (byte dbt 7))
469 ;        (setint dbt (getguest (+ dbt-addr 8)))
470 ;        (printf "08: %02x\n" (byte dbt 0))
471 ;        (printf "09: %02x\n" (byte dbt 1))
472 ;        (printf "0a: %02x\n" (byte dbt 2)))
474 ;(vprobe GUEST:_HaveParams
475 ;        (dump-dbt)
476 ;        (dump-regs))