When dealing with mmap traces, the whole trace buffer is mmapped in
babeltrace and we may need to read it one subbuffer at a time.
In order to do that, we need to keep a reference of the base of the
current subbuffer inside the mmap region.
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
if (!integer_declaration->signedness) {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
if (!integer_declaration->signedness) {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
- bt_bitfield_read_le(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_read_le(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
&integer_definition->value._unsigned);
else
pos->offset, integer_declaration->len,
&integer_definition->value._unsigned);
else
- bt_bitfield_read_be(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_read_be(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
&integer_definition->value._unsigned);
} else {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
pos->offset, integer_declaration->len,
&integer_definition->value._unsigned);
} else {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
- bt_bitfield_read_le(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_read_le(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
&integer_definition->value._signed);
else
pos->offset, integer_declaration->len,
&integer_definition->value._signed);
else
- bt_bitfield_read_be(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_read_be(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
&integer_definition->value._signed);
}
pos->offset, integer_declaration->len,
&integer_definition->value._signed);
}
goto end;
if (!integer_declaration->signedness) {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
goto end;
if (!integer_declaration->signedness) {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
- bt_bitfield_write_le(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_write_le(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
integer_definition->value._unsigned);
else
pos->offset, integer_declaration->len,
integer_definition->value._unsigned);
else
- bt_bitfield_write_be(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_write_be(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
integer_definition->value._unsigned);
} else {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
pos->offset, integer_declaration->len,
integer_definition->value._unsigned);
} else {
if (integer_declaration->byte_order == LITTLE_ENDIAN)
- bt_bitfield_write_le(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_write_le(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
integer_definition->value._signed);
else
pos->offset, integer_declaration->len,
integer_definition->value._signed);
else
- bt_bitfield_write_be(mmap_align_addr(pos->base_mma), unsigned long,
+ bt_bitfield_write_be(mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset, unsigned long,
pos->offset, integer_declaration->len,
integer_definition->value._signed);
}
pos->offset, integer_declaration->len,
integer_definition->value._signed);
}
/* Current position */
off_t mmap_offset; /* mmap offset in the file, in bytes */
/* Current position */
off_t mmap_offset; /* mmap offset in the file, in bytes */
+ off_t mmap_base_offset; /* offset of start of packet in mmap, in bytes */
size_t packet_size; /* current packet size, in bits */
size_t content_size; /* current content size, in bits */
uint32_t *content_size_loc; /* pointer to current content size */
size_t packet_size; /* current packet size, in bits */
size_t content_size; /* current content size, in bits */
uint32_t *content_size_loc; /* pointer to current content size */
{
/* Only makes sense to get the address after aligning on CHAR_BIT */
assert(!(pos->offset % CHAR_BIT));
{
/* Only makes sense to get the address after aligning on CHAR_BIT */
assert(!(pos->offset % CHAR_BIT));
- return mmap_align_addr(pos->base_mma) + (pos->offset / CHAR_BIT);
+ return mmap_align_addr(pos->base_mma) +
+ pos->mmap_base_offset + (pos->offset / CHAR_BIT);