dump: Rework filter area variables

While the DumpState begin and length variables directly mirror the API
variable names they are not very descriptive. So let's add a
"filter_area_" prefix and make has_filter a function checking length > 0.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20220811121111.9878-6-frankja@linux.ibm.com>
This commit is contained in:
Janosch Frank 2022-08-11 12:10:58 +00:00 committed by Marc-André Lureau
parent 0c2994ac90
commit dddf725f70
2 changed files with 41 additions and 25 deletions

View File

@ -59,6 +59,11 @@ static inline bool dump_is_64bit(DumpState *s)
return s->dump_info.d_class == ELFCLASS64; return s->dump_info.d_class == ELFCLASS64;
} }
static inline bool dump_has_filter(DumpState *s)
{
return s->filter_area_length > 0;
}
uint16_t cpu_to_dump16(DumpState *s, uint16_t val) uint16_t cpu_to_dump16(DumpState *s, uint16_t val)
{ {
if (s->dump_info.d_endian == ELFDATA2LSB) { if (s->dump_info.d_endian == ELFDATA2LSB) {
@ -443,29 +448,30 @@ static void get_offset_range(hwaddr phys_addr,
*p_offset = -1; *p_offset = -1;
*p_filesz = 0; *p_filesz = 0;
if (s->has_filter) { if (dump_has_filter(s)) {
if (phys_addr < s->begin || phys_addr >= s->begin + s->length) { if (phys_addr < s->filter_area_begin ||
phys_addr >= s->filter_area_begin + s->filter_area_length) {
return; return;
} }
} }
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
if (s->has_filter) { if (dump_has_filter(s)) {
if (block->target_start >= s->begin + s->length || if (block->target_start >= s->filter_area_begin + s->filter_area_length ||
block->target_end <= s->begin) { block->target_end <= s->filter_area_begin) {
/* This block is out of the range */ /* This block is out of the range */
continue; continue;
} }
if (s->begin <= block->target_start) { if (s->filter_area_begin <= block->target_start) {
start = block->target_start; start = block->target_start;
} else { } else {
start = s->begin; start = s->filter_area_begin;
} }
size_in_block = block->target_end - start; size_in_block = block->target_end - start;
if (s->begin + s->length < block->target_end) { if (s->filter_area_begin + s->filter_area_length < block->target_end) {
size_in_block -= block->target_end - (s->begin + s->length); size_in_block -= block->target_end - (s->filter_area_begin + s->filter_area_length);
} }
} else { } else {
start = block->target_start; start = block->target_start;
@ -638,12 +644,12 @@ static void dump_iterate(DumpState *s, Error **errp)
int64_t memblock_size, memblock_start; int64_t memblock_size, memblock_start;
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
memblock_start = dump_filtered_memblock_start(block, s->begin, s->length); memblock_start = dump_filtered_memblock_start(block, s->filter_area_begin, s->filter_area_length);
if (memblock_start == -1) { if (memblock_start == -1) {
continue; continue;
} }
memblock_size = dump_filtered_memblock_size(block, s->begin, s->length); memblock_size = dump_filtered_memblock_size(block, s->filter_area_begin, s->filter_area_length);
/* Write the memory to file */ /* Write the memory to file */
write_memory(s, block, memblock_start, memblock_size, errp); write_memory(s, block, memblock_start, memblock_size, errp);
@ -1504,14 +1510,14 @@ static int validate_start_block(DumpState *s)
{ {
GuestPhysBlock *block; GuestPhysBlock *block;
if (!s->has_filter) { if (!dump_has_filter(s)) {
return 0; return 0;
} }
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
/* This block is out of the range */ /* This block is out of the range */
if (block->target_start >= s->begin + s->length || if (block->target_start >= s->filter_area_begin + s->filter_area_length ||
block->target_end <= s->begin) { block->target_end <= s->filter_area_begin) {
continue; continue;
} }
return 0; return 0;
@ -1550,10 +1556,10 @@ static int64_t dump_calculate_size(DumpState *s)
int64_t size = 0, total = 0, left = 0, right = 0; int64_t size = 0, total = 0, left = 0, right = 0;
QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
if (s->has_filter) { if (dump_has_filter(s)) {
/* calculate the overlapped region. */ /* calculate the overlapped region. */
left = MAX(s->begin, block->target_start); left = MAX(s->filter_area_begin, block->target_start);
right = MIN(s->begin + s->length, block->target_end); right = MIN(s->filter_area_begin + s->filter_area_length, block->target_end);
size = right - left; size = right - left;
size = size > 0 ? size : 0; size = size > 0 ? size : 0;
} else { } else {
@ -1643,9 +1649,12 @@ static void dump_init(DumpState *s, int fd, bool has_format,
} }
s->fd = fd; s->fd = fd;
s->has_filter = has_filter; if (has_filter && !length) {
s->begin = begin; error_setg(errp, QERR_INVALID_PARAMETER, "length");
s->length = length; goto cleanup;
}
s->filter_area_begin = begin;
s->filter_area_length = length;
memory_mapping_list_init(&s->list); memory_mapping_list_init(&s->list);
@ -1778,8 +1787,8 @@ static void dump_init(DumpState *s, int fd, bool has_format,
return; return;
} }
if (s->has_filter) { if (dump_has_filter(s)) {
memory_mapping_filter(&s->list, s->begin, s->length); memory_mapping_filter(&s->list, s->filter_area_begin, s->filter_area_length);
} }
/* /*

View File

@ -166,9 +166,16 @@ typedef struct DumpState {
hwaddr memory_offset; hwaddr memory_offset;
int fd; int fd;
bool has_filter; /*
int64_t begin; * Dump filter area variables
int64_t length; *
* A filtered dump only contains the guest memory designated by
* the start address and length variables defined below.
*
* If length is 0, no filtering is applied.
*/
int64_t filter_area_begin; /* Start address of partial guest memory area */
int64_t filter_area_length; /* Length of partial guest memory area */
uint8_t *note_buf; /* buffer for notes */ uint8_t *note_buf; /* buffer for notes */
size_t note_buf_offset; /* the writing place in note_buf */ size_t note_buf_offset; /* the writing place in note_buf */