add pt_insn_get_cr3
Change-Id: Ie8716eb3f46c6eea7cd400f6ffac7b7ddb2cf0ca
diff --git a/libipt/include/intel-pt.h.in b/libipt/include/intel-pt.h.in
index ae0df6b..3a884db 100644
--- a/libipt/include/intel-pt.h.in
+++ b/libipt/include/intel-pt.h.in
@@ -2000,6 +2000,18 @@
extern pt_export int pt_insn_get_sync_offset(struct pt_insn_decoder *decoder,
uint64_t *offset);
+/** Get the current CR3
+ *
+ * Fills the current CR3 of \@decoder into \@cr3.
+ *
+ * Returns zero on success, a negative error code otherwise.
+ *
+ * Returns -pte_invalid if \@decoder or \@offset is NULL.
+ * Returns -pte_nosync if \@decoder is out of sync.
+ */
+extern pt_export int pt_insn_get_cr3(struct pt_insn_decoder *decoder,
+ uint64_t *cr3);
+
/** Get the traced image.
*
* The returned image may be modified as long as no decoder that uses this
diff --git a/libipt/src/pt_insn_decoder.c b/libipt/src/pt_insn_decoder.c
index 8dbdd03..0ce1e78 100644
--- a/libipt/src/pt_insn_decoder.c
+++ b/libipt/src/pt_insn_decoder.c
@@ -211,6 +211,17 @@
return pt_qry_get_sync_offset(&decoder->query, offset);
}
+int pt_insn_get_cr3(struct pt_insn_decoder *decoder, uint64_t *cr3)
+{
+ if (!decoder || !cr3)
+ return -pte_invalid;
+
+ /* check for being in sync? */
+
+ *cr3 = decoder->asid.cr3;
+ return 0;
+}
+
struct pt_image *pt_insn_get_image(struct pt_insn_decoder *decoder)
{
if (!decoder)