git.annexia.org
/
virt-mem.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
8e753ba
)
virt-dmesg working.
author
Richard W.M. Jones
<rjones@redhat.com>
Tue, 3 Jun 2008 22:27:25 +0000
(23:27 +0100)
committer
Richard W.M. Jones
<rjones@redhat.com>
Tue, 3 Jun 2008 22:27:25 +0000
(23:27 +0100)
dmesg/virt_dmesg.ml
patch
|
blob
|
history
diff --git
a/dmesg/virt_dmesg.ml
b/dmesg/virt_dmesg.ml
index
2435bbc
..
10d231f
100644
(file)
--- a/
dmesg/virt_dmesg.ml
+++ b/
dmesg/virt_dmesg.ml
@@
-45,13
+45,42
@@
let () =
* It's possible we can fall back to memory scanning. XXX
*)
let log_buf = lookup_ksym "log_buf" in
* 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 = lookup_ksym "log_buf_len" in
- let log_start = lookup_ksym "log_start" 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 = lookup_ksym "log_end" in
- let con_start = lookup_ksym "con_start" 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
- ()
+ (* 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 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")
with
Not_found ->
eprintf (f_"%s: could not find kernel log buffer in kernel image\n")