This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / x86_64 / kernel / e820-xen.c
1 /* 
2  * Handle the memory map.
3  * The functions here do the job until bootmem takes over.
4  * $Id: e820.c,v 1.4 2002/09/19 19:25:32 ak Exp $
5  *
6  *  Getting sanitize_e820_map() in sync with i386 version by applying change:
7  *  -  Provisions for empty E820 memory regions (reported by certain BIOSes).
8  *     Alex Achenbach <xela@slit.de>, December 2002.
9  *  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
10  *
11  */
12 #include <linux/config.h>
13 #include <linux/kernel.h>
14 #include <linux/types.h>
15 #include <linux/init.h>
16 #include <linux/bootmem.h>
17 #include <linux/ioport.h>
18 #include <linux/string.h>
19 #include <linux/kexec.h>
20 #include <linux/module.h>
21
22 #include <asm/page.h>
23 #include <asm/e820.h>
24 #include <asm/proto.h>
25 #include <asm/bootsetup.h>
26 #include <asm/sections.h>
27 #include <xen/interface/memory.h>
28
29 /* 
30  * PFN of last memory page.
31  */
32 unsigned long end_pfn; 
33 EXPORT_SYMBOL(end_pfn);
34
35 /* 
36  * end_pfn only includes RAM, while end_pfn_map includes all e820 entries.
37  * The direct mapping extends to end_pfn_map, so that we can directly access
38  * apertures, ACPI and other tables without having to play with fixmaps.
39  */ 
40 unsigned long end_pfn_map; 
41
42 /* 
43  * Last pfn which the user wants to use.
44  */
45 unsigned long end_user_pfn = MAXMEM>>PAGE_SHIFT;  
46
47 extern struct resource code_resource, data_resource;
48
49 /* Check for some hardcoded bad areas that early boot is not allowed to touch */ 
50 static inline int bad_addr(unsigned long *addrp, unsigned long size)
51
52         unsigned long addr = *addrp, last = addr + size; 
53
54 #ifndef CONFIG_XEN
55         /* various gunk below that needed for SMP startup */
56         if (addr < 0x8000) { 
57                 *addrp = 0x8000;
58                 return 1; 
59         }
60
61         /* direct mapping tables of the kernel */
62         if (last >= table_start<<PAGE_SHIFT && addr < table_end<<PAGE_SHIFT) { 
63                 *addrp = table_end << PAGE_SHIFT; 
64                 return 1;
65         } 
66
67         /* initrd */ 
68 #ifdef CONFIG_BLK_DEV_INITRD
69         if (LOADER_TYPE && INITRD_START && last >= INITRD_START && 
70             addr < INITRD_START+INITRD_SIZE) { 
71                 *addrp = INITRD_START + INITRD_SIZE; 
72                 return 1;
73         } 
74 #endif
75         /* kernel code + 640k memory hole (later should not be needed, but 
76            be paranoid for now) */
77         if (last >= 640*1024 && addr < __pa_symbol(&_end)) { 
78                 *addrp = __pa_symbol(&_end);
79                 return 1;
80         }
81
82         if (last >= ebda_addr && addr < ebda_addr + ebda_size) {
83                 *addrp = ebda_addr + ebda_size;
84                 return 1;
85         }
86
87         /* XXX ramdisk image here? */ 
88 #else
89         if (last < (table_end<<PAGE_SHIFT)) {
90                 *addrp = table_end << PAGE_SHIFT;
91                 return 1;
92         }
93 #endif
94         return 0;
95
96
97 #ifndef CONFIG_XEN
98 /*
99  * This function checks if any part of the range <start,end> is mapped
100  * with type.
101  */
102 int __meminit
103 e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
104
105         int i;
106         for (i = 0; i < e820.nr_map; i++) { 
107                 struct e820entry *ei = &e820.map[i]; 
108                 if (type && ei->type != type) 
109                         continue;
110                 if (ei->addr >= end || ei->addr + ei->size <= start)
111                         continue; 
112                 return 1; 
113         } 
114         return 0;
115 }
116 #endif
117
118 /*
119  * This function checks if the entire range <start,end> is mapped with type.
120  *
121  * Note: this function only works correct if the e820 table is sorted and
122  * not-overlapping, which is the case
123  */
124 int __init e820_all_mapped(unsigned long start, unsigned long end, unsigned type)
125 {
126         int i;
127         for (i = 0; i < e820.nr_map; i++) {
128                 struct e820entry *ei = &e820.map[i];
129                 if (type && ei->type != type)
130                         continue;
131                 /* is the region (part) in overlap with the current region ?*/
132                 if (ei->addr >= end || ei->addr + ei->size <= start)
133                         continue;
134
135                 /* if the region is at the beginning of <start,end> we move
136                  * start to the end of the region since it's ok until there
137                  */
138                 if (ei->addr <= start)
139                         start = ei->addr + ei->size;
140                 /* if start is now at or beyond end, we're done, full coverage */
141                 if (start >= end)
142                         return 1; /* we're done */
143         }
144         return 0;
145 }
146
147 /* 
148  * Find a free area in a specific range. 
149  */ 
150 unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsigned size) 
151
152         int i; 
153         for (i = 0; i < e820.nr_map; i++) { 
154                 struct e820entry *ei = &e820.map[i]; 
155                 unsigned long addr = ei->addr, last; 
156                 if (ei->type != E820_RAM) 
157                         continue; 
158                 if (addr < start) 
159                         addr = start;
160                 if (addr > ei->addr + ei->size) 
161                         continue; 
162                 while (bad_addr(&addr, size) && addr+size < ei->addr + ei->size)
163                         ;
164                 last = addr + size;
165                 if (last > ei->addr + ei->size)
166                         continue;
167                 if (last > end) 
168                         continue;
169                 return addr; 
170         } 
171         return -1UL;            
172
173
174 /* 
175  * Free bootmem based on the e820 table for a node.
176  */
177 void __init e820_bootmem_free(pg_data_t *pgdat, unsigned long start,unsigned long end)
178 {
179         int i;
180         for (i = 0; i < e820.nr_map; i++) {
181                 struct e820entry *ei = &e820.map[i]; 
182                 unsigned long last, addr;
183
184                 if (ei->type != E820_RAM || 
185                     ei->addr+ei->size <= start || 
186                     ei->addr >= end)
187                         continue;
188
189                 addr = round_up(ei->addr, PAGE_SIZE);
190                 if (addr < start) 
191                         addr = start;
192
193                 last = round_down(ei->addr + ei->size, PAGE_SIZE); 
194                 if (last >= end)
195                         last = end; 
196
197                 if (last > addr && last-addr >= PAGE_SIZE)
198                         free_bootmem_node(pgdat, addr, last-addr);
199         }
200 }
201
202 /*
203  * Find the highest page frame number we have available
204  */
205 unsigned long __init e820_end_of_ram(void)
206 {
207         int i;
208         unsigned long end_pfn = 0;
209         
210         for (i = 0; i < e820.nr_map; i++) {
211                 struct e820entry *ei = &e820.map[i]; 
212                 unsigned long start, end;
213
214                 start = round_up(ei->addr, PAGE_SIZE); 
215                 end = round_down(ei->addr + ei->size, PAGE_SIZE); 
216                 if (start >= end)
217                         continue;
218                 if (ei->type == E820_RAM) { 
219                 if (end > end_pfn<<PAGE_SHIFT)
220                         end_pfn = end>>PAGE_SHIFT;
221                 } else { 
222                         if (end > end_pfn_map<<PAGE_SHIFT) 
223                                 end_pfn_map = end>>PAGE_SHIFT;
224                 } 
225         }
226
227         if (end_pfn > end_pfn_map) 
228                 end_pfn_map = end_pfn;
229         if (end_pfn_map > MAXMEM>>PAGE_SHIFT)
230                 end_pfn_map = MAXMEM>>PAGE_SHIFT;
231         if (end_pfn > end_user_pfn)
232                 end_pfn = end_user_pfn;
233         if (end_pfn > end_pfn_map) 
234                 end_pfn = end_pfn_map; 
235
236         return end_pfn; 
237 }
238
239 /* 
240  * Compute how much memory is missing in a range.
241  * Unlike the other functions in this file the arguments are in page numbers.
242  */
243 unsigned long __init
244 e820_hole_size(unsigned long start_pfn, unsigned long end_pfn)
245 {
246         unsigned long ram = 0;
247         unsigned long start = start_pfn << PAGE_SHIFT;
248         unsigned long end = end_pfn << PAGE_SHIFT;
249         int i;
250         for (i = 0; i < e820.nr_map; i++) {
251                 struct e820entry *ei = &e820.map[i];
252                 unsigned long last, addr;
253
254                 if (ei->type != E820_RAM ||
255                     ei->addr+ei->size <= start ||
256                     ei->addr >= end)
257                         continue;
258
259                 addr = round_up(ei->addr, PAGE_SIZE);
260                 if (addr < start)
261                         addr = start;
262
263                 last = round_down(ei->addr + ei->size, PAGE_SIZE);
264                 if (last >= end)
265                         last = end;
266
267                 if (last > addr)
268                         ram += last - addr;
269         }
270         return ((end - start) - ram) >> PAGE_SHIFT;
271 }
272
273 /*
274  * Mark e820 reserved areas as busy for the resource manager.
275  */
276 void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
277 {
278         int i;
279         for (i = 0; i < nr_map; i++) {
280                 struct resource *res;
281                 res = alloc_bootmem_low(sizeof(struct resource));
282                 switch (e820[i].type) {
283                 case E820_RAM:  res->name = "System RAM"; break;
284                 case E820_ACPI: res->name = "ACPI Tables"; break;
285                 case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
286                 default:        res->name = "reserved";
287                 }
288                 res->start = e820[i].addr;
289                 res->end = res->start + e820[i].size - 1;
290                 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
291                 request_resource(&iomem_resource, res);
292                 if (e820[i].type == E820_RAM) {
293                         /*
294                          *  We don't know which RAM region contains kernel data,
295                          *  so we try it repeatedly and let the resource manager
296                          *  test it.
297                          */
298                         request_resource(res, &code_resource);
299                         request_resource(res, &data_resource);
300 #ifdef CONFIG_KEXEC
301                         request_resource(res, &crashk_res);
302 #endif
303                 }
304         }
305 }
306
307 /* 
308  * Add a memory region to the kernel e820 map.
309  */ 
310 void __init add_memory_region(unsigned long start, unsigned long size, int type)
311 {
312         int x = e820.nr_map;
313
314         if (x == E820MAX) {
315                 printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
316                 return;
317         }
318
319         e820.map[x].addr = start;
320         e820.map[x].size = size;
321         e820.map[x].type = type;
322         e820.nr_map++;
323 }
324
325 void __init e820_print_map(char *who)
326 {
327         int i;
328
329         for (i = 0; i < e820.nr_map; i++) {
330                 printk(" %s: %016Lx - %016Lx ", who,
331                         (unsigned long long) e820.map[i].addr,
332                         (unsigned long long) (e820.map[i].addr + e820.map[i].size));
333                 switch (e820.map[i].type) {
334                 case E820_RAM:  printk("(usable)\n");
335                                 break;
336                 case E820_RESERVED:
337                                 printk("(reserved)\n");
338                                 break;
339                 case E820_ACPI:
340                                 printk("(ACPI data)\n");
341                                 break;
342                 case E820_NVS:
343                                 printk("(ACPI NVS)\n");
344                                 break;
345                 default:        printk("type %u\n", e820.map[i].type);
346                                 break;
347                 }
348         }
349 }
350
351 /*
352  * Sanitize the BIOS e820 map.
353  *
354  * Some e820 responses include overlapping entries.  The following 
355  * replaces the original e820 map with a new one, removing overlaps.
356  *
357  */
358 static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
359 {
360         struct change_member {
361                 struct e820entry *pbios; /* pointer to original bios entry */
362                 unsigned long long addr; /* address for this change point */
363         };
364         static struct change_member change_point_list[2*E820MAX] __initdata;
365         static struct change_member *change_point[2*E820MAX] __initdata;
366         static struct e820entry *overlap_list[E820MAX] __initdata;
367         static struct e820entry new_bios[E820MAX] __initdata;
368         struct change_member *change_tmp;
369         unsigned long current_type, last_type;
370         unsigned long long last_addr;
371         int chgidx, still_changing;
372         int overlap_entries;
373         int new_bios_entry;
374         int old_nr, new_nr, chg_nr;
375         int i;
376
377         /*
378                 Visually we're performing the following (1,2,3,4 = memory types)...
379
380                 Sample memory map (w/overlaps):
381                    ____22__________________
382                    ______________________4_
383                    ____1111________________
384                    _44_____________________
385                    11111111________________
386                    ____________________33__
387                    ___________44___________
388                    __________33333_________
389                    ______________22________
390                    ___________________2222_
391                    _________111111111______
392                    _____________________11_
393                    _________________4______
394
395                 Sanitized equivalent (no overlap):
396                    1_______________________
397                    _44_____________________
398                    ___1____________________
399                    ____22__________________
400                    ______11________________
401                    _________1______________
402                    __________3_____________
403                    ___________44___________
404                    _____________33_________
405                    _______________2________
406                    ________________1_______
407                    _________________4______
408                    ___________________2____
409                    ____________________33__
410                    ______________________4_
411         */
412
413         /* if there's only one memory region, don't bother */
414         if (*pnr_map < 2)
415                 return -1;
416
417         old_nr = *pnr_map;
418
419         /* bail out if we find any unreasonable addresses in bios map */
420         for (i=0; i<old_nr; i++)
421                 if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
422                         return -1;
423
424         /* create pointers for initial change-point information (for sorting) */
425         for (i=0; i < 2*old_nr; i++)
426                 change_point[i] = &change_point_list[i];
427
428         /* record all known change-points (starting and ending addresses),
429            omitting those that are for empty memory regions */
430         chgidx = 0;
431         for (i=0; i < old_nr; i++)      {
432                 if (biosmap[i].size != 0) {
433                         change_point[chgidx]->addr = biosmap[i].addr;
434                         change_point[chgidx++]->pbios = &biosmap[i];
435                         change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
436                         change_point[chgidx++]->pbios = &biosmap[i];
437                 }
438         }
439         chg_nr = chgidx;
440
441         /* sort change-point list by memory addresses (low -> high) */
442         still_changing = 1;
443         while (still_changing)  {
444                 still_changing = 0;
445                 for (i=1; i < chg_nr; i++)  {
446                         /* if <current_addr> > <last_addr>, swap */
447                         /* or, if current=<start_addr> & last=<end_addr>, swap */
448                         if ((change_point[i]->addr < change_point[i-1]->addr) ||
449                                 ((change_point[i]->addr == change_point[i-1]->addr) &&
450                                  (change_point[i]->addr == change_point[i]->pbios->addr) &&
451                                  (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
452                            )
453                         {
454                                 change_tmp = change_point[i];
455                                 change_point[i] = change_point[i-1];
456                                 change_point[i-1] = change_tmp;
457                                 still_changing=1;
458                         }
459                 }
460         }
461
462         /* create a new bios memory map, removing overlaps */
463         overlap_entries=0;       /* number of entries in the overlap table */
464         new_bios_entry=0;        /* index for creating new bios map entries */
465         last_type = 0;           /* start with undefined memory type */
466         last_addr = 0;           /* start with 0 as last starting address */
467         /* loop through change-points, determining affect on the new bios map */
468         for (chgidx=0; chgidx < chg_nr; chgidx++)
469         {
470                 /* keep track of all overlapping bios entries */
471                 if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
472                 {
473                         /* add map entry to overlap list (> 1 entry implies an overlap) */
474                         overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
475                 }
476                 else
477                 {
478                         /* remove entry from list (order independent, so swap with last) */
479                         for (i=0; i<overlap_entries; i++)
480                         {
481                                 if (overlap_list[i] == change_point[chgidx]->pbios)
482                                         overlap_list[i] = overlap_list[overlap_entries-1];
483                         }
484                         overlap_entries--;
485                 }
486                 /* if there are overlapping entries, decide which "type" to use */
487                 /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
488                 current_type = 0;
489                 for (i=0; i<overlap_entries; i++)
490                         if (overlap_list[i]->type > current_type)
491                                 current_type = overlap_list[i]->type;
492                 /* continue building up new bios map based on this information */
493                 if (current_type != last_type)  {
494                         if (last_type != 0)      {
495                                 new_bios[new_bios_entry].size =
496                                         change_point[chgidx]->addr - last_addr;
497                                 /* move forward only if the new size was non-zero */
498                                 if (new_bios[new_bios_entry].size != 0)
499                                         if (++new_bios_entry >= E820MAX)
500                                                 break;  /* no more space left for new bios entries */
501                         }
502                         if (current_type != 0)  {
503                                 new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
504                                 new_bios[new_bios_entry].type = current_type;
505                                 last_addr=change_point[chgidx]->addr;
506                         }
507                         last_type = current_type;
508                 }
509         }
510         new_nr = new_bios_entry;   /* retain count for new bios entries */
511
512         /* copy new bios mapping into original location */
513         memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
514         *pnr_map = new_nr;
515
516         return 0;
517 }
518
519 /*
520  * Copy the BIOS e820 map into a safe place.
521  *
522  * Sanity-check it while we're at it..
523  *
524  * If we're lucky and live on a modern system, the setup code
525  * will have given us a memory map that we can use to properly
526  * set up memory.  If we aren't, we'll fake a memory map.
527  *
528  * We check to see that the memory map contains at least 2 elements
529  * before we'll use it, because the detection code in setup.S may
530  * not be perfect and most every PC known to man has two memory
531  * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
532  * thinkpad 560x, for example, does not cooperate with the memory
533  * detection code.)
534  */
535 static int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
536 {
537 #ifndef CONFIG_XEN
538         /* Only one memory region (or negative)? Ignore it */
539         if (nr_map < 2)
540                 return -1;
541 #else
542         BUG_ON(nr_map < 1);
543 #endif
544
545         do {
546                 unsigned long start = biosmap->addr;
547                 unsigned long size = biosmap->size;
548                 unsigned long end = start + size;
549                 unsigned long type = biosmap->type;
550
551                 /* Overflow in 64 bits? Ignore the memory map. */
552                 if (start > end)
553                         return -1;
554
555 #ifndef CONFIG_XEN
556                 /*
557                  * Some BIOSes claim RAM in the 640k - 1M region.
558                  * Not right. Fix it up.
559                  * 
560                  * This should be removed on Hammer which is supposed to not
561                  * have non e820 covered ISA mappings there, but I had some strange
562                  * problems so it stays for now.  -AK
563                  */
564                 if (type == E820_RAM) {
565                         if (start < 0x100000ULL && end > 0xA0000ULL) {
566                                 if (start < 0xA0000ULL)
567                                         add_memory_region(start, 0xA0000ULL-start, type);
568                                 if (end <= 0x100000ULL)
569                                         continue;
570                                 start = 0x100000ULL;
571                                 size = end - start;
572                         }
573                 }
574 #endif
575
576                 add_memory_region(start, size, type);
577         } while (biosmap++,--nr_map);
578         return 0;
579 }
580
581 #ifndef CONFIG_XEN
582 void __init setup_memory_region(void)
583 {
584         char *who = "BIOS-e820";
585
586         /*
587          * Try to copy the BIOS-supplied E820-map.
588          *
589          * Otherwise fake a memory map; one section from 0k->640k,
590          * the next section from 1mb->appropriate_mem_k
591          */
592         sanitize_e820_map(E820_MAP, &E820_MAP_NR);
593         if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
594                 unsigned long mem_size;
595
596                 /* compare results from other methods and take the greater */
597                 if (ALT_MEM_K < EXT_MEM_K) {
598                         mem_size = EXT_MEM_K;
599                         who = "BIOS-88";
600                 } else {
601                         mem_size = ALT_MEM_K;
602                         who = "BIOS-e801";
603                 }
604
605                 e820.nr_map = 0;
606                 add_memory_region(0, LOWMEMSIZE(), E820_RAM);
607                 add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
608         }
609         printk(KERN_INFO "BIOS-provided physical RAM map:\n");
610         e820_print_map(who);
611 }
612
613 #else  /* CONFIG_XEN */
614
615 void __init setup_memory_region(void)
616 {
617         int rc;
618         struct xen_memory_map memmap;
619         /*
620          * This is rather large for a stack variable but this early in
621          * the boot process we know we have plenty slack space.
622          */
623         struct e820entry map[E820MAX];
624
625         memmap.nr_entries = E820MAX;
626         set_xen_guest_handle(memmap.buffer, map);
627
628         rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
629         if ( rc == -ENOSYS ) {
630                 memmap.nr_entries = 1;
631                 map[0].addr = 0ULL;
632                 map[0].size = xen_start_info->nr_pages << PAGE_SHIFT;
633                 /* 8MB slack (to balance backend allocations). */
634                 map[0].size += 8 << 20;
635                 map[0].type = E820_RAM;
636                 rc = 0;
637         }
638         BUG_ON(rc);
639
640         sanitize_e820_map(map, (char *)&memmap.nr_entries);
641
642         BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
643
644         printk(KERN_INFO "BIOS-provided physical RAM map:\n");
645         e820_print_map("Xen");
646 }
647 #endif
648
649 void __init parse_memopt(char *p, char **from) 
650
651         int i;
652         unsigned long current_end;
653         unsigned long end;
654
655         end_user_pfn = memparse(p, from);
656         end_user_pfn >>= PAGE_SHIFT;    
657
658         end = end_user_pfn<<PAGE_SHIFT;
659         i = e820.nr_map-1;
660         current_end = e820.map[i].addr + e820.map[i].size;
661
662         if (current_end < end) {
663                 /*
664                  * The e820 map ends before our requested size so
665                  * extend the final entry to the requested address.
666                  */
667                 if (e820.map[i].type == E820_RAM)
668                         e820.map[i].size = end - e820.map[i].addr;
669                 else
670                         add_memory_region(current_end, end - current_end, E820_RAM);
671         }
672
673
674 void __init parse_memmapopt(char *p, char **from)
675 {
676         unsigned long long start_at, mem_size;
677
678         mem_size = memparse(p, from);
679         p = *from;
680         if (*p == '@') {
681                 start_at = memparse(p+1, from);
682                 add_memory_region(start_at, mem_size, E820_RAM);
683         } else if (*p == '#') {
684                 start_at = memparse(p+1, from);
685                 add_memory_region(start_at, mem_size, E820_ACPI);
686         } else if (*p == '$') {
687                 start_at = memparse(p+1, from);
688                 add_memory_region(start_at, mem_size, E820_RESERVED);
689         } else {
690                 end_user_pfn = (mem_size >> PAGE_SHIFT);
691         }
692         p = *from;
693 }
694
695 unsigned long pci_mem_start = 0xaeedbabe;
696
697 /*
698  * Search for the biggest gap in the low 32 bits of the e820
699  * memory space.  We pass this space to PCI to assign MMIO resources
700  * for hotplug or unconfigured devices in.
701  * Hopefully the BIOS let enough space left.
702  */
703 __init void e820_setup_gap(struct e820entry *e820, int nr_map)
704 {
705         unsigned long gapstart, gapsize, round;
706         unsigned long last;
707         int i;
708         int found = 0;
709
710         last = 0x100000000ull;
711         gapstart = 0x10000000;
712         gapsize = 0x400000;
713         i = nr_map;
714         while (--i >= 0) {
715                 unsigned long long start = e820[i].addr;
716                 unsigned long long end = start + e820[i].size;
717
718                 /*
719                  * Since "last" is at most 4GB, we know we'll
720                  * fit in 32 bits if this condition is true
721                  */
722                 if (last > end) {
723                         unsigned long gap = last - end;
724
725                         if (gap > gapsize) {
726                                 gapsize = gap;
727                                 gapstart = end;
728                                 found = 1;
729                         }
730                 }
731                 if (start < last)
732                         last = start;
733         }
734
735         if (!found) {
736                 gapstart = (end_pfn << PAGE_SHIFT) + 1024*1024;
737                 printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit address range\n"
738                        KERN_ERR "PCI: Unassigned devices with 32bit resource registers may break!\n");
739         }
740
741         /*
742          * See how much we want to round up: start off with
743          * rounding to the next 1MB area.
744          */
745         round = 0x100000;
746         while ((gapsize >> 4) > round)
747                 round += round;
748         /* Fun with two's complement */
749         pci_mem_start = (gapstart + round) & -round;
750
751         printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
752                 pci_mem_start, gapstart, gapsize);
753 }