facs.bend
bend-osdev-acpi@0.1.1.0 · 56 lines · 6 definitions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import Base
18import bend-osdev-word64@0.1.1.0/word64.bend as W
19import bend-osdev-bytes@0.1.1.0/bytes.bend as B
20import bend-osdev-acpi@0.1.1.0/error.bend as E
21import bend-osdev-acpi@0.1.1.0/fields.bend as F
22
23type AcpiFacs is Data:
24 AcpiFacs{length: U32, hardware_signature: U32, waking_vector: U32, global_lock: U32, flags: U32, x_waking_vector: W.W64, version: U32, ospm_flags: U32}
25
26def facs.p3(ok: Bool, +l: U32, +o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiFacs>:
27 match ok:
28 case False{}:
29 Fail{E.AcpiBadLength{l}}
30 case True{}:
31 Done{AcpiFacs{l, F.AcpiF.u32(o, 8n), F.AcpiF.u32(o, 12n), F.AcpiF.u32(o, 16n), F.AcpiF.u32(o, 20n), F.AcpiF.u64(o, 24n), F.AcpiF.u8(o, 32n), F.AcpiF.u32(o, 36n)}}
32
33def facs.p2(ok: Bool, +o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiFacs>:
34 match ok:
35 case False{}:
36 Fail{E.AcpiBadSignature{B.Octets.take(4n, o)}}
37 case True{}:
38 +l = F.AcpiF.u32(o, 4n)
39 facs.p3(Nat.is_le(64n, U32.to_nat(l)), l, o)
40
41def facs.p1(ok: Bool, +o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiFacs>:
42 match ok:
43 case False{}:
44 Fail{E.AcpiTooShort{64n, B.Octets.len(o)}}
45 case True{}:
46 facs.p2(B.Octets.is_eq(B.Octets.take(4n, o), B.Octets.of_string("FACS")), o)
47
48
49
50def AcpiFacs.parse(+o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiFacs>:
51 facs.p1(Nat.is_le(64n, B.Octets.len(o)), o)
52
53def AcpiFacs.build(f: AcpiFacs) -> B.Octets:
54 match f:
55 case AcpiFacs{l, hs, wv, gl, fl, xw, v, of}:
56 B.Octets.concat([B.Octets.of_string("FACS"), B.Octets.le32(64), B.Octets.le32(hs), B.Octets.le32(wv), B.Octets.le32(gl), B.Octets.le32(fl), B.Octets.le64(xw), B.Octets.of_list([v]), B.Octets.zeros(3n), B.Octets.le32(of), B.Octets.zeros(24n)])