Discussion:
[dmidecode] [PATCH 0/3] biosdecode: Decode the PIR table
Jean Delvare
2017-07-19 08:22:37 UTC
Permalink
As requested in feature #109339:
https://savannah.nongnu.org/support/index.php?109339

[1/3] biosdecode: Add option --pir full
[2/3] biosdecode: Clean up the PIR table output
[3/3] biosdecode: Avoid repating pointer arithmetics
--
Jean Delvare
SUSE L3 Support

_______________________________________________
https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
Jean Delvare
2017-07-19 08:23:22 UTC
Permalink
Add an option to decode the details of the PIR table.

This implements support request #109339:
https://savannah.nongnu.org/support/index.php?109339
---
biosdecode.c | 59 ++++++++++++++++++++++++++++++-------------------------
man/biosdecode.8 | 3 ++
2 files changed, 36 insertions(+), 26 deletions(-)

--- dmidecode.orig/biosdecode.c 2017-07-17 11:01:58.836719674 +0200
+++ dmidecode/biosdecode.c 2017-07-17 11:15:54.810625212 +0200
@@ -73,12 +73,16 @@ struct opt
{
const char *devmem;
unsigned int flags;
+ unsigned char pir;
};
static struct opt opt;

#define FLAG_VERSION (1 << 0)
#define FLAG_HELP (1 << 1)

