| plan 9 kernel history: overview | file list | diff list |
pc/memory.c (diff list | history)
| 1997/0327/sys/src/9/pc/memory.c:21,27 – 1997/0328/sys/src/9/pc/memory.c:21,27 (short | long) | ||
| 1997/0327 | KB = 1024, MemMinMB = 4, /* minimum physical memory (<=4MB) */ | |
| 1997/0328 | MemMaxMB = 512, /* maximum physical memory to check */ | |
| 1997/0327 | NMemBase = 10, }; | |
| 1997/0328/sys/src/9/pc/memory.c:67,73 – 1997/0329/sys/src/9/pc/memory.c:67,105 (short | long) | ||
| 1997/0327 | &mapumb[63], }; | |
| 1997/0329 | static Map mapumbr[8]; static RMap rmapumbr = { "UMB device memory", mapumbr, &mapumbr[7], }; #define notdef #ifdef notdef | |
| 1997/0327 | void | |
| 1997/0329 | dumpmembank(void) { Map *mp; ulong maxpa, maxpa1, maxpa2; maxpa = (nvramread(0x18)<<8)|nvramread(0x17); maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); print("maxpa = %uX -> %uX, maxpa1 = %uXm maxpa2 = %uX\n", maxpa, MB+maxpa*KB, maxpa1, maxpa2); for(mp = rmapram.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapumb.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapumbr.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapupa.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); } #endif /* notdef */ void | |
| 1997/0327 | mapfree(RMap* rmap, ulong addr, int size) { Map *mp; | |
| 1997/0328/sys/src/9/pc/memory.c:98,104 – 1997/0329/sys/src/9/pc/memory.c:130,137 | ||
| 1997/0327 | } else do{ if(mp >= rmap->mapend){ | |
| 1997/0329 | print("mapfree: %s: losing 0x%uX, %d\n", rmap->name, addr, size); | |
| 1997/0327 | break; } t = mp->addr; | |
| 1997/0328/sys/src/9/pc/memory.c:177,193 – 1997/0329/sys/src/9/pc/memory.c:210,229 | ||
| 1997/0327 | */ p = KADDR(0xC8000); while(p < (uchar*)KADDR(0xE0000)){ | |
| 1997/0329 | if(p[0] != 0xCC && p[2*KB-1] != 0xCC){ p[0] = 0x55; p[1] = 0xAA; p[2] = 4; if(p[0] == 0x55 && p[1] == 0xAA){ p += p[2]*512; continue; } | |
| 1997/0327 | mapfree(&rmapumb, PADDR(p), 2*KB); | |
| 1997/0329 | } else mapfree(&rmapumbr, PADDR(p), 2*KB); | |
| 1997/0327 | p += 2*KB; } | |
| 1997/0328/sys/src/9/pc/memory.c:201,207 – 1997/0329/sys/src/9/pc/memory.c:237,243 | ||
| 1997/0327 | } static void | |
| 1997/0329 | ramscan(ulong maxmem) | |
| 1997/0327 | { ulong *k0, kzero, map, maxpa, pa, *pte, *table, *va, x; int nvalid[NMemType]; | |
| 1997/0328/sys/src/9/pc/memory.c:220,226 – 1997/0329/sys/src/9/pc/memory.c:256,261 | ||
| 1997/0327 | * the BIOS data area. */ x = PADDR(CPU0MACH+BY2PG); | |
| 1997/0328/sys/src/9/pc/memory.c:230,243 – 1997/0329/sys/src/9/pc/memory.c:265,284 | ||
| 1997/0327 | * at least 24MB in case there's a memory gap (up to 8MB) below 16MB; * in this case the memory from the gap is remapped to the top of * memory. | |
| 1997/0329 | * The value in CMOS is supposed to be the number of KB above 1MB. | |
| 1997/0327 | */ | |
| 1997/0329 | if(maxmem == 0){ x = (nvramread(0x18)<<8)|nvramread(0x17); if(x == 0 || x >= (63*KB)) maxpa = MemMaxMB*MB; else maxpa = MB+x*KB; if(maxpa < 24*MB) maxpa = 24*MB; maxmem = MemMaxMB*MB; } else maxpa = maxmem; | |
| 1997/0327 | /* * March up memory from the end of the loaded kernel to maxpa | |
| 1997/0328/sys/src/9/pc/memory.c:331,338 – 1997/0329/sys/src/9/pc/memory.c:372,379 | ||
| 1997/0327 | } if(map) mapfree(&rmapram, map, BY2PG); | |
| 1997/0329 | if(pa < maxmem) mapfree(&rmapupa, pa, maxmem-pa); | |
| 1997/0327 | *k0 = kzero; } | |
| 1997/0328/sys/src/9/pc/memory.c:373,381 – 1997/0329/sys/src/9/pc/memory.c:414,424 | ||
| 1997/0327 | mapfree(&xrmapupa, addr, pa-addr); } | |
| 1997/0329 | ||
| 1997/0327 | void | |
| 1997/0329 | meminit(ulong maxmem) | |
| 1997/0327 | { | |
| 1997/0329 | Map *mp, *xmp; | |
| 1997/0327 | ulong pa, *pte; /* | |
| 1997/0328/sys/src/9/pc/memory.c:395,429 – 1997/0329/sys/src/9/pc/memory.c:438,447 | ||
| 1997/0327 | mmuflushtlb(PADDR(m->pdb)); umbscan(); | |
| 1997/0329 | dumpmembank(); ramscan(maxmem); | |
| 1997/0327 | upainit(); | |
| 1997/0328/sys/src/9/pc/memory.c:460,465 – 1997/0329/sys/src/9/pc/memory.c:478,494 | ||
| 1997/0327 | umbfree(ulong addr, int size) { mapfree(&rmapumb, addr & ~KZERO, size); | |
| 1997/0329 | } ulong umbrmalloc(ulong addr, int size, int align) { ulong a; if(a = mapalloc(&rmapumbr, addr, size, align)) return KZERO|a; return 0; | |
| 1997/0327 | } ulong | |
| 1997/0329/sys/src/9/pc/memory.c:67,77 – 1997/0331/sys/src/9/pc/memory.c:67,77 (short | long) | ||
| 1997/0327 | &mapumb[63], }; | |
| 1997/0329 |
| |
| 1997/0331 | static Map mapumbrw[8]; static RMap rmapumbrw = { | |
| 1997/0329 | "UMB device memory", | |
| 1997/0331 | mapumbrw, &mapumbrw[7], | |
| 1997/0329 | }; #define notdef | |
| 1997/0329/sys/src/9/pc/memory.c:85,91 – 1997/0331/sys/src/9/pc/memory.c:85,91 | ||
| 1997/0329 | maxpa = (nvramread(0x18)<<8)|nvramread(0x17); maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); | |
| 1997/0331 | print("maxpa = %uX -> %uX, maxpa1 = %uX maxpa2 = %uX\n", | |
| 1997/0329 | maxpa, MB+maxpa*KB, maxpa1, maxpa2); for(mp = rmapram.map; mp->size; mp++) | |
| 1997/0329/sys/src/9/pc/memory.c:92,98 – 1997/0331/sys/src/9/pc/memory.c:92,98 | ||
| 1997/0329 | print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapumb.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0331 | for(mp = rmapumbrw.map; mp->size; mp++) | |
| 1997/0329 | print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapupa.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0329/sys/src/9/pc/memory.c:212,218 – 1997/0331/sys/src/9/pc/memory.c:212,218 | ||
| 1997/0327 | while(p < (uchar*)KADDR(0xE0000)){ p[0] = 0xCC; p[2*KB-1] = 0xCC; | |
| 1997/0329 |
| |
| 1997/0331 | if(p[0] != 0xCC || p[2*KB-1] != 0xCC){ | |
| 1997/0329 | p[0] = 0x55; p[1] = 0xAA; p[2] = 4; | |
| 1997/0329/sys/src/9/pc/memory.c:223,229 – 1997/0331/sys/src/9/pc/memory.c:223,229 | ||
| 1997/0327 | mapfree(&rmapumb, PADDR(p), 2*KB); | |
| 1997/0329 | } else | |
| 1997/0331 | mapfree(&rmapumbrw, PADDR(p), 2*KB); | |
| 1997/0327 | p += 2*KB; } | |
| 1997/0329/sys/src/9/pc/memory.c:481,494 – 1997/0331/sys/src/9/pc/memory.c:481,514 | ||
| 1997/0329 | } ulong | |
| 1997/0331 | umbrwmalloc(ulong addr, int size, int align) | |
| 1997/0329 | { ulong a; | |
| 1997/0331 | uchar *p; | |
| 1997/0329 |
| |
| 1997/0331 | if(a = mapalloc(&rmapumbrw, addr, size, align)) | |
| 1997/0329 | return KZERO|a; | |
| 1997/0331 | /* * Perhaps the memory wasn't visible before * the interface is initialised, so try again. */ if((a = umbmalloc(addr, size, align)) == 0) return 0; p = (uchar*)a; p[0] = 0xCC; p[size-1] = 0xCC; if(p[0] == 0xCC && p[size-1] == 0xCC) return a; umbfree(a, size); | |
| 1997/0329 | return 0; | |
| 1997/0331 | } void umbrwfree(ulong addr, int size) { mapfree(&rmapumbrw, addr & ~KZERO, size); | |
| 1997/0327 | } ulong | |
| 1997/0331/sys/src/9/pc/memory.c:74,80 – 1997/0401/sys/src/9/pc/memory.c:74,79 (short | long) | ||
| 1997/0331 | &mapumbrw[7], | |
| 1997/0329 | }; | |
| 1997/0327 | void | |
| 1997/0329 | dumpmembank(void) | |
| 1997/0331/sys/src/9/pc/memory.c:438,444 – 1997/0401/sys/src/9/pc/memory.c:437,442 | ||
| 1997/0327 | mmuflushtlb(PADDR(m->pdb)); umbscan(); | |
| 1997/0329 |
| |
| 1997/0327 | upainit(); | |
| 1997/0401/sys/src/9/pc/memory.c:235,240 – 1997/0522/sys/src/9/pc/memory.c:235,241 (short | long) | ||
| 1997/0327 | } } | |
| 1997/0522 | ||
| 1997/0327 | static void | |
| 1997/0329 | ramscan(ulong maxmem) | |
| 1997/0327 | { | |
| 1997/0401/sys/src/9/pc/memory.c:258,263 – 1997/0522/sys/src/9/pc/memory.c:259,268 | ||
| 1997/0327 | bda = (uchar*)(KZERO|0x400); mapfree(&rmapram, x, ((bda[0x14]<<8)|bda[0x13])*KB-x); | |
| 1997/0522 | x = PADDR(PGROUND((ulong)end)); pa = MemMinMB*MB; mapfree(&rmapram, x, pa-x); | |
| 1997/0327 | /* * Check if the extended memory size can be obtained from the CMOS. * If it's 0 then it's either not known or >= 64MB. Always check | |
| 1997/0401/sys/src/9/pc/memory.c:280,292 – 1997/0522/sys/src/9/pc/memory.c:285,294 | ||
| 1997/0329 | maxpa = maxmem; | |
| 1997/0327 | /* | |
| 1997/0522 | * March up memory from MemMinMB to maxpa 1MB at a time, * mapping the first page and checking the page can | |
| 1997/0327 | * be written and read correctly. The page tables are created here * on the fly, allocating from low memory as necessary. | |
| 1997/0401/sys/src/9/pc/memory.c:293,301 – 1997/0522/sys/src/9/pc/memory.c:295,301 | ||
| 1997/0327 | map = 0; x = 0x12345678; memset(nvalid, 0, sizeof(nvalid)); | |
| 1997/0522 | while(pa < maxpa){ | |
| 1997/0327 | /* * Map the page. Use mapalloc(&rmapram, ...) to make * the page table if necessary, it will be returned to the | |
| 1997/0401/sys/src/9/pc/memory.c:319,348 – 1997/0522/sys/src/9/pc/memory.c:319,358 | ||
| 1997/0327 | /* * Write a pattern to the page and write a different * pattern to a possible mirror at KZER0. If the data | |
| 1997/0522 | * reads back correctly the chunk is some type of RAM (possibly | |
| 1997/0327 | * a linearly-mapped VGA framebuffer, for instance...) and * can be cleared and added to the memory pool. If not, the | |
| 1997/0522 | * chunk is marked uncached and added to the UMB pool if <16MB * or is marked invalid and added to the UPA pool. | |
| 1997/0327 | */ *va = x; *k0 = ~x; if(*va == x){ | |
| 1997/0522 | nvalid[MemRAM] += MB/BY2PG; mapfree(&rmapram, pa, MB); do{ *pte++ = pa|PTEWRITE|PTEVALID; pa += BY2PG; }while(pa % MB); mmuflushtlb(PADDR(m->pdb)); //memset(va, 0, MB); | |
| 1997/0327 | } | |
| 1997/0522 | else if(pa < 16*MB){ nvalid[MemUMB] += MB/BY2PG; mapfree(&rmapumb, pa, MB); do{ *pte++ = pa|PTEWRITE|PTEUNCACHED|PTEVALID; pa += BY2PG; }while(pa % MB); } | |
| 1997/0327 | else{ | |
| 1997/0522 | nvalid[MemUPA] += MB/BY2PG; mapfree(&rmapupa, pa, MB); *pte = 0; pa += MB; | |
| 1997/0327 | } /* | |
| 1997/0401/sys/src/9/pc/memory.c:354,367 – 1997/0522/sys/src/9/pc/memory.c:364,377 | ||
| 1997/0327 | * 4) mixed or no 4MB page extension - commit the already * initialised space for the page table. */ | |
| 1997/0522 | if((pa % (4*MB)) == 0){ | |
| 1997/0327 | table = &((ulong*)m->pdb)[PDX(va)]; | |
| 1997/0522 | if(nvalid[MemUPA] == (4*MB)/BY2PG) | |
| 1997/0327 | *table = 0; | |
| 1997/0522 | else if(nvalid[MemRAM] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) *table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEVALID; else if(nvalid[MemUMB] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) *table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID; | |
| 1997/0327 | else map = 0; } | |
| 1997/0522/sys/src/9/pc/memory.c:336,342 – 1997/0612/sys/src/9/pc/memory.c:336,342 (short | long) | ||
| 1997/0522 | pa += BY2PG; }while(pa % MB); mmuflushtlb(PADDR(m->pdb)); | |
| 1997/0612 | // memset(va, 0, MB); | |
| 1997/0327 | } | |
| 1997/0522 | else if(pa < 16*MB){ nvalid[MemUMB] += MB/BY2PG; | |
| 1997/0612/sys/src/9/pc/memory.c:392,405 – 1997/0717/sys/src/9/pc/memory.c:392,405 (short | long) | ||
| 1997/0327 | ulong addr, pa, pae, *table, *va, x; /* | |
| 1997/0717 | * Allocate an 64MB chunk aligned to 64MB. Later can | |
| 1997/0327 | * make the region selectable via conf if necessary. */ | |
| 1997/0717 | if((addr = mapalloc(&rmapupa, 0, 64*MB, 64*MB)) == 0) | |
| 1997/0327 | return; pa = addr; | |
| 1997/0717 | pae = pa+(64*MB); | |
| 1997/0327 | while(pa < pae){ va = KADDR(pa); table = &((ulong*)m->pdb)[PDX(va)]; | |
| 1997/0717/sys/src/9/pc/memory.c:21,27 – 1997/0805/sys/src/9/pc/memory.c:21,27 (short | long) | ||
| 1997/0327 | KB = 1024, MemMinMB = 4, /* minimum physical memory (<=4MB) */ | |
| 1997/0328 |
| |
| 1997/0805 | MemMaxMB = 768, /* maximum physical memory to check */ | |
| 1997/0327 | NMemBase = 10, }; | |
| 1997/0805/sys/src/9/pc/memory.c:392,401 – 1997/0811/sys/src/9/pc/memory.c:392,401 (short | long) | ||
| 1997/0327 | ulong addr, pa, pae, *table, *va, x; /* | |
| 1997/0717 |
| |
| 1997/0811 | * Allocate an 8MB chunk aligned to 16MB. Later can | |
| 1997/0327 | * make the region selectable via conf if necessary. */ | |
| 1997/0717 |
| |
| 1997/0811 | if((addr = mapalloc(&rmapupa, 0, 8*MB, 16*MB)) == 0) | |
| 1997/0327 | return; pa = addr; | |
| 1997/0811/sys/src/9/pc/memory.c:399,405 – 1997/0823/sys/src/9/pc/memory.c:399,405 (short | long) | ||
| 1997/0327 | return; pa = addr; | |
| 1997/0717 |
| |
| 1997/0823 | pae = pa+(8*MB); | |
| 1997/0327 | while(pa < pae){ va = KADDR(pa); table = &((ulong*)m->pdb)[PDX(va)]; | |
| 1997/0823/sys/src/9/pc/memory.c:99,105 – 1997/1011/sys/src/9/pc/memory.c:99,105 (short | long) | ||
| 1997/0329 | #endif /* notdef */ void | |
| 1997/0327 |
| |
| 1997/1011 | mapfree(RMap* rmap, ulong addr, ulong size) | |
| 1997/0327 | { Map *mp; ulong t; | |
| 1997/0823/sys/src/9/pc/memory.c:256,262 – 1997/1011/sys/src/9/pc/memory.c:256,262 | ||
| 1997/0327 | * the BIOS data area. */ x = PADDR(CPU0MACH+BY2PG); | |
| 1997/1011 | bda = (uchar*)KADDR(0x400); | |
| 1997/0327 | mapfree(&rmapram, x, ((bda[0x14]<<8)|bda[0x13])*KB-x); | |
| 1997/0522 | x = PADDR(PGROUND((ulong)end)); | |
| 1997/0823/sys/src/9/pc/memory.c:290,296 – 1997/1011/sys/src/9/pc/memory.c:290,296 | ||
| 1997/0327 | * be written and read correctly. The page tables are created here * on the fly, allocating from low memory as necessary. */ | |
| 1997/1011 | k0 = (ulong*)KADDR(0); | |
| 1997/0327 | kzero = *k0; map = 0; x = 0x12345678; | |
| 1997/0823/sys/src/9/pc/memory.c:383,429 – 1997/1011/sys/src/9/pc/memory.c:383,393 | ||
| 1997/0327 | mapfree(&rmapram, map, BY2PG); | |
| 1997/0329 | if(pa < maxmem) mapfree(&rmapupa, pa, maxmem-pa); | |
| 1997/1011 | if(maxmem < 0xFEC00000) mapfree(&rmapupa, maxmem, 0xFEC00000-maxmem); | |
| 1997/0327 | *k0 = kzero; } | |
| 1997/0811 |
| |
| 1997/0327 |
| |
| 1997/0811 |
| |
| 1997/0327 |
| |
| 1997/0823 |
| |
| 1997/0327 |
| |
| 1997/0329 | ||
| 1997/0327 | void | |
| 1997/0329 | meminit(ulong maxmem) | |
| 1997/0327 | { | |
| 1997/0823/sys/src/9/pc/memory.c:448,454 – 1997/1011/sys/src/9/pc/memory.c:412,417 | ||
| 1997/0327 | umbscan(); | |
| 1997/0329 | ramscan(maxmem); | |
| 1997/0327 |
| |
| 1997/0823/sys/src/9/pc/memory.c:477,483 – 1997/1011/sys/src/9/pc/memory.c:440,446 | ||
| 1997/0327 | ulong a; if(a = mapalloc(&rmapumb, addr, size, align)) | |
| 1997/1011 | return (ulong)KADDR(a); | |
| 1997/0327 | return 0; } | |
| 1997/0823/sys/src/9/pc/memory.c:485,491 – 1997/1011/sys/src/9/pc/memory.c:448,454 | ||
| 1997/0327 | void umbfree(ulong addr, int size) { | |
| 1997/1011 | mapfree(&rmapumb, PADDR(addr), size); | |
| 1997/0329 | } ulong | |
| 1997/0823/sys/src/9/pc/memory.c:495,501 – 1997/1011/sys/src/9/pc/memory.c:458,464 | ||
| 1997/0331 | uchar *p; | |
| 1997/0329 | ||
| 1997/0331 | if(a = mapalloc(&rmapumbrw, addr, size, align)) | |
| 1997/0329 |
| |
| 1997/1011 | return(ulong)KADDR(a); | |
| 1997/0329 | ||
| 1997/0331 | /* * Perhaps the memory wasn't visible before | |
| 1997/0823/sys/src/9/pc/memory.c:516,537 – 1997/1011/sys/src/9/pc/memory.c:479,514 | ||
| 1997/0331 | void umbrwfree(ulong addr, int size) { | |
| 1997/1011 | mapfree(&rmapumbrw, PADDR(addr), size); | |
| 1997/0327 | } ulong upamalloc(ulong addr, int size, int align) { | |
| 1997/1011 | ulong a, ae; | |
| 1997/0327 | if(a = mapalloc(&xrmapupa, addr, size, align)) | |
| 1997/1011 | return (ulong)KADDR(a); | |
| 1997/0327 |
| |
| 1997/1011 | if((a = mapalloc(&rmapupa, addr, size, align)) == 0) return 0; ae = mmukmap(a, 0, size); /* * Should check here that it was all delivered * and put it back and barf if not. */ USED(ae); /* * Be very careful this returns a PHYSICAL address. */ return a; | |
| 1997/0327 | } void upafree(ulong addr, int size) { | |
| 1997/1011 | mapfree(&xrmapupa, addr, size); | |
| 1997/0327 | } | |
| 1997/1011/sys/src/9/pc/memory.c:74,79 – 1997/1101/sys/src/9/pc/memory.c:74,80 (short | long) | ||
| 1997/0331 | &mapumbrw[7], | |
| 1997/0329 | }; | |
| 1997/1101 | #define notdef | |
| 1997/0329 | #ifdef notdef | |
| 1997/0327 | void | |
| 1997/0329 | dumpmembank(void) | |
| 1997/1011/sys/src/9/pc/memory.c:302,308 – 1997/1101/sys/src/9/pc/memory.c:303,309 | ||
| 1997/0327 | * pool later if it isn't needed. */ va = KADDR(pa); | |
| 1997/1101 | table = &m->pdb[PDX(va)]; | |
| 1997/0327 | if(*table == 0){ if(map == 0 && (map = mapalloc(&rmapram, 0, BY2PG, BY2PG)) == 0) break; | |
| 1997/1011/sys/src/9/pc/memory.c:365,371 – 1997/1101/sys/src/9/pc/memory.c:366,372 | ||
| 1997/0327 | * initialised space for the page table. */ | |
| 1997/0522 | if((pa % (4*MB)) == 0){ | |
| 1997/0327 |
| |
| 1997/1101 | table = &m->pdb[PDX(va)]; | |
| 1997/0522 | if(nvalid[MemUPA] == (4*MB)/BY2PG) | |
| 1997/0327 | *table = 0; | |
| 1997/0522 | else if(nvalid[MemRAM] == (4*MB)/BY2PG && (m->cpuiddx & 0x08)) | |
| 1997/1011/sys/src/9/pc/memory.c:383,390 – 1997/1101/sys/src/9/pc/memory.c:384,392 | ||
| 1997/0327 | mapfree(&rmapram, map, BY2PG); | |
| 1997/0329 | if(pa < maxmem) mapfree(&rmapupa, pa, maxmem-pa); | |
| 1997/1011 |
| |
| 1997/1101 | if(maxmem < 0xFFE00000) mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); | |
| 1997/0327 | *k0 = kzero; } | |
| 1997/1011/sys/src/9/pc/memory.c:401,411 – 1997/1101/sys/src/9/pc/memory.c:403,413 | ||
| 1997/0327 | * then scan for useful memory. */ for(pa = 0xA0000; pa < 0xC0000; pa += BY2PG){ | |
| 1997/1101 | pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 2, 0); | |
| 1997/0327 | *pte |= PTEWT; } for(pa = 0xC0000; pa < 0x100000; pa += BY2PG){ | |
| 1997/1101 | pte = mmuwalk(m->pdb, (ulong)KADDR(pa), 2, 0); | |
| 1997/0327 | *pte |= PTEUNCACHED; } mmuflushtlb(PADDR(m->pdb)); | |
| 1997/1011/sys/src/9/pc/memory.c:432,437 – 1997/1101/sys/src/9/pc/memory.c:434,440 | ||
| 1997/0327 | conf.base1 = xmp->addr; conf.npage1 = xmp->size/BY2PG; } | |
| 1997/1101 | dumpmembank(); | |
| 1997/0327 | } ulong | |
| 1997/1101/sys/src/9/pc/memory.c:9,14 – 1997/1213/sys/src/9/pc/memory.c:9,16 (short | long) | ||
| 1997/0327 | #include "fns.h" #include "io.h" | |
| 1997/1213 | #define MEMDEBUG 0 | |
| 1997/0327 | #define PDX(va) ((((ulong)(va))>>22) & 0x03FF) #define PTX(va) ((((ulong)(va))>>12) & 0x03FF) | |
| 1997/1101/sys/src/9/pc/memory.c:74,87 – 1997/1213/sys/src/9/pc/memory.c:76,90 | ||
| 1997/0331 | &mapumbrw[7], | |
| 1997/0329 | }; | |
| 1997/1101 |
| |
| 1997/0329 |
| |
| 1997/0327 | void | |
| 1997/0329 |
| |
| 1997/1213 | memdebug(void) | |
| 1997/0329 | { Map *mp; ulong maxpa, maxpa1, maxpa2; | |
| 1997/1213 | if(MEMDEBUG == 0) return; | |
| 1997/0329 | maxpa = (nvramread(0x18)<<8)|nvramread(0x17); maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); | |
| 1997/1101/sys/src/9/pc/memory.c:97,103 – 1997/1213/sys/src/9/pc/memory.c:100,105 | ||
| 1997/0329 | for(mp = rmapupa.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); } | |
| 1997/1011 | mapfree(RMap* rmap, ulong addr, ulong size) | |
| 1997/1101/sys/src/9/pc/memory.c:156,162 – 1997/1213/sys/src/9/pc/memory.c:158,177 | ||
| 1997/0327 | maddr = mp->addr; if(addr){ | |
| 1997/1213 | /* * A specific address range has been given: * if the current map entry is greater then * the address is not in the map; * if the current map entry does not overlap * the beginning of the requested range then * continue on to the next map entry; * if the current map entry does not entirely * contain the requested range then the range * is not in the map. */ | |
| 1997/0327 | if(maddr > addr) | |
| 1997/1213 | break; if(maddr+mp->size < addr) | |
| 1997/0327 | continue; if(addr+size > maddr+mp->size) break; | |
| 1997/1101/sys/src/9/pc/memory.c:386,392 – 1997/1213/sys/src/9/pc/memory.c:401,408 | ||
| 1997/0329 | mapfree(&rmapupa, pa, maxmem-pa); | |
| 1997/1101 | if(maxmem < 0xFFE00000) mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); | |
| 1997/1213 | if(MEMDEBUG) print("maxmem %uX %uX\n", maxmem, 0xFFE00000-maxmem); | |
| 1997/0327 | *k0 = kzero; } | |
| 1997/1101/sys/src/9/pc/memory.c:434,440 – 1997/1213/sys/src/9/pc/memory.c:450,457 | ||
| 1997/0327 | conf.base1 = xmp->addr; conf.npage1 = xmp->size/BY2PG; } | |
| 1997/1101 |
| |
| 1997/1213 | if(MEMDEBUG) memdebug(); | |
| 1997/0327 | } ulong | |
| 1997/1101/sys/src/9/pc/memory.c:491,497 – 1997/1213/sys/src/9/pc/memory.c:508,514 | ||
| 1997/1011 | ulong a, ae; | |
| 1997/0327 | if(a = mapalloc(&xrmapupa, addr, size, align)) | |
| 1997/1011 |
| |
| 1997/1213 | return a; | |
| 1997/0327 | ||
| 1997/1011 | if((a = mapalloc(&rmapupa, addr, size, align)) == 0) return 0; | |
| 1997/1213/sys/src/9/pc/memory.c:251,257 – 1998/0221/sys/src/9/pc/memory.c:251,256 (short | long) | ||
| 1997/0327 | } } | |
| 1997/0522 | ||
| 1997/0327 | static void | |
| 1997/0329 | ramscan(ulong maxmem) | |
| 1997/0327 | { | |
| 1998/0221/sys/src/9/pc/memory.c:223,229 – 1998/0312/sys/src/9/pc/memory.c:223,229 (short | long) | ||
| 1997/0327 | * at 0xE0000 then the whole 64KB up to 0xF0000 is theoretically up * for grabs; check anyway. */ | |
| 1998/0312 | p = KADDR(0xC0000); | |
| 1997/0327 | while(p < (uchar*)KADDR(0xE0000)){ p[0] = 0xCC; p[2*KB-1] = 0xCC; | |
| 1998/0221/sys/src/9/pc/memory.c:235,241 – 1998/0312/sys/src/9/pc/memory.c:235,242 | ||
| 1997/0329 | p += p[2]*512; continue; } | |
| 1997/0327 |
| |
| 1998/0312 | if(p[0] == 0xFF && p[1] == 0xFF) mapfree(&rmapumb, PADDR(p), 2*KB); | |
| 1997/0329 | } else | |
| 1997/0331 | mapfree(&rmapumbrw, PADDR(p), 2*KB); | |
| 1998/0312/sys/src/9/pc/memory.c:88,104 – 1998/0825/sys/src/9/pc/memory.c:88,104 (short | long) | ||
|
Bug fix: print format.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1997/0329 | maxpa = (nvramread(0x18)<<8)|nvramread(0x17); maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); | |
| 1997/0331 |
| |
| 1998/0825 | print("maxpa = %luX -> %luX, maxpa1 = %luX maxpa2 = %luX\n", | |
| 1997/0329 | maxpa, MB+maxpa*KB, maxpa1, maxpa2); for(mp = rmapram.map; mp->size; mp++) | |
| 1998/0825 | print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0329 | for(mp = rmapumb.map; mp->size; mp++) | |
| 1998/0825 | print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0331 | for(mp = rmapumbrw.map; mp->size; mp++) | |
| 1997/0329 |
| |
| 1998/0825 | print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0329 | for(mp = rmapupa.map; mp->size; mp++) | |
| 1998/0825 | print("%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size); | |
| 1997/0329 | } void | |
| 1998/0312/sys/src/9/pc/memory.c:132,138 – 1998/0825/sys/src/9/pc/memory.c:132,138 | ||
| 1997/0327 | } else do{ if(mp >= rmap->mapend){ | |
| 1997/0329 |
| |
| 1998/0825 | print("mapfree: %s: losing 0x%luX, %ld\n", | |
| 1997/0329 | rmap->name, addr, size); | |
| 1997/0327 | break; } | |
| 1998/0312/sys/src/9/pc/memory.c:402,408 – 1998/0825/sys/src/9/pc/memory.c:402,408 | ||
| 1997/1101 | if(maxmem < 0xFFE00000) mapfree(&rmapupa, maxmem, 0xFFE00000-maxmem); | |
| 1997/1213 | if(MEMDEBUG) | |
| 1998/0825 | print("maxmem %luX %luX\n", maxmem, 0xFFE00000-maxmem); | |
| 1997/0327 | *k0 = kzero; } | |
| 1998/0825/sys/src/9/pc/memory.c:41,65 – 1998/0906/sys/src/9/pc/memory.c:41,65 (short | long) | ||
| 1997/0327 | Lock; } RMap; | |
| 1998/0906 | static Map mapupa[16]; | |
| 1997/0327 | static RMap rmapupa = { "unallocated unbacked physical memory", mapupa, | |
| 1998/0906 | &mapupa[nelem(mapupa)-1], | |
| 1997/0327 | }; | |
| 1998/0906 | static Map xmapupa[16]; | |
| 1997/0327 | static RMap xrmapupa = { "unbacked physical memory", xmapupa, | |
| 1998/0906 | &xmapupa[nelem(xmapupa)-1], | |
| 1997/0327 | }; | |
| 1998/0906 | static Map mapram[16]; | |
| 1997/0327 | static RMap rmapram = { "physical memory", mapram, | |
| 1998/0906 | &mapram[nelem(mapram)-1], | |
| 1997/0327 | }; static Map mapumb[64]; | |
| 1998/0825/sys/src/9/pc/memory.c:66,79 – 1998/0906/sys/src/9/pc/memory.c:66,79 | ||
| 1997/0327 | static RMap rmapumb = { "upper memory block", mapumb, | |
| 1998/0906 | &mapumb[nelem(mapumb)-1], | |
| 1997/0327 | }; | |
| 1997/0331 |
| |
| 1998/0906 | static Map mapumbrw[16]; | |
| 1997/0331 | static RMap rmapumbrw = { | |
| 1997/0329 | "UMB device memory", | |
| 1997/0331 | mapumbrw, | |
| 1998/0906 | &mapumbrw[nelem(mapumbrw)-1], | |
| 1997/0329 | }; | |
| 1997/0327 | void | |
| 1998/0906/sys/src/9/pc/memory.c:503,519 – 1998/0924/sys/src/9/pc/memory.c:503,527 (short | long) | ||
| 1997/0327 | } ulong | |
| 1998/0924 | upamalloc(ulong pa, int size, int align) | |
| 1997/0327 | { | |
| 1997/1011 | ulong a, ae; | |
| 1997/0327 |
| |
| 1998/0924 | if(a = mapalloc(&xrmapupa, pa, size, align)) | |
| 1997/1213 | return a; | |
| 1997/0327 | ||
| 1997/1011 |
| |
| 1998/0924 | if((a = mapalloc(&rmapupa, pa, size, align)) == 0){ memdebug(); | |
| 1997/1011 | return 0; | |
| 1998/0924 | } | |
| 1997/1011 |
| |
| 1998/0924 | /* * Upamalloc is a request to map a range of physical addresses. * Therefore, if pa is 0 mapalloc will choose the base address. * Note, however, mmukmap is always asked to give a 1-to-1 mapping * of va to pa. */ ae = mmukmap(a, a, size); | |
| 1997/1011 | /* * Should check here that it was all delivered | |
| 1998/0906/sys/src/9/pc/memory.c:528,534 – 1998/0924/sys/src/9/pc/memory.c:536,542 | ||
| 1997/0327 | } void | |
| 1998/0924 | upafree(ulong pa, int size) | |
| 1997/0327 | { | |
| 1997/1011 |
| |
| 1998/0924 | mapfree(&xrmapupa, pa, size); | |
| 1997/0327 | } | |
| 1998/0924/sys/src/9/pc/memory.c:520,527 – 1998/0926/sys/src/9/pc/memory.c:520,529 (short | long) | ||
| 1998/0924 | * Therefore, if pa is 0 mapalloc will choose the base address. * Note, however, mmukmap is always asked to give a 1-to-1 mapping * of va to pa. | |
| 1998/0926 | * ...but for the moment go back to the old scheme for VLB cards. */ ae = mmukmap(a, 0, size); | |
| 1997/1011 | /* * Should check here that it was all delivered | |
| 1998/0924/sys/src/9/pc/memory.c:530,536 – 1998/0926/sys/src/9/pc/memory.c:532,541 | ||
| 1997/1011 | USED(ae); /* | |
| 1998/0926 | * Be very careful this returns a PHYSICAL address * mapped 1-to-1 with the virtual address. * If a < KZERO it's probably not a good idea to * try KADDR(a)... | |
| 1997/1011 | */ return a; | |
| 1997/0327 | } | |
| 1998/0926/sys/src/9/pc/memory.c:76,81 – 1999/0713/sys/src/9/pc/memory.c:76,88 (short | long) | ||
| 1998/0906 | &mapumbrw[nelem(mapumbrw)-1], | |
| 1997/0329 | }; | |
| 1999/0713 | static Map mapiospace[256]; static RMap rmapiospace = { "x86 IO port space", mapiospace, &mapiospace[nelem(mapiospace)-1], }; | |
| 1997/0327 | void | |
| 1997/1213 | memdebug(void) | |
| 1997/0329 | { | |
| 1998/0926/sys/src/9/pc/memory.c:544,547 – 1999/0713/sys/src/9/pc/memory.c:551,582 | ||
| 1998/0924 | upafree(ulong pa, int size) | |
| 1997/0327 | { | |
| 1998/0924 | mapfree(&xrmapupa, pa, size); | |
| 1999/0713 | } /* * since mapalloc uses 0 to mean no allocation, add one to pa * to shift the whole io range up one in the map. */ void ioinit(void) { mapfree(&rmapiospace, 1, (1<<24)+1); } ulong ioalloc(ulong pa, int size, int align) { ulong a; if((a = mapalloc(&rmapiospace, ++pa, size, align)) == 0) return 0; return --a; } void iofree(ulong pa, int size) { mapfree(&rmapiospace, ++pa, size); | |
| 1997/0327 | } | |
| 1999/0713/sys/src/9/pc/memory.c:76,88 – 1999/0714/sys/src/9/pc/memory.c:76,81 (short | long) | ||
|
Remove ioalloc etc. (Now in port? XXX) Remove rmapiospace.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1998/0906 | &mapumbrw[nelem(mapumbrw)-1], | |
| 1997/0329 | }; | |
| 1999/0713 |
| |
| 1997/0327 | void | |
| 1997/1213 | memdebug(void) | |
| 1997/0329 | { | |
| 1999/0713/sys/src/9/pc/memory.c:553,582 – 1999/0714/sys/src/9/pc/memory.c:546,548 | ||
| 1998/0924 | mapfree(&xrmapupa, pa, size); | |
| 1999/0713 | } | |
| 1997/0327 |
| |
| 1999/0714/sys/src/9/pc/memory.c:171,179 – 2000/0630/sys/src/9/pc/memory.c:171,179 (short | long) | ||
| 1997/1213 | */ | |
| 1997/0327 | if(maddr > addr) | |
| 1997/1213 | break; | |
| 2000/0630 | if(mp->size < addr - maddr) /* maddr+mp->size < addr, but no overflow */ | |
| 1997/0327 | continue; | |
| 2000/0630 | if(addr - maddr > mp->size - size) /* addr+size > maddr+mp->size, but no overflow */ | |
| 1997/0327 | break; maddr = addr; } | |
| 1999/0714/sys/src/9/pc/memory.c:400,408 – 2000/0630/sys/src/9/pc/memory.c:400,408 | ||
| 1997/0329 | if(pa < maxmem) mapfree(&rmapupa, pa, maxmem-pa); | |
| 1997/1101 | if(maxmem < 0xFFE00000) | |
| 2000/0630 | mapfree(&rmapupa, maxmem, 0x00000000-maxmem); | |
| 1997/1213 | if(MEMDEBUG) | |
| 1998/0825 |
| |
| 2000/0630 | print("maxmem %luX %luX\n", maxmem, 0x00000000-maxmem); | |
| 1997/0327 | *k0 = kzero; } | |
| 2000/0630/sys/src/9/pc/memory.c:225,230 – 2001/0523/sys/src/9/pc/memory.c:225,238 (short | long) | ||
| 1997/0327 | */ | |
| 1998/0312 | p = KADDR(0xC0000); | |
| 1997/0327 | while(p < (uchar*)KADDR(0xE0000)){ | |
| 2001/0523 | if (p[0] == 0x55 && p[1] == 0xAA) { /* Skip p[2] chunks of 512 bytes. Test for 0x55 AA before poking obtrusively, or else the Thinkpad X20 dies when setting up the cardbus (PB) */ p += p[2] * 512; continue; } | |
| 1997/0327 | p[0] = 0xCC; p[2*KB-1] = 0xCC; | |
| 1997/0331 | if(p[0] != 0xCC || p[2*KB-1] != 0xCC){ | |
| 2001/0523/sys/src/9/pc/memory.c:225,235 – 2001/0527/sys/src/9/pc/memory.c:225,238 (short | long) | ||
| 1997/0327 | */ | |
| 1998/0312 | p = KADDR(0xC0000); | |
| 1997/0327 | while(p < (uchar*)KADDR(0xE0000)){ | |
| 2001/0523 |
| |
| 2001/0527 | /* * Test for 0x55 AA before poking obtrusively, * some machines (e.g. Thinkpad X20) seem to map * something dynamic here (cardbus?) causing weird * problems if it is changed. */ if(p[0] == 0x55 && p[1] == 0xAA){ p += p[2]*512; | |
| 2001/0523 | continue; } | |
| 2001/0527/sys/src/9/pc/memory.c:225,238 – 2001/0609/sys/src/9/pc/memory.c:225,235 (short | long) | ||
| 1997/0327 | */ | |
| 1998/0312 | p = KADDR(0xC0000); | |
| 1997/0327 | while(p < (uchar*)KADDR(0xE0000)){ | |
| 2001/0527 |
| |
| 2001/0609 | if (p[0] == 0x55 && p[1] == 0xAA) { /* Skip p[2] chunks of 512 bytes. Test for 0x55 AA before poking obtrusively, or else the Thinkpad X20 dies when setting up the cardbus (PB) */ p += p[2] * 512; | |
| 2001/0523 | continue; } | |
| Too many diffs (26 > 25). Stopping. | ||