blob: b5d1b55b1bfb654438ab2db7ddf96ef2cfe89e29 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/runtime/hart.h"
#include <stdbool.h>
#include "sw/device/lib/arch/device.h"
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/runtime/ibex.h"
extern void wait_for_interrupt(void);
void usleep(uint32_t usec) {
uint64_t cycles = kClockFreqCpuHz * usec / 1000000;
uint64_t start = ibex_mcycle_read();
while ((ibex_mcycle_read() - start) < cycles) {
}
}
noreturn void abort(void) {
if (kDeviceStopAddress != 0) {
mmio_region_t end_sim_addr = mmio_region_from_addr(kDeviceStopAddress);
// Write all ones to the address, to signal that it was `abort`. The
// simulator doesn't do anything with the info, but it's good to
// differentiate from likely `main` return codes (0, 1).
mmio_region_write32(end_sim_addr, 0x0, 0xFFFFFFFF);
}
while (true) {
wait_for_interrupt();
}
}