.. | .. |
---|
361 | 361 | break; |
---|
362 | 362 | |
---|
363 | 363 | case KBUFFER_TYPE_TIME_EXTEND: |
---|
| 364 | + case KBUFFER_TYPE_TIME_STAMP: |
---|
364 | 365 | extend = read_4(kbuf, data); |
---|
365 | 366 | data += 4; |
---|
366 | 367 | extend <<= TS_SHIFT; |
---|
.. | .. |
---|
369 | 370 | *length = 0; |
---|
370 | 371 | break; |
---|
371 | 372 | |
---|
372 | | - case KBUFFER_TYPE_TIME_STAMP: |
---|
373 | | - data += 12; |
---|
374 | | - *length = 0; |
---|
375 | | - break; |
---|
376 | 373 | case 0: |
---|
377 | 374 | *length = read_4(kbuf, data) - 4; |
---|
378 | 375 | *length = (*length + 3) & ~3; |
---|
.. | .. |
---|
397 | 394 | |
---|
398 | 395 | type_len = translate_data(kbuf, ptr, &ptr, &delta, &length); |
---|
399 | 396 | |
---|
400 | | - kbuf->timestamp += delta; |
---|
| 397 | + if (type_len == KBUFFER_TYPE_TIME_STAMP) |
---|
| 398 | + kbuf->timestamp = delta; |
---|
| 399 | + else |
---|
| 400 | + kbuf->timestamp += delta; |
---|
| 401 | + |
---|
401 | 402 | kbuf->index = calc_index(kbuf, ptr); |
---|
402 | 403 | kbuf->next = kbuf->index + length; |
---|
403 | 404 | |
---|
.. | .. |
---|
438 | 439 | case KBUFFER_TYPE_TIME_EXTEND: |
---|
439 | 440 | case KBUFFER_TYPE_TIME_STAMP: |
---|
440 | 441 | return NULL; |
---|
441 | | - }; |
---|
| 442 | + } |
---|
442 | 443 | |
---|
443 | 444 | *size = length; |
---|
444 | 445 | |
---|
.. | .. |
---|
454 | 455 | if (kbuf->next >= kbuf->size) |
---|
455 | 456 | return -1; |
---|
456 | 457 | 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); |
---|
458 | 461 | |
---|
459 | 462 | return 0; |
---|
460 | 463 | } |
---|
.. | .. |
---|
545 | 548 | |
---|
546 | 549 | return 0; |
---|
547 | 550 | } |
---|
| 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 | + |
---|
548 | 579 | |
---|
549 | 580 | /** |
---|
550 | 581 | * kbuffer_read_event - read the next event in the kbuffer subbuffer |
---|
.. | .. |
---|
727 | 758 | { |
---|
728 | 759 | return kbuf->start; |
---|
729 | 760 | } |
---|
| 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 | +} |
---|