|
@@ -229,6 +229,8 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
|
|
unsigned char buf2[BUFSZ];
|
|
unsigned char buf2[BUFSZ];
|
|
size_t ret_len;
|
|
size_t ret_len;
|
|
u64 objdump_addr;
|
|
u64 objdump_addr;
|
|
|
|
+ const char *objdump_name;
|
|
|
|
+ char decomp_name[KMOD_DECOMP_LEN];
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
|
|
pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
|
|
@@ -289,9 +291,25 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
|
|
state->done[state->done_cnt++] = al.map->start;
|
|
state->done[state->done_cnt++] = al.map->start;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ objdump_name = al.map->dso->long_name;
|
|
|
|
+ if (dso__needs_decompress(al.map->dso)) {
|
|
|
|
+ if (dso__decompress_kmodule_path(al.map->dso, objdump_name,
|
|
|
|
+ decomp_name,
|
|
|
|
+ sizeof(decomp_name)) < 0) {
|
|
|
|
+ pr_debug("decompression failed\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ objdump_name = decomp_name;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Read the object code using objdump */
|
|
/* Read the object code using objdump */
|
|
objdump_addr = map__rip_2objdump(al.map, al.addr);
|
|
objdump_addr = map__rip_2objdump(al.map, al.addr);
|
|
- ret = read_via_objdump(al.map->dso->long_name, objdump_addr, buf2, len);
|
|
|
|
|
|
+ ret = read_via_objdump(objdump_name, objdump_addr, buf2, len);
|
|
|
|
+
|
|
|
|
+ if (dso__needs_decompress(al.map->dso))
|
|
|
|
+ unlink(objdump_name);
|
|
|
|
+
|
|
if (ret > 0) {
|
|
if (ret > 0) {
|
|
/*
|
|
/*
|
|
* The kernel maps are inaccurate - assume objdump is right in
|
|
* The kernel maps are inaccurate - assume objdump is right in
|