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)