]>
Commit | Line | Data |
---|---|---|
40901acd | 1 | /* lsefimemmap.c - Display memory map. */ |
41a331a8 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/efi/api.h> | |
23 | #include <grub/efi/efi.h> | |
24 | #include <grub/command.h> | |
25 | ||
e745cf0c VS |
26 | GRUB_MOD_LICENSE ("GPLv3+"); |
27 | ||
41a331a8 TG |
28 | #define ADD_MEMORY_DESCRIPTOR(desc, size) \ |
29 | ((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size))) | |
30 | ||
31 | static grub_err_t | |
32 | grub_cmd_lsefimmap (grub_command_t cmd __attribute__ ((unused)), | |
33 | int argc __attribute__ ((unused)), | |
34 | char **args __attribute__ ((unused))) | |
35 | { | |
36 | grub_efi_uintn_t map_size; | |
37 | grub_efi_memory_descriptor_t *memory_map; | |
38 | grub_efi_memory_descriptor_t *memory_map_end; | |
39 | grub_efi_memory_descriptor_t *desc; | |
40 | grub_efi_uintn_t desc_size; | |
41 | ||
42 | map_size = 0; | |
43 | if (grub_efi_get_memory_map (&map_size, NULL, NULL, &desc_size, 0) < 0) | |
44 | return 0; | |
45 | ||
46 | memory_map = grub_malloc (map_size); | |
47 | if (memory_map == NULL) | |
48 | return grub_errno; | |
49 | if (grub_efi_get_memory_map (&map_size, memory_map, NULL, &desc_size, 0) <= 0) | |
50 | goto fail; | |
51 | ||
52 | grub_printf | |
53 | ("Type Physical start - end #Pages " | |
54 | " Size Attributes\n"); | |
55 | memory_map_end = ADD_MEMORY_DESCRIPTOR (memory_map, map_size); | |
56 | for (desc = memory_map; | |
57 | desc < memory_map_end; | |
58 | desc = ADD_MEMORY_DESCRIPTOR (desc, desc_size)) | |
59 | { | |
60 | grub_efi_uint64_t size; | |
61 | grub_efi_uint64_t attr; | |
62 | static const char types_str[][9] = | |
63 | { | |
64 | "reserved", | |
65 | "ldr-code", | |
66 | "ldr-data", | |
67 | "BS-code ", | |
68 | "BS-data ", | |
69 | "RT-code ", | |
70 | "RT-data ", | |
71 | "conv-mem", | |
72 | "unusable", | |
73 | "ACPI-rec", | |
74 | "ACPI-nvs", | |
75 | "MMIO ", | |
76 | "IO-ports", | |
77 | "PAL-code" | |
78 | }; | |
79 | if (desc->type < ARRAY_SIZE (types_str)) | |
80 | grub_printf ("%s ", types_str[desc->type]); | |
81 | else | |
82 | grub_printf ("Unk %02x ", desc->type); | |
83 | ||
84 | grub_printf (" %016" PRIxGRUB_UINT64_T "-%016" PRIxGRUB_UINT64_T | |
b031012d | 85 | " %08" PRIxGRUB_UINT64_T, |
41a331a8 TG |
86 | desc->physical_start, |
87 | desc->physical_start + (desc->num_pages << 12) - 1, | |
88 | desc->num_pages); | |
89 | ||
90 | size = desc->num_pages; | |
91 | size <<= (12 - 10); | |
92 | if (size < 1024) | |
93 | grub_printf (" %4" PRIuGRUB_UINT64_T "KB", size); | |
94 | else | |
95 | { | |
96 | size /= 1024; | |
97 | if (size < 1024) | |
98 | grub_printf (" %4" PRIuGRUB_UINT64_T "MB", size); | |
99 | else | |
100 | { | |
101 | size /= 1024; | |
102 | grub_printf (" %4" PRIuGRUB_UINT64_T "GB", size); | |
103 | } | |
104 | } | |
105 | ||
106 | attr = desc->attribute; | |
107 | if (attr & GRUB_EFI_MEMORY_RUNTIME) | |
108 | grub_printf (" RT"); | |
109 | if (attr & GRUB_EFI_MEMORY_UC) | |
110 | grub_printf (" UC"); | |
111 | if (attr & GRUB_EFI_MEMORY_WC) | |
112 | grub_printf (" WC"); | |
113 | if (attr & GRUB_EFI_MEMORY_WT) | |
114 | grub_printf (" WT"); | |
115 | if (attr & GRUB_EFI_MEMORY_WB) | |
116 | grub_printf (" WB"); | |
117 | if (attr & GRUB_EFI_MEMORY_UCE) | |
118 | grub_printf (" UCE"); | |
119 | if (attr & GRUB_EFI_MEMORY_WP) | |
120 | grub_printf (" WP"); | |
121 | if (attr & GRUB_EFI_MEMORY_RP) | |
122 | grub_printf (" RP"); | |
123 | if (attr & GRUB_EFI_MEMORY_XP) | |
124 | grub_printf (" XP"); | |
125 | ||
126 | grub_printf ("\n"); | |
127 | } | |
128 | ||
129 | fail: | |
130 | grub_free (memory_map); | |
131 | return 0; | |
132 | } | |
133 | ||
134 | static grub_command_t cmd; | |
135 | ||
136 | GRUB_MOD_INIT(lsefimmap) | |
137 | { | |
138 | cmd = grub_register_command ("lsefimmap", grub_cmd_lsefimmap, | |
139 | "", "Display EFI memory map."); | |
140 | } | |
141 | ||
142 | GRUB_MOD_FINI(lsefimmap) | |
143 | { | |
144 | grub_unregister_command (cmd); | |
145 | } |