On 06/09/16 14:18, Xuguo Wang wrote:
> Refactoring the algorithm to the generate the .pio_bitmap using
> the ioports entries and new parameters for the
> root-cell-config.c-tmpl.
>
> Signed-off-by: Xuguo Wang <[email protected]>
> ---
> tools/jailhouse-config-create | 308
> ++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 299 insertions(+), 9 deletions(-)
>
> diff --git a/tools/jailhouse-config-create b/tools/jailhouse-config-create
> index 727c87f..745b271 100755
> --- a/tools/jailhouse-config-create
> +++ b/tools/jailhouse-config-create
> @@ -1133,15 +1133,302 @@ def parse_ivrs(pcidevices, ioapics):
> return units, regions
>
>
> +# parse the /proc/ioports
# parse /proc/ioports
> def parse_ioports():
> pm_timer_base = None
> - f = input_open('/proc/ioports')
> - for line in f:
> - if line.endswith('ACPI PM_TMR\n'):
> - pm_timer_base = int(line.split('-')[0], 16)
> - break
> - f.close()
> - return pm_timer_base
> + bitmap_regions = []
> + regions = IOPortRegionTree.parse_ioport_tree(
> + IOPortRegionTree.parse_ioport_file())
> +
> + for region in regions:
> + # parse the ACPI PM_TMR
> + if region.typestr == 'ACPI PM_TMR':
> + pm_timer_base = region.start
> + continue
> +
> + # region PCI conf1 must intercept
> + if region.typestr == 'PCI conf1':
> + region.value = 0xff
> + if region.size() > 8:
> + region.value = -1
> + bitmap_regions.append(region)
> + continue
> +
> + # region in bytes
> + byte_size = region.size()/8
> +
> + # head and tail are not aligned
> + if region.start % 8 != 0 and (region.stop % 8 + 1) % 8 != 0:
> + # direct to the decrease
> + round_up = (region.start % 8)
> + # direct to the increase
> + round_down = 7 - (region.stop % 8)
> +
> + # region has one byte or fewer
> + if byte_size <= 1:
> + value = IOPortRegionTree.get_first_ioport_byte(region.start,
> + region.stop)
> + region.start -= round_up
> + region.stop += round_down
> +
> + # overlap with the valuable region
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value
> + region.typestr += ',' + bitmap_regions[-1].typestr
Add a whitespace after the comma ', '
> + bitmap_regions.pop()
> + else:
> + region.value = value
> + bitmap_regions.append(region)
> +
> + # region has two bytes
> + elif byte_size <= 2:
> + value_head = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.start + (7 - round_up))
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.start -= round_up
> + region.stop += round_down
> +
> + # overlap with the valid region
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value_head
> + region.typestr += ',' + bitmap_regions[-1].typestr
Same here
> + bitmap_regions.pop()
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr, region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> + else:
> + region.value = value_head
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> +
> + # region is large the two bytes
# region is larger than two bytes
> + else:
> + value_head = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.start + (7 - round_up))
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.start -= round_up
> + region.stop += round_down
> +
> + # overlay with the valid region
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value_head
> + region.typestr += ',' + bitmap_regions[-1].typestr
Whitespace after comma
> + bitmap_regions.pop()
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> + else:
> + region.value = value_head
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.start + (7 - round_up) + 1,
> + region.stop - (region.stop % 8) -
> 1,
> + region.typestr,
> + 0))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> +
> + # head not aligned but tail aligned
> + elif region.start % 8 != 0 \
> + and (region.stop % 8 + 1) % 8 == 0:
> + round_up = (region.start % 8)
> +
> + # region has one byte
> + if byte_size <= 1:
> + value = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.stop)
> + region.start -= round_up
> +
> + # overlap the valid region
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value
> + region.typestr += ',' + bitmap_regions[-1].typestr
missing a whitespace
> + bitmap_regions.pop()
> + else:
> + region.value = value
> +
> + bitmap_regions.append(region)
> +
> + # region has two bytes
> + elif byte_size <= 2:
> + value_head = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.start + (7 - round_up))
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.start -= round_up
> +
> + # overlay the valid region
overlay != overlap...
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value_head
> + region.typestr += ',' + bitmap_regions[-1].typestr
Whitespace
> + bitmap_regions.pop()
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> + else:
> + region.value = value_head
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> +
> + # region has more than two bytes
> + else:
> + value_head = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.start + (7 - round_up))
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.start -= round_up
> +
> + # overlap with valid region
> + if region.start - round_up < bitmap_regions[-1].stop:
> + region.value = bitmap_regions[-1].value & value_head
> + region.typestr += ',' + bitmap_regions[-1].typestr
Now that I see it:
I can find these three lines of code six times in this patch. Isn't
there a chance to consolidate?
It's always the same repeating snippet:
if region.start - round_up < bitmap_regions[-1].stop:
region.value = bitmap_regions[-1].value & value
region.typestr += ',' + bitmap_regions[-1].typestr
bitmap_regions.pop()
...
> + bitmap_regions.pop()
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + region.value))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> + else:
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + (7 - round_up),
> + region.typestr,
> + value_head))
> + bitmap_regions.append(IOPortRegion(
> + region.start + (7 - round_up) +
> 1,
> + region.stop,
> + region.typestr,
> + 0))
> +
> + # head aligned but not tail
> + elif region.start % 8 == 0 \
> + and (region.stop % 8 + 1) % 8 != 0:
> + round_down = 7 - (region.stop % 8)
> +
> + # region has only one byte
> + if byte_size <= 1:
> + value = IOPortRegionTree.get_first_ioport_byte(
> + region.start, region.stop)
> + region.stop += round_down
> + region.value = value
> + bitmap_regions.append(region)
> +
> + # region has two bytes
> + elif byte_size <= 2:
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.stop += round_down
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.start + 7,
> + region.typestr,
> + 0))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> +
> + # region has more then two bytes
> + else:
> + value_tail = IOPortRegionTree.get_first_ioport_byte(
> + region.stop - (region.stop % 8), region.stop)
> + region.stop += round_down
> + bitmap_regions.append(IOPortRegion(
> + region.start,
> + region.stop - (region.stop % 8) - 1,
> + region.typestr,
> + 0))
> + bitmap_regions.append(IOPortRegion(
> + region.stop - (region.stop % 8),
> + region.stop,
> + region.typestr,
> + value_tail))
> +
> + # head and tail are all aligned
> + else:
> + region.value = 0
> + bitmap_regions.append(region)
> +
> + # replenishment the region
> + for region in bitmap_regions:
> + i = bitmap_regions.index(region)
> + if region.start != 0 \
> + and region.stop != 0xffff \
> + and region != bitmap_regions[-1]:
> + if region.stop + 1 != bitmap_regions[i + 1].start:
> + size = bitmap_regions[i + 1].start - region.stop - 1
> + value = 0xff
> + if size > 8:
> + value = -1
> + bitmap_regions.insert(i + 1,
> + IOPortRegion(
> + region.stop + 1,
> + bitmap_regions[i + 1].start - 1,
> + '',
> + value))
> +
> + # if the last address is not 0xffff
> + # padding the last address
Amend to sth like 'pad with 0xff, if the last address is not 0xffff'
> + if bitmap_regions[-1].stop != 0xffff:
> + start = bitmap_regions[-1].stop + 1
> + stop = 0xffff
> + value = 0xff
> + if stop - start - 1 > 8:
> + value = -1
> + bitmap_regions.append(IOPortRegion(start, stop, '', value))
> +
> + return pm_timer_base, bitmap_regions
>
>
> class MMConfig:
> @@ -1251,7 +1538,8 @@ regions.append(inmatereg)
>
> cpucount = count_cpus()
>
> -pm_timer_base = parse_ioports()
> +(pm_timer_base, pm_bitmap_regions) = parse_ioports()
> +pm_bitmap_size = int(pm_bitmap_regions[-1].stop/8 + 1)
>
>
> f = open(options.file, 'w')
> @@ -1269,7 +1557,9 @@ kwargs = {
> 'irqchips': ioapics,
> 'pm_timer_base': pm_timer_base,
> 'mmconfig': mmconfig,
> - 'iommu_units': iommu_units
> + 'iommu_units': iommu_units,
> + 'pm_bitmap_size': pm_bitmap_size,
> + 'pm_bitmap_regions': pm_bitmap_regions
> }
>
> f.write(tmpl.render(**kwargs))
>
Ralf
--
Ralf Ramsauer
PGP: 0x8F10049B
--
You received this message because you are subscribed to the Google Groups
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.