From 328771ae290da01cc127f3251b68015e68a1db52 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 20 Jul 2026 11:30:06 +0300 Subject: [PATCH] Kernel: Fix AC97 issues Set last entry bit on the last entry :D Verify that allocated DMA buffer fits in a 32 bit integer --- kernel/kernel/Audio/AC97/Controller.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/kernel/kernel/Audio/AC97/Controller.cpp b/kernel/kernel/Audio/AC97/Controller.cpp index 65ed3406..d81d7c9d 100644 --- a/kernel/kernel/Audio/AC97/Controller.cpp +++ b/kernel/kernel/Audio/AC97/Controller.cpp @@ -182,13 +182,22 @@ namespace Kernel m_bdl_region = TRY(DMARegion::create(bdl_size + buffer_size * m_used_bdl_entries)); memset(reinterpret_cast(m_bdl_region->vaddr()), 0x00, m_bdl_region->size()); + if (m_bdl_region->paddr() + m_bdl_region->size() > BAN::numeric_limits::max()) + { + dwarnln("Could not allocate 32 bit dma buffer"); + return BAN::Error::from_errno(EFAULT); + } + + auto* bdl_entries = reinterpret_cast(m_bdl_region->vaddr()); for (size_t i = 0; i < m_bdl_entries; i++) { - auto& entry = reinterpret_cast(m_bdl_region->vaddr())[i]; - entry.address = m_bdl_region->paddr() + bdl_size + (i % m_used_bdl_entries) * buffer_size; - entry.samples = 0; - entry.flags = 0; + bdl_entries[i] = { + .address = static_cast(m_bdl_region->paddr() + bdl_size + (i % m_used_bdl_entries) * buffer_size), + .samples = 0, + .flags = 1 << 15, + }; } + bdl_entries[m_bdl_entries - 1].flags |= 1 << 14; m_bus_master->write32(BusMasterRegister::PO_BDBAR, m_bdl_region->paddr()); @@ -245,7 +254,6 @@ namespace Kernel auto& entry = reinterpret_cast(m_bdl_region->vaddr())[m_bdl_head]; entry.samples = sample_frames * get_channels(); - entry.flags = (1 << 15); memcpy( reinterpret_cast(m_bdl_region->paddr_to_vaddr(entry.address)), m_sample_data->get_data().data(),