Chameleon

Chameleon Svn Source Tree

Root/branches/meklort/i386/libsaio/mem.c

Source at commit 284 created 13 years 10 months ago.
By blackosx, Amended my mistake by updating the Default theme images in the trunk. Now put them back as they were.. (Sorry)
1/*
2 * Copyright 2010 AsereBLN. All rights reserved. <aserebln@googlemail.com>
3 *
4 * mem.c - obtain system memory information
5 */
6
7#include "libsaio.h"
8#include "pci.h"
9#include "platform.h"
10#include "cpu.h"
11#include "mem.h"
12#include "smbios_patcher.h"
13
14#ifndef DEBUG_MEM
15#define DEBUG_MEM 0
16#endif
17
18#if DEBUG_MEM
19#define DBG(x...)printf(x)
20#else
21#define DBG(x...)
22#endif
23
24#define DC(c) (c >= 0x20 && c < 0x7f ? (char) c : '.')
25#define STEP 16
26
27void dumpPhysAddr(const char * title, void * a, int len)
28{
29 int i,j;
30 u_int8_t* ad = (u_int8_t*) a;
31 char buffer[80];
32 char str[16];
33
34 if(ad==NULL) return;
35
36 printf("%s addr=0x%08x len=%04d\n",title ? title : "Dump of ", a, len);
37 printf("Ofs-00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F ASCII\n");
38 i = (len/STEP)*STEP;
39 for (j=0; j < i; j+=STEP)
40 {
41 printf("%02x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
42 j,
43 ad[j], ad[j+1], ad[j+2], ad[j+3] , ad[j+4], ad[j+5], ad[j+6], ad[j+7],
44 ad[j+8], ad[j+9], ad[j+10], ad[j+11] , ad[j+12], ad[j+13], ad[j+14], ad[j+15],
45 DC(ad[j]), DC(ad[j+1]), DC(ad[j+2]), DC(ad[j+3]) , DC(ad[j+4]), DC(ad[j+5]), DC(ad[j+6]), DC(ad[j+7]),
46 DC(ad[j+8]), DC(ad[j+9]), DC(ad[j+10]), DC(ad[j+11]) , DC(ad[j+12]), DC(ad[j+13]), DC(ad[j+14]), DC(ad[j+15])
47 );
48 }
49
50 if (len%STEP==0) return;
51 sprintf(buffer,"%02x:", i);
52 for (j=0; j < STEP; j++) {
53 if (j<(len%STEP))
54 sprintf(str, " %02x", ad[i+j]);
55 else
56 strcpy(str, " " );
57 strncat(buffer, str, sizeof(buffer));
58 }
59 strncat(buffer," ", sizeof(buffer));
60 for (j=0; j < (len%STEP); j++) {
61 sprintf(str, "%c", DC(ad[i+j]));
62 strncat(buffer, str, sizeof(buffer));
63 }
64 printf("%s\n",buffer);
65}
66
67void dumpAllTablesOfType(int i)
68{
69 char title[32];
70 struct DMIHeader * dmihdr;
71 for(dmihdr = FindFirstDmiTableOfType(i, 4);
72 dmihdr;
73 dmihdr = FindNextDmiTableOfType(i, 4)) {
74 sprintf(title,"Table (type %d) :" , i);
75 dumpPhysAddr(title, dmihdr, dmihdr->length+32);
76 }
77}
78
79const char * getDMIString(struct DMIHeader * dmihdr, uint8_t strNum)
80{
81 const char * ret =NULL;
82 const char * startAddr = (const char *) dmihdr;
83 const char * limit = NULL;
84
85 if (!dmihdr || dmihdr->length<4 || strNum==0) return NULL;
86 startAddr += dmihdr->length;
87 limit = startAddr + 256;
88 for(; strNum; strNum--) {
89 if ((*startAddr)==0 && *(startAddr+1)==0) break;
90 if (*startAddr && strNum<=1) {
91 ret = startAddr; // current str
92 break;
93 }
94 while(*startAddr && startAddr<limit) startAddr++;
95 if (startAddr==limit) break; // no terminator found
96 else if((*startAddr==0) && *(startAddr+1)==0) break;
97 else startAddr++;
98 }
99
100 return ret;
101}
102
103void scan_memory(PlatformInfo_t *p)
104{
105 int i=0;
106 struct DMIHeader * dmihdr = NULL;
107
108 struct DMIMemoryModuleInfo* memInfo[MAX_RAM_SLOTS]; // 6
109 struct DMIPhysicalMemoryArray* physMemArray; // 16
110 struct DMIMemoryDevice* memDev[MAX_RAM_SLOTS]; //17
111
112 /* We mainly don't use obsolete tables 5,6 because most of computers don't handle it anymore */
113 Platform.DMI.MemoryModules = 0;
114 /* Now lets peek info rom table 16,17 as for some bios, table 5 & 6 are not used */
115 physMemArray = (struct DMIPhysicalMemoryArray*) FindFirstDmiTableOfType(16, 4);
116 Platform.DMI.MaxMemorySlots = physMemArray ? physMemArray->numberOfMemoryDevices : 0;
117
118 i = 0;
119 for(dmihdr = FindFirstDmiTableOfType(17, 4);
120 dmihdr;
121 dmihdr = FindNextDmiTableOfType(17, 4) ) {
122 memDev[i] = (struct DMIMemoryDevice*) dmihdr;
123 if (memDev[i]->size !=0 ) Platform.DMI.MemoryModules++;
124 if (memDev[i]->speed>0) Platform.RAM.DIMM[i].Frequency = memDev[i]->speed; // take it here for now but we'll check spd and dmi table 6 as well
125 i++;
126 }
127 // for table 6, we only have a look at the current speed
128 i = 0;
129 for(dmihdr = FindFirstDmiTableOfType(6, 4);
130 dmihdr;
131 dmihdr = FindNextDmiTableOfType(6, 4) ) {
132 memInfo[i] = (struct DMIMemoryModuleInfo*) dmihdr;
133 if (memInfo[i]->currentSpeed > Platform.RAM.DIMM[i].Frequency)
134 Platform.RAM.DIMM[i].Frequency = memInfo[i]->currentSpeed; // favor real overclocked speed if any
135 i++;
136 }
137#if 0
138 dumpAllTablesOfType(17);
139 getc();
140#endif
141}
142

Archive Download this file

Revision: 284