acpi/dsdt/
ops.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4pub trait OperationObject {
5    fn append_to_vec(&self, byte_stream: &mut Vec<u8>);
6
7    fn to_bytes(&self) -> Vec<u8> {
8        let mut byte_stream = Vec::new();
9        self.append_to_vec(&mut byte_stream);
10        byte_stream
11    }
12}
13
14pub struct AndOp {
15    pub operand1: Vec<u8>,
16    pub operand2: Vec<u8>,
17    pub target_name: Vec<u8>,
18}
19
20impl OperationObject for AndOp {
21    fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
22        byte_stream.push(0x7b);
23        byte_stream.extend_from_slice(&self.operand1);
24        byte_stream.extend_from_slice(&self.operand2);
25        byte_stream.extend_from_slice(&self.target_name);
26    }
27}
28
29pub struct OrOp {
30    pub operand1: Vec<u8>,
31    pub operand2: Vec<u8>,
32    pub target_name: Vec<u8>,
33}
34
35impl OperationObject for OrOp {
36    fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
37        byte_stream.push(0x7d);
38        byte_stream.extend_from_slice(&self.operand1);
39        byte_stream.extend_from_slice(&self.operand2);
40        byte_stream.extend_from_slice(&self.target_name);
41    }
42}
43
44pub struct ReturnOp {
45    pub result: Vec<u8>,
46}
47
48impl OperationObject for ReturnOp {
49    fn append_to_vec(&self, byte_stream: &mut Vec<u8>) {
50        byte_stream.push(0xa4);
51        byte_stream.extend_from_slice(&self.result);
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use crate::dsdt::encode_integer;
59    use crate::dsdt::tests::verify_expected_bytes;
60
61    #[test]
62    fn verify_and_operation() {
63        let op = AndOp {
64            operand1: vec![b'S', b'T', b'A', b'_'],
65            operand2: encode_integer(13),
66            target_name: vec![b'S', b'T', b'A', b'_'],
67        };
68        let bytes = op.to_bytes();
69        verify_expected_bytes(
70            &bytes,
71            &[
72                0x7b, b'S', b'T', b'A', b'_', 0x0a, 0x0d, b'S', b'T', b'A', b'_',
73            ],
74        );
75    }
76
77    #[test]
78    fn verify_or_operation() {
79        let op = OrOp {
80            operand1: vec![b'S', b'T', b'A', b'_'],
81            operand2: encode_integer(13),
82            target_name: vec![b'S', b'T', b'A', b'_'],
83        };
84        let bytes = op.to_bytes();
85        verify_expected_bytes(
86            &bytes,
87            &[
88                0x7d, b'S', b'T', b'A', b'_', 0x0a, 0x0d, b'S', b'T', b'A', b'_',
89            ],
90        );
91    }
92
93    #[test]
94    fn verify_return_operation() {
95        let op = ReturnOp {
96            result: vec![b'S', b'T', b'A', b'_'],
97        };
98        let bytes = op.to_bytes();
99        verify_expected_bytes(&bytes, &[0xa4, b'S', b'T', b'A', b'_']);
100    }
101}