traced_probes: Add systrace/0 event

This requires a workaround to handle the event name begining with a
number since tokens begining with numbers aren't vaid proto message
names or field names.

Bug: 133453890
Change-Id: If5bc65fd9aea336d667032151dda200c6287a870
diff --git a/Android.bp b/Android.bp
index 4e02f6b..39c92d1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1385,6 +1385,7 @@
     "protos/perfetto/trace/ftrace/sched.proto",
     "protos/perfetto/trace/ftrace/signal.proto",
     "protos/perfetto/trace/ftrace/sync.proto",
+    "protos/perfetto/trace/ftrace/systrace.proto",
     "protos/perfetto/trace/ftrace/task.proto",
     "protos/perfetto/trace/ftrace/test_bundle_wrapper.proto",
     "protos/perfetto/trace/ftrace/vmscan.proto",
@@ -1423,6 +1424,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/sched.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/signal.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/sync.pb.cc",
+    "external/perfetto/protos/perfetto/trace/ftrace/systrace.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/task.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/test_bundle_wrapper.pb.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/vmscan.pb.cc",
@@ -1462,6 +1464,7 @@
     "protos/perfetto/trace/ftrace/sched.proto",
     "protos/perfetto/trace/ftrace/signal.proto",
     "protos/perfetto/trace/ftrace/sync.proto",
+    "protos/perfetto/trace/ftrace/systrace.proto",
     "protos/perfetto/trace/ftrace/task.proto",
     "protos/perfetto/trace/ftrace/test_bundle_wrapper.proto",
     "protos/perfetto/trace/ftrace/vmscan.proto",
@@ -1500,6 +1503,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/sched.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/signal.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/sync.pb.h",
+    "external/perfetto/protos/perfetto/trace/ftrace/systrace.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/task.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/test_bundle_wrapper.pb.h",
     "external/perfetto/protos/perfetto/trace/ftrace/vmscan.pb.h",
@@ -1542,6 +1546,7 @@
     "protos/perfetto/trace/ftrace/sched.proto",
     "protos/perfetto/trace/ftrace/signal.proto",
     "protos/perfetto/trace/ftrace/sync.proto",
+    "protos/perfetto/trace/ftrace/systrace.proto",
     "protos/perfetto/trace/ftrace/task.proto",
     "protos/perfetto/trace/ftrace/test_bundle_wrapper.proto",
     "protos/perfetto/trace/ftrace/vmscan.proto",
@@ -1581,6 +1586,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/sched.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.cc",
+    "external/perfetto/protos/perfetto/trace/ftrace/systrace.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/task.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/test_bundle_wrapper.pbzero.cc",
     "external/perfetto/protos/perfetto/trace/ftrace/vmscan.pbzero.cc",
@@ -1620,6 +1626,7 @@
     "protos/perfetto/trace/ftrace/sched.proto",
     "protos/perfetto/trace/ftrace/signal.proto",
     "protos/perfetto/trace/ftrace/sync.proto",
+    "protos/perfetto/trace/ftrace/systrace.proto",
     "protos/perfetto/trace/ftrace/task.proto",
     "protos/perfetto/trace/ftrace/test_bundle_wrapper.proto",
     "protos/perfetto/trace/ftrace/vmscan.proto",
@@ -1659,6 +1666,7 @@
     "external/perfetto/protos/perfetto/trace/ftrace/sched.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.h",
+    "external/perfetto/protos/perfetto/trace/ftrace/systrace.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/task.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/test_bundle_wrapper.pbzero.h",
     "external/perfetto/protos/perfetto/trace/ftrace/vmscan.pbzero.h",
diff --git a/protos/BUILD b/protos/BUILD
index 1a9a05b..a49267d 100644
--- a/protos/BUILD
+++ b/protos/BUILD
@@ -504,6 +504,7 @@
         "perfetto/trace/ftrace/sched.proto",
         "perfetto/trace/ftrace/signal.proto",
         "perfetto/trace/ftrace/sync.proto",
