Skip to content
This repository was archived by the owner on Apr 22, 2023. It is now read-only.

Commit 4b5d1b4

Browse files
committed
sys/src/9k/k10: use physalloc in MMU (thanks The NIX Authors)
1 parent 85b854f commit 4b5d1b4

File tree

1 file changed

+19
-25
lines changed

1 file changed

+19
-25
lines changed

sys/src/9k/k10/mmu.c

+19-25
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ mmuptpfree(Proc* proc, int release)
9191
static Page*
9292
mmuptpalloc(void)
9393
{
94-
void* va;
9594
Page *page;
95+
uintmem pa;
96+
int color;
9697

9798
/*
9899
* Do not really need a whole Page structure,
@@ -104,16 +105,19 @@ mmuptpalloc(void)
104105

105106
return nil;
106107
}
107-
if((va = mallocalign(PTSZ, PTSZ, 0, 0)) == nil){
108-
print("mmuptpalloc va\n");
108+
color = NOCOLOR;
109+
if((pa = physalloc(PTSZ, &color, page)) == 0){
110+
print("mmuptpalloc pa\n");
109111
free(page);
110112

111113
return nil;
112114
}
113115

114-
page->va = PTR2UINT(va);
115-
page->pa = PADDR(va);
116+
page->va = PTR2UINT(KADDR(pa));
117+
page->pa = pa;
116118
page->ref = 1;
119+
page->color = color;
120+
memset(UINT2PTR(page->va), 0, PTSZ);
117121

118122
return page;
119123
}
@@ -160,7 +164,7 @@ mmurelease(Proc* proc)
160164
next = page->next;
161165
if(--page->ref)
162166
panic("mmurelease: page->ref %d\n", page->ref);
163-
free(UINT2PTR(page->va));
167+
physfree(page->pa, PTSZ);
164168
free(page);
165169
}
166170
if(proc->mmuptp[0] && palloc.r.p)
@@ -244,7 +248,8 @@ pdmap(uintmem pa, int attr, uintptr va, usize size)
244248
{
245249
uintmem pae;
246250
PTE *pd, *pde, *pt, *pte;
247-
int pdx, pgsz;
251+
uintmem pdpa;
252+
int pdx, pgsz, color;
248253

249254
pd = (PTE*)(PDMAP+PDX(PDMAP)*4096);
250255

@@ -263,27 +268,16 @@ pdmap(uintmem pa, int attr, uintptr va, usize size)
263268
pgsz = PGLSZ(1);
264269
}
265270
else{
271+
pt = (PTE*)(PDMAP+pdx*PTSZ);
266272
if(*pde == 0){
267-
/*
268-
* Need a PTSZ physical allocator here.
269-
* Because space will never be given back
270-
* (see vunmap below), just malloc it so
271-
* Ron can prove a point.
272-
*pde = pmalloc(PTSZ)|PteRW|PteP;
273-
*/
274-
void *alloc;
275-
276-
alloc = mallocalign(PTSZ, PTSZ, 0, 0);
277-
if(alloc != nil){
278-
*pde = PADDR(alloc)|PteRW|PteP;
279-
//print("*pde %#llux va %#p\n", *pde, va);
280-
memset((PTE*)(PDMAP+pdx*4096), 0, 4096);
281-
282-
}
273+
color = NOCOLOR;
274+
pdpa = physalloc(PTSZ, &color, nil);
275+
if(pdpa == 0)
276+
panic("pdmap");
277+
*pde = pdpa|PteRW|PteP;
278+
memset(pt, 0, PTSZ);
283279
}
284-
assert(*pde != 0);
285280

286-
pt = (PTE*)(PDMAP+pdx*4096);
287281
pte = &pt[PTX(va)];
288282
assert(!(*pte & PteP));
289283
*pte = pa|attr|PteP;

0 commit comments

Comments
 (0)