Skip to content

Commit 884f4f6

Browse files
mflemingIngo Molnar
authored andcommitted
efi: Remove global 'memmap' EFI memory map
Abolish the poorly named EFI memory map, 'memmap'. It is shadowed by a bunch of local definitions in various files and having two ways to access the EFI memory map ('efi.memmap' vs. 'memmap') is rather confusing. Furthermore, IA64 doesn't even provide this global object, which has caused issues when trying to write generic EFI memmap code. Replace all occurrences with efi.memmap, and convert the remaining iterator code to use for_each_efi_mem_desc(). Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Luck, Tony <tony.luck@intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-efi@vger.kernel.org Link: http://lkml.kernel.org/r/1461614832-17633-8-git-send-email-matt@codeblueprint.co.uk Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent 78ce248 commit 884f4f6

File tree

6 files changed

+85
-78
lines changed

6 files changed

+85
-78
lines changed

arch/x86/platform/efi/efi.c

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@
5656

5757
#define EFI_DEBUG
5858

59-
struct efi_memory_map memmap;
60-
6159
static struct efi efi_phys __initdata;
6260
static efi_system_table_t efi_systab __initdata;
6361

@@ -207,15 +205,13 @@ int __init efi_memblock_x86_reserve_range(void)
207205
#else
208206
pmap = (e->efi_memmap | ((__u64)e->efi_memmap_hi << 32));
209207
#endif
210-
memmap.phys_map = pmap;
211-
memmap.nr_map = e->efi_memmap_size /
208+
efi.memmap.phys_map = pmap;
209+
efi.memmap.nr_map = e->efi_memmap_size /
212210
e->efi_memdesc_size;
213-
memmap.desc_size = e->efi_memdesc_size;
214-
memmap.desc_version = e->efi_memdesc_version;
215-
216-
memblock_reserve(pmap, memmap.nr_map * memmap.desc_size);
211+
efi.memmap.desc_size = e->efi_memdesc_size;
212+
efi.memmap.desc_version = e->efi_memdesc_version;
217213

218-
efi.memmap = &memmap;
214+
memblock_reserve(pmap, efi.memmap.nr_map * efi.memmap.desc_size);
219215

220216
return 0;
221217
}
@@ -240,10 +236,14 @@ void __init efi_print_memmap(void)
240236

241237
void __init efi_unmap_memmap(void)
242238
{
239+
unsigned long size;
240+
243241
clear_bit(EFI_MEMMAP, &efi.flags);
244-
if (memmap.map) {
245-
early_memunmap(memmap.map, memmap.nr_map * memmap.desc_size);
246-
memmap.map = NULL;
242+
243+
size = efi.memmap.nr_map * efi.memmap.desc_size;
244+
if (efi.memmap.map) {
245+
early_memunmap(efi.memmap.map, size);
246+
efi.memmap.map = NULL;
247247
}
248248
}
249249

@@ -432,17 +432,22 @@ static int __init efi_runtime_init(void)
432432

433433
static int __init efi_memmap_init(void)
434434
{
435+
unsigned long addr, size;
436+
435437
if (efi_enabled(EFI_PARAVIRT))
436438
return 0;
437439

438440
/* Map the EFI memory map */
439-
memmap.map = early_memremap((unsigned long)memmap.phys_map,
440-
memmap.nr_map * memmap.desc_size);
441-
if (memmap.map == NULL) {
441+
size = efi.memmap.nr_map * efi.memmap.desc_size;
442+
addr = (unsigned long)efi.memmap.phys_map;
443+
444+
efi.memmap.map = early_memremap(addr, size);
445+
if (efi.memmap.map == NULL) {
442446
pr_err("Could not map the memory map!\n");
443447
return -ENOMEM;
444448
}
445-
memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size);
449+
450+
efi.memmap.map_end = efi.memmap.map + size;
446451

447452
if (add_efi_memmap)
448453
do_add_efi_memmap();
@@ -638,28 +643,31 @@ static void __init get_systab_virt_addr(efi_memory_desc_t *md)
638643
static void __init save_runtime_map(void)
639644
{
640645
#ifdef CONFIG_KEXEC_CORE
646+
unsigned long desc_size;
641647
efi_memory_desc_t *md;
642648
void *tmp, *q = NULL;
643649
int count = 0;
644650

645651
if (efi_enabled(EFI_OLD_MEMMAP))
646652
return;
647653

654+
desc_size = efi.memmap.desc_size;
655+
648656
for_each_efi_memory_desc(md) {
649657
if (!(md->attribute & EFI_MEMORY_RUNTIME) ||
650658
(md->type == EFI_BOOT_SERVICES_CODE) ||
651659
(md->type == EFI_BOOT_SERVICES_DATA))
652660
continue;
653-
tmp = krealloc(q, (count + 1) * memmap.desc_size, GFP_KERNEL);
661+
tmp = krealloc(q, (count + 1) * desc_size, GFP_KERNEL);
654662
if (!tmp)
655663
goto out;
656664
q = tmp;
657665

658-
memcpy(q + count * memmap.desc_size, md, memmap.desc_size);
666+
memcpy(q + count * desc_size, md, desc_size);
659667
count++;
660668
}
661669

662-
efi_runtime_map_setup(q, count, memmap.desc_size);
670+
efi_runtime_map_setup(q, count, desc_size);
663671
return;
664672

665673
out:
@@ -699,10 +707,10 @@ static inline void *efi_map_next_entry_reverse(void *entry)
699707
{
700708
/* Initial call */
701709
if (!entry)
702-
return memmap.map_end - memmap.desc_size;
710+
return efi.memmap.map_end - efi.memmap.desc_size;
703711

704-
entry -= memmap.desc_size;
705-
if (entry < memmap.map)
712+
entry -= efi.memmap.desc_size;
713+
if (entry < efi.memmap.map)
706714
return NULL;
707715

708716
return entry;
@@ -744,10 +752,10 @@ static void *efi_map_next_entry(void *entry)
744752

745753
/* Initial call */
746754
if (!entry)
747-
return memmap.map;
755+
return efi.memmap.map;
748756

749-
entry += memmap.desc_size;
750-
if (entry >= memmap.map_end)
757+
entry += efi.memmap.desc_size;
758+
if (entry >= efi.memmap.map_end)
751759
return NULL;
752760

753761
return entry;
@@ -761,8 +769,11 @@ static void * __init efi_map_regions(int *count, int *pg_shift)
761769
{
762770
void *p, *new_memmap = NULL;
763771
unsigned long left = 0;
772+
unsigned long desc_size;
764773
efi_memory_desc_t *md;
765774

775+
desc_size = efi.memmap.desc_size;
776+
766777
p = NULL;
767778
while ((p = efi_map_next_entry(p))) {
768779
md = p;
@@ -777,7 +788,7 @@ static void * __init efi_map_regions(int *count, int *pg_shift)
777788
efi_map_region(md);
778789
get_systab_virt_addr(md);
779790

780-
if (left < memmap.desc_size) {
791+
if (left < desc_size) {
781792
new_memmap = realloc_pages(new_memmap, *pg_shift);
782793
if (!new_memmap)
783794
return NULL;
@@ -786,10 +797,9 @@ static void * __init efi_map_regions(int *count, int *pg_shift)
786797
(*pg_shift)++;
787798
}
788799

789-
memcpy(new_memmap + (*count * memmap.desc_size), md,
790-
memmap.desc_size);
800+
memcpy(new_memmap + (*count * desc_size), md, desc_size);
791801

792-
left -= memmap.desc_size;
802+
left -= desc_size;
793803
(*count)++;
794804
}
795805

@@ -833,10 +843,10 @@ static void __init kexec_enter_virtual_mode(void)
833843

834844
BUG_ON(!efi.systab);
835845

836-
num_pages = ALIGN(memmap.nr_map * memmap.desc_size, PAGE_SIZE);
846+
num_pages = ALIGN(efi.memmap.nr_map * efi.memmap.desc_size, PAGE_SIZE);
837847
num_pages >>= PAGE_SHIFT;
838848

839-
if (efi_setup_page_tables(memmap.phys_map, num_pages)) {
849+
if (efi_setup_page_tables(efi.memmap.phys_map, num_pages)) {
840850
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
841851
return;
842852
}
@@ -920,16 +930,16 @@ static void __init __efi_enter_virtual_mode(void)
920930

921931
if (efi_is_native()) {
922932
status = phys_efi_set_virtual_address_map(
923-
memmap.desc_size * count,
924-
memmap.desc_size,
925-
memmap.desc_version,
933+
efi.memmap.desc_size * count,
934+
efi.memmap.desc_size,
935+
efi.memmap.desc_version,
926936
(efi_memory_desc_t *)__pa(new_memmap));
927937
} else {
928938
status = efi_thunk_set_virtual_address_map(
929939
efi_phys.set_virtual_address_map,
930-
memmap.desc_size * count,
931-
memmap.desc_size,
932-
memmap.desc_version,
940+
efi.memmap.desc_size * count,
941+
efi.memmap.desc_size,
942+
efi.memmap.desc_version,
933943
(efi_memory_desc_t *)__pa(new_memmap));
934944
}
935945

drivers/firmware/efi/arm-init.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020

2121
#include <asm/efi.h>
2222

23-
struct efi_memory_map memmap;
24-
2523
u64 efi_system_table;
2624

2725
static int __init is_normal_ram(efi_memory_desc_t *md)
@@ -40,7 +38,7 @@ static phys_addr_t efi_to_phys(unsigned long addr)
4038
{
4139
efi_memory_desc_t *md;
4240

43-
for_each_efi_memory_desc_in_map(&memmap, md) {
41+
for_each_efi_memory_desc(md) {
4442
if (!(md->attribute & EFI_MEMORY_RUNTIME))
4543
continue;
4644
if (md->virt_addr == 0)
@@ -145,7 +143,7 @@ static __init void reserve_regions(void)
145143
if (efi_enabled(EFI_DBG))
146144
pr_info("Processing EFI memory map:\n");
147145

148-
for_each_efi_memory_desc_in_map(&memmap, md) {
146+
for_each_efi_memory_desc(md) {
149147
paddr = md->phys_addr;
150148
npages = md->num_pages;
151149

@@ -186,25 +184,25 @@ void __init efi_init(void)
186184

187185
efi_system_table = params.system_table;
188186

189-
memmap.phys_map = params.mmap;
190-
memmap.map = early_memremap_ro(params.mmap, params.mmap_size);
191-
if (memmap.map == NULL) {
187+
efi.memmap.phys_map = params.mmap;
188+
efi.memmap.map = early_memremap_ro(params.mmap, params.mmap_size);
189+
if (efi.memmap.map == NULL) {
192190
/*
193191
* If we are booting via UEFI, the UEFI memory map is the only
194192
* description of memory we have, so there is little point in
195193
* proceeding if we cannot access it.
196194
*/
197195
panic("Unable to map EFI memory map.\n");
198196
}
199-
memmap.map_end = memmap.map + params.mmap_size;
200-
memmap.desc_size = params.desc_size;
201-
memmap.desc_version = params.desc_ver;
197+
efi.memmap.map_end = efi.memmap.map + params.mmap_size;
198+
efi.memmap.desc_size = params.desc_size;
199+
efi.memmap.desc_version = params.desc_ver;
202200

203201
if (uefi_init() < 0)
204202
return;
205203

206204
reserve_regions();
207-
early_memunmap(memmap.map, params.mmap_size);
205+
early_memunmap(efi.memmap.map, params.mmap_size);
208206

209207
if (IS_ENABLED(CONFIG_ARM)) {
210208
/*

drivers/firmware/efi/arm-runtime.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ static int __init arm_enable_runtime_services(void)
103103

104104
pr_info("Remapping and enabling EFI services.\n");
105105

106-
mapsize = memmap.map_end - memmap.map;
107-
memmap.map = (__force void *)ioremap_cache(memmap.phys_map,
108-
mapsize);
109-
if (!memmap.map) {
106+
mapsize = efi.memmap.map_end - efi.memmap.map;
107+
108+
efi.memmap.map = (__force void *)ioremap_cache(efi.memmap.phys_map,
109+
mapsize);
110+
if (!efi.memmap.map) {
110111
pr_err("Failed to remap EFI memory map\n");
111112
return -ENOMEM;
112113
}
113-
memmap.map_end = memmap.map + mapsize;
114-
efi.memmap = &memmap;
114+
efi.memmap.map_end = efi.memmap.map + mapsize;
115115

116116
if (!efi_virtmap_init()) {
117117
pr_err("UEFI virtual mapping missing or invalid -- runtime services will not be available\n");

drivers/firmware/efi/efi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ subsys_initcall(efisubsys_init);
256256
*/
257257
int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md)
258258
{
259-
struct efi_memory_map *map = efi.memmap;
259+
struct efi_memory_map *map = &efi.memmap;
260260
phys_addr_t p, e;
261261

262262
if (!efi_enabled(EFI_MEMMAP)) {

drivers/firmware/efi/fake_mem.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static int __init cmp_fake_mem(const void *x1, const void *x2)
5757
void __init efi_fake_memmap(void)
5858
{
5959
u64 start, end, m_start, m_end, m_attr;
60-
int new_nr_map = memmap.nr_map;
60+
int new_nr_map = efi.memmap.nr_map;
6161
efi_memory_desc_t *md;
6262
phys_addr_t new_memmap_phy;
6363
void *new_memmap;
@@ -94,25 +94,25 @@ void __init efi_fake_memmap(void)
9494
}
9595

9696
/* allocate memory for new EFI memmap */
97-
new_memmap_phy = memblock_alloc(memmap.desc_size * new_nr_map,
97+
new_memmap_phy = memblock_alloc(efi.memmap.desc_size * new_nr_map,
9898
PAGE_SIZE);
9999
if (!new_memmap_phy)
100100
return;
101101

102102
/* create new EFI memmap */
103103
new_memmap = early_memremap(new_memmap_phy,
104-
memmap.desc_size * new_nr_map);
104+
efi.memmap.desc_size * new_nr_map);
105105
if (!new_memmap) {
106-
memblock_free(new_memmap_phy, memmap.desc_size * new_nr_map);
106+
memblock_free(new_memmap_phy, efi.memmap.desc_size * new_nr_map);
107107
return;
108108
}
109109

110-
for (old = memmap.map, new = new_memmap;
111-
old < memmap.map_end;
112-
old += memmap.desc_size, new += memmap.desc_size) {
110+
for (old = efi.memmap.map, new = new_memmap;
111+
old < efi.memmap.map_end;
112+
old += efi.memmap.desc_size, new += efi.memmap.desc_size) {
113113

114114
/* copy original EFI memory descriptor */
115-
memcpy(new, old, memmap.desc_size);
115+
memcpy(new, old, efi.memmap.desc_size);
116116
md = new;
117117
start = md->phys_addr;
118118
end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1;
@@ -133,8 +133,8 @@ void __init efi_fake_memmap(void)
133133
md->num_pages = (m_end - md->phys_addr + 1) >>
134134
EFI_PAGE_SHIFT;
135135
/* latter part */
136-
new += memmap.desc_size;
137-
memcpy(new, old, memmap.desc_size);
136+
new += efi.memmap.desc_size;
137+
memcpy(new, old, efi.memmap.desc_size);
138138
md = new;
139139
md->phys_addr = m_end + 1;
140140
md->num_pages = (end - md->phys_addr + 1) >>
@@ -146,16 +146,16 @@ void __init efi_fake_memmap(void)
146146
md->num_pages = (m_start - md->phys_addr) >>
147147
EFI_PAGE_SHIFT;
148148
/* middle part */
149-
new += memmap.desc_size;
150-
memcpy(new, old, memmap.desc_size);
149+
new += efi.memmap.desc_size;
150+
memcpy(new, old, efi.memmap.desc_size);
151151
md = new;
152152
md->attribute |= m_attr;
153153
md->phys_addr = m_start;
154154
md->num_pages = (m_end - m_start + 1) >>
155155
EFI_PAGE_SHIFT;
156156
/* last part */
157-
new += memmap.desc_size;
158-
memcpy(new, old, memmap.desc_size);
157+
new += efi.memmap.desc_size;
158+
memcpy(new, old, efi.memmap.desc_size);
159159
md = new;
160160
md->phys_addr = m_end + 1;
161161
md->num_pages = (end - m_end) >>
@@ -168,8 +168,8 @@ void __init efi_fake_memmap(void)
168168
md->num_pages = (m_start - md->phys_addr) >>
169169
EFI_PAGE_SHIFT;
170170
/* latter part */
171-
new += memmap.desc_size;
172-
memcpy(new, old, memmap.desc_size);
171+
new += efi.memmap.desc_size;
172+
memcpy(new, old, efi.memmap.desc_size);
173173
md = new;
174174
md->phys_addr = m_start;
175175
md->num_pages = (end - md->phys_addr + 1) >>
@@ -181,10 +181,10 @@ void __init efi_fake_memmap(void)
181181

182182
/* swap into new EFI memmap */
183183
efi_unmap_memmap();
184-
memmap.map = new_memmap;
185-
memmap.phys_map = new_memmap_phy;
186-
memmap.nr_map = new_nr_map;
187-
memmap.map_end = memmap.map + memmap.nr_map * memmap.desc_size;
184+
efi.memmap.map = new_memmap;
185+
efi.memmap.phys_map = new_memmap_phy;
186+
efi.memmap.nr_map = new_nr_map;
187+
efi.memmap.map_end = efi.memmap.map + efi.memmap.nr_map * efi.memmap.desc_size;
188188
set_bit(EFI_MEMMAP, &efi.flags);
189189

190190
/* print new EFI memmap */

0 commit comments

Comments
 (0)