diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java b/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
index a91049d..06b3624 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
@@ -34,19 +34,58 @@
 import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 
+class KvmHypEvent {
+    public final int cpu;
+    public final double timestamp;
+    public final String name;
+    public final String args;
+    public final boolean valid;
+
+    private static final Pattern LOST_EVENT_PATTERN = Pattern.compile(
+            "^CPU:[0-9]* \\[LOST ([0-9]*) EVENTS\\]");
+
+    public KvmHypEvent(String str) {
+        Matcher matcher = LOST_EVENT_PATTERN.matcher(str);
+        if (matcher.find())
+            throw new OutOfMemoryError("Lost " + matcher.group(1) + " events");
+
+        Pattern pattern = Pattern.compile(
+                "^\\[([0-9]*)\\][ \t]*([0-9]*\\.[0-9]*): (\\S+) (.*)");
+
+        matcher = pattern.matcher(str);
+        if (!matcher.find()) {
+            valid = false;
+            cpu = 0;
+            timestamp = 0;
+            name = "";
+            args = "";
+            CLog.w("Failed to parse hyp event: " + str);
+            return;
+        }
+
+        cpu = Integer.parseInt(matcher.group(1));
+        timestamp = Double.parseDouble(matcher.group(2));
+        name = matcher.group(3);
+        args = matcher.group(4);
+        valid = true;
+    }
+
+    public String toString() {
+        return String.format(
+                "[%03d]\t%f: %s %s", cpu, timestamp, name, args);
+    }
+}
+
 /** This class provides utilities to interact with the hyp tracing subsystem */
 public final class KvmHypTracer {
 
     private static final String HYP_TRACING_ROOT = "/sys/kernel/tracing/hyp/";
     private static final int DEFAULT_BUF_SIZE_KB = 4 * 1024;
-    private static final Pattern LOST_EVENT_PATTERN = Pattern.compile(
-            "^CPU:[0-9]* \\[LOST ([0-9]*) EVENTS\\]");
 
     private final CommandRunner mRunner;
     private final ITestDevice mDevice;
     private final int mNrCpus;
     private final String mHypEvents[];
-    private final Pattern mHypEventPattern;
 
     private final ArrayList<File> mTraces;
 
@@ -75,8 +114,6 @@
         mTraces = new ArrayList<File>();
         mNrCpus = Integer.parseInt(mRunner.run("nproc"));
         mHypEvents = events;
-        mHypEventPattern = Pattern.compile(
-            "^\\[([0-9]*)\\][ \t]*([0-9]*\\.[0-9]*): (" + String.join("|", mHypEvents) + ") (.*)");
     }
 
     public String run(String payload_cmd) throws Exception {
@@ -140,6 +177,20 @@
         return true;
     }
 
+    private KvmHypEvent getNextEvent(BufferedReader br) throws Exception {
+        KvmHypEvent event;
+        String l;
+
+        if ((l = br.readLine()) == null)
+            return null;
+
+        event = new KvmHypEvent(l);
+        if (!event.valid)
+            return null;
+
+        return event;
+    }
+
     public SimpleStats getDurationStats() throws Exception {
         String[] reqEvents = {"hyp_enter", "hyp_exit"};
         SimpleStats stats = new SimpleStats();
@@ -152,26 +203,21 @@
             double last = 0.0, hyp_enter = 0.0;
             String l, prev_event = "";
             while ((l = br.readLine()) != null) {
-                Matcher matcher = LOST_EVENT_PATTERN.matcher(l);
-                if (matcher.find())
-                    throw new OutOfMemoryError("Lost " + matcher.group(1) + " events");
+                KvmHypEvent hypEvent = new KvmHypEvent(l);
 
-                matcher = mHypEventPattern.matcher(l);
-                if (!matcher.find()) {
-                    CLog.w("Failed to parse hyp event: " + l);
+                if (!hypEvent.valid)
                     continue;
-                }
 
-                int cpu = Integer.parseInt(matcher.group(1));
+                int cpu = hypEvent.cpu;
                 if (cpu < 0 || cpu >= mNrCpus)
                     throw new ParseException("Incorrect CPU number: " + cpu, 0);
 
-                double cur = Double.parseDouble(matcher.group(2));
+                double cur = hypEvent.timestamp;
                 if (cur < last)
                     throw new ParseException("Time must not go backward: " + cur, 0);
                 last = cur;
 
-                String event = matcher.group(3);
+                String event = hypEvent.name;
                 if (event.equals(prev_event)) {
                     throw new ParseException("Hyp event found twice in a row: " + trace + " - " + l,
                                              0);
@@ -186,7 +232,7 @@
                         hyp_enter = cur;
                         break;
                     default:
-                        throw new ParseException("Unexpected line in trace" + l, 0);
+                        throw new ParseException("Unexpected line in trace " + l, 0);
                 }
                 prev_event = event;
             }
