diff options
author | Suren A. Chilingaryan <csa@suren.me> | 2015-09-10 05:44:03 +0200 |
---|---|---|
committer | Suren A. Chilingaryan <csa@suren.me> | 2015-09-10 05:44:03 +0200 |
commit | 32c4a1bf219bf5a01bdcee0b0180f19ed79b5887 (patch) | |
tree | 7d84ea6ae6efbc8c660d22da4c0e244e42e25748 /pcitool | |
parent | fcc0da28faca832a5d10572ae62ffa0e25436b19 (diff) | |
download | pcitool-32c4a1bf219bf5a01bdcee0b0180f19ed79b5887.tar.gz pcitool-32c4a1bf219bf5a01bdcee0b0180f19ed79b5887.tar.bz2 pcitool-32c4a1bf219bf5a01bdcee0b0180f19ed79b5887.tar.xz pcitool-32c4a1bf219bf5a01bdcee0b0180f19ed79b5887.zip |
Sort registers before listing
Diffstat (limited to 'pcitool')
-rw-r--r-- | pcitool/cli.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/pcitool/cli.c b/pcitool/cli.c index 2ae569f..c3663d2 100644 --- a/pcitool/cli.c +++ b/pcitool/cli.c @@ -1,6 +1,7 @@ #define _XOPEN_SOURCE 700 #define _POSIX_C_SOURCE 200112L #define _BSD_SOURCE +#define _GNU_SOURCE #define _DEFAULT_SOURCE #include <stdio.h> @@ -386,8 +387,27 @@ void ErrorInternal(void *arg, const char *file, int line, pcilib_log_priority_t #define Error(...) ErrorInternal(NULL, __FILE__, __LINE__, PCILIB_LOG_ERROR, __VA_ARGS__) +int RegisterCompare(const void *aptr, const void *bptr, void *registers) { + pcilib_register_description_t *a = &((pcilib_register_description_t*)registers)[*(const pcilib_register_t*)aptr]; + pcilib_register_description_t *b = &((pcilib_register_description_t*)registers)[*(const pcilib_register_t*)bptr]; + + if (a->bank < b->bank) return -1; + if (a->bank > b->bank) return 1; + + if (a->addr < b->addr) return -1; + if (a->addr > b->addr) return 1; + + if ((a->type != PCILIB_REGISTER_BITS)&&(b->type == PCILIB_REGISTER_BITS)) return -1; + if ((a->type == PCILIB_REGISTER_BITS)&&(b->type != PCILIB_REGISTER_BITS)) return 1; + + if (a->offset < b->offset) return -1; + if (a->offset > b->offset) return 0; + + return 0; +} + void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const char *bank, int details) { - int i,j; + int i, j, k; const pcilib_register_bank_description_t *banks; const pcilib_register_description_t *registers; const pcilib_event_description_t *events; @@ -467,6 +487,8 @@ void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const else registers = model_info->registers; if (registers) { + pcilib_register_t regsort[handle->num_reg]; + pcilib_register_bank_addr_t bank_addr = 0; if (bank) { pcilib_register_bank_t bank_id = pcilib_find_register_bank(handle, bank); @@ -479,10 +501,21 @@ void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const } else { printf("Registers: \n"); } - for (i = 0; registers[i].bits; i++) { - const char *mode; - + + // sorting + for (i = 0, k = 0; registers[i].bits; i++) { if ((bank)&&(registers[i].bank != bank_addr)) continue; + if ((registers[i].type == PCILIB_REGISTER_BITS)&&(!details)) continue; + regsort[k++] = i; + } + + qsort_r(regsort, k, sizeof(pcilib_register_t), &RegisterCompare, (void*)registers); + + + for (j = 0; j < k; j++) { + const char *mode; + i = regsort[j]; + if (registers[i].type == PCILIB_REGISTER_BITS) { if (!details) continue; |