mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
To prevent segmentation faults when the function dfi_mem_phys_read() is given invalid parameters, check that the given memory range falls within a known physical memory chunk, just like it is done for dfi_mem_virt_read(). Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
70 lines
2.2 KiB
C
70 lines
2.2 KiB
C
/*
|
|
* Copyright IBM Corp. 2001, 2018
|
|
*
|
|
* s390-tools is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*/
|
|
|
|
#ifndef DFI_MEM_CHUNK_H
|
|
#define DFI_MEM_CHUNK_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include "lib/zt_common.h"
|
|
#include "lib/util_list.h"
|
|
|
|
/*
|
|
* Mem chunk functions and definitions
|
|
*/
|
|
struct dfi_mem_chunk;
|
|
|
|
typedef void (*dfi_mem_chunk_read_fn)(struct dfi_mem_chunk *mem_chunk,
|
|
u64 off, void *buf, u64 cnt);
|
|
typedef void (*dfi_mem_chunk_free_fn)(void *data);
|
|
|
|
struct dfi_mem_chunk {
|
|
struct util_list_node list; /* List */
|
|
u64 start; /* Start address in memory */
|
|
u64 end; /* End address in memory */
|
|
u64 size; /* Size of chunk in dump file */
|
|
dfi_mem_chunk_read_fn read_fn; /* Chunk read callback */
|
|
dfi_mem_chunk_free_fn free_fn; /* Free data callback */
|
|
void *data; /* Data for callback */
|
|
u32 volnr; /* Volume id where chunk resides */
|
|
};
|
|
|
|
void dfi_mem_chunk_read_zero(struct dfi_mem_chunk *UNUSED(mem_chunk),
|
|
u64 UNUSED(off), void *buf, u64 cnt);
|
|
void dfi_mem_chunk_add_vol(u64 start, u64 size, void *data,
|
|
dfi_mem_chunk_read_fn read_fn,
|
|
dfi_mem_chunk_free_fn free_fn,
|
|
u32 volnr);
|
|
void dfi_mem_chunk_add(u64 start, u64 size, void *data,
|
|
dfi_mem_chunk_read_fn read_fn,
|
|
dfi_mem_chunk_free_fn free_fn);
|
|
u64 dfi_mem_range(void);
|
|
int dfi_mem_range_valid(u64 addr, u64 len);
|
|
unsigned int dfi_mem_chunk_cnt(void);
|
|
struct dfi_mem_chunk *dfi_mem_chunk_first(void);
|
|
struct dfi_mem_chunk *dfi_mem_chunk_last(void);
|
|
struct dfi_mem_chunk *dfi_mem_chunk_next(struct dfi_mem_chunk *chunk);
|
|
struct dfi_mem_chunk *dfi_mem_chunk_prev(struct dfi_mem_chunk *chunk);
|
|
struct dfi_mem_chunk *dfi_mem_chunk_find(u64 addr);
|
|
|
|
struct util_list *dfi_mem_chunk_list(void);
|
|
#define dfi_mem_chunk_iterate(mem_chunk) \
|
|
util_list_iterate(dfi_mem_chunk_list(), mem_chunk)
|
|
|
|
int dfi_mem_virt_read(u64 addr, void *buf, size_t cnt);
|
|
int dfi_mem_phys_read(u64 addr, void *buf, size_t cnt);
|
|
|
|
void dfi_mem_map_print(bool verbose);
|
|
|
|
void dfi_mem_unmap(u64 start, u64 size);
|
|
void dfi_mem_map(u64 start, u64 size, u64 start_phys);
|
|
|
|
int dfi_mem_chunk_init(void);
|
|
void dfi_mem_chunk_deinit(void);
|
|
|
|
#endif /* DFI_MEM_CHUNK_H */
|