The deferred-only VGA flush (timer tick at 50Hz) caused VGA output
to stop updating when the ring3 test was active. Restoring the
immediate flush after each write batch fixes the issue.
The shadow buffer still provides the key performance wins:
- Scrolling in RAM (memmove on shadow, not MMIO)
- Single cursor update per write batch (not per character)
- Dirty-region tracking (only modified cells flushed)
Tests: 20/20 smoke (11s), 16/16 battery, cppcheck clean.
for (uint32_t i = 0; i < len; i++) {
vga_put_char_unlocked(buf[i]);
}
- /* No MMIO flush here — deferred to vga_flush() on timer tick */
+ vga_flush_to_hw();
spin_unlock_irqrestore(&vga_lock, flags);
}