From 26ff1025b44131b1cf4833a28b95343aeeb13eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gwenol=C3=A9=20Beauchesne?= Date: Tue, 9 Aug 2005 08:01:11 +0000 Subject: map more closely to dmidecode behaviour's, aka mmap(/dev/mem) and find/read the raw DMI table in a whole. --- perl-install/c/smp-dmi.c | 155 +++++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 66 deletions(-) diff --git a/perl-install/c/smp-dmi.c b/perl-install/c/smp-dmi.c index 241d8f464..60a92b9d6 100644 --- a/perl-install/c/smp-dmi.c +++ b/perl-install/c/smp-dmi.c @@ -12,6 +12,7 @@ #include #include #include +#include typedef unsigned char u8; typedef unsigned short u16; @@ -50,6 +51,34 @@ dump_raw_data(void *data, unsigned int length) } +#define DEFAULT_MEM_DEV "/dev/mem" + +void *mem_chunk(u32 base, u32 len, const char *devmem) +{ + void *p; + int fd; + off_t mmoffset; + void *mmp; + + if ((fd = open(devmem, O_RDONLY)) < 0) + return NULL; + + if ((p = malloc(len)) == NULL) + return NULL; + + mmoffset = base % getpagesize(); + mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset); + if (mmp == MAP_FAILED) { + free(p); + return NULL; + } + + memcpy(p, (u8 *)mmp + mmoffset, len); + munmap(mmp, mmoffset + len); + close(fd); + return p; +} + struct dmi_header { @@ -135,78 +164,65 @@ static char *dmi_processor_family(u8 code) typedef int (*dmi_decode)(u8 * data); -static int decode_handle(int fd, u32 base, int len, int num, dmi_decode decode) +static int decode_handle(u32 base, int len, int num, dmi_decode decode) { - u8 *buf = malloc(len); - struct dmi_header *dm; - u8 *data; - int i = 0; - int ret = 0; - - if (lseek(fd, (long)base, 0) == -1) { - perror("dmi: lseek"); - return; - } - if (read(fd, buf, len)!=len) { - perror("dmi: read"); - return; - } - data = buf; - while(ilength; - while(next-buf+1length; + while(next-buf+1 s2 ? s1 : s2; } + +#ifdef TEST +int main(void) +{ + printf("Memory Size: %d MB\n", dmiDetectMemory()); +} +#endif -- cgit v1.2.1