A question about codes in mdb_flush(...)
"Yan Zheng" <[email protected]>
| Newsgroups | gmane.comp.micro-kernel.l4.l4ka.general |
|---|---|
| Message-ID | <[email protected]> |
Hi all.
In file kernel/src/generic/mapping.cc line 514.
-- code --
else // when nroot is null
{
if (nmap)
{
if (pmap)
f_pg = nmap->get_pgent (pmap);
else
f_pg = nmap->get_pgent (proot);
f_map = nmap;
}
else if ((f_pgsize < t_pgsize) && root)
{
// Recurse up from subarray
if (fp.is_rwx ())
{
// Revoke all access rights (i.e., remove subtree)
root -= mdb_arraysize (f_pgsize) - 1;
mdb_free_buffer ((addr_t) root,
mdb_arraysize (f_pgsize) *
sizeof (rootnode_t));
}
ASSERT (f_pgsize < mapnode_t::size_max);
f_map = r_nmap[f_pgsize];
root = r_root[f_pgsize];
rcnt = r_rcnt[f_pgsize];
if (r_prev[f_pgsize] & 1)
{
proot = NULL;
pmap = (mapnode_t *) (r_prev[f_pgsize] & ~1UL);
if (f_map)
f_pg = f_map->get_pgent (pmap);
}
else
{
proot = (rootnode_t *) r_prev[f_pgsize];
pmap = NULL;
if (f_map)
f_pg = f_map->get_pgent (proot);
}
f_pgsize++;
}
-- code --
When nmap is null and the test at line 514 returns true, it recurse
up from subarray. (I think) this doesn't ensure that it has already
traversed all nodes of the subarray. (for example, f_map is a child of
a node in the middle of subarray) Maybe it also needs test rcnt equal
to zero at line 514 .
Thanks for reading.
Regards.