@@ -47,11 +47,16 @@ void libafl_getwork(void *input_map_qemu, uint64_t input_map_qemu_sz);
47
47
void libafl_finishwork (void );
48
48
void libafl_crash (void );
49
49
void libafl_restore (void );
50
+ void libafl_clear_map (void );
51
+ void libafl_user_crash (void );
52
+ void libafl_enable_hooks (void );
53
+ void libafl_disable_hooks (void );
50
54
51
55
static uint64_t input_map_qemu_addr ;
52
56
static uint64_t input_map_qemu_size ;
53
57
54
58
static bool RESTORING_SNAPSHOT = false;
59
+ static bool RESTORING_FROM_USERMODE_PANIC = false;
55
60
56
61
//#define AFL_DEBUG 1
57
62
@@ -64,6 +69,7 @@ void HELPER(libafl_qemu_handle_breakpoint)(CPUArchState *env)
64
69
cpu_loop_exit (cpu );
65
70
}
66
71
72
+ void libafl_load_snapshot_restart (void );
67
73
void save_snapshot_bh (void * opaque );
68
74
void load_snapshot_bh (void * opaque );
69
75
@@ -78,6 +84,12 @@ void save_snapshot_bh(void *opaque)
78
84
printf ("Saving finished\n" );
79
85
}
80
86
87
+ void libafl_load_snapshot_restart (void )
88
+ {
89
+ libafl_crash ();
90
+ aio_bh_schedule_oneshot_full (qemu_get_aio_context (), load_snapshot_bh , NULL , "load_snapshot" );
91
+ }
92
+
81
93
void load_snapshot_bh (void * opaque )
82
94
{
83
95
Error * err = NULL ;
@@ -93,6 +105,7 @@ void load_snapshot_bh(void *opaque)
93
105
error_report ("Could not load snapshot" );
94
106
}
95
107
RESTORING_SNAPSHOT = true;
108
+ RESTORING_FROM_USERMODE_PANIC = false;
96
109
if (loaded && saved_vm_running ) {
97
110
vm_start ();
98
111
}
@@ -128,19 +141,33 @@ target_ulong HELPER(libafl_qemu_hypercall)(CPUArchState *env, target_ulong r0, t
128
141
129
142
aio_bh_schedule_oneshot_full (qemu_get_aio_context (), load_snapshot_bh , NULL , "load_snapshot" );
130
143
break ;
144
+ case 4 :
145
+ #ifdef AFL_DEBUG
146
+ printf ("!!!! User crash !!!!!\n" );
147
+ #endif
148
+ libafl_user_crash ();
149
+ break ;
131
150
case 0 : // fallthrough
132
151
default :
152
+ if (RESTORING_FROM_USERMODE_PANIC ) {
153
+ //libafl_clear_map();
154
+ //libafl_crash();
155
+ break ;
156
+ }
133
157
if (RESTORING_SNAPSHOT ) {
134
158
// reset exit kind
135
159
libafl_finishwork ();
136
160
// restarting after crash, no need to init again
161
+ //RESTORING_SNAPSHOT = false;
137
162
break ;
138
163
}
139
164
input_map_qemu_addr = r1 ;
140
165
input_map_qemu_size = r2 ;
141
166
libafl_init_fuzzer ();
142
-
167
+ vm_stop ( RUN_STATE_SAVE_VM ); // "sync barrier"
143
168
aio_bh_schedule_oneshot_full (qemu_get_aio_context (), save_snapshot_bh , NULL , "save_snapshot" );
169
+
170
+ RESTORING_FROM_USERMODE_PANIC = true; // we initialized once, ignore next initialize
144
171
break ;
145
172
}
146
173
#ifdef AFL_DEBUG
0 commit comments