From f82813bfa40193aec07e013b029eec6dc092ecdd Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Wed, 1 Jul 2015 16:18:45 +0200 Subject: registers and banks support in xml v1. pci -ll works fine, but got segfault on pci -r name and pci -r name gives 0 always. might be due to the order in pci.c ------> ask suren --- pcilib/pci.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 3a18ccd..5bae8fc 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -24,6 +24,7 @@ #include "model.h" #include "plugin.h" #include "bar.h" +#include "xml.h" static int pcilib_detect_model(pcilib_t *ctx, const char *model) { int i, j; @@ -105,6 +106,26 @@ pcilib_t *pcilib_open(const char *device, const char *model) { int err; size_t i; pcilib_t *ctx = malloc(sizeof(pcilib_t)); + + pcilib_register_description_t *registers=NULL; + pcilib_register_bank_description_t *banks=NULL; + int number_registers, number_banks; + + char *xmlfile; + pcilib_xml_read_config(&xmlfile,3); + xmlDocPtr doc; + doc=pcilib_xml_getdoc(xmlfile); + + xmlXPathContextPtr context; + context=pcilib_xml_getcontext(doc); + + number_registers=pcilib_xml_getnumberregisters(context); + number_banks=pcilib_xml_getnumberbanks(context); + + if(number_registers)registers=calloc((number_registers),sizeof(pcilib_register_description_t)); + else pcilib_error("no registers in the xml file"); + if(number_banks)banks=calloc((number_banks),sizeof(pcilib_register_bank_description_t)); + else pcilib_error("no banks in the xml file"); if (ctx) { memset(ctx, 0, sizeof(pcilib_t)); @@ -154,6 +175,17 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); + if(registers){ + pcilib_xml_initialize_registers(doc,registers); + pcilib_xml_arrange_registers(registers,number_registers); + pcilib_add_registers(ctx,number_registers,registers); + }else pcilib_error("no memory for registers"); + + if(banks){ + pcilib_xml_initialize_banks(doc,banks); + pcilib_add_register_banks(ctx,number_banks,banks); + }else pcilib_error("no memory for banks"); + ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; ctx->model_info.protocols = ctx->protocols; @@ -166,6 +198,7 @@ pcilib_t *pcilib_open(const char *device, const char *model) { pcilib_close(ctx); return NULL; } + err = pcilib_init_event_engine(ctx); if (err) { -- cgit v1.2.3 From c4f209458c5caa00f8d67033224458c78c374adc Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Fri, 3 Jul 2015 18:03:53 +0200 Subject: modified pci to put banks before registers --- pcilib/pci.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 5bae8fc..5312922 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -175,17 +175,17 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); + if(banks){ + pcilib_xml_initialize_banks(doc,banks); + pcilib_add_register_banks(ctx,number_banks,banks); + }else pcilib_error("no memory for banks"); + if(registers){ pcilib_xml_initialize_registers(doc,registers); pcilib_xml_arrange_registers(registers,number_registers); pcilib_add_registers(ctx,number_registers,registers); }else pcilib_error("no memory for registers"); - if(banks){ - pcilib_xml_initialize_banks(doc,banks); - pcilib_add_register_banks(ctx,number_banks,banks); - }else pcilib_error("no memory for banks"); - ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; ctx->model_info.protocols = ctx->protocols; -- cgit v1.2.3 From 5a7bcf11b8e3168900a75e7cbf3b1e18f424d271 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Tue, 7 Jul 2015 14:03:39 +0200 Subject: some modif --- pcilib/pci.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 5312922..76bd59f 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -294,6 +294,7 @@ int pcilib_map_data_space(pcilib_t *ctx, uintptr_t addr) { char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr) { if (bar == PCILIB_BAR_DETECT) { + printf("bar = PCILIB_BAR_DETECT\n"); // First checking the default register bar size_t offset = addr - ctx->board_info.bar_start[ctx->reg_bar]; if ((addr > ctx->board_info.bar_start[ctx->reg_bar])&&(offset < ctx->board_info.bar_length[ctx->reg_bar])) { @@ -308,6 +309,7 @@ char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t // Otherwise trying to detect bar = pcilib_detect_bar(ctx, addr, 1); if (bar != PCILIB_BAR_INVALID) { + printf("bar pas ainvalid\n"); size_t offset = addr - ctx->board_info.bar_start[bar]; if ((offset < ctx->board_info.bar_length[bar])&&(ctx->bar_space[bar])) { if (!ctx->bar_space[bar]) { @@ -318,16 +320,21 @@ char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t } } } else { + printf("bar internal :%i\n",bar); + // printf("bar invalid\n"); if (!ctx->bar_space[bar]) { pcilib_error("The requested bar (%i) is not mapped", bar); return NULL; } if (addr < ctx->board_info.bar_length[bar]) { + printf("path1\n"); + // printf("apres: %s\n",ctx->bar_space[bar] + addr); return ctx->bar_space[bar] + addr + (ctx->board_info.bar_start[bar] & ctx->page_mask); } if ((addr >= ctx->board_info.bar_start[bar])&&(addr < (ctx->board_info.bar_start[bar] + ctx->board_info.bar_length[ctx->reg_bar]))) { + printf("path2\n"); return ctx->bar_space[bar] + (addr - ctx->board_info.bar_start[bar]) + (ctx->board_info.bar_start[bar] & ctx->page_mask); } } -- cgit v1.2.3 From d3678e0fcb489eba625347d1209bd8a179153ae0 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Thu, 27 Aug 2015 11:09:21 +0200 Subject: put xml nodes pointers for banks and registers in pcilib_t, compil ok --- pcilib/pci.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index f043257..fa3175d 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -193,13 +193,13 @@ pcilib_t *pcilib_open(const char *device, const char *model) { ctx->model = strdup(model?model:"pci"); if(banks){ - pcilib_xml_initialize_banks(doc,banks); - pcilib_add_register_banks(ctx,number_banks,banks); + pcilib_xml_initialize_banks(ctx,doc,banks); + pcilib_add_register_banks(ctx,number_banks,banks); }else pcilib_error("no memory for banks"); if(registers){ - pcilib_xml_initialize_registers(doc,registers); - pcilib_xml_arrange_registers(registers,number_registers); + pcilib_xml_initialize_registers(ctx,doc,registers); + pcilib_xml_arrange_registers(registers,number_registers); pcilib_add_registers(ctx,number_registers,registers); }else pcilib_error("no memory for registers"); -- cgit v1.2.3 From 1d3cffac722081aa8b74821a832d8cc9c58715e6 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Thu, 27 Aug 2015 12:13:38 +0200 Subject: better public API and no more use of locals within pcilib_open --- pcilib/pci.c | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index fa3175d..5d9fedb 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -109,10 +109,6 @@ pcilib_t *pcilib_open(const char *device, const char *model) { size_t i; pcilib_t *ctx = malloc(sizeof(pcilib_t)); - pcilib_register_description_t *registers=NULL; - pcilib_register_bank_description_t *banks=NULL; - int number_registers, number_banks; - char *xmlfile; pcilib_xml_read_config(&xmlfile,3); xmlDocPtr doc; @@ -121,14 +117,6 @@ pcilib_t *pcilib_open(const char *device, const char *model) { xmlXPathContextPtr context; context=pcilib_xml_getcontext(doc); - number_registers=pcilib_xml_getnumberregisters(context); - number_banks=pcilib_xml_getnumberbanks(context); - - if(number_registers)registers=calloc((number_registers),sizeof(pcilib_register_description_t)); - else pcilib_error("no registers in the xml file"); - if(number_banks)banks=calloc((number_banks),sizeof(pcilib_register_bank_description_t)); - else pcilib_error("no banks in the xml file"); - if (!model) model = getenv("PCILIB_MODEL"); @@ -192,16 +180,8 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - if(banks){ - pcilib_xml_initialize_banks(ctx,doc,banks); - pcilib_add_register_banks(ctx,number_banks,banks); - }else pcilib_error("no memory for banks"); - - if(registers){ - pcilib_xml_initialize_registers(ctx,doc,registers); - pcilib_xml_arrange_registers(registers,number_registers); - pcilib_add_registers(ctx,number_registers,registers); - }else pcilib_error("no memory for registers"); + pcilib_xml_initialize_banks(ctx,doc); + pcilib_xml_initialize_registers(ctx,doc); ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; -- cgit v1.2.3 From d2ec5ac52105c526390d8a31e52a7a2c260dde80 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Thu, 27 Aug 2015 16:19:53 +0200 Subject: xml files get by model and remove of validation mode --- pcilib/pci.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 5d9fedb..03b2623 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -109,14 +109,8 @@ pcilib_t *pcilib_open(const char *device, const char *model) { size_t i; pcilib_t *ctx = malloc(sizeof(pcilib_t)); - char *xmlfile; - pcilib_xml_read_config(&xmlfile,3); - xmlDocPtr doc; - doc=pcilib_xml_getdoc(xmlfile); - - xmlXPathContextPtr context; - context=pcilib_xml_getcontext(doc); - + xmlDocPtr* docs=NULL; + if (!model) model = getenv("PCILIB_MODEL"); @@ -179,9 +173,10 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - - pcilib_xml_initialize_banks(ctx,doc); - pcilib_xml_initialize_registers(ctx,doc); + + pcilib_init_xml(docs); + pcilib_xml_initialize_banks(ctx,docs); + pcilib_xml_initialize_registers(ctx,docs); ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; -- cgit v1.2.3 From 57149189cb4e15ed38ee34d44450390955e56697 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Fri, 4 Sep 2015 12:52:07 +0200 Subject: almost finished regarding suren remarks --- pcilib/pci.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 03b2623..8a0ee29 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -109,8 +109,6 @@ pcilib_t *pcilib_open(const char *device, const char *model) { size_t i; pcilib_t *ctx = malloc(sizeof(pcilib_t)); - xmlDocPtr* docs=NULL; - if (!model) model = getenv("PCILIB_MODEL"); @@ -174,9 +172,7 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - pcilib_init_xml(docs); - pcilib_xml_initialize_banks(ctx,docs); - pcilib_xml_initialize_registers(ctx,docs); + pcilib_init_xml(ctx); ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; -- cgit v1.2.3 From ea28e2990ae59e21856d9ae0311cec5b5415237b Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Fri, 4 Sep 2015 20:31:14 +0200 Subject: end of modifications --- pcilib/pci.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 3a0073b..8bbee2f 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -1,7 +1,6 @@ //#define PCILIB_FILE_IO #define _XOPEN_SOURCE 700 #define _BSD_SOURCE -#define _DEFAULT_SOURCE #define _POSIX_C_SOURCE 200809L #include @@ -173,7 +172,7 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - pcilib_init_xml(ctx); + pcilib_init_xml(ctx, ctx->model); ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; @@ -282,7 +281,6 @@ int pcilib_map_data_space(pcilib_t *ctx, uintptr_t addr) { char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr) { if (bar == PCILIB_BAR_DETECT) { - printf("bar = PCILIB_BAR_DETECT\n"); // First checking the default register bar size_t offset = addr - ctx->board_info.bar_start[ctx->reg_bar]; if ((addr > ctx->board_info.bar_start[ctx->reg_bar])&&(offset < ctx->board_info.bar_length[ctx->reg_bar])) { @@ -297,7 +295,6 @@ char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t // Otherwise trying to detect bar = pcilib_detect_bar(ctx, addr, 1); if (bar != PCILIB_BAR_INVALID) { - printf("bar pas ainvalid\n"); size_t offset = addr - ctx->board_info.bar_start[bar]; if ((offset < ctx->board_info.bar_length[bar])&&(ctx->bar_space[bar])) { if (!ctx->bar_space[bar]) { @@ -308,21 +305,16 @@ char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t } } } else { - printf("bar internal :%i\n",bar); - // printf("bar invalid\n"); if (!ctx->bar_space[bar]) { pcilib_error("The requested bar (%i) is not mapped", bar); return NULL; } if (addr < ctx->board_info.bar_length[bar]) { - printf("path1\n"); - // printf("apres: %s\n",ctx->bar_space[bar] + addr); return ctx->bar_space[bar] + addr + (ctx->board_info.bar_start[bar] & ctx->page_mask); } if ((addr >= ctx->board_info.bar_start[bar])&&(addr < (ctx->board_info.bar_start[bar] + ctx->board_info.bar_length[ctx->reg_bar]))) { - printf("path2\n"); return ctx->bar_space[bar] + (addr - ctx->board_info.bar_start[bar]) + (ctx->board_info.bar_start[bar] & ctx->page_mask); } } -- cgit v1.2.3 From d996fab54c59ca0b34d4ff7c4ab5ab8247559db0 Mon Sep 17 00:00:00 2001 From: zilio nicolas Date: Mon, 7 Sep 2015 10:35:48 +0200 Subject: further modifications --- pcilib/pci.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'pcilib/pci.c') diff --git a/pcilib/pci.c b/pcilib/pci.c index 8bbee2f..5f3c8aa 100644 --- a/pcilib/pci.c +++ b/pcilib/pci.c @@ -172,7 +172,12 @@ pcilib_t *pcilib_open(const char *device, const char *model) { if (!ctx->model) ctx->model = strdup(model?model:"pci"); - pcilib_init_xml(ctx, ctx->model); + err = pcilib_init_xml(ctx, ctx->model); + if (err) { + pcilib_error("Error (%i) initializing xml part\n", err); + pcilib_close(ctx); + return NULL; + } ctx->model_info.registers = ctx->registers; ctx->model_info.banks = ctx->banks; @@ -357,6 +362,9 @@ void pcilib_close(pcilib_t *ctx) { } pcilib_free_register_banks(ctx); + + if(ctx->xml_ctx) + pcilib_free_xml(ctx); if (ctx->register_ctx) free(ctx->register_ctx); -- cgit v1.2.3