1 /* lssal.c - Display EFI SAL systab. */
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2008 Free Software Foundation, Inc.
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.
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.
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/>.
19 #include <grub/types.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>
28 GRUB_MOD_LICENSE ("GPLv3+");
31 disp_sal (void *table
)
33 struct grub_efi_sal_system_table
*t
= table
;
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
);
46 len
= t
->total_table_len
- sizeof (struct grub_efi_sal_system_table
);
49 switch (*(grub_uint8_t
*) desc
)
51 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR
:
53 struct grub_efi_sal_system_table_entrypoint_descriptor
*c
= desc
;
55 grub_printf (" Entry point: PAL=%016" PRIxGRUB_UINT64_T
56 " SAL=%016" PRIxGRUB_UINT64_T
" GP=%016"
57 PRIxGRUB_UINT64_T
"\n",
58 c
->pal_proc_addr
, c
->sal_proc_addr
,
62 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR
:
64 struct grub_efi_sal_system_table_memory_descriptor
*c
= desc
;
66 grub_printf (" Memory descriptor entry addr=%016" PRIxGRUB_UINT64_T
67 " len=%" PRIuGRUB_UINT64_T
"KB\n",
69 grub_printf (" sal_used=%d attr=%x AR=%x attr_mask=%x "
71 c
->sal_used
, c
->attr
, c
->ar
, c
->attr_mask
, c
->mem_type
,
75 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES
:
77 struct grub_efi_sal_system_table_platform_features
*c
= desc
;
79 grub_printf (" Platform features: %02x", c
->flags
);
80 if (c
->flags
& GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK
)
81 grub_printf (" BusLock");
82 if (c
->flags
& GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT
)
83 grub_printf (" IrqRedirect");
84 if (c
->flags
& GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT
)
86 grub_printf (" IPIRedirect");
87 if (c
->flags
& GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT
)
89 grub_printf (" ITCDrift");
93 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR
:
95 struct grub_efi_sal_system_table_translation_register_descriptor
*c
98 grub_printf (" TR type=%d num=%d va=%016" PRIxGRUB_UINT64_T
99 " pte=%016" PRIxGRUB_UINT64_T
"\n",
100 c
->register_type
, c
->register_number
,
101 c
->addr
, c
->page_size
);
104 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE
:
106 struct grub_efi_sal_system_table_purge_translation_coherence
*c
109 grub_printf (" PTC coherence nbr=%d addr=%016" PRIxGRUB_UINT64_T
"\n",
110 c
->ndomains
, c
->coherence
);
113 case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP
:
115 struct grub_efi_sal_system_table_ap_wakeup
*c
= desc
;
117 grub_printf (" AP wake-up: mec=%d vect=%" PRIxGRUB_UINT64_T
"\n",
118 c
->mechanism
, c
->vector
);
122 grub_printf (" unknown entry 0x%x\n", *(grub_uint8_t
*)desc
);
125 desc
= (grub_uint8_t
*)desc
+ l
;
131 grub_cmd_lssal (struct grub_command
*cmd
__attribute__ ((unused
)),
132 int argc
__attribute__ ((unused
)),
133 char **args
__attribute__ ((unused
)))
135 const grub_efi_system_table_t
*st
= grub_efi_system_table
;
136 grub_efi_configuration_table_t
*t
= st
->configuration_table
;
138 grub_efi_guid_t guid
= GRUB_EFI_SAL_TABLE_GUID
;
140 for (i
= 0; i
< st
->num_table_entries
; i
++)
142 if (grub_memcmp (&guid
, &t
->vendor_guid
,
143 sizeof (grub_efi_guid_t
)) == 0)
145 disp_sal (t
->vendor_table
);
146 return GRUB_ERR_NONE
;
150 grub_printf ("SAL not found\n");
151 return GRUB_ERR_NONE
;
154 static grub_command_t cmd
;
158 cmd
= grub_register_command ("lssal", grub_cmd_lssal
, "",
159 "Display SAL system table.");
164 grub_unregister_command (cmd
);