@@ -71,6 +71,8 @@ static const char *bad_index = "<BAD INDEX>";
71
71
72
72
#define SUPPORTED_SMBIOS_VER 0x0208
73
73
74
+ #define FLAG_NO_FILE_OFFSET (1 << 0)
75
+
74
76
/*
75
77
* Type-independant Stuff
76
78
*/
@@ -4331,7 +4333,8 @@ static void dmi_table_dump(u32 base, u16 len, const char *devmem)
4331
4333
free (buf );
4332
4334
}
4333
4335
4334
- static void dmi_table (u32 base , u16 len , u16 num , u16 ver , const char * devmem )
4336
+ static void dmi_table (u32 base , u16 len , u16 num , u16 ver , const char * devmem ,
4337
+ u32 flags )
4335
4338
{
4336
4339
u8 * buf ;
4337
4340
u8 * data ;
@@ -4362,6 +4365,15 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem)
4362
4365
printf ("\n" );
4363
4366
}
4364
4367
4368
+ /*
4369
+ * When we are reading the DMI table from sysfs, we want to print
4370
+ * the address of the table (done above), but the offset of the
4371
+ * data in the file is 0. When reading from /dev/mem, the offset
4372
+ * in the file is the address.
4373
+ */
4374
+ if (flags & FLAG_NO_FILE_OFFSET )
4375
+ base = 0 ;
4376
+
4365
4377
if ((buf = mem_chunk (base , len , devmem )) == NULL )
4366
4378
{
4367
4379
fprintf (stderr , "Table is unreachable, sorry."
@@ -4468,7 +4480,7 @@ static void overwrite_dmi_address(u8 *buf)
4468
4480
buf [0x0B ] = 0 ;
4469
4481
}
4470
4482
4471
- static int smbios_decode (u8 * buf , const char * devmem )
4483
+ static int smbios_decode (u8 * buf , const char * devmem , u32 flags )
4472
4484
{
4473
4485
u16 ver ;
4474
4486
@@ -4500,7 +4512,7 @@ static int smbios_decode(u8 *buf, const char *devmem)
4500
4512
ver >> 8 , ver & 0xFF );
4501
4513
4502
4514
dmi_table (DWORD (buf + 0x18 ), WORD (buf + 0x16 ), WORD (buf + 0x1C ),
4503
- ver , devmem );
4515
+ ver , devmem , flags );
4504
4516
4505
4517
if (opt .flags & FLAG_DUMP_BIN )
4506
4518
{
@@ -4518,7 +4530,7 @@ static int smbios_decode(u8 *buf, const char *devmem)
4518
4530
return 1 ;
4519
4531
}
4520
4532
4521
- static int legacy_decode (u8 * buf , const char * devmem )
4533
+ static int legacy_decode (u8 * buf , const char * devmem , u32 flags )
4522
4534
{
4523
4535
if (!checksum (buf , 0x0F ))
4524
4536
return 0 ;
@@ -4528,7 +4540,7 @@ static int legacy_decode(u8 *buf, const char *devmem)
4528
4540
buf [0x0E ] >> 4 , buf [0x0E ] & 0x0F );
4529
4541
4530
4542
dmi_table (DWORD (buf + 0x08 ), WORD (buf + 0x06 ), WORD (buf + 0x0C ),
4531
- ((buf [0x0E ] & 0xF0 ) << 4 ) + (buf [0x0E ] & 0x0F ), devmem );
4543
+ ((buf [0x0E ] & 0xF0 ) << 4 ) + (buf [0x0E ] & 0x0F ), devmem , flags );
4532
4544
4533
4545
if (opt .flags & FLAG_DUMP_BIN )
4534
4546
{
@@ -4646,12 +4658,12 @@ int main(int argc, char * const argv[])
4646
4658
4647
4659
if (memcmp (buf , "_SM_" , 4 ) == 0 )
4648
4660
{
4649
- if (smbios_decode (buf , opt .dumpfile ))
4661
+ if (smbios_decode (buf , opt .dumpfile , 0 ))
4650
4662
found ++ ;
4651
4663
}
4652
4664
else if (memcmp (buf , "_DMI_" , 5 ) == 0 )
4653
4665
{
4654
- if (legacy_decode (buf , opt .dumpfile ))
4666
+ if (legacy_decode (buf , opt .dumpfile , 0 ))
4655
4667
found ++ ;
4656
4668
}
4657
4669
goto done ;
@@ -4674,7 +4686,7 @@ int main(int argc, char * const argv[])
4674
4686
goto exit_free ;
4675
4687
}
4676
4688
4677
- if (smbios_decode (buf , opt .devmem ))
4689
+ if (smbios_decode (buf , opt .devmem , 0 ))
4678
4690
found ++ ;
4679
4691
goto done ;
4680
4692
@@ -4690,15 +4702,15 @@ int main(int argc, char * const argv[])
4690
4702
{
4691
4703
if (memcmp (buf + fp , "_SM_" , 4 ) == 0 && fp <= 0xFFE0 )
4692
4704
{
4693
- if (smbios_decode (buf + fp , opt .devmem ))
4705
+ if (smbios_decode (buf + fp , opt .devmem , 0 ))
4694
4706
{
4695
4707
found ++ ;
4696
4708
fp += 16 ;
4697
4709
}
4698
4710
}
4699
4711
else if (memcmp (buf + fp , "_DMI_" , 5 ) == 0 )
4700
4712
{
4701
- if (legacy_decode (buf + fp , opt .devmem ))
4713
+ if (legacy_decode (buf + fp , opt .devmem , 0 ))
4702
4714
found ++ ;
4703
4715
}
4704
4716
}
0 commit comments