chipset/pit/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for the PIT (Programmable Interval Timer) chipset device.
5
6use super::PitDevice;
7use chipset_device_resources::IRQ_LINE_SET;
8use chipset_device_resources::ResolveChipsetDeviceHandleParams;
9use chipset_device_resources::ResolvedChipsetDevice;
10use chipset_resources::pit::PitDeviceHandle;
11use vm_resource::ResolveResource;
12use vm_resource::declare_static_resolver;
13use vm_resource::kind::ChipsetDeviceHandleKind;
14
15/// A resolver for PIT devices.
16pub struct PitResolver;
17
18declare_static_resolver! {
19    PitResolver,
20    (ChipsetDeviceHandleKind, PitDeviceHandle),
21}
22
23impl ResolveResource<ChipsetDeviceHandleKind, PitDeviceHandle> for PitResolver {
24    type Output = ResolvedChipsetDevice;
25    type Error = std::convert::Infallible;
26
27    fn resolve(
28        &self,
29        _resource: PitDeviceHandle,
30        input: ResolveChipsetDeviceHandleParams<'_>,
31    ) -> Result<Self::Output, Self::Error> {
32        let interrupt = input.configure.new_line(IRQ_LINE_SET, "timer0", 2); // hard-coded IRQ lines, as per x86 spec
33        let vmtime = input.vmtime.access("pit");
34        Ok(PitDevice::new(interrupt, vmtime).into())
35    }
36}