+        "perfetto/trace/ftrace/systrace.proto",
         "perfetto/trace/ftrace/task.proto",
         "perfetto/trace/ftrace/test_bundle_wrapper.proto",
         "perfetto/trace/ftrace/vmscan.proto",
@@ -560,6 +561,7 @@
         "perfetto/trace/ftrace/sched.proto",
         "perfetto/trace/ftrace/signal.proto",
         "perfetto/trace/ftrace/sync.proto",
+        "perfetto/trace/ftrace/systrace.proto",
         "perfetto/trace/ftrace/task.proto",
         "perfetto/trace/ftrace/test_bundle_wrapper.proto",
         "perfetto/trace/ftrace/vmscan.proto",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index a5042a9..b6278b8 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -44,6 +44,7 @@
   "sched.proto",
   "signal.proto",
   "sync.proto",
+  "systrace.proto",
   "task.proto",
   "vmscan.proto",
   "workqueue.proto",
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index df4ec06..5e27dac 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -29,6 +29,7 @@
 import "perfetto/trace/ftrace/sched.proto";
 import "perfetto/trace/ftrace/signal.proto";
 import "perfetto/trace/ftrace/sync.proto";
+import "perfetto/trace/ftrace/systrace.proto";
 import "perfetto/trace/ftrace/task.proto";
 import "perfetto/trace/ftrace/vmscan.proto";
 import "perfetto/trace/ftrace/workqueue.proto";
@@ -392,5 +393,6 @@
     MmEventRecordFtraceEvent mm_event_record = 328;
     SysEnterFtraceEvent sys_enter = 329;
     SysExitFtraceEvent sys_exit = 330;
+    ZeroFtraceEvent zero = 331;
   }
 }
diff --git a/protos/perfetto/trace/ftrace/systrace.proto b/protos/perfetto/trace/ftrace/systrace.proto
new file mode 100644
index 0000000..b52b305
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/systrace.proto
@@ -0,0 +1,14 @@
+// Autogenerated by:
+// ../../tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+option optimize_for = LITE_RUNTIME;
+package perfetto.protos;
+
+message ZeroFtraceEvent {
+  optional int32 flag = 1;
+  optional string name = 2;
+  optional int32 pid = 3;
+  optional int64 value = 4;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index d622550..8be98a2 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -1967,6 +1967,7 @@
     MmEventRecordFtraceEvent mm_event_record = 328;
     SysEnterFtraceEvent sys_enter = 329;
     SysExitFtraceEvent sys_exit = 330;
+    ZeroFtraceEvent zero = 331;
   }
 }
 
@@ -2459,6 +2460,17 @@
 
 // End of protos/perfetto/trace/ftrace/signal.proto
 
