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 12 import Base 13 import bend-osdev-word64@0.1.1.1/word64.bend as W 14 import bend-osdev-bytes@0.1.1.1/bytes.bend as B 15 import ./error.bend as E 16 import ./header.bend as H 17 import ./fields.bend as F 18 19 type 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 22 def 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 29 def 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 35 def 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 42 def 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 45 def 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)]))