Skip to content

Commit

Permalink
dump: add members to DumpState and init some of them
Browse files Browse the repository at this point in the history
add some members to DumpState that will be used in writing vmcore in
kdump-compressed format. some of them, like page_size, will be initialized
in the patch.

Signed-off-by: Qiao Nuohan <[email protected]>
Reviewed-by: Laszlo Ersek <[email protected]>
Signed-off-by: Luiz Capitulino <[email protected]>
  • Loading branch information
qiaonuohan authored and Luiz Capitulino committed Feb 28, 2014
1 parent 607dacd commit 7aad248
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
28 changes: 28 additions & 0 deletions dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ typedef struct DumpState {

uint8_t *note_buf; /* buffer for notes */
size_t note_buf_offset; /* the writing place in note_buf */
uint32_t nr_cpus; /* number of guest's cpu */
size_t page_size; /* guest's page size */
uint32_t page_shift; /* guest's page shift */
uint64_t max_mapnr; /* the biggest guest's phys-mem's number */
size_t len_dump_bitmap; /* the size of the place used to store
dump_bitmap in vmcore */
off_t offset_dump_bitmap; /* offset of dump_bitmap part in vmcore */
off_t offset_page; /* offset of page part in vmcore */
size_t num_dumpable; /* number of page that can be dumped */
uint32_t flag_compress; /* indicate the compression format */
} DumpState;

static int dump_cleanup(DumpState *s)
Expand Down Expand Up @@ -796,6 +806,14 @@ static ram_addr_t get_start_block(DumpState *s)
return -1;
}

static void get_max_mapnr(DumpState *s)
{
GuestPhysBlock *last_block;

last_block = QTAILQ_LAST(&s->guest_phys_blocks.head, GuestPhysBlockHead);
s->max_mapnr = paddr_to_pfn(last_block->target_end, s->page_shift);
}

static int dump_init(DumpState *s, int fd, bool paging, bool has_filter,
int64_t begin, int64_t length, Error **errp)
{
Expand Down Expand Up @@ -864,6 +882,16 @@ static int dump_init(DumpState *s, int fd, bool paging, bool has_filter,
qemu_get_guest_simple_memory_mapping(&s->list, &s->guest_phys_blocks);
}

s->nr_cpus = nr_cpus;
s->page_size = TARGET_PAGE_SIZE;
s->page_shift = ffs(s->page_size) - 1;

get_max_mapnr(s);

uint64_t tmp;
tmp = DIV_ROUND_UP(DIV_ROUND_UP(s->max_mapnr, CHAR_BIT), s->page_size);
s->len_dump_bitmap = tmp * s->page_size;

if (s->has_filter) {
memory_mapping_filter(&s->list, s->begin, s->length);
}
Expand Down
7 changes: 7 additions & 0 deletions include/sysemu/dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@
#define VERSION_FLAT_HEADER (1) /* version of flattened format */
#define END_FLAG_FLAT_HEADER (-1)

#define ARCH_PFN_OFFSET (0)

#define paddr_to_pfn(X, page_shift) \
(((unsigned long long)(X) >> (page_shift)) - ARCH_PFN_OFFSET)
#define pfn_to_paddr(X, page_shift) \
(((unsigned long long)(X) + ARCH_PFN_OFFSET) << (page_shift))

typedef struct ArchDumpInfo {
int d_machine; /* Architecture */
int d_endian; /* ELFDATA2LSB or ELFDATA2MSB */
Expand Down

0 comments on commit 7aad248

Please sign in to comment.