Since dwarf and btf have different apiops, so making it as parameter to eppic_init, and initialized respectively.
Signed-off-by: Tao Liu <[email protected]> --- erase_info.c | 8 +++++--- extension_eppic.c | 24 +++++++++++++++++++++--- extension_eppic.h | 6 ++++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/erase_info.c b/erase_info.c index d68e1a2..e903eeb 100644 --- a/erase_info.c +++ b/erase_info.c @@ -2188,7 +2188,7 @@ get_die_member_all(unsigned long long die_off, int index, long *offset, /* Process the eppic macro using eppic library */ static int -process_eppic_file(char *name_config) +process_eppic_file(char *name_config, bool is_btf) { void *handle; void (*eppic_load)(char *), (*eppic_unload)(char *); @@ -2207,7 +2207,9 @@ process_eppic_file(char *name_config) * Support specifying eppic macros in makedumpfile.conf file */ - eppic_init = dlsym(handle, "eppic_init"); + if (!is_btf) { + eppic_init = dlsym(handle, "eppic_dwarf_init"); + } if (!eppic_init) { ERRMSG("Could not find eppic_init function\n"); return FALSE; @@ -2354,7 +2356,7 @@ gather_filter_info(void) ret = process_config_file(info->name_filterconfig); if (info->name_eppic_config) - ret &= process_eppic_file(info->name_eppic_config); + ret &= process_eppic_file(info->name_eppic_config, false); /* * Remove modules symbol information, we dont need now. diff --git a/extension_eppic.c b/extension_eppic.c index ebace25..00d19fa 100644 --- a/extension_eppic.c +++ b/extension_eppic.c @@ -25,6 +25,7 @@ #include "extension_eppic.h" static int apigetctype(int, char *, type_t *); +struct call_back *cb; /* * Most of the functions included in this file performs similar @@ -437,7 +438,7 @@ apifindsym(char *p) return NULL; } -apiops icops = { +apiops dwarf_icops = { apigetmem, apiputmem, apimember, @@ -470,17 +471,27 @@ eppic_memset(VALUE_S *vaddr, VALUE_S *vch, VALUE_S *vlen) return eppic_makebtype(1); } +VALUE_S * +eppic_filter_pages(VALUE_S *p, VALUE_S *n) +{ + unsigned long pfn = eppic_getval(p); + unsigned long num = eppic_getval(n); + + UPDATE_FILTER_PAGE_INFO(pfn, num); + return eppic_makebtype(1); +} + /* Initialize eppic */ int -eppic_init(void *fun_ptr) +eppic_init(void *fun_ptr, apiops *ops, bool is_btf) { cb = (struct call_back *)fun_ptr; if (eppic_open() >= 0) { /* Register call back functions */ - eppic_apiset(&icops, 3, sizeof(long), 0); + eppic_apiset(ops, 3, sizeof(long), 0); /* set the new function callback */ eppic_setcallback(reg_callback); @@ -489,8 +500,15 @@ eppic_init(void *fun_ptr) eppic_builtin("int memset(char *, int, int)", (bf_t *)eppic_memset); + eppic_builtin("unsigned long filter_pages(unsigned long, unsigned long)", + (bf_t *)eppic_filter_pages); + return 0; } return 1; } +int eppic_dwarf_init(void *fun_ptr) +{ + return eppic_init(fun_ptr, &dwarf_icops, false); +} diff --git a/extension_eppic.h b/extension_eppic.h index 08f1db0..ff92f01 100644 --- a/extension_eppic.h +++ b/extension_eppic.h @@ -79,8 +79,7 @@ do { \ fprintf(stderr, x); \ } while (0) - -struct call_back *cb; +extern struct call_back *cb; #define GET_DOMAIN_ALL cb->get_domain_all #define READMEM cb->readmem @@ -92,5 +91,8 @@ struct call_back *cb; #define GET_DIE_NFIELDS_ALL cb->get_die_nfields_all #define GET_SYMBOL_ADDR_ALL cb->get_symbol_addr_all #define UPDATE_FILTER_INFO_RAW cb->update_filter_info_raw +#define UPDATE_FILTER_PAGE_INFO cb->update_filter_pages_info + +int eppic_init(void *, apiops *, bool); #endif /* _EXTENSION_EPPIC_H */ -- 2.47.0
