Skip to content

Commit 43302cd

Browse files
cube0x8rmalmain
andcommitted
Fixed qemu usermode snapshot (#66)
* Fixed qemu usermode snapshot --------- Co-authored-by: Romain Malmain <[email protected]>
1 parent c6d56fc commit 43302cd

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

accel/tcg/user-exec.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ static PageFlagsNode *pageflags_find(target_ulong start, target_ulong last)
153153
return n ? container_of(n, PageFlagsNode, itree) : NULL;
154154
}
155155

156+
//// --- Begin LibAFL code ---
157+
IntervalTreeRoot * pageflags_get_root(void) {
158+
return &pageflags_root;
159+
}
160+
//// --- End LibAFL code ---
161+
156162
static PageFlagsNode *pageflags_next(PageFlagsNode *p, target_ulong start,
157163
target_ulong last)
158164
{

include/exec/cpu-all.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include "hw/core/cpu.h"
2727
#include "qemu/rcu.h"
2828

29+
//// --- Begin LibAFL code ---
30+
#include "qemu/interval-tree.h"
31+
//// --- End LibAFL code ---
32+
2933
/* some important defines:
3034
*
3135
* HOST_BIG_ENDIAN : whether the host cpu is big endian and
@@ -192,6 +196,10 @@ int page_get_flags(target_ulong address);
192196
void page_set_flags(target_ulong start, target_ulong last, int flags);
193197
void page_reset_target_data(target_ulong start, target_ulong last);
194198

199+
//// --- Begin LibAFL code ---
200+
IntervalTreeRoot* pageflags_get_root(void);
201+
//// --- End LibAFL code ---
202+
195203
/**
196204
* page_check_range
197205
* @start: first byte of range

include/libafl/user.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ struct libafl_mapinfo {
1414
};
1515

1616
IntervalTreeNode * libafl_maps_first(IntervalTreeRoot * map_info);
17-
IntervalTreeNode * libafl_maps_next(IntervalTreeNode *node, struct libafl_mapinfo* ret);
17+
IntervalTreeNode * libafl_maps_next(IntervalTreeNode *pageflags_maps_node, IntervalTreeRoot *proc_maps_node, struct libafl_mapinfo* ret);

linux-user/syscall.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13806,27 +13806,33 @@ IntervalTreeNode * libafl_maps_first(IntervalTreeRoot * map_info) {
1380613806
return interval_tree_iter_first(map_info, 0, -1);
1380713807
}
1380813808

13809-
IntervalTreeNode * libafl_maps_next(IntervalTreeNode *node, struct libafl_mapinfo* ret) {
13809+
IntervalTreeNode * libafl_maps_next(IntervalTreeNode *pageflags_maps_node, IntervalTreeRoot *proc_maps_root, struct libafl_mapinfo* ret) {
1381013810
ret->is_valid = false;
1381113811

13812-
if (!node || !ret) {
13812+
if (!pageflags_maps_node || !ret) {
1381313813
return NULL;
1381413814
}
1381513815

13816-
MapInfo *e = container_of(node, MapInfo, itree);
13816+
MapInfo *e;
13817+
IntervalTreeNode *proc_map_interval_node;
1381713818

13818-
if (h2g_valid(e->itree.start)) {
13819-
unsigned long min = e->itree.start;
13820-
unsigned long max = e->itree.last + 1;
13819+
if (h2g_valid(pageflags_maps_node->start)) {
13820+
unsigned long min = pageflags_maps_node->start;
13821+
unsigned long max = pageflags_maps_node->last + 1;
1382113822
int flags = page_get_flags(h2g(min));
1382213823

1382313824
max = h2g_valid(max - 1) ?
1382413825
max : (uintptr_t) g2h_untagged(GUEST_ADDR_MAX) + 1;
1382513826

13827+
// I guess this is useless? we are walking the entire pageflags_root tree, so we should always have a valid node
1382613828
if (!page_check_range(h2g(min), max - min, flags)) {
13827-
return libafl_maps_next(interval_tree_iter_next(node, 0, -1), ret);
13829+
return libafl_maps_next(interval_tree_iter_next(pageflags_maps_node, 0, -1), proc_maps_root, ret);
1382813830
}
1382913831

13832+
// Should we check for NULL? Not sure, but if an inteval is in pageflags, then it should be in proc_maps too
13833+
proc_map_interval_node = interval_tree_iter_first(proc_maps_root, min, min);
13834+
e = container_of(proc_map_interval_node, MapInfo, itree);
13835+
1383013836
int libafl_flags = 0;
1383113837
if (flags & PAGE_READ) libafl_flags |= PROT_READ;
1383213838
if (flags & PAGE_WRITE_ORG) libafl_flags |= PROT_WRITE;
@@ -13840,9 +13846,9 @@ IntervalTreeNode * libafl_maps_next(IntervalTreeNode *node, struct libafl_mapinf
1384013846
ret->flags = libafl_flags;
1384113847
ret->is_priv = e->is_priv;
1384213848

13843-
return interval_tree_iter_next(node, 0, -1);
13849+
return interval_tree_iter_next(pageflags_maps_node, 0, -1);
1384413850
} else {
13845-
return libafl_maps_next(interval_tree_iter_next(node, 0, -1), ret);
13851+
return libafl_maps_next(interval_tree_iter_next(pageflags_maps_node, 0, -1), proc_maps_root, ret);
1384613852
}
1384713853
}
1384813854

0 commit comments

Comments
 (0)