platform/pc: clear invalidation descriptor

Each new entry in the invalidation queue must be zeroed before writing
in order to clear data from old entries. Not doing this can cause
invalidation queue errors after the tail pointer wrapped around.

genodelabs/genode#5501
genodelabs/genode#5523
This commit is contained in:
Johannes Schlatow 2025-04-10 09:00:35 +02:00 committed by Norman Feske
parent f93aebc810
commit df97b39340

View File

@ -213,8 +213,15 @@ class Intel::Queued_invalidator : public Invalidator
bool _empty() {
return _queue_mmio.read<Queue_mmio::Head>() == _queue_mmio.read<Queue_mmio::Tail>(); }
Descriptor::access_t *_tail() {
return (Descriptor::access_t*)(_queue_mmio.read<Queue_mmio::Tail>() + (addr_t)_queue.local_addr<void>()); }
Descriptor::access_t *_tail()
{
Descriptor::access_t *tail =
(Descriptor::access_t*)(_queue_mmio.read<Queue_mmio::Tail>() +
(addr_t)_queue.local_addr<void>());
*tail = 0;
return tail;
}
void _next()
{
@ -239,7 +246,7 @@ class Intel::Queued_invalidator : public Invalidator
: _queue_mmio({(char*)queue_reg_base, 56}),
_queue(env.ram(), env.rm(), 4096, Cache::CACHED)
{
/* set tail register to zero*/
/* set tail register to zero */
_queue_mmio.write<Queue_mmio::Tail>(0);
/* write physical address of invalidation queue into address register */