|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v7][RFC][PATCH 05/13] hvmloader/mmio: reconcile guest mmio with reserved device memory
On 2014/10/24 22:42, Jan Beulich wrote: On 24.10.14 at 09:34, <tiejun.chen@xxxxxxxxx> wrote:--- a/tools/firmware/hvmloader/pci.c +++ b/tools/firmware/hvmloader/pci.c @@ -37,6 +37,44 @@ uint64_t pci_hi_mem_start = 0, pci_hi_mem_end = 0; enum virtual_vga virtual_vga = VGA_none; unsigned long igd_opregion_pgbase = 0; +unsigned int need_skip_rmrr = 0;Static (and without initializer)? static unsigned int need_skip_rmrr; + +/* + * Check whether there exists mmio hole in the specified memory range. + * Returns 1 if exists, else returns 0. + */ +static int check_mmio_hole_confliction(uint64_t start, uint64_t memsize,I don't think the word "confliction" exists. "conflict" please. s/check_mmio_hole_confliction/check_mmio_hole_conflict/g
static int check_mmio_hole_conflict(uint64_t start, uint64_t memsize,uint64_t mmio_start, uint64_t mmio_size)
{
if ( start + memsize <= mmio_start || start >= mmio_start + mmio_size )
return 0;
return 1;
}
uint32_t i;
uint64_t rdm_start, rdm_end;
int nr_rdm_entries = hvm_get_reserved_device_memory_map();
I tried to go back looking into something but just found you were saying I shouldn't use PAGE_SHIFT and PAGE_SIZE at the same time. If I'm still missing could you show me what you expect? + if ( check_mmio_hole_confliction(rdm_start, (rdm_end - rdm_start),Pointless parentheses.
if ( check_mmio_hole_conflict(rdm_start, rdm_end - rdm_start,
int nr_rdm_entries; surely wants to be "unsigned int". Also I guess the variable name nr_rdm_entries should be literally unsigned int but this value always be set from hvm_get_reserved_device_memory_map(), nr_rdm_entries = hvm_get_reserved_device_memory_map() I hope that return value can be negative value in some failed case is too generic - nr_rdm_entries perhaps? Okay, s/nr_entries/nr_rdm_entries/g
Looks I should insert these code fragments between bar_data_upper = (uint32_t)(base >> 32); and base += bar_sz; So (See below)
Here move 'reallocate_mmio' downward one line, ands/resource->base = rdm_end;/base = (rdm_end + bar_sz - 1) & ~(uint64_t)(bar_sz - 1);
Then,
...
base = (resource->base + bar_sz - 1) & ~(uint64_t)(bar_sz - 1);
reallocate_mmio:
bar_data |= (uint32_t)base;
bar_data_upper = (uint32_t)(base >> 32);
if ( need_skip_rmrr )
{
for ( j = 0; j < nr_rdm_entries; j++ )
{
rdm_start = rdm_map[j].start_pfn << PAGE_SHIFT;
rdm_end = rdm_start + (rdm_map[j].nr_pages << PAGE_SHIFT);
if ( check_mmio_hole_conflict(rdm_start, rdm_end -
rdm_start,
base, bar_sz) )
{
base = (rdm_end + bar_sz - 1) & ~(uint64_t)(bar_sz
- 1);
need_skip_rmrr--;
goto reallocate_mmio;
}
}
}
base += bar_sz;
Additionally, actually there are some original codes just following my
codes:
if ( need_skip_rmrr )
{
...
}
base += bar_sz;
if ( (base < resource->base) || (base > resource->max) )
{
printf("pci dev %02x:%x bar %02x size "PRIllx": no space for "
"resource!\n", devfn>>3, devfn&7, bar_reg,
PRIllx_arg(bar_sz));
continue;
}
This can guarantee we don't overwhelm the previous mmio range.
and bar_data_upper will likely end up being garbage. Did you actually _test_ this code? Actually in my real case those RMRR ranges are always below MMIO. Thanks Tiejun _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |