thermosphere: implement reading and writing guest memory
This commit is contained in:
@@ -27,44 +27,3 @@ __attribute__((noinline)) bool overlaps(u64 as, u64 ae, u64 bs, u64 be)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: put that elsewhere
|
||||
bool readEl1Memory(void *dst, uintptr_t addr, size_t size)
|
||||
{
|
||||
// Note: what if we read uncached regions/not shared?
|
||||
bool valid;
|
||||
|
||||
u64 flags = maskIrq();
|
||||
uintptr_t pa = get_physical_address_el1_stage12(&valid, addr);
|
||||
restoreInterruptFlags(flags);
|
||||
|
||||
if (!valid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(dst, (const void *)pa, size);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool writeEl1Memory(uintptr_t addr, const void *src, size_t size)
|
||||
{
|
||||
bool valid;
|
||||
|
||||
u64 flags = maskIrq();
|
||||
uintptr_t pa = get_physical_address_el1_stage12(&valid, addr);
|
||||
restoreInterruptFlags(flags);
|
||||
|
||||
if (!valid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy((void *)pa, src, size);
|
||||
cacheHandleSelfModifyingCodePoU((const void *)pa, size);
|
||||
|
||||
__tlb_invalidate_el1_stage12_local(); //FIXME FIXME FIXME
|
||||
__dsb_sy();
|
||||
__isb();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user