parent
bbb9c6daec
commit
7c591a8151
|
@ -66,6 +66,7 @@ namespace Noux {
|
||||||
inline void dissolve(Dataspace_info &ds);
|
inline void dissolve(Dataspace_info &ds);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Lock _region_lock;
|
||||||
List<Region> _regions;
|
List<Region> _regions;
|
||||||
|
|
||||||
Region *_lookup_region_by_addr(addr_t local_addr)
|
Region *_lookup_region_by_addr(addr_t local_addr)
|
||||||
|
@ -115,6 +116,7 @@ namespace Noux {
|
||||||
Dataspace_registry &ds_registry,
|
Dataspace_registry &ds_registry,
|
||||||
Rpc_entrypoint &ep)
|
Rpc_entrypoint &ep)
|
||||||
{
|
{
|
||||||
|
Lock::Guard guard(_region_lock);
|
||||||
for (Region *curr = _regions.first(); curr; curr = curr->next_region()) {
|
for (Region *curr = _regions.first(); curr; curr = curr->next_region()) {
|
||||||
|
|
||||||
Dataspace_capability ds;
|
Dataspace_capability ds;
|
||||||
|
@ -163,6 +165,12 @@ namespace Noux {
|
||||||
|
|
||||||
void poke(addr_t dst_addr, void const *src, size_t len)
|
void poke(addr_t dst_addr, void const *src, size_t len)
|
||||||
{
|
{
|
||||||
|
Dataspace_capability ds_cap;
|
||||||
|
addr_t local_addr;
|
||||||
|
|
||||||
|
{
|
||||||
|
Lock::Guard guard(_region_lock);
|
||||||
|
|
||||||
Region *region = _lookup_region_by_addr(dst_addr);
|
Region *region = _lookup_region_by_addr(dst_addr);
|
||||||
if (!region) {
|
if (!region) {
|
||||||
PERR("poke: no region at 0x%lx", dst_addr);
|
PERR("poke: no region at 0x%lx", dst_addr);
|
||||||
|
@ -178,19 +186,23 @@ namespace Noux {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object_pool<Dataspace_info>::Guard info(_ds_registry.lookup_info(region->ds));
|
if (region->offset) {
|
||||||
|
PERR("poke: writing to region with offset is not supported");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ds_cap = region->ds;
|
||||||
|
local_addr = region->local_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object_pool<Dataspace_info>::Guard info(_ds_registry.lookup_info(ds_cap));
|
||||||
if (!info) {
|
if (!info) {
|
||||||
PERR("attempt to write to unknown dataspace type");
|
PERR("attempt to write to unknown dataspace type");
|
||||||
for (;;);
|
for (;;);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region->offset) {
|
info->poke(dst_addr - local_addr, src, len);
|
||||||
PERR("poke: writing to region with offset is not supported");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->poke(dst_addr - region->local_addr, src, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,7 +217,7 @@ namespace Noux {
|
||||||
bool executable = false)
|
bool executable = false)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Rm_session substracts offset from size if size is 0
|
* Rm_session subtracts offset from size if size is 0
|
||||||
*/
|
*/
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
size = Dataspace_client(ds).size() - offset;
|
size = Dataspace_client(ds).size() - offset;
|
||||||
|
@ -237,6 +249,7 @@ namespace Noux {
|
||||||
* Record attachment for later replay (needed during
|
* Record attachment for later replay (needed during
|
||||||
* fork)
|
* fork)
|
||||||
*/
|
*/
|
||||||
|
Lock::Guard guard(_region_lock);
|
||||||
_regions.insert(region);
|
_regions.insert(region);
|
||||||
|
|
||||||
|
|
||||||
|
@ -245,7 +258,10 @@ namespace Noux {
|
||||||
|
|
||||||
void detach(Local_addr local_addr)
|
void detach(Local_addr local_addr)
|
||||||
{
|
{
|
||||||
Region *region = _lookup_region_by_addr(local_addr);
|
Region * region = 0;
|
||||||
|
{
|
||||||
|
Lock::Guard guard(_region_lock);
|
||||||
|
region = _lookup_region_by_addr(local_addr);
|
||||||
if (!region) {
|
if (!region) {
|
||||||
PWRN("Attempt to detach unknown region at 0x%p",
|
PWRN("Attempt to detach unknown region at 0x%p",
|
||||||
(void *)local_addr);
|
(void *)local_addr);
|
||||||
|
@ -253,6 +269,7 @@ namespace Noux {
|
||||||
}
|
}
|
||||||
|
|
||||||
_regions.remove(region);
|
_regions.remove(region);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Object_pool<Dataspace_info>::Guard info(_ds_registry.lookup_info(region->ds));
|
Object_pool<Dataspace_info>::Guard info(_ds_registry.lookup_info(region->ds));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user