Newer
Older
minerva / Kernel / Arch / aarch64 / Delay.cpp
@minerva minerva on 13 Jul 764 bytes Initial commit
/*
 * Copyright (c) 2024, Sönke Holz <sholz8530@gmail.com>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <Kernel/Arch/Delay.h>
#include <Kernel/Arch/Processor.h>

namespace Kernel {

void microseconds_delay(u32 microseconds)
{
    auto frequency = Aarch64::CNTFRQ_EL0::read().ClockFrequency;

    // TODO: Fall back to the devicetree clock-frequency property.
    VERIFY(frequency != 0);

    // Use the EL1 virtual timer, as that timer should should be accessible to us both on device and in a VM.
    u64 const start = Aarch64::CNTVCT_EL0::read().VirtualCount;
    u64 const delta = (static_cast<u64>(microseconds) * frequency) / 1'000'000ull;

    while ((Aarch64::CNTVCT_EL0::read().VirtualCount - start) < delta)
        Processor::pause();
}

}