@@ -91,8 +91,9 @@ mmuptpfree(Proc* proc, int release)
91
91
static Page *
92
92
mmuptpalloc (void )
93
93
{
94
- void * va ;
95
94
Page * page ;
95
+ uintmem pa ;
96
+ int color ;
96
97
97
98
/*
98
99
* Do not really need a whole Page structure,
@@ -104,16 +105,19 @@ mmuptpalloc(void)
104
105
105
106
return nil ;
106
107
}
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" );
109
111
free (page );
110
112
111
113
return nil ;
112
114
}
113
115
114
- page -> va = PTR2UINT (va );
115
- page -> pa = PADDR ( va ) ;
116
+ page -> va = PTR2UINT (KADDR ( pa ) );
117
+ page -> pa = pa ;
116
118
page -> ref = 1 ;
119
+ page -> color = color ;
120
+ memset (UINT2PTR (page -> va ), 0 , PTSZ );
117
121
118
122
return page ;
119
123
}
@@ -160,7 +164,7 @@ mmurelease(Proc* proc)
160
164
next = page -> next ;
161
165
if (-- page -> ref )
162
166
panic ("mmurelease: page->ref %d\n" , page -> ref );
163
- free ( UINT2PTR ( page -> va ) );
167
+ physfree ( page -> pa , PTSZ );
164
168
free (page );
165
169
}
166
170
if (proc -> mmuptp [0 ] && palloc .r .p )
@@ -244,7 +248,8 @@ pdmap(uintmem pa, int attr, uintptr va, usize size)
244
248
{
245
249
uintmem pae ;
246
250
PTE * pd , * pde , * pt , * pte ;
247
- int pdx , pgsz ;
251
+ uintmem pdpa ;
252
+ int pdx , pgsz , color ;
248
253
249
254
pd = (PTE * )(PDMAP + PDX (PDMAP )* 4096 );
250
255
@@ -263,27 +268,16 @@ pdmap(uintmem pa, int attr, uintptr va, usize size)
263
268
pgsz = PGLSZ (1 );
264
269
}
265
270
else {
271
+ pt = (PTE * )(PDMAP + pdx * PTSZ );
266
272
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 );
283
279
}
284
- assert (* pde != 0 );
285
280
286
- pt = (PTE * )(PDMAP + pdx * 4096 );
287
281
pte = & pt [PTX (va )];
288
282
assert (!(* pte & PteP ));
289
283
* pte = pa |attr |PteP ;
0 commit comments