diff --git a/devicemodel/hw/mmio/core.c b/devicemodel/hw/mmio/core.c index b22cd7737..347a55ec0 100644 --- a/devicemodel/hw/mmio/core.c +++ b/devicemodel/hw/mmio/core.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "dm.h" #include "vmmapi.h" @@ -19,6 +20,7 @@ #include "inout.h" #include "mem.h" #include "log.h" +#include "mmio_dev.h" struct mmio_dev { @@ -44,6 +46,23 @@ SET_DECLARE(mmio_dev_ops_set, struct mmio_dev_ops); struct mmio_dev_ops pt_mmiodev; +static uint32_t mmio_dev_base = MMIO_DEV_BASE; + +int mmio_dev_alloc_gpa_resource32(uint32_t *addr, uint32_t size_in) +{ + uint32_t base, size; + + size = roundup2(size_in, PAGE_SIZE); + base = roundup2(mmio_dev_base, size); + if (base + size <= MMIO_DEV_LIMIT) { + *addr = base; + mmio_dev_base = base + size; + return 0; + } else { + return -1; + } +} + int parse_pt_acpidev(char *opt) { int err = -EINVAL; diff --git a/devicemodel/include/mmio_dev.h b/devicemodel/include/mmio_dev.h index d3307899c..7dda28fdf 100644 --- a/devicemodel/include/mmio_dev.h +++ b/devicemodel/include/mmio_dev.h @@ -14,4 +14,8 @@ int parse_pt_mmiodev(char *arg); int init_mmio_devs(struct vmctx *ctx); void deinit_mmio_devs(struct vmctx *ctx); +int mmio_dev_alloc_gpa_resource32(uint32_t *addr, uint32_t size_in); + +#define MMIO_DEV_BASE 0xF0000000U +#define MMIO_DEV_LIMIT 0xFE000000U #endif /* _MMIO_DEV_H_ */