Bring kernel version checking (utsname) into the central process.
[virt-mem.git] / dmesg / virt_dmesg.ml
index dd41d26..1886a92 100644 (file)
@@ -21,58 +21,56 @@ open Printf
 
 open Virt_mem_gettext.Gettext
 open Virt_mem_utils
+open Virt_mem_types
 open Virt_mem_mmap
 
-let run debug images =
-  List.iter (
-    fun (_, name, arch, mem, lookup_ksym) ->
-      try
-       (* I don't know why but this symbol doesn't exist in 2.6.9
-        * even in kallsyms.  Hence this won't work with that kernel.
-        * It's possible we can fall back to memory scanning. XXX
-        *)
-       let log_buf = lookup_ksym "log_buf" in
-       let log_buf = follow_pointer mem log_buf in
-       let log_buf_len = lookup_ksym "log_buf_len" in
-       let log_buf_len = Int64.of_int32 (get_C_int mem log_buf_len) in
-(*     let log_start = lookup_ksym "log_start" in
+let run debug (_, name, arch, mem, lookup_ksym, _) =
+  try
+    (* I don't know why but this symbol doesn't exist in 2.6.9
+     * even in kallsyms.  Hence this won't work with that kernel.
+     * It's possible we can fall back to memory scanning. XXX
+     *)
+    let log_buf = lookup_ksym "log_buf" in
+    let log_buf = follow_pointer mem log_buf in
+    let log_buf_len = lookup_ksym "log_buf_len" in
+    let log_buf_len = Int64.of_int32 (get_C_int mem log_buf_len) in
+    (* let log_start = lookup_ksym "log_start" in
        let log_start = get_C_long mem log_start in *)
-       let log_end = lookup_ksym "log_end" in
-       let log_end = get_C_long mem log_end in
-(*     let con_start = lookup_ksym "con_start" in
+    let log_end = lookup_ksym "log_end" in
+    let log_end = get_C_long mem log_end in
+    (* let con_start = lookup_ksym "con_start" in
        let con_start = get_C_long mem con_start in *)
-       let logged_chars = lookup_ksym "logged_chars" in
-       let logged_chars = get_C_long mem logged_chars in
+    let logged_chars = lookup_ksym "logged_chars" in
+    let logged_chars = get_C_long mem logged_chars in
 
-       (* This is basically the same algorithm from printk.c:do_syslog
-        * type=3, translated into OCaml.  Unlike the kernel version
-        * however we don't copy the buffer backwards.
-        *)
-       let get_log_buf idx =
-         let addr = log_buf +^ (idx &^ (log_buf_len -^ 1L)) in
-         Char.chr (get_byte mem addr)
-       in
+    (* This is basically the same algorithm from printk.c:do_syslog
+     * type=3, translated into OCaml.  Unlike the kernel version
+     * however we don't copy the buffer backwards.
+     *)
+    let get_log_buf idx =
+      let addr = log_buf +^ (idx &^ (log_buf_len -^ 1L)) in
+      Char.chr (get_byte mem addr)
+    in
 
-       let count = log_buf_len in
-       let count = if count > logged_chars then logged_chars else count in
-       let limit = log_end in
+    let count = log_buf_len in
+    let count = if count > logged_chars then logged_chars else count in
+    let limit = log_end in
 
-       let rec loop i =
-         if i >= 0L then (
-           let j = limit-^1L-^i in
-           if j +^ log_buf_len >= log_end then (
-             let c = get_log_buf j in
-             printf "%c" c;
-             loop (i-^1L)
-           )
-         )
-       in
-       loop (count-^1L)
-      with
-       Not_found ->
-         eprintf (f_"%s: could not find kernel log buffer in kernel image\n")
-           name
-  ) images
+    let rec loop i =
+      if i >= 0L then (
+       let j = limit-^1L-^i in
+       if j +^ log_buf_len >= log_end then (
+         let c = get_log_buf j in
+         printf "%c" c;
+         loop (i-^1L)
+       )
+      )
+    in
+    loop (count-^1L)
+  with
+    Not_found ->
+      eprintf (f_"%s: could not find kernel log buffer in kernel image\n")
+       name
 
 let summary = s_"display kernel messages"
 let description = s_"\