.. _timer-hld:

Timer
#####

Because ACRN is a flexible, lightweight reference hypervisor, we provide
limited timer management services:

- Only the LAPIC tsc-deadline timer is supported as the clock source.

- A timer can only be added on the logical CPU for a process or thread. Timer
  scheduling or timer migrating is not supported.

How It Works
************

When the system boots, we check that the hardware supports the LAPIC
tsc-deadline timer by checking CPUID.01H:ECX.TSC_Deadline[bit 24]. If
support is missing, we output an error message and panic the hypervisor.
If supported, we register the timer interrupt callback that raises a
timer softirq on each logical CPU and sets the LAPIC timer mode to
tsc-deadline timer mode by writing the local APIC LVT register.

Data Structures and APIs
************************

Interfaces Design
=================

.. doxygenfunction:: initialize_timer
   :project: Project ACRN

.. doxygenfunction:: timer_expired
   :project: Project ACRN

.. doxygenfunction:: timer_is_started
   :project: Project ACRN

.. doxygenfunction:: add_timer
   :project: Project ACRN

.. doxygenfunction:: del_timer
   :project: Project ACRN

.. doxygenfunction:: timer_init
   :project: Project ACRN

.. doxygenfunction:: calibrate_tsc
   :project: Project ACRN

.. doxygenfunction:: cpu_ticks
   :project: Project ACRN

.. doxygenfunction:: cpu_tickrate
   :project: Project ACRN

.. doxygenfunction:: us_to_ticks
   :project: Project ACRN

.. doxygenfunction:: ticks_to_us
   :project: Project ACRN

.. doxygenfunction:: ticks_to_ms
   :project: Project ACRN

.. doxygenfunction:: udelay
   :project: Project ACRN
