Root/
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 | ␊ |
27 | void 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 | ␊ |
67 | void 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 | ␊ |
79 | const 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 | ␊ |
103 | void 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 |