On 2015/7/17 18:50, Jan Beulich wrote:
On 17.07.15 at 11:09, <tiejun.c...@intel.com> wrote:
And then of course there's the question of whether "nr" is really
the right upper loop bound here: Just prior to this you added
the hypervisor supplied entries - why would you need to iterate
over them here? I.e. I'd see this better be moved ahead of that
other code.
Sounds you mean I should sync low/high memory in memory_map.map[]
beforehand and then fulfill e820 like this,
Why would you want/need to sync into memory_map.map[]?
But actually I just felt this make our process clear.
That's certainly not what I suggested.
Do you mean I should check low/high mem before we add the hypervisor
supplied entries like this?
+ for ( i = nr-1; i > memory_map.nr_map; i-- )
+ {
+ uint64_t end = e820[i].addr + e820[i].size;
+
+ if ( e820[i].type == E820_RAM &&
+ low_mem_end > e820[i].addr && low_mem_end < end )
+ {
+ add_high_mem = end - low_mem_end;
+ e820[i].size = low_mem_end - e820[i].addr;
+ break;
+ }
+ }
+
+ /* And then we also need to adjust highmem. */
+ if ( add_high_mem )
+ {
+ /* Modify the existing highmem region if it exists. */
+ for ( i = nr-1 ; i > memory_map.nr_map; i-- )
+ {
+ if ( e820[i].type == E820_RAM &&
+ e820[i].addr == ((uint64_t)1 << 32))
+ {
+ e820[i].size += add_high_mem;
+ break;
+ }
+ }
+
+ /* If there was no highmem region, just create one. */
+ if ( i == memory_map.nr_map )
+ {
+ e820[nr].addr = ((uint64_t)1 << 32);
+ e820[nr].size = add_high_mem;
+ e820[nr].type = E820_RAM;
+ i = nr;
+ nr++;
+ }
+
+ /* A sanity check if high memory is broken. */
+ BUG_ON( high_mem_end != e820[i].addr + e820[i].size);
+ }
Thanks
Tiejun
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel