bgrt.bend
bend-osdev-acpi@0.1.0.0 · 48 lines · 0 definitions
1# bend-osdev-acpi, bgrt.bend: the Boot Graphics Resource Table, "BGRT"
2# (ACPI 6.5, section 5.2, Boot Graphics Resource Table), 56 bytes:
3#
4# offset size field
5# 36 2 Version (1)
6# 38 1 Status: bit 0 displayed, bits 1-2 orientation offset
7# (0, 90, 180, 270 degrees clockwise)
8# 39 1 Image Type (0: a bitmap, BMP)
9# 40 8 Image Address (physical address of the image)
10# 48 4 Image Offset X
11# 52 4 Image Offset Y
12import Base
13import bend-osdev-word64@0.1.0.0/word64.bend as W
14import bend-osdev-bytes@0.1.0.0/bytes.bend as B
15import bend-osdev-acpi@0.1.0.0/error.bend as E
16import bend-osdev-acpi@0.1.0.0/header.bend as H
17import bend-osdev-acpi@0.1.0.0/fields.bend as F
18
19type AcpiBgrt is Data:
20 AcpiBgrt{header: H.AcpiHeader, version: U32, status: U32, image_type: U32, image_address: W.W64, offset_x: U32, offset_y: U32}
21
22def bgrt.read(ok: Bool, +h: H.AcpiHeader, +o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiBgrt>:
23 match ok:
24 case False{}:
25 Fail{E.AcpiTooShort{56n, B.Octets.len(o)}}
26 case True{}:
27 Done{AcpiBgrt{h, F.AcpiF.u16(o, 36n), F.AcpiF.u8(o, 38n), F.AcpiF.u8(o, 39n), F.AcpiF.u64(o, 40n), F.AcpiF.u32(o, 48n), F.AcpiF.u32(o, 52n)}}
28
29def AcpiBgrt.of_sdt(t: H.AcpiSdt) -> Result<&2, &2, E.AcpiError, AcpiBgrt>:
30 match t:
31 case H.AcpiSdt{+h, body}:
32 +o = B.Octets.append(H.AcpiHeader.encode(h), body)
33 bgrt.read(Nat.is_le(56n, B.Octets.len(o)), h, o)
34
35def bgrt.parse(r: Result<&2, &2, E.AcpiError, H.AcpiSdt>) -> Result<&2, &2, E.AcpiError, AcpiBgrt>:
36 match r:
37 case Fail{e}:
38 Fail{e}
39 case Done{t}:
40 AcpiBgrt.of_sdt(t)
41
42def AcpiBgrt.parse(+o: B.Octets) -> Result<&2, &2, E.AcpiError, AcpiBgrt>:
43 bgrt.parse(H.AcpiSdt.parse_sig(B.Octets.of_string("BGRT"), o))
44
45def AcpiBgrt.build(t: AcpiBgrt) -> B.Octets:
46 match t:
47 case AcpiBgrt{H.AcpiHeader{s, l, r, c, o, tid, orv, ci, cr}, v, st, it, a, x, y}:
48 H.AcpiSdt.build(H.AcpiHeader{B.Octets.of_string("BGRT"), l, r, c, o, tid, orv, ci, cr}, B.Octets.concat([B.Octets.le16(v), B.Octets.of_list([st, it]), B.Octets.le64(a), B.Octets.le32(x), B.Octets.le32(y)]))