Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/Memory/mem.c

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 "fake_efi.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 snprintf(buffer, sizeof(buffer),"%02x:", i);
52 for (j=0; j < STEP; j++) {
53 if (j<(len%STEP))
54 snprintf(str, sizeof(str)," %02x", ad[i+j]);
55 else
56 strlcpy(str, " " , sizeof(str));
57 strlcat(buffer, str, sizeof(buffer));
58 }
59 strlcat(buffer," ", sizeof(buffer));
60 for (j=0; j < (len%STEP); j++) {
61 snprintf(str, sizeof(str) ,"%c", DC(ad[i+j]));
62 strlcat(buffer, str, sizeof(buffer));
63 }
64 printf("%s\n",buffer);
65}
66
67#if UNUSED
68const char * getDMIString(struct DMIHeader * dmihdr, uint8_t strNum)
69{
70 const char * ret =NULL;
71 const char * startAddr = (const char *) dmihdr;
72 const char * limit = NULL;
73
74 if (!dmihdr || dmihdr->length<4 || strNum==0) return NULL;
75 startAddr += dmihdr->length;
76 limit = startAddr + 256;
77 for(; strNum; strNum--) {
78 if ((*startAddr)==0 && *(startAddr+1)==0) break;
79 if (*startAddr && strNum<=1) {
80 ret = startAddr; // current str
81 break;
82 }
83 while(*startAddr && startAddr<limit) startAddr++;
84 if (startAddr==limit) break; // no terminator found
85 else if((*startAddr==0) && *(startAddr+1)==0) break;
86 else startAddr++;
87 }
88
89 return ret;
90}
91
92void dumpAllTablesOfType(int i)
93{
94 char title[32];
95struct DMIHeader * dmihdr;
96for(dmihdr = FindFirstDmiTableOfType(i, 4);
97dmihdr;
98dmihdr = FindNextDmiTableOfType(i, 4)) {
99snprintf(title,sizeof(title),"Table (type %d) :" , i);
100dumpPhysAddr(title, dmihdr, dmihdr->length+32);
101}
102}
103
104#endif
105

Archive Download this file

Revision: 2044