On Thu, Oct 28, 2010 at 07:56:41AM +0200, Michael S. Tsirkin wrote:
diff --git a/src/util.h b/src/util.h index 5cc9f17..17eedd0 100644 --- a/src/util.h +++ b/src/util.h @@ -344,6 +344,34 @@ void qemu_prep_reset(void); void smm_save_and_copy(void); void smm_relocate_and_restore(void);
+// pci_region.c +// region allocator. pci region allocates the requested region +// sequentially with overflow check. +struct pci_region {
- // The region is [start, region).
[start end)?
Yes. Will fix.
- u32 start;
- u32 end;
- // The next allocation is start from this.
- // i.e. [start, cur_end) is allocated.
- // Right after initialization cur_end == start.
- u32 cur_end;
What is the value for a region at 0xfffff000 and size 0x1000?
Maybe first, last is better to detect this?
You mean [first, last] instead of [start, end). Maybe Makes sense. Anyway the area right below 4G can't be used for PCI because it's used for LAPIC and so on.
+}; +// initialize the pci_region of [start, end) +void pci_region_init(struct pci_region *r, u32 start, u32 end); +// allocate the region of size +u32 pci_region_alloc(struct pci_region *r, u32 size); +// make the next allocation aligned to align +u32 pci_region_align(struct pci_region *r, u32 align); +// revert the allocation to addr. +void pci_region_revert(struct pci_region *r, u32 addr); +// make the allocation fail. +u32 pci_region_disable(struct pci_region *r); +// returns the current allocation point. +u32 pci_region_addr(const struct pci_region *r); +// returns the region size. +u32 pci_region_size(const struct pci_region *r);
// pciinit.c extern const u8 pci_irqs[4]; void pci_bios_allocate_regions(u16 bdf, void *arg); -- 1.7.1.1