mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-15 23:17:14 +00:00
parent
d67a26ea4c
commit
f8c2596259
@ -544,8 +544,8 @@ void Thread::_call_update_pd()
|
||||
void Thread::_call_update_region()
|
||||
{
|
||||
/* flush hardware caches */
|
||||
Processor::flush_data_cache_by_virt_region((addr_t)user_arg_1(),
|
||||
(size_t)user_arg_2());
|
||||
Processor::flush_data_caches_by_virt_region((addr_t)user_arg_1(),
|
||||
(size_t)user_arg_2());
|
||||
}
|
||||
|
||||
|
||||
|
@ -280,6 +280,21 @@ namespace Arm
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Data Cache Clean by MVA to PoC
|
||||
*/
|
||||
struct Dccmvac : Register<32>
|
||||
{
|
||||
/**
|
||||
* Write register value
|
||||
*/
|
||||
static void write(access_t const v)
|
||||
{
|
||||
asm volatile (
|
||||
"mcr p15, 0, %[v], c7, c10, 1\n" :: [v] "r" (v) : );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Context identification register
|
||||
*/
|
||||
@ -639,20 +654,19 @@ namespace Arm
|
||||
flush_caches();
|
||||
}
|
||||
|
||||
/*
|
||||
* Clean every data-cache entry within a region via MVA
|
||||
/**
|
||||
* Clean every data-cache entry within a virtual region
|
||||
*/
|
||||
static void flush_data_cache_by_virt_region(addr_t base, size_t const size)
|
||||
static void
|
||||
flush_data_caches_by_virt_region(addr_t base, size_t const size)
|
||||
{
|
||||
enum {
|
||||
CACHE_LINE_SIZE = 1 << Board::CACHE_LINE_SIZE_LOG2,
|
||||
CACHE_LINE_ALIGNM_MASK = ~(CACHE_LINE_SIZE - 1),
|
||||
LINE_SIZE = 1 << Board::CACHE_LINE_SIZE_LOG2,
|
||||
LINE_ALIGNM_MASK = ~(LINE_SIZE - 1),
|
||||
};
|
||||
addr_t const top = base + size;
|
||||
base = base & CACHE_LINE_ALIGNM_MASK;
|
||||
for (; base < top; base += CACHE_LINE_SIZE)
|
||||
asm volatile ("mcr p15, 0, %[base], c7, c10, 1\n" /* DCCMVAC */
|
||||
:: [base] "r" (base) : );
|
||||
base = base & LINE_ALIGNM_MASK;
|
||||
for (; base < top; base += LINE_SIZE) { Dccmvac::write(base); }
|
||||
}
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user