+#define PIR_SHORT 0
+#define PIR_FULL 1
+
struct bios_entry {
const char *anchor;
size_t anchor_len; /* computed */
@@ -386,32 +390,29 @@ static int pir_decode(const u8 *p, size_
i, p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
pir_slot_number(p[(i + 1) * 16 + 14]);
printf("\n");
-/* printf("\tSlot Entry %u\n", i);
- printf("\t\tID: %02x:%02x\n",
- p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
- printf("\t\tLink Value for INTA#: %u\n",
- p[(i + 1) * 16 + 2]);
- printf("\t\tIRQ Bitmap for INTA#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 3));
- printf("\n");
- printf("\t\tLink Value for INTB#: %u\n",
- p[(i + 1) * 16 + 5]);
- printf("\t\tIRQ Bitmap for INTB#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 6));
- printf("\n");
- printf("\t\tLink Value for INTC#: %u\n",
- p[(i + 1) * 16 + 8]);
- printf("\t\tIRQ Bitmap for INTC#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 9));
- printf("\n");
- printf("\t\tLink Value for INTD#: %u\n",
- p[(i + 1) * 16 + 11]);
- printf("\t\tIRQ Bitmap for INTD#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 12));
- printf("\n");
- printf("\t\tSlot Number:");
- pir_slot_number(p[(i + 1) * 16 + 14]);
- printf("\n");*/
+ if (opt.pir == PIR_FULL)
+ {
+ printf("\t\tLink Value for INTA#: %u\n",
+ p[(i + 1) * 16 + 2]);
+ printf("\t\tIRQ Bitmap for INTA#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 3));
+ printf("\n");
+ printf("\t\tLink Value for INTB#: %u\n",
+ p[(i + 1) * 16 + 5]);
+ printf("\t\tIRQ Bitmap for INTB#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 6));
+ printf("\n");
+ printf("\t\tLink Value for INTC#: %u\n",
+ p[(i + 1) * 16 + 8]);
+ printf("\t\tIRQ Bitmap for INTC#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 9));
+ printf("\n");
+ printf("\t\tLink Value for INTD#: %u\n",
+ p[(i + 1) * 16 + 11]);
+ printf("\t\tIRQ Bitmap for INTD#:");
+ pir_irqs(WORD(p + (i + 1) * 16 + 12));
+ printf("\n");
+ }
}

return 1;
@@ -616,6 +617,7 @@ static int parse_command_line(int argc,
const char *optstring = "d:hV";
struct option longopts[] = {
{ "dev-mem", required_argument, NULL, 'd' },
+ { "pir", required_argument, NULL, 'P' },
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
@@ -627,6 +629,10 @@ static int parse_command_line(int argc,
case 'd':
opt.devmem = optarg;
break;
+ case 'P':
+ if (strcmp(optarg, "full") == 0)
+ opt.pir = PIR_FULL;
+ break;
case 'h':
opt.flags |= FLAG_HELP;
break;
@@ -646,6 +652,7 @@ static void print_help(void)
"Usage: biosdecode [OPTIONS]\n"
"Options are:\n"
" -d, --dev-mem FILE Read memory from device FILE (default: " DEFAULT_MEM_DEV ")\n"
+ " --pir full Decode the details of the PCI IRQ routing table\n"
" -h, --help Display this help text and exit\n"
" -V, --version Display the version and exit\n";

--- dmidecode.orig/man/biosdecode.8 2017-07-17 11:01:58.836719674 +0200
+++ dmidecode/man/biosdecode.8 2017-07-17 11:02:03.478781694 +0200
@@ -60,6 +60,9 @@ program.
.BR "-d" ", " "--dev-mem FILE"
Read memory from device \fBFILE\fR (default: \fB/dev/mem\fR)
.TP
+.BR " " " " "--pir full"
+Decode the details of the PCI IRQ routing table
+.TP
.BR "-h" ", " "--help"
Display usage information and exit
.TP
--
Jean Delvare
SUSE L3 Support

_______________________________________________
https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
Jean Delvare
2017-07-19 08:23:59 UTC
Permalink
* Remove entry numbers.
* Use "Device" instead of "ID".
* Put repeated code in a function.
* Don't display unconnected links.
* Shorten "slot number" to just "slot".
---
biosdecode.c | 42 ++++++++++++++++++------------------------
1 file changed, 18 insertions(+), 24 deletions(-)

--- dmidecode.orig/biosdecode.c 2017-07-17 11:15:54.810625212 +0200
+++ dmidecode/biosdecode.c 2017-07-17 12:09:56.855050306 +0200
@@ -355,7 +355,7 @@ static void pir_slot_number(u8 code)
if (code == 0)
printf(" on-board");
else
- printf(" slot number %u", code);
+ printf(" slot %u", code);
}

static size_t pir_length(const u8 *p)
@@ -363,6 +363,16 @@ static size_t pir_length(const u8 *p)
return WORD(p + 6);
}

+static void pir_link_bitmap(char letter, const u8 *p)
+{
+ if (p[0] == 0) /* Not connected */
+ return;
+
+ printf("\t\tINT%c#: Link 0x%02x, IRQ Bitmap", letter, p[0]);
+ pir_irqs(WORD(p + 1));
+ printf("\n");
+}
+
static int pir_decode(const u8 *p, size_t len)
{
int i;
@@ -372,7 +382,7 @@ static int pir_decode(const u8 *p, size_

printf("PCI Interrupt Routing %u.%u present.\n",
p[5], p[4]);
- printf("\tRouter ID: %02x:%02x.%1x\n",
+ printf("\tRouter Device: %02x:%02x.%1x\n",
p[8], p[9]>>3, p[9] & 0x07);
printf("\tExclusive IRQs:");
pir_irqs(WORD(p + 10));
@@ -386,32 +396,16 @@ static int pir_decode(const u8 *p, size_

for (i = 1; i <= (WORD(p + 6) - 32) / 16; i++)
{
- printf("\tSlot Entry %u: ID %02x:%02x,",
- i, p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
+ printf("\tDevice: %02x:%02x,",
+ p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
pir_slot_number(p[(i + 1) * 16 + 14]);
printf("\n");
if (opt.pir == PIR_FULL)
{
- printf("\t\tLink Value for INTA#: %u\n",
- p[(i + 1) * 16 + 2]);
- printf("\t\tIRQ Bitmap for INTA#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 3));
- printf("\n");
- printf("\t\tLink Value for INTB#: %u\n",
- p[(i + 1) * 16 + 5]);
- printf("\t\tIRQ Bitmap for INTB#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 6));
- printf("\n");
- printf("\t\tLink Value for INTC#: %u\n",
- p[(i + 1) * 16 + 8]);
- printf("\t\tIRQ Bitmap for INTC#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 9));
- printf("\n");
- printf("\t\tLink Value for INTD#: %u\n",
- p[(i + 1) * 16 + 11]);
- printf("\t\tIRQ Bitmap for INTD#:");
- pir_irqs(WORD(p + (i + 1) * 16 + 12));
- printf("\n");
+ pir_link_bitmap('A', p + (i + 1) * 16 + 2);
+ pir_link_bitmap('B', p + (i + 1) * 16 + 5);
+ pir_link_bitmap('C', p + (i + 1) * 16 + 8);
+ pir_link_bitmap('D', p + (i + 1) * 16 + 11);
}
}
--
Jean Delvare
SUSE L3 Support

_______________________________________________
https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
Jean Delvare
2017-07-19 08:26:49 UTC
Permalink
This makes the code both more efficient and more readable.
---
biosdecode.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)

--- dmidecode.orig/biosdecode.c 2017-07-17 11:16:06.510774783 +0200
+++ dmidecode/biosdecode.c 2017-07-17 11:16:19.897945953 +0200
@@ -375,7 +375,7 @@ static void pir_link_bitmap(char letter,

static int pir_decode(const u8 *p, size_t len)
{
- int i;
+ int i, n;

if (len < 32 || !checksum(p, WORD(p + 6)))
return 0;
@@ -394,18 +394,18 @@ static int pir_decode(const u8 *p, size_
printf("\tMiniport Data: 0x%08X\n",
DWORD(p + 16));

- for (i = 1; i <= (WORD(p + 6) - 32) / 16; i++)
+ n = (len - 32) / 16;
+ for (i = 1, p += 32; i <= n; i++, p += 16)
{
- printf("\tDevice: %02x:%02x,",
- p[(i + 1) * 16], p[(i + 1) * 16 + 1] >> 3);
- pir_slot_number(p[(i + 1) * 16 + 14]);
+ printf("\tDevice: %02x:%02x,", p[0], p[1] >> 3);
+ pir_slot_number(p[14]);
printf("\n");
if (opt.pir == PIR_FULL)
{
- pir_link_bitmap('A', p + (i + 1) * 16 + 2);
- pir_link_bitmap('B', p + (i + 1) * 16 + 5);
- pir_link_bitmap('C', p + (i + 1) * 16 + 8);
- pir_link_bitmap('D', p + (i + 1) * 16 + 11);
+ pir_link_bitmap('A', p + 2);
+ pir_link_bitmap('B', p + 5);
+ pir_link_bitmap('C', p + 8);
+ pir_link_bitmap('D', p + 11);
}
}
--
Jean Delvare
SUSE L3 Support

_______________________________________________
https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
Loading...