+// Begin of protos/perfetto/trace/ftrace/systrace.proto
+
+message ZeroFtraceEvent {
+  optional int32 flag = 1;
+  optional string name = 2;
+  optional int32 pid = 3;
+  optional int64 value = 4;
+}
+
+// End of protos/perfetto/trace/ftrace/systrace.proto
+
 // Begin of protos/perfetto/trace/ftrace/task.proto
 
 message TaskNewtaskFtraceEvent {
diff --git a/src/trace_processor/ftrace_descriptors.cc b/src/trace_processor/ftrace_descriptors.cc
index f7f0113..90b9661 100644
--- a/src/trace_processor/ftrace_descriptors.cc
+++ b/src/trace_processor/ftrace_descriptors.cc
@@ -8,7 +8,7 @@
 namespace trace_processor {
 namespace {
 
-std::array<MessageDescriptor, 331> descriptors{{
+std::array<MessageDescriptor, 332> descriptors{{
     {nullptr, 0, {}},
     {nullptr, 0, {}},
     {nullptr, 0, {}},
@@ -3517,6 +3517,17 @@
             {"ret", ProtoSchemaType::kInt64},
         },
     },
+    {
+        "zero",
+        4,
+        {
+            {},
+            {"flag", ProtoSchemaType::kInt32},
+            {"name", ProtoSchemaType::kString},
+            {"pid", ProtoSchemaType::kInt32},
+            {"value", ProtoSchemaType::kInt64},
+        },
+    },
 }};
 
 }  // namespace
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index df587e5..92ed091 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -3909,6 +3909,18 @@
   {
     events.emplace_back(Event{});
     Event* event = &events.back();
+    event->name = "0";
+    event->group = "systrace";
+    event->proto_field_id = 331;
+    event->fields.push_back(MakeField("flag", 1, ProtoSchemaType::kInt32));
+    event->fields.push_back(MakeField("name", 2, ProtoSchemaType::kString));
+    event->fields.push_back(MakeField("pid", 3, ProtoSchemaType::kInt32));
+    event->fields.push_back(MakeField("value", 4, ProtoSchemaType::kInt64));
+  }
+
+  {
+    events.emplace_back(Event{});
+    Event* event = &events.back();
     event->name = "task_newtask";
     event->group = "task";
     event->proto_field_id = 235;
diff --git a/src/traced/probes/ftrace/ftrace_config_muxer.cc b/src/traced/probes/ftrace/ftrace_config_muxer.cc
index ca4719b..00b88ef 100644
--- a/src/traced/probes/ftrace/ftrace_config_muxer.cc
+++ b/src/traced/probes/ftrace/ftrace_config_muxer.cc
@@ -123,6 +123,7 @@
         events.insert(GroupAndName("sched", "sched_cpu_hotplug"));
         events.insert(GroupAndName("sched", "sched_pi_setprio"));
         events.insert(GroupAndName("sched", "sched_process_exit"));
+        events.insert(GroupAndName("systrace", "0"));
         AddEventGroup(table, "cgroup", &events);
         events.insert(GroupAndName("oom", "oom_score_adj_update"));
         events.insert(GroupAndName("task", "task_rename"));
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/systrace/0/format b/src/traced/probes/ftrace/test/data/synthetic/events/systrace/0/format
new file mode 100644
index 0000000..6335546
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/systrace/0/format
@@ -0,0 +1,14 @@
+name: 0
+ID: 728
+format:
+	field:unsigned short common_type;	offset:0;	size:2;	signed:0;
+	field:unsigned char common_flags;	offset:2;	size:1;	signed:0;
+	field:unsigned char common_preempt_count;	offset:3;	size:1;	signed:0;
+	field:int common_pid;	offset:4;	size:4;	signed:1;
+
+	field:int flag;	offset:8;	size:4;	signed:1;
+	field:int pid;	offset:12;	size:4;	signed:1;
+	field:__data_loc char[] name;	offset:16;	size:4;	signed:0;
+	field:int64_t value;	offset:24;	size:8;	signed:1;
+
+print fmt: "%s|%d|%s|%lld", __print_flags(REC->flag, "", { SYSTRACE_EVENT_BEGIN, "B" }, { SYSTRACE_EVENT_END, "E" }, { SYSTRACE_EVENT_INT64, "C" }), REC->pid, __get_str(name), REC->value
diff --git a/tools/ftrace_proto_gen/event_whitelist b/tools/ftrace_proto_gen/event_whitelist
index e2ceeec..9f9737a 100644
--- a/tools/ftrace_proto_gen/event_whitelist
+++ b/tools/ftrace_proto_gen/event_whitelist
@@ -325,3 +325,4 @@
 mm_event/mm_event_record
 raw_syscalls/sys_enter
 raw_syscalls/sys_exit
+systrace/0
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.cc b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
index 72dcbf8..e545622 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.cc
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.cc
@@ -34,6 +34,14 @@
 using base::StartsWith;
 using base::Contains;
 
+std::string EventNameToProtoFieldName(const std::string& name) {
+  return (name == "0") ? "zero" : name;
+}
+
+std::string EventNameToProtoName(const std::string& name) {
+  return ToCamelCase(EventNameToProtoFieldName(name)) + "FtraceEvent";
+}
+
 std::vector<FtraceEventName> ReadWhitelist(const std::string& filename) {
   std::string line;
   std::vector<FtraceEventName> lines;
@@ -97,7 +105,7 @@
 }
 
 bool GenerateProto(const FtraceEvent& format, Proto* proto_out) {
-  proto_out->name = ToCamelCase(format.name) + "FtraceEvent";
+  proto_out->name = EventNameToProtoName(format.name);
   proto_out->event_name = format.name;
   std::set<std::string> seen;
   // TODO(hjd): We should be cleverer about id assignment.
@@ -163,19 +171,20 @@
       continue;
     }
 
-    std::string typeName = ToCamelCase(event.name()) + "FtraceEvent";
+    std::string field_name = EventNameToProtoFieldName(event.name());
+    std::string type_name = EventNameToProtoName(event.name());
 
     // "    " (indent) + TypeName + " " + field_name + " = " + 123 + ";"
-    if (4 + typeName.size() + 1 + event.name().size() + 3 + 3 + 1 <= 80) {
+    if (4 + type_name.size() + 1 + field_name.size() + 3 + 3 + 1 <= 80) {
       // Everything fits in one line:
-      *fout << "    " << typeName << " " << event.name() << " = " << i << ";\n";
-    } else if (4 + typeName.size() + 1 + event.name().size() + 2 <= 80) {
+      *fout << "    " << type_name << " " << field_name << " = " << i << ";\n";
+    } else if (4 + type_name.size() + 1 + field_name.size() + 2 <= 80) {
       // Everything fits except the field id:
-      *fout << "    " << typeName << " " << event.name() << " =\n        " << i
+      *fout << "    " << type_name << " " << field_name << " =\n        " << i
             << ";\n";
     } else {
       // Nothing fits:
-      *fout << "    " << typeName << "\n        " << event.name() << " = " << i
+      *fout << "    " << type_name << "\n        " << field_name << " = " << i
             << ";\n";
     }
     ++i;
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.h b/tools/ftrace_proto_gen/ftrace_proto_gen.h
index 3934dcb..9136ef0 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.h
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.h
@@ -29,6 +29,9 @@
 
 namespace perfetto {
 
+std::string EventNameToProtoName(const std::string&);
+std::string EventNameToProtoFieldName(const std::string&);
+
 void PrintFtraceEventProtoAdditions(const std::set<std::string>& events);
 void PrintEventFormatterMain(const std::set<std::string>& events);
 void PrintEventFormatterUsingStatements(const std::set<std::string>& events);
diff --git a/tools/ftrace_proto_gen/main.cc b/tools/ftrace_proto_gen/main.cc
index de15591..c539372 100644
--- a/tools/ftrace_proto_gen/main.cc
+++ b/tools/ftrace_proto_gen/main.cc
@@ -162,8 +162,7 @@
       if (!event.valid())
         continue;
 
-      std::string proto_name =
-          perfetto::ToCamelCase(event.name()) + "FtraceEvent";
+      std::string proto_name = perfetto::EventNameToProtoName(event.name());
       perfetto::Proto proto;
       proto.name = proto_name;
       proto.event_name = event.name();
diff --git a/tools/gen_merged_protos b/tools/gen_merged_protos
index 15245f7..35f6721 100755
--- a/tools/gen_merged_protos
+++ b/tools/gen_merged_protos
@@ -66,6 +66,7 @@
   'protos/perfetto/trace/ftrace/raw_syscalls.proto',
   'protos/perfetto/trace/ftrace/sched.proto',
   'protos/perfetto/trace/ftrace/signal.proto',
+  'protos/perfetto/trace/ftrace/systrace.proto',
   'protos/perfetto/trace/ftrace/task.proto',
   'protos/perfetto/trace/ftrace/vmscan.proto',
   'protos/perfetto/trace/interned_data/interned_data.proto',