volatileunsignedlong mem_err; /* So we know an error occurred */
/* * Probe memory in 4MB chunks, waiting for an error to tell us we've fallen * off the end of real memory. Only suitable for the 2100/3100's (PMAX).
*/
/* read unmapped and uncached (KSEG1) * DECstations have at least 4MB RAM * Assume less than 480MB of RAM, as this is max for 5000/2xx * FIXME this should be replaced by the first free page!
*/ for (memory_page = (unsignedchar *)CKSEG1 + CHUNK_SIZE;
mem_err == 0 && memory_page < (unsignedchar *)CKSEG1 + 0x1e00000;
memory_page += CHUNK_SIZE) {
dummy = *memory_page;
}
memcpy((void *)(CKSEG0 + 0x80), &old_handler, 0x80);
/* * Use the REX prom calls to get hold of the memory bitmap, and thence * determine memory size.
*/ static __init void rex_setup_memory_region(void)
{ int i, bitmap_size; unsignedlong mem_start = 0, mem_size = 0;
memmap *bm;
/* some free 64k */
bm = (memmap *)CKSEG0ADDR(0x28000);
bitmap_size = rex_getbitmap(bm);
for (i = 0; i < bitmap_size; i++) { /* FIXME: very simplistically only add full sets of pages */ if (bm->bitmap[i] == 0xff)
mem_size += (8 * bm->pagesize); elseif (!mem_size)
mem_start += (8 * bm->pagesize); else {
memblock_add(mem_start, mem_size);
mem_start += mem_size + (8 * bm->pagesize);
mem_size = 0;
}
} if (mem_size)
memblock_add(mem_start, mem_size);
}
/* * Free everything below the kernel itself but leave * the first page reserved for the exception handlers.
*/
#if IS_ENABLED(CONFIG_DECLANCE) /* * Leave 128 KB reserved for Lance memory for * IOASIC DECstations. * * XXX: save this address for use in dec_lance.c?
*/ if (IOASIC)
end = __pa(&_text) - 0x00020000; else #endif
end = __pa(&_text);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.