]>
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> | |
26 | ||
27 | static void | |
28 | disp_sal (void *table) | |
29 | { | |
30 | struct grub_efi_sal_system_table *t = table; | |
31 | void *desc; | |
32 | grub_uint32_t len, l; | |
33 | ||
34 | grub_printf ("SAL rev: %02x, signature: %x, len:%x\n", | |
35 | t->sal_rev, t->signature, t->total_table_len); | |
36 | grub_printf ("nbr entry: %d, chksum: %02x, SAL version A: %02x B: %02x\n", | |
37 | t->entry_count, t->checksum, | |
38 | t->sal_a_version, t->sal_b_version); | |
39 | grub_printf ("OEM-ID: %-32s\n", t->oem_id); | |
40 | grub_printf ("Product-ID: %-32s\n", t->product_id); | |
41 | ||
42 | desc = t->entries; | |
43 | len = t->total_table_len - sizeof (struct grub_efi_sal_system_table); | |
44 | while (len > 0) | |
45 | { | |
46 | switch (*(grub_uint8_t *) desc) | |
47 | { | |
48 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR: | |
49 | { | |
50 | struct grub_efi_sal_system_table_entrypoint_descriptor *c = desc; | |
51 | l = sizeof (*c); | |
52 | grub_printf (" Entry point: PAL=%016" PRIxGRUB_UINT64_T | |
53 | " SAL=%016" PRIxGRUB_UINT64_T " GP=%016" | |
54 | PRIxGRUB_UINT64_T "\n", | |
55 | c->pal_proc_addr, c->sal_proc_addr, | |
56 | c->global_data_ptr); | |
57 | } | |
58 | break; | |
59 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR: | |
60 | { | |
61 | struct grub_efi_sal_system_table_memory_descriptor *c = desc; | |
62 | l = sizeof (*c); | |
63 | grub_printf (" Memory descriptor entry addr=%016" PRIxGRUB_UINT64_T | |
64 | " len=%" PRIuGRUB_UINT64_T "KB\n", | |
65 | c->addr, c->len * 4); | |
66 | grub_printf (" sal_used=%d attr=%x AR=%x attr_mask=%x " | |
67 | "type=%x usage=%x\n", | |
68 | c->sal_used, c->attr, c->ar, c->attr_mask, c->mem_type, | |
69 | c->usage); | |
70 | } | |
71 | break; | |
72 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES: | |
73 | { | |
74 | struct grub_efi_sal_system_table_platform_features *c = desc; | |
75 | l = sizeof (*c); | |
76 | grub_printf (" Platform features: %02x", c->flags); | |
77 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK) | |
78 | grub_printf (" BusLock"); | |
79 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT) | |
80 | grub_printf (" IrqRedirect"); | |
81 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT) | |
82 | ||
83 | grub_printf (" IPIRedirect"); | |
84 | if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT) | |
85 | ||
86 | grub_printf (" ITCDrift"); | |
87 | grub_printf ("\n"); | |
88 | } | |
89 | break; | |
90 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR: | |
91 | { | |
92 | struct grub_efi_sal_system_table_translation_register_descriptor *c | |
93 | = desc; | |
94 | l = sizeof (*c); | |
95 | grub_printf (" TR type=%d num=%d va=%016" PRIxGRUB_UINT64_T | |
96 | " pte=%016" PRIxGRUB_UINT64_T "\n", | |
97 | c->register_type, c->register_number, | |
98 | c->addr, c->page_size); | |
99 | } | |
100 | break; | |
101 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE: | |
102 | { | |
103 | struct grub_efi_sal_system_table_purge_translation_coherence *c | |
104 | = desc; | |
105 | l = sizeof (*c); | |
106 | grub_printf (" PTC coherence nbr=%d addr=%016" PRIxGRUB_UINT64_T "\n", | |
107 | c->ndomains, c->coherence); | |
108 | } | |
109 | break; | |
110 | case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP: | |
111 | { | |
112 | struct grub_efi_sal_system_table_ap_wakeup *c = desc; | |
113 | l = sizeof (*c); | |
114 | grub_printf (" AP wake-up: mec=%d vect=%" PRIxGRUB_UINT64_T "\n", | |
115 | c->mechanism, c->vector); | |
116 | } | |
117 | break; | |
118 | default: | |
119 | grub_printf (" unknown entry 0x%x\n", *(grub_uint8_t *)desc); | |
120 | return; | |
121 | } | |
122 | desc = (grub_uint8_t *)desc + l; | |
123 | len -= l; | |
124 | } | |
125 | } | |
126 | ||
127 | static grub_err_t | |
128 | grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)), | |
129 | int argc __attribute__ ((unused)), | |
130 | char **args __attribute__ ((unused))) | |
131 | { | |
132 | const grub_efi_system_table_t *st = grub_efi_system_table; | |
133 | grub_efi_configuration_table_t *t = st->configuration_table; | |
134 | unsigned int i; | |
135 | grub_efi_guid_t guid = GRUB_EFI_SAL_TABLE_GUID; | |
136 | ||
137 | for (i = 0; i < st->num_table_entries; i++) | |
138 | { | |
139 | if (grub_memcmp (&guid, &t->vendor_guid, | |
140 | sizeof (grub_efi_guid_t)) == 0) | |
141 | { | |
142 | disp_sal (t->vendor_table); | |
143 | return GRUB_ERR_NONE; | |
144 | } | |
145 | t++; | |
146 | } | |
147 | grub_printf ("SAL not found\n"); | |
148 | return GRUB_ERR_NONE; | |
149 | } | |
150 | ||
151 | static grub_command_t cmd; | |
152 | ||
153 | GRUB_MOD_INIT(lssal) | |
154 | { | |
155 | cmd = grub_register_command ("lssal", grub_cmd_lssal, "", | |
156 | "Display SAL system table."); | |
157 | } | |
158 | ||
159 | GRUB_MOD_FINI(lssal) | |
160 | { | |
161 | grub_unregister_command (cmd); | |
162 | } |