|
@@ -389,6 +389,16 @@ static int kvm_mmu_get_page_handler(struct trace_seq *s,
|
|
|
return kvm_mmu_print_role(s, record, event, context);
|
|
|
}
|
|
|
|
|
|
+#define PT_WRITABLE_SHIFT 1
|
|
|
+#define PT_WRITABLE_MASK (1ULL << PT_WRITABLE_SHIFT)
|
|
|
+
|
|
|
+static unsigned long long
|
|
|
+process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
|
|
|
+{
|
|
|
+ unsigned long pte = args[0];
|
|
|
+ return pte & PT_WRITABLE_MASK;
|
|
|
+}
|
|
|
+
|
|
|
int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
|
|
|
{
|
|
|
init_disassembler();
|
|
@@ -415,5 +425,12 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
|
|
|
pevent_register_event_handler(pevent, -1, "kvmmmu",
|
|
|
"kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
|
|
|
NULL);
|
|
|
+
|
|
|
+ pevent_register_print_function(pevent,
|
|
|
+ process_is_writable_pte,
|
|
|
+ PEVENT_FUNC_ARG_INT,
|
|
|
+ "is_writable_pte",
|
|
|
+ PEVENT_FUNC_ARG_LONG,
|
|
|
+ PEVENT_FUNC_ARG_VOID);
|
|
|
return 0;
|
|
|
}
|