hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/tools/lib/traceevent/kbuffer-parse.c
....@@ -361,6 +361,7 @@
361361 break;
362362
363363 case KBUFFER_TYPE_TIME_EXTEND:
364
+ case KBUFFER_TYPE_TIME_STAMP:
364365 extend = read_4(kbuf, data);
365366 data += 4;
366367 extend <<= TS_SHIFT;
....@@ -369,10 +370,6 @@
369370 *length = 0;
370371 break;
371372
372
- case KBUFFER_TYPE_TIME_STAMP:
373
- data += 12;
374
- *length = 0;
375
- break;
376373 case 0:
377374 *length = read_4(kbuf, data) - 4;
378375 *length = (*length + 3) & ~3;
....@@ -397,7 +394,11 @@
397394
398395 type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
399396
400
- kbuf->timestamp += delta;
397
+ if (type_len == KBUFFER_TYPE_TIME_STAMP)
398
+ kbuf->timestamp = delta;
399
+ else
400
+ kbuf->timestamp += delta;
401
+
401402 kbuf->index = calc_index(kbuf, ptr);
402403 kbuf->next = kbuf->index + length;
403404
....@@ -438,7 +439,7 @@
438439 case KBUFFER_TYPE_TIME_EXTEND:
439440 case KBUFFER_TYPE_TIME_STAMP:
440441 return NULL;
441
- };
442
+ }
442443
443444 *size = length;
444445
....@@ -454,7 +455,9 @@
454455 if (kbuf->next >= kbuf->size)
455456 return -1;
456457 type = update_pointers(kbuf);
457
- } while (type == KBUFFER_TYPE_TIME_EXTEND || type == KBUFFER_TYPE_PADDING);
458
+ } while (type == KBUFFER_TYPE_TIME_EXTEND ||
459
+ type == KBUFFER_TYPE_TIME_STAMP ||
460
+ type == KBUFFER_TYPE_PADDING);
458461
459462 return 0;
460463 }
....@@ -545,6 +548,34 @@
545548
546549 return 0;
547550 }
551
+
552
+/**
553
+ * kbuffer_subbuf_timestamp - read the timestamp from a sub buffer
554
+ * @kbuf: The kbuffer to load
555
+ * @subbuf: The subbuffer to read from.
556
+ *
557
+ * Return the timestamp from a subbuffer.
558
+ */
559
+unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf)
560
+{
561
+ return kbuf->read_8(subbuf);
562
+}
563
+
564
+/**
565
+ * kbuffer_ptr_delta - read the delta field from a record
566
+ * @kbuf: The kbuffer to load
567
+ * @ptr: The record in the buffe.
568
+ *
569
+ * Return the timestamp delta from a record
570
+ */
571
+unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr)
572
+{
573
+ unsigned int type_len_ts;
574
+
575
+ type_len_ts = read_4(kbuf, ptr);
576
+ return ts4host(kbuf, type_len_ts);
577
+}
578
+
548579
549580 /**
550581 * kbuffer_read_event - read the next event in the kbuffer subbuffer
....@@ -727,3 +758,52 @@
727758 {
728759 return kbuf->start;
729760 }
761
+
762
+/**
763
+ * kbuffer_raw_get - get raw buffer info
764
+ * @kbuf: The kbuffer
765
+ * @subbuf: Start of mapped subbuffer
766
+ * @info: Info descriptor to fill in
767
+ *
768
+ * For debugging. This can return internals of the ring buffer.
769
+ * Expects to have info->next set to what it will read.
770
+ * The type, length and timestamp delta will be filled in, and
771
+ * @info->next will be updated to the next element.
772
+ * The @subbuf is used to know if the info is passed the end of
773
+ * data and NULL will be returned if it is.
774
+ */
775
+struct kbuffer_raw_info *
776
+kbuffer_raw_get(struct kbuffer *kbuf, void *subbuf, struct kbuffer_raw_info *info)
777
+{
778
+ unsigned long long flags;
779
+ unsigned long long delta;
780
+ unsigned int type_len;
781
+ unsigned int size;
782
+ int start;
783
+ int length;
784
+ void *ptr = info->next;
785
+
786
+ if (!kbuf || !subbuf)
787
+ return NULL;
788
+
789
+ if (kbuf->flags & KBUFFER_FL_LONG_8)
790
+ start = 16;
791
+ else
792
+ start = 12;
793
+
794
+ flags = read_long(kbuf, subbuf + 8);
795
+ size = (unsigned int)flags & COMMIT_MASK;
796
+
797
+ if (ptr < subbuf || ptr >= subbuf + start + size)
798
+ return NULL;
799
+
800
+ type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
801
+
802
+ info->next = ptr + length;
803
+
804
+ info->type = type_len;
805
+ info->delta = delta;
806
+ info->length = length;
807
+
808
+ return info;
809
+}