]>
Commit | Line | Data |
---|---|---|
6d3d698d | 1 | /* lssal.c - Display EFI SAL systab. */ |
105de6a7 TG |
2 | /* |
3 | * GRUB -- GRand Unified Bootloader | |
4 | * Copyright (C) 2008 Free Software Foundation, Inc. | |
5 | * | |
6 | * GRUB is free software: you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation, either version 3 of the License, or | |
9 | * (at your option) any later version. | |
10 | * | |
11 | * GRUB is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with GRUB. If not, see <http://www.gnu.org/licenses/>. | |
18 | */ | |
19 | #include <grub/types.h> | |
20 | #include <grub/mm.h> | |
21 | #include <grub/misc.h> | |
22 | #include <grub/normal.h> | |
23 | #include <grub/charset.h> | |
24 | #include <grub/efi/api.h> | |
25 | #include <grub/efi/efi.h> | |
e745cf0c VS |
26 | #include <grub/dl.h> |
27 | ||
28 | GRUB_MOD_LICENSE ("GPLv3+"); | |
105de6a7 TG |
29 | |
30 | static void | |
31 | disp_sal (void *table) | |
32 | { | |
33 | struct grub_efi_sal_system_table *t = table; | |
34 | void *desc; | |
3e3dff24 | 35 | grub_uint32_t len, l, i; |
105de6a7 TG |
36 | |
37 | grub_printf ("SAL rev: %02x, signature: %x, len:%x\n", | |
38 | t->sal_rev, t->signature, t->total_table_len); | |
39 | grub_printf ("nbr entry: %d, chksum: %02x, SAL version A: %02x B: %02x\n", | |
40 | t->entry_count, t->checksum, | |
41 | t->sal_a_version, t->sal_b_version); | |
42 | grub_printf ("OEM-ID: %-32s\n", t->oem_id); | |
43 | grub_printf ("Product-ID: %-32s\n", t->product_id); | |
44 | ||
45 | desc = t->entries; | |
46 | len = t->total_table_len - sizeof (struct grub_efi_sal_system_table); | |
3e3dff24 VS |
47 | if (t->total_table_len <= sizeof (struct grub_efi_sal_system_table)) |
48 | return; | |
49 | for (i = 0; i < t->entry_count; i++) | |
105de6a7 TG |
50 | { |
51 | switch (*(grub_uint8_t *) desc) | |
52 | { | |
53 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR: | |
54 | { | |
55 | struct grub_efi_sal_system_table_entrypoint_descriptor *c = desc; | |
56 | l = sizeof (*c); | |
57 | grub_printf (" Entry point: PAL=%016" PRIxGRUB_UINT64_T | |
58 | " SAL=%016" PRIxGRUB_UINT64_T " GP=%016" | |
59 | PRIxGRUB_UINT64_T "\n", | |
60 | c->pal_proc_addr, c->sal_proc_addr, | |
61 | c->global_data_ptr); | |
62 | } | |
63 | break; | |
64 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR: | |
65 | { | |
66 | struct grub_efi_sal_system_table_memory_descriptor *c = desc; | |
67 | l = sizeof (*c); | |
68 | grub_printf (" Memory descriptor entry addr=%016" PRIxGRUB_UINT64_T | |
69 | " len=%" PRIuGRUB_UINT64_T "KB\n", | |
70 | c->addr, c->len * 4); | |
71 | grub_printf (" sal_used=%d attr=%x AR=%x attr_mask=%x " | |
72 | "type=%x usage=%x\n", | |
73 | c->sal_used, c->attr, c->ar, c->attr_mask, c->mem_type, | |
74 | c->usage); | |
75 | } | |
76 | break; | |
77 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES: | |
78 | { | |
79 | struct grub_efi_sal_system_table_platform_features *c = desc; | |
80 | l = sizeof (*c); | |
81 | grub_printf (" Platform features: %02x", c->flags); | |
82 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK) | |
83 | grub_printf (" BusLock"); | |
84 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT) | |
85 | grub_printf (" IrqRedirect"); | |
86 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT) | |
87 | ||
88 | grub_printf (" IPIRedirect"); | |
89 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT) | |
90 | ||
91 | grub_printf (" ITCDrift"); | |
92 | grub_printf ("\n"); | |
93 | } | |
94 | break; | |
95 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR: | |
96 | { | |
97 | struct grub_efi_sal_system_table_translation_register_descriptor *c | |
98 | = desc; | |
99 | l = sizeof (*c); | |
100 | grub_printf (" TR type=%d num=%d va=%016" PRIxGRUB_UINT64_T | |
101 | " pte=%016" PRIxGRUB_UINT64_T "\n", | |
102 | c->register_type, c->register_number, | |
103 | c->addr, c->page_size); | |
104 | } | |
105 | break; | |
106 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE: | |
107 | { | |
108 | struct grub_efi_sal_system_table_purge_translation_coherence *c | |
109 | = desc; | |
110 | l = sizeof (*c); | |
111 | grub_printf (" PTC coherence nbr=%d addr=%016" PRIxGRUB_UINT64_T "\n", | |
112 | c->ndomains, c->coherence); | |
113 | } | |
114 | break; | |
115 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP: | |
116 | { | |
117 | struct grub_efi_sal_system_table_ap_wakeup *c = desc; | |
118 | l = sizeof (*c); | |
119 | grub_printf (" AP wake-up: mec=%d vect=%" PRIxGRUB_UINT64_T "\n", | |
120 | c->mechanism, c->vector); | |
121 | } | |
122 | break; | |
123 | default: | |
124 | grub_printf (" unknown entry 0x%x\n", *(grub_uint8_t *)desc); | |
125 | return; | |
126 | } | |
127 | desc = (grub_uint8_t *)desc + l; | |
3e3dff24 VS |
128 | if (len <= l) |
129 | return; | |
105de6a7 TG |
130 | len -= l; |
131 | } | |
132 | } | |
133 | ||
134 | static grub_err_t | |
135 | grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)), | |
136 | int argc __attribute__ ((unused)), | |
137 | char **args __attribute__ ((unused))) | |
138 | { | |
139 | const grub_efi_system_table_t *st = grub_efi_system_table; | |
140 | grub_efi_configuration_table_t *t = st->configuration_table; | |
141 | unsigned int i; | |
316dda71 | 142 | grub_efi_packed_guid_t guid = GRUB_EFI_SAL_TABLE_GUID; |
105de6a7 TG |
143 | |
144 | for (i = 0; i < st->num_table_entries; i++) | |
145 | { | |
146 | if (grub_memcmp (&guid, &t->vendor_guid, | |
316dda71 | 147 | sizeof (grub_efi_packed_guid_t)) == 0) |
105de6a7 TG |
148 | { |
149 | disp_sal (t->vendor_table); | |
150 | return GRUB_ERR_NONE; | |
151 | } | |
152 | t++; | |
153 | } | |
154 | grub_printf ("SAL not found\n"); | |
155 | return GRUB_ERR_NONE; | |
156 | } | |
157 | ||
158 | static grub_command_t cmd; | |
159 | ||
160 | GRUB_MOD_INIT(lssal) | |
161 | { | |
162 | cmd = grub_register_command ("lssal", grub_cmd_lssal, "", | |
163 | "Display SAL system table."); | |
164 | } | |
165 | ||
166 | GRUB_MOD_FINI(lssal) | |
167 | { | |
168 | grub_unregister_command (cmd); | |
169 | } |