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)]))