console.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
  2. use core::mem;
  3. use multiboot2_common::{MaybeDynSized, Tag};
  4. /// Possible flags for [`ConsoleHeaderTag`].
  5. #[repr(u32)]
  6. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
  7. pub enum ConsoleHeaderTagFlags {
  8. /// Console required.
  9. ConsoleRequired = 0,
  10. /// EGA text support.
  11. EgaTextSupported = 1,
  12. }
  13. /// Tells that a console must be available in MBI.
  14. /// Only relevant for legacy BIOS.
  15. #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
  16. #[repr(C, align(8))]
  17. pub struct ConsoleHeaderTag {
  18. header: HeaderTagHeader,
  19. console_flags: ConsoleHeaderTagFlags,
  20. }
  21. impl ConsoleHeaderTag {
  22. /// Constructs a new tag.
  23. #[must_use]
  24. pub const fn new(flags: HeaderTagFlag, console_flags: ConsoleHeaderTagFlags) -> Self {
  25. let header =
  26. HeaderTagHeader::new(HeaderTagType::ConsoleFlags, flags, Self::BASE_SIZE as u32);
  27. Self {
  28. header,
  29. console_flags,
  30. }
  31. }
  32. /// Returns the [`HeaderTagType`].
  33. #[must_use]
  34. pub const fn typ(&self) -> HeaderTagType {
  35. self.header.typ()
  36. }
  37. /// Returns the [`HeaderTagFlag`]s.
  38. #[must_use]
  39. pub const fn flags(&self) -> HeaderTagFlag {
  40. self.header.flags()
  41. }
  42. /// Returns the size.
  43. #[must_use]
  44. pub const fn size(&self) -> u32 {
  45. self.header.size()
  46. }
  47. /// Returns the [`ConsoleHeaderTagFlags`].
  48. #[must_use]
  49. pub const fn console_flags(&self) -> ConsoleHeaderTagFlags {
  50. self.console_flags
  51. }
  52. }
  53. impl MaybeDynSized for ConsoleHeaderTag {
  54. type Header = HeaderTagHeader;
  55. const BASE_SIZE: usize = mem::size_of::<HeaderTagHeader>() + mem::size_of::<u32>();
  56. fn dst_len(_header: &Self::Header) -> Self::Metadata {}
  57. }
  58. impl Tag for ConsoleHeaderTag {
  59. type IDType = HeaderTagType;
  60. const ID: HeaderTagType = HeaderTagType::ConsoleFlags;
  61. }