mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-04 11:07:51 +00:00
dm: remove set vm memory by cma
Signed-off-by: Li, Fei1 <fei1.li@intel.com> Acked-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
parent
652e37e908
commit
6f097b1633
@ -829,7 +829,7 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
vm_set_memflags(ctx, memflags);
|
vm_set_memflags(ctx, memflags);
|
||||||
err = vm_setup_memory(ctx, memsize, VM_MMAP_ALL);
|
err = vm_setup_memory(ctx, memsize);
|
||||||
if (err) {
|
if (err) {
|
||||||
fprintf(stderr, "Unable to setup memory (%d)\n", errno);
|
fprintf(stderr, "Unable to setup memory (%d)\n", errno);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -318,59 +318,9 @@ vm_map_memseg_vma(struct vmctx *ctx, size_t len, vm_paddr_t gpa,
|
|||||||
return ioctl(ctx->fd, IC_SET_MEMSEG, &memmap);
|
return ioctl(ctx->fd, IC_SET_MEMSEG, &memmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
vm_alloc_set_memseg(struct vmctx *ctx, int segid, size_t len,
|
|
||||||
vm_paddr_t gpa, int prot, char *base, char **ptr)
|
|
||||||
{
|
|
||||||
struct vm_memseg memseg;
|
|
||||||
struct vm_memmap memmap;
|
|
||||||
int error, flags;
|
|
||||||
|
|
||||||
if (segid == VM_MEMMAP_SYSMEM) {
|
|
||||||
bzero(&memseg, sizeof(struct vm_memseg));
|
|
||||||
memseg.len = len;
|
|
||||||
memseg.gpa = gpa;
|
|
||||||
error = ioctl(ctx->fd, IC_ALLOC_MEMSEG, &memseg);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
bzero(&memmap, sizeof(struct vm_memmap));
|
|
||||||
memmap.type = segid;
|
|
||||||
memmap.len = len;
|
|
||||||
memmap.gpa = gpa;
|
|
||||||
memmap.prot = PROT_ALL;
|
|
||||||
error = ioctl(ctx->fd, IC_SET_MEMSEG, &memmap);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
flags = MAP_SHARED | MAP_FIXED;
|
|
||||||
if ((ctx->memflags & VM_MEM_F_INCORE) == 0)
|
|
||||||
flags |= MAP_NOCORE;
|
|
||||||
|
|
||||||
/* mmap into the process address space on the host */
|
|
||||||
*ptr = mmap(base + gpa, len, PROT_RW, flags, ctx->fd, gpa);
|
|
||||||
if (*ptr == MAP_FAILED) {
|
|
||||||
*ptr = NULL;
|
|
||||||
error = -1;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
/* XXX: no VM_BOOTROM/VM_FRAMEBUFFER support*/
|
|
||||||
error = -1;
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
vm_setup_memory(struct vmctx *ctx, size_t memsize, enum vm_mmap_style vms)
|
vm_setup_memory(struct vmctx *ctx, size_t memsize)
|
||||||
{
|
{
|
||||||
size_t objsize, len;
|
|
||||||
vm_paddr_t gpa;
|
|
||||||
int prot;
|
|
||||||
char *baseaddr, *ptr;
|
|
||||||
int error, flags;
|
|
||||||
|
|
||||||
assert(vms == VM_MMAP_ALL);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If 'memsize' cannot fit entirely in the 'lowmem' segment then
|
* If 'memsize' cannot fit entirely in the 'lowmem' segment then
|
||||||
* create another 'highmem' segment above 4GB for the remainder.
|
* create another 'highmem' segment above 4GB for the remainder.
|
||||||
@ -378,66 +328,18 @@ vm_setup_memory(struct vmctx *ctx, size_t memsize, enum vm_mmap_style vms)
|
|||||||
if (memsize > ctx->lowmem_limit) {
|
if (memsize > ctx->lowmem_limit) {
|
||||||
ctx->lowmem = ctx->lowmem_limit;
|
ctx->lowmem = ctx->lowmem_limit;
|
||||||
ctx->highmem = memsize - ctx->lowmem_limit;
|
ctx->highmem = memsize - ctx->lowmem_limit;
|
||||||
objsize = 4*GB + ctx->highmem;
|
|
||||||
} else {
|
} else {
|
||||||
ctx->lowmem = memsize;
|
ctx->lowmem = memsize;
|
||||||
ctx->highmem = 0;
|
ctx->highmem = 0;
|
||||||
objsize = ctx->lowmem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return hugetlb_setup_memory(ctx);
|
return hugetlb_setup_memory(ctx);
|
||||||
|
|
||||||
/*
|
|
||||||
* Stake out a contiguous region covering the guest physical memory
|
|
||||||
* and the adjoining guard regions.
|
|
||||||
*/
|
|
||||||
len = VM_MMAP_GUARD_SIZE + objsize + VM_MMAP_GUARD_SIZE;
|
|
||||||
flags = MAP_PRIVATE | MAP_ANON | MAP_NOCORE | MAP_ALIGNED_SUPER;
|
|
||||||
ptr = mmap(NULL, len, PROT_NONE, flags, -1, 0);
|
|
||||||
if (ptr == MAP_FAILED)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
baseaddr = ptr + VM_MMAP_GUARD_SIZE;
|
|
||||||
|
|
||||||
/* TODO: need add error handling */
|
|
||||||
/* alloc & map for lowmem */
|
|
||||||
if (ctx->lowmem > 0) {
|
|
||||||
gpa = 0;
|
|
||||||
len = ctx->lowmem;
|
|
||||||
prot = PROT_ALL;
|
|
||||||
error = vm_alloc_set_memseg(ctx, VM_MEMMAP_SYSMEM, len, gpa,
|
|
||||||
prot, baseaddr, &ctx->mmap_lowmem);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* alloc & map for highmem */
|
|
||||||
if (ctx->highmem > 0) {
|
|
||||||
gpa = 4*GB;
|
|
||||||
len = ctx->highmem;
|
|
||||||
prot = PROT_ALL;
|
|
||||||
error = vm_alloc_set_memseg(ctx, VM_MEMMAP_SYSMEM, len, gpa,
|
|
||||||
prot, baseaddr, &ctx->mmap_highmem);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->baseaddr = baseaddr;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vm_unsetup_memory(struct vmctx *ctx)
|
vm_unsetup_memory(struct vmctx *ctx)
|
||||||
{
|
{
|
||||||
hugetlb_unsetup_memory(ctx);
|
hugetlb_unsetup_memory(ctx);
|
||||||
return;
|
|
||||||
|
|
||||||
if (ctx->lowmem > 0)
|
|
||||||
munmap(ctx->mmap_lowmem, ctx->lowmem);
|
|
||||||
|
|
||||||
if (ctx->highmem > 0)
|
|
||||||
munmap(ctx->mmap_highmem, ctx->highmem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
|
|
||||||
/* Guest memory management */
|
/* Guest memory management */
|
||||||
#define IC_ID_MEM_BASE 0x40UL
|
#define IC_ID_MEM_BASE 0x40UL
|
||||||
|
/* IC_ALLOC_MEMSEG not used */
|
||||||
#define IC_ALLOC_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x00)
|
#define IC_ALLOC_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x00)
|
||||||
#define IC_SET_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x01)
|
#define IC_SET_MEMSEG _IC_ID(IC_ID, IC_ID_MEM_BASE + 0x01)
|
||||||
|
|
||||||
@ -105,17 +106,6 @@
|
|||||||
#define IC_ID_PM_BASE 0x60UL
|
#define IC_ID_PM_BASE 0x60UL
|
||||||
#define IC_PM_GET_CPU_STATE _IC_ID(IC_ID, IC_ID_PM_BASE + 0x00)
|
#define IC_PM_GET_CPU_STATE _IC_ID(IC_ID, IC_ID_PM_BASE + 0x00)
|
||||||
|
|
||||||
/**
|
|
||||||
* struct vm_memseg - memory segment info for guest
|
|
||||||
*
|
|
||||||
* @len: length of memory segment
|
|
||||||
* @gpa: guest physical start address of memory segment
|
|
||||||
*/
|
|
||||||
struct vm_memseg {
|
|
||||||
uint64_t len;
|
|
||||||
uint64_t gpa;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define VM_MEMMAP_SYSMEM 0
|
#define VM_MEMMAP_SYSMEM 0
|
||||||
#define VM_MMIO 1
|
#define VM_MMIO 1
|
||||||
|
|
||||||
|
@ -53,8 +53,6 @@ struct vmctx {
|
|||||||
int memflags;
|
int memflags;
|
||||||
size_t lowmem;
|
size_t lowmem;
|
||||||
size_t highmem;
|
size_t highmem;
|
||||||
char *mmap_lowmem;
|
|
||||||
char *mmap_highmem;
|
|
||||||
char *baseaddr;
|
char *baseaddr;
|
||||||
char *name;
|
char *name;
|
||||||
uuid_t vm_uuid;
|
uuid_t vm_uuid;
|
||||||
@ -65,16 +63,6 @@ struct vmctx {
|
|||||||
void *ioc_dev;
|
void *ioc_dev;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Different styles of mapping the memory assigned to a VM into the address
|
|
||||||
* space of the controlling process.
|
|
||||||
*/
|
|
||||||
enum vm_mmap_style {
|
|
||||||
VM_MMAP_NONE, /* no mapping */
|
|
||||||
VM_MMAP_ALL, /* fully and statically mapped */
|
|
||||||
VM_MMAP_SPARSE, /* mappings created on-demand */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 'flags' value passed to 'vm_set_memflags()'.
|
* 'flags' value passed to 'vm_set_memflags()'.
|
||||||
*/
|
*/
|
||||||
@ -122,7 +110,7 @@ void vm_destroy(struct vmctx *ctx);
|
|||||||
int vm_parse_memsize(const char *optarg, size_t *memsize);
|
int vm_parse_memsize(const char *optarg, size_t *memsize);
|
||||||
int vm_map_memseg_vma(struct vmctx *ctx, size_t len, vm_paddr_t gpa,
|
int vm_map_memseg_vma(struct vmctx *ctx, size_t len, vm_paddr_t gpa,
|
||||||
uint64_t vma, int prot);
|
uint64_t vma, int prot);
|
||||||
int vm_setup_memory(struct vmctx *ctx, size_t len, enum vm_mmap_style s);
|
int vm_setup_memory(struct vmctx *ctx, size_t len);
|
||||||
void vm_unsetup_memory(struct vmctx *ctx);
|
void vm_unsetup_memory(struct vmctx *ctx);
|
||||||
bool check_hugetlb_support(void);
|
bool check_hugetlb_support(void);
|
||||||
int hugetlb_setup_memory(struct vmctx *ctx);
|
int hugetlb_setup_memory(struct vmctx *ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user