85 lines · 1.5 KB · C
RawDownload
#include "u.h"#include "lib.h"#include "dat.h"#include "fns.h"#include "mem.h" typedef struct {	uvlong	base;	uvlong	len;	ulong	type;} Emap; static char *etypes[] ={	"type=0",	"memory",	"reserved",	"acpi reclaim",	"acpi nvs",}; static intemapcmp(const void *va, const void *vb){	Emap *a, *b;		a = (Emap*)va;	b = (Emap*)vb;	if(a->base < b->base)		return -1;	if(a->base > b->base)		return 1;	if(a->len < b->len)		return -1;	if(a->len > b->len)		return 1;	return a->type - b->type;} voide820(void){	ulong i, nt, quiet;	Emap *e, **p, *tab[maxe820];	MMap *m; 	i = *(uchar*)e820end;	print("found %lud e820 entries\n", i);	if(i > maxe820)		return;	quiet = getconf("*e820print") == 0 && i>1;	e = (Emap*)e820tab;	for(nt = 0; nt < i; nt++){		if(e[nt].type == 0)			break;		for(p = tab+nt; p > tab && emapcmp(p[-1], e+nt) > 0; p--)			*p = p[-1];		*p = e+nt;	}	changeconf("e820", 0, "");	changeconf("*e820", 0, "");	for(p = tab; p < tab+nt; p++){		e = *p; 		if(e->type == 1)			changeconf("e820", 1, "%llux %llux ", e->base, e->base+e->len);		changeconf("*e820", 1, "%ld %#llux %#llux ", e->type, e->base, e->base+e->len);		if(!quiet){			print("e820: %.8llux %.8llux ", e->base, e->base+e->len);			if(e->type < nelem(etypes))				print("%s\n", etypes[e->type]);			else				print("type=%lud\n", e->type);		}		if(e->type == 0)			break;		m = mmap + nmmap++;		m->size = 20;		m->base[0] = e->base;		m->base[1] = e->base>>32;		m->length[0] = e->len;		m->length[1] = e->len>>32;		m->type = e->type;	}}