struct page* region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE * is the minimum useful size for something on unused_pages) */ if ( (unsigned long)s + (unsigned long)K * RPAGESIZE < (unsigned long)MINIMUM_MEM_REQUEST ) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; mem = malloc(request_bytes + RPAGESIZE); if (!mem) return NULL; newp = PALIGN(mem, RPAGESIZE); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; #ifndef NMEMDEBUG set_region_range(newp, (char*)newp + request_bytes, FREEPAGE); #endif /* ifndef NMEMDEBUG */ total_page_count += request_bytes >> RPAGELOG; /* this should be atomic * */ newp->pagecount = request_bytes >> RPAGELOG; newp->free = 1; return newp; }
struct page* region_get_mem(size_t s) { struct page *newp, *tmp; #if 0 s = ALIGN(s, 65536); #endif /* if 0 */ newp = (struct page*)MMAP(0, s, PROT_READ | PROT_WRITE, MAP_PRIVATE); if (!newp) return NULL; if (PALIGN(newp, RPAGESIZE) != newp) abort(); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char*)newp + s, FREEPAGE); #endif /* ifndef NMEMDEBUG */ total_page_count += s >> RPAGELOG; /* This should be atomic */ newp->pagecount = s >> RPAGELOG; newp->free = 1; return newp; }
void findrefs(region r, void *from, void *to) { char *f; if (!out) out = fopen("/dev/tty", "w"); for (f = PALIGN(from, PTRALIGNMENT); f < (char *)to; f += PTRALIGNMENT) if (regionof(*(void **)f) == r) printref(f); fflush(out); }
void *__rc_ralloc_small0(region r, size_t size) { char *mem2; mem2 = PALIGN(r->normal.page.allocfrom, RALIGNMENT); if (mem2 + size >= r->normal.page.end) return __rc_typed_ralloc(r, size, 0); record_alloc(size); r->normal.page.allocfrom = mem2 + size + REDZONE; // VALGRIND_DO_QUICK_LEAK_CHECK; VALGRIND_MEMPOOL_ALLOC(r, mem2, size); postclear(mem2, size); return mem2; }
struct page *region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE is the minimum useful size for something on unused_pages) */ if (s + K * RPAGESIZE < MINIMUM_MEM_REQUEST) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; #if 0 request_bytes = ALIGN(request_bytes, 65536); #endif mem = (struct page *)MMAP(0, request_bytes+RPAGESIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE); if (!mem) { out_of_memory(); abort(); } VALGRIND_MALLOCLIKE_BLOCK(mem, request_bytes+RPAGESIZE, 0, 0); // VALGRIND_MAKE_NOACCESS(mem, request_bytes+RPAGESIZE); newp = PALIGN(mem, RPAGESIZE); VALGRIND_MAKE_WRITABLE(newp, sizeof(struct page)); memset(newp, 0, sizeof(struct page)); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; addbyaddress(newp); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char *)newp + s, FREEPAGE); #endif total_page_count += request_bytes >> RPAGELOG; newp->pagecount = request_bytes >> RPAGELOG; assert(newp->pagecount > 0); newp->free = 1; addfront(&unused_pages, newp); return newp; }
struct page *region_get_mem(size_t s) { size_t request_bytes; void *mem; struct page *newp; /* Don't get less than K * RPAGESIZE extra memory (K * RPAGESIZE is the minimum useful size for something on unused_pages) */ if (s + K * RPAGESIZE < MINIMUM_MEM_REQUEST) request_bytes = MINIMUM_MEM_REQUEST; else request_bytes = s; mem = xmalloc(request_bytes + RPAGESIZE); // memset(mem, 0, request_bytes + RPAGESIZE); // VALGRIND_MAKE_NOACCESS(mem, request_bytes + RPAGESIZE); newp = PALIGN(mem, RPAGESIZE); // fprintf(stderr, "## region_get_mem: s=%d, request_bytes=%d, mem=%p, newp=%p\n", s, request_bytes, mem, newp); // VALGRIND_MAKE_WRITABLE(newp, sizeof(struct page)); memset(newp, 0, sizeof(struct page)); if (mem == newp) /* Maybe we were lucky! */ request_bytes += RPAGESIZE; addbyaddress(newp); /* Add the new memory to unused_pages */ #ifndef NMEMDEBUG set_region_range(newp, (char *)newp + request_bytes, FREEPAGE); #endif total_page_count += request_bytes >> RPAGELOG; newp->pagecount = request_bytes >> RPAGELOG; assert(newp->pagecount > 0); newp->free = 1; addfront(&unused_pages, newp); return newp; }
static void dump_blob(void *blob) { struct fdt_header *bph = blob; uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap); uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct); uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings); struct fdt_reserve_entry *p_rsvmap = (struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap); const char *p_struct = (const char *)blob + off_dt; const char *p_strings = (const char *)blob + off_str; uint32_t version = fdt32_to_cpu(bph->version); uint32_t totalsize = fdt32_to_cpu(bph->totalsize); uint32_t tag; const char *p, *s, *t; int depth, sz, shift; int i; uint64_t addr, size; depth = 0; shift = 4; printf("/dts-v1/;\n"); printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic)); printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize); printf("// off_dt_struct:\t0x%x\n", off_dt); printf("// off_dt_strings:\t0x%x\n", off_str); printf("// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap); printf("// version:\t\t%d\n", version); printf("// last_comp_version:\t%d\n", fdt32_to_cpu(bph->last_comp_version)); if (version >= 2) printf("// boot_cpuid_phys:\t0x%x\n", fdt32_to_cpu(bph->boot_cpuid_phys)); if (version >= 3) printf("// size_dt_strings:\t0x%x\n", fdt32_to_cpu(bph->size_dt_strings)); if (version >= 17) printf("// size_dt_struct:\t0x%x\n", fdt32_to_cpu(bph->size_dt_struct)); printf("\n"); for (i = 0; ; i++) { addr = fdt64_to_cpu(p_rsvmap[i].address); size = fdt64_to_cpu(p_rsvmap[i].size); if (addr == 0 && size == 0) break; printf("/memreserve/ %llx %llx;\n", (unsigned long long)addr, (unsigned long long)size); } p = p_struct; while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) { /* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */ if (tag == FDT_BEGIN_NODE) { s = p; p = PALIGN(p + strlen(s) + 1, 4); if (*s == '\0') s = "/"; printf("%*s%s {\n", depth * shift, "", s); depth++; continue; } if (tag == FDT_END_NODE) { depth--; printf("%*s};\n", depth * shift, ""); continue; } if (tag == FDT_NOP) { printf("%*s// [NOP]\n", depth * shift, ""); continue; } if (tag != FDT_PROP) { fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag); break; } sz = fdt32_to_cpu(GET_CELL(p)); s = p_strings + fdt32_to_cpu(GET_CELL(p)); if (version < 16 && sz >= 8) p = PALIGN(p, 8); t = p; p = PALIGN(p + sz, 4); printf("%*s%s", depth * shift, "", s); print_data(t, sz); printf(";\n"); } }
VOID DumpFdt ( IN VOID* FdtBlob ) { struct fdt_header *bph; UINT32 off_dt; UINT32 off_str; CONST CHAR8* p_struct; CONST CHAR8* p_strings; CONST CHAR8* p; CONST CHAR8* s; CONST CHAR8* t; UINT32 tag; UINTN sz; UINTN depth; UINTN shift; UINT32 version; depth = 0; shift = 4; bph = FdtBlob; off_dt = fdt32_to_cpu(bph->off_dt_struct); off_str = fdt32_to_cpu(bph->off_dt_strings); p_struct = (CONST CHAR8*)FdtBlob + off_dt; p_strings = (CONST CHAR8*)FdtBlob + off_str; version = fdt32_to_cpu(bph->version); p = p_struct; while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) { if (tag == FDT_BEGIN_NODE) { s = p; p = PALIGN(p + strlen(s) + 1, 4); if (*s == '\0') s = "/"; Print(L"%*s%a {\n", depth * shift, L" ", s); depth++; continue; } if (tag == FDT_END_NODE) { depth--; Print(L"%*s};\n", depth * shift, L" "); continue; } if (tag == FDT_NOP) { Print(L"%*s// [NOP]\n", depth * shift, L" "); continue; } if (tag != FDT_PROP) { Print(L"%*s ** Unknown tag 0x%08x\n", depth * shift, L" ", tag); break; } sz = fdt32_to_cpu(GET_CELL(p)); s = p_strings + fdt32_to_cpu(GET_CELL(p)); if (version < 16 && sz >= 8) p = PALIGN(p, 8); t = p; p = PALIGN(p + sz, 4); Print(L"%*s%a", depth * shift, L" ", s); PrintData(t, sz); Print(L";\n"); } }
STATIC VOID DumpFdt ( IN VOID* FdtBlob ) { struct fdt_header *bph; UINT32 off_dt; UINT32 off_str; CONST CHAR8* p_struct; CONST CHAR8* p_strings; CONST CHAR8* p; CONST CHAR8* s; CONST CHAR8* t; UINT32 tag; UINTN sz; UINTN depth; UINTN shift; UINT32 version; { // Can 'memreserve' be printed by below code? INTN num = fdt_num_mem_rsv (FdtBlob); INTN i, err; UINT64 addr = 0, size = 0; for (i = 0; i < num; i++) { err = fdt_get_mem_rsv (FdtBlob, i, &addr, &size); if (err) { DEBUG ((EFI_D_ERROR, "Error (%d) : Cannot get memreserve section (%d)\n", err, i)); } else { Print (L"/memreserve/ \t0x%lx \t0x%lx;\n", addr, size); } } } depth = 0; shift = 4; bph = FdtBlob; off_dt = fdt32_to_cpu (bph->off_dt_struct); off_str = fdt32_to_cpu (bph->off_dt_strings); p_struct = (CONST CHAR8*)FdtBlob + off_dt; p_strings = (CONST CHAR8*)FdtBlob + off_str; version = fdt32_to_cpu (bph->version); p = p_struct; while ((tag = fdt32_to_cpu (GET_CELL (p))) != FDT_END) { if (tag == FDT_BEGIN_NODE) { s = p; p = PALIGN (p + AsciiStrLen (s) + 1, 4); if (*s == '\0') s = "/"; Print (L"%*s%a {\n", depth * shift, L" ", s); depth++; continue; } if (tag == FDT_END_NODE) { depth--; Print (L"%*s};\n", depth * shift, L" "); continue; } if (tag == FDT_NOP) { Print (L"%*s// [NOP]\n", depth * shift, L" "); continue; } if (tag != FDT_PROP) { Print (L"%*s ** Unknown tag 0x%08x\n", depth * shift, L" ", tag); break; } sz = fdt32_to_cpu (GET_CELL (p)); s = p_strings + fdt32_to_cpu (GET_CELL (p)); if (version < 16 && sz >= 8) p = PALIGN (p, 8); t = p; p = PALIGN (p + sz, 4); Print (L"%*s%a", depth * shift, L" ", s); PrintData (t, sz); Print (L";\n"); } }
static void dump_blob(void *blob, bool debug) { uintptr_t blob_off = (uintptr_t)blob; struct fdt_header *bph = blob; uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap); uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct); uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings); struct fdt_reserve_entry *p_rsvmap = (struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap); const char *p_struct = (const char *)blob + off_dt; /* Get offset to the strings */ const char *p_strings = (const char *)blob + off_str; uint32_t version = fdt32_to_cpu(bph->version); uint32_t totalsize = fdt32_to_cpu(bph->totalsize); uint32_t tag; const char *p, *s, *t; int depth, sz, shift; int i; uint64_t addr, size; char *buffer; buffer = (char *)malloc(MAX_LEN); depth = 0; shift = 4; uint32_t off_total_size = fdt32_to_cpu(bph->totalsize); /* TODO: Remove this additional info. Do I need it? */ dprintf(buffer, "totalsize: %d\n", off_total_size); dprintf(buffer, "// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic)); dprintf(buffer, "// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize); dprintf(buffer, "// off_dt_struct:\t0x%x\n", off_dt); dprintf(buffer, "// off_dt_strings:\t0x%x\n", off_str); dprintf(buffer, "// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap); dprintf(buffer, "// version:\t\t%d\n", version); dprintf(buffer, "// last_comp_version:\t%d\n", fdt32_to_cpu(bph->last_comp_version)); if (version >= 2) dprintf(buffer, "// boot_cpuid_phys:\t0x%x\n", fdt32_to_cpu(bph->boot_cpuid_phys)); if (version >= 3) dprintf(buffer, "// size_dt_strings:\t0x%x\n", fdt32_to_cpu(bph->size_dt_strings)); if (version >= 17) dprintf(buffer, "// size_dt_struct:\t0x%x\n", fdt32_to_cpu(bph->size_dt_struct)); dprintf(buffer, "\n"); for (i = 0; ; i++) { addr = fdt64_to_cpu(p_rsvmap[i].address); size = fdt64_to_cpu(p_rsvmap[i].size); if (addr == 0 && size == 0) break; dprintf(buffer, "/memreserve/ %#llx %#llx;\n", (unsigned long long)addr, (unsigned long long)size); } p = p_struct; while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) { dumpf("%04zx: tag: 0x%08x (%s)\n", (uintptr_t)p - blob_off - 4, tag, tagname(tag)); if (tag == FDT_BEGIN_NODE) { s = p; p = PALIGN(p + strlen(s) + 1, 4); if (*s == '\0') s = "/"; dprintf(buffer, "%*s%s {\n", depth * shift, "", s); depth++; continue; } if (tag == FDT_END_NODE) { depth--; dprintf(buffer, "%*s};\n", depth * shift, ""); continue; } if (tag == FDT_NOP) { dprintf(buffer, "%*s// [NOP]\n", depth * shift, ""); continue; } if (tag != FDT_PROP) { fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag); break; } /* sz - length of the returned values in bytes */ sz = fdt32_to_cpu(GET_CELL(p)); /* s - pointer to the property name */ s = p_strings + fdt32_to_cpu(GET_CELL(p)); if (version < 16 && sz >= 8) p = PALIGN(p, 8); t = p; p = PALIGN(p + sz, 4); dumpf("%04zx: string: %s\n", (uintptr_t)s - blob_off, s); dumpf("%04zx: value\n", (uintptr_t)t - blob_off); dprintf(buffer, "%*s%s", depth * shift, "", s); my_utilfdt_print_data(t, sz, buffer); dprintf(buffer, ";\n"); } printf("%s", buffer); }