Kernel: Make ATABus use BAN::Atomic<> instead of gcc builtin atomics
This commit is contained in:
parent
ffe73165f9
commit
77b5e6d44a
|
@ -53,7 +53,7 @@ namespace Kernel
|
||||||
const uint16_t m_ctrl;
|
const uint16_t m_ctrl;
|
||||||
Mutex m_mutex;
|
Mutex m_mutex;
|
||||||
|
|
||||||
volatile bool m_has_got_irq { false };
|
BAN::Atomic<bool> m_has_got_irq { false };
|
||||||
|
|
||||||
// Non-owning pointers
|
// Non-owning pointers
|
||||||
BAN::Vector<ATADevice*> m_devices;
|
BAN::Vector<ATADevice*> m_devices;
|
||||||
|
|
|
@ -149,13 +149,17 @@ namespace Kernel
|
||||||
ASSERT(!m_has_got_irq);
|
ASSERT(!m_has_got_irq);
|
||||||
if (io_read(ATA_PORT_STATUS) & ATA_STATUS_ERR)
|
if (io_read(ATA_PORT_STATUS) & ATA_STATUS_ERR)
|
||||||
dprintln("ATA Error: {}", error());
|
dprintln("ATA Error: {}", error());
|
||||||
m_has_got_irq = true;
|
m_has_got_irq.store(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATABus::block_until_irq()
|
void ATABus::block_until_irq()
|
||||||
{
|
{
|
||||||
while (!__sync_bool_compare_and_swap(&m_has_got_irq, true, false))
|
bool expected { true };
|
||||||
__builtin_ia32_pause();
|
while (!m_has_got_irq.compare_exchange(expected, false))
|
||||||
|
{
|
||||||
|
Processor::pause();
|
||||||
|
expected = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t ATABus::io_read(uint16_t port)
|
uint8_t ATABus::io_read(uint16_t port)
|
||||||
|
|
Loading…
Reference in New Issue