summaryrefslogtreecommitdiffstats
path: root/bsps/shared/dev/clock/clock-simidle.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/shared/dev/clock/clock-simidle.c')
-rw-r--r--bsps/shared/dev/clock/clock-simidle.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/bsps/shared/dev/clock/clock-simidle.c b/bsps/shared/dev/clock/clock-simidle.c
new file mode 100644
index 0000000000..def406a1df
--- /dev/null
+++ b/bsps/shared/dev/clock/clock-simidle.c
@@ -0,0 +1,59 @@
+/*
+ * Instantiate the clock driver shell.
+ *
+ * Since there is no clock source on the simulator, we fake
+ * it with a special IDLE task.
+ */
+
+#include <rtems.h>
+#include <rtems/score/percpu.h>
+#include <rtems/score/threaddispatch.h>
+
+#define CLOCK_VECTOR 0
+
+volatile bool clock_driver_enabled;
+
+#define Clock_driver_support_initialize_hardware() \
+ do { \
+ clock_driver_enabled = true; \
+ } while (0)
+
+#define Clock_driver_support_shutdown_hardware() \
+ do { \
+ clock_driver_enabled = false; \
+ } while (0)
+
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
+#include "clockimpl.h"
+
+/*
+ * If this is defined, then the BSP has defined a delay of some sort so
+ * time passage appears somewhat correctly. Otherwise, it runs extremely
+ * fast with no delays.
+ */
+#ifndef BSP_CLOCK_DRIVER_DELAY
+#define BSP_CLOCK_DRIVER_DELAY()
+#endif
+
+/*
+ * Since there is no interrupt on this simulator, let's just
+ * fake time passing. This will not let preemption from an
+ * interrupt work but is enough for many tests.
+ */
+void *clock_driver_sim_idle_body(
+ uintptr_t ignored
+)
+{
+ for( ; ; ) {
+ if ( clock_driver_enabled ) {
+ Per_CPU_Control *cpu = _Thread_Dispatch_disable();
+ _ISR_Nest_level++;
+ rtems_clock_tick();
+ _ISR_Nest_level--;
+ _Thread_Dispatch_enable( cpu );
+ BSP_CLOCK_DRIVER_DELAY();
+ }
+ }
+ return 0; /* to avoid warning */
+}