1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//! Configuration table utilities.
//!
//! The configuration table is an array of GUIDs and pointers to extra system tables.
//!
//! For example, it can be used to find the ACPI tables.
//!
//! This module contains the actual entries of the configuration table,
//! as well as GUIDs for many known vendor tables.

#![allow(clippy::unreadable_literal)]

use crate::Guid;
use bitflags::bitflags;
use core::ffi::c_void;

/// Contains a set of GUID / pointer for a vendor-specific table.
///
/// The UEFI standard guarantees each entry is unique.
#[derive(Debug)]
#[repr(C)]
pub struct ConfigTableEntry {
    /// The GUID identifying this table.
    pub guid: Guid,
    /// The starting address of this table.
    ///
    /// Whether this is a physical or virtual address depends on the table.
    pub address: *const c_void,
}

/// Entry pointing to the old ACPI 1 RSDP.
pub const ACPI_GUID: Guid = Guid::from_values(
    0xeb9d2d30,
    0x2d88,
    0x11d3,
    0x9a16,
    [0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d],
);

///Entry pointing to the ACPI 2 RSDP.
pub const ACPI2_GUID: Guid = Guid::from_values(
    0x8868e871,
    0xe4f1,
    0x11d3,
    0xbc22,
    [0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81],
);

/// Entry pointing to the SMBIOS 1.0 table.
pub const SMBIOS_GUID: Guid = Guid::from_values(
    0xeb9d2d31,
    0x2d88,
    0x11d3,
    0x9a16,
    [0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d],
);

/// Entry pointing to the SMBIOS 3.0 table.
pub const SMBIOS3_GUID: Guid = Guid::from_values(
    0xf2fd1544,
    0x9794,
    0x4a2c,
    0x992e,
    [0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94],
);

/// GUID of the UEFI properties table.
///
/// The properties table is used to provide additional info
/// about the UEFI implementation.
pub const PROPERTIES_TABLE_GUID: Guid = Guid::from_values(
    0x880aaca3,
    0x4adc,
    0x4a04,
    0x9079,
    [0xb7, 0x47, 0x34, 0x08, 0x25, 0xe5],
);

/// This table contains additional information about the UEFI implementation.
#[repr(C)]
pub struct PropertiesTable {
    /// Version of the UEFI properties table.
    ///
    /// The only valid version currently is 0x10_000.
    pub version: u32,
    /// Length in bytes of this table.
    ///
    /// The initial version's length is 16.
    pub length: u32,
    /// Memory protection attributes.
    pub memory_protection: MemoryProtectionAttribute,
}

bitflags! {
    /// Flags describing memory protection.
    pub struct MemoryProtectionAttribute: usize {
        /// If this bit is set, then the UEFI implementation will mark pages
        /// containing data as non-executable.
        const NON_EXECUTABLE_DATA = 1;
    }
}

/// Hand-off Blocks are used to pass data from the early pre-UEFI environment to the UEFI drivers.
///
/// Most OS loaders or applications should not mess with this.
pub const HAND_OFF_BLOCK_LIST_GUID: Guid = Guid::from_values(
    0x7739f24c,
    0x93d7,
    0x11d4,
    0x9a3a,
    [0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d],
);

/// Table used in the early boot environment to record memory ranges.
pub const MEMORY_TYPE_INFORMATION_GUID: Guid = Guid::from_values(
    0x4c19049f,
    0x4137,
    0x4dd3,
    0x9c10,
    [0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa],
);

/// Used to identify Hand-off Blocks which store
/// status codes reported during the pre-UEFI environment.
pub const MEMORY_STATUS_CODE_RECORD_GUID: Guid = Guid::from_values(
    0x60cc026,
    0x4c0d,
    0x4dda,
    0x8f41,
    [0x59, 0x5f, 0xef, 0x00, 0xa5, 0x02],
);

/// Table which provides Driver eXecution Environment services.
pub const DXE_SERVICES_GUID: Guid = Guid::from_values(
    0x5ad34ba,
    0x6f02,
    0x4214,
    0x952e,
    [0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9],
);

/// LZMA-compressed filesystem.
pub const LZMA_COMPRESS_GUID: Guid = Guid::from_values(
    0xee4e5898,
    0x3914,
    0x4259,
    0x9d6e,
    [0xdc, 0x7b, 0xd7, 0x94, 0x03, 0xcf],
);

/// A custom compressed filesystem used by the Tiano UEFI implementation.
pub const TIANO_COMPRESS_GUID: Guid = Guid::from_values(
    0xa31280ad,
    0x481e,
    0x41b6,
    0x95e8,
    [0x12, 0x7f, 0x4c, 0x98, 0x47, 0x79],
);

/// Pointer to the debug image info table.
pub const DEBUG_IMAGE_INFO_GUID: Guid = Guid::from_values(
    0x49152e77,
    0x1ada,
    0x4764,
    0xb7a2,
    [0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b],
);