/* lssal.c - Display EFI SAL systab. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2008 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); static void disp_sal (void *table) { struct grub_efi_sal_system_table *t = table; void *desc; grub_uint32_t len, l, i; grub_printf ("SAL rev: %02x, signature: %x, len:%x\n", t->sal_rev, t->signature, t->total_table_len); grub_printf ("nbr entry: %d, chksum: %02x, SAL version A: %02x B: %02x\n", t->entry_count, t->checksum, t->sal_a_version, t->sal_b_version); grub_printf ("OEM-ID: %-32s\n", t->oem_id); grub_printf ("Product-ID: %-32s\n", t->product_id); desc = t->entries; len = t->total_table_len - sizeof (struct grub_efi_sal_system_table); if (t->total_table_len <= sizeof (struct grub_efi_sal_system_table)) return; for (i = 0; i < t->entry_count; i++) { switch (*(grub_uint8_t *) desc) { case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR: { struct grub_efi_sal_system_table_entrypoint_descriptor *c = desc; l = sizeof (*c); grub_printf (" Entry point: PAL=%016" PRIxGRUB_UINT64_T " SAL=%016" PRIxGRUB_UINT64_T " GP=%016" PRIxGRUB_UINT64_T "\n", c->pal_proc_addr, c->sal_proc_addr, c->global_data_ptr); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR: { struct grub_efi_sal_system_table_memory_descriptor *c = desc; l = sizeof (*c); grub_printf (" Memory descriptor entry addr=%016" PRIxGRUB_UINT64_T " len=%" PRIuGRUB_UINT64_T "KB\n", c->addr, c->len * 4); grub_printf (" sal_used=%d attr=%x AR=%x attr_mask=%x " "type=%x usage=%x\n", c->sal_used, c->attr, c->ar, c->attr_mask, c->mem_type, c->usage); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES: { struct grub_efi_sal_system_table_platform_features *c = desc; l = sizeof (*c); grub_printf (" Platform features: %02x", c->flags); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK) grub_printf (" BusLock"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT) grub_printf (" IrqRedirect"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT) grub_printf (" IPIRedirect"); if (c->flags & GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT) grub_printf (" ITCDrift"); grub_printf ("\n"); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR: { struct grub_efi_sal_system_table_translation_register_descriptor *c = desc; l = sizeof (*c); grub_printf (" TR type=%d num=%d va=%016" PRIxGRUB_UINT64_T " pte=%016" PRIxGRUB_UINT64_T "\n", c->register_type, c->register_number, c->addr, c->page_size); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE: { struct grub_efi_sal_system_table_purge_translation_coherence *c = desc; l = sizeof (*c); grub_printf (" PTC coherence nbr=%d addr=%016" PRIxGRUB_UINT64_T "\n", c->ndomains, c->coherence); } break; case GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP: { struct grub_efi_sal_system_table_ap_wakeup *c = desc; l = sizeof (*c); grub_printf (" AP wake-up: mec=%d vect=%" PRIxGRUB_UINT64_T "\n", c->mechanism, c->vector); } break; default: grub_printf (" unknown entry 0x%x\n", *(grub_uint8_t *)desc); return; } desc = (grub_uint8_t *)desc + l; if (len <= l) return; len -= l; } } static grub_err_t grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)), int argc __attribute__ ((unused)), char **args __attribute__ ((unused))) { const grub_efi_system_table_t *st = grub_efi_system_table; grub_efi_configuration_table_t *t = st->configuration_table; unsigned int i; grub_efi_packed_guid_t guid = GRUB_EFI_SAL_TABLE_GUID; for (i = 0; i < st->num_table_entries; i++) { if (grub_memcmp (&guid, &t->vendor_guid, sizeof (grub_efi_packed_guid_t)) == 0) { disp_sal (t->vendor_table); return GRUB_ERR_NONE; } t++; } grub_printf ("SAL not found\n"); return GRUB_ERR_NONE; } static grub_command_t cmd; GRUB_MOD_INIT(lssal) { cmd = grub_register_command ("lssal", grub_cmd_lssal, "", "Display SAL system table."); } GRUB_MOD_FINI(lssal) { grub_unregister_command (cmd); }