Home | History | Annotate | Download | only in hdt
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2011 Erwan Velu - All Rights Reserved
      4  *
      5  *   Permission is hereby granted, free of charge, to any person
      6  *   obtaining a copy of this software and associated documentation
      7  *   files (the "Software"), to deal in the Software without
      8  *   restriction, including without limitation the rights to use,
      9  *   copy, modify, merge, publish, distribute, sublicense, and/or
     10  *   sell copies of the Software, and to permit persons to whom
     11  *   the Software is furnished to do so, subject to the following
     12  *   conditions:
     13  *
     14  *   The above copyright notice and this permission notice shall
     15  *   be included in all copies or substantial portions of the Software.
     16  *
     17  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     18  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     19  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     20  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     21  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     22  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     23  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     24  *   OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  * -----------------------------------------------------------------------
     27  */
     28 
     29 #include <memory.h>
     30 #include "hdt-common.h"
     31 #include "hdt-dump.h"
     32 
     33 void dump_88(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
     34 
     35 	(void) hardware;
     36 	int mem_size = 0;
     37 	CREATE_NEW_OBJECT;
     38 	if (detect_memory_88(&mem_size)) {
     39 		add_s("memory.error","8800h memory configuration is invalid");
     40 		FLUSH_OBJECT
     41 		return;
     42 	}
     43 
     44 	add_s("dmi.item","memory via 88");
     45 	add_i("memory.size (KiB)", mem_size);
     46 	add_i("memory.size (MiB)", mem_size >> 10);
     47 	FLUSH_OBJECT;
     48 }
     49 
     50 void dump_e801(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
     51 
     52 	(void) hardware;
     53 	int mem_low, mem_high = 0;
     54 	CREATE_NEW_OBJECT;
     55 	if (detect_memory_e801(&mem_low,&mem_high)) {
     56 		add_s("memory.error","e801 memory configuration is invalid");
     57 		FLUSH_OBJECT;
     58 		return;
     59 	}
     60 
     61 	add_s("dmi.item","memory via e801");
     62 	add_i("memory.total.size (KiB)", mem_low + (mem_high << 6));
     63 	add_i("memory.total.size (MiB)", (mem_low >> 10) + (mem_high >> 4));
     64 	add_i("memory.low.size (KiB)", mem_low );
     65 	add_i("memory.low.size (MiB)", mem_low >> 10);
     66 	add_i("memory.high.size (KiB)", mem_high << 6);
     67 	add_i("memory.high.size (MiB)", mem_high >> 4);
     68 	FLUSH_OBJECT;
     69 
     70 }
     71 void dump_e820(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
     72 
     73 	(void) hardware;
     74 	struct e820entry map[E820MAX];
     75 	struct e820entry nm[E820MAX];
     76 	unsigned long memsize = 0;
     77 	int count = 0;
     78 	char type[14] = {0};
     79 
     80 	detect_memory_e820(map, E820MAX, &count);
     81  	memsize = memsize_e820(map, count);
     82 
     83 	CREATE_NEW_OBJECT;
     84 		add_s("dmi.item","memory via e820");
     85 		add_i("memory.total.size (KiB)", memsize);
     86 		add_i("memory.total.size (MiB)", (memsize + (1 << 9)) >> 10);
     87 	FLUSH_OBJECT;
     88 
     89 	for (int i = 0; i < count; i++) {
     90 		get_type(map[i].type, type, sizeof(type));
     91 		char begin[24]={0};
     92 		char size[24]={0};
     93 		char end[24]={0};
     94 		snprintf(begin,sizeof(begin),"0x%016llx",map[i].addr);
     95 		snprintf(size,sizeof(size),"0x%016llx",map[i].size);
     96 		snprintf(end,sizeof(end),"0x%016llx",map[i].addr+map[i].size);
     97 		CREATE_NEW_OBJECT;
     98 			add_s("memory.segment.start",begin);
     99 			add_s("memory.segment.size ",size);
    100 			add_s("memory.segment.end  ",end);
    101 			add_s("memory.segment.type ",remove_spaces(type));
    102 		FLUSH_OBJECT;
    103 	}
    104 
    105 	int nr = sanitize_e820_map(map, nm, count);
    106 	for (int i = 0; i < nr; i++) {
    107 		get_type(nm[i].type, type, sizeof(type));
    108 		char begin[24]={0};
    109 		char size[24]={0};
    110 		char end[24]={0};
    111 		snprintf(begin,sizeof(begin),"0x%016llx",nm[i].addr);
    112 		snprintf(size,sizeof(size),"0x%016llx",nm[i].size);
    113 		snprintf(end,sizeof(end),"0x%016llx",nm[i].addr+nm[i].size);
    114 		CREATE_NEW_OBJECT;
    115 			add_s("sanitized_memory.segment.start",begin);
    116 			add_s("sanitized_memory.segment.size ",size);
    117 			add_s("sanitized_memory.segment.end  ",end);
    118 			add_s("sanitized_memory.segment.type ",remove_spaces(type));
    119 		FLUSH_OBJECT;
    120 	}
    121 }
    122 
    123 void dump_memory(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
    124 
    125 	CREATE_NEW_OBJECT;
    126 		add_s("Memory configuration","true");
    127 	FLUSH_OBJECT;
    128 
    129 	dump_88(hardware,config,item);
    130 	dump_e801(hardware,config,item);
    131 	dump_e820(hardware,config,item);
    132 	to_cpio("memory");
    133 }
    134