On 2022-12-12 16:36, Dave Voutila wrote:
Mischa <[email protected]> writes:
On 2022-12-12 16:02, Dave Voutila wrote:
Mischa <[email protected]> writes:
Hi Dave,
Great stuff!!
Everything is patched, build and booted.
What is the best way to test this?
Start guests as usual. I'd say the only thing definitively to
manually
check is that they see the same amount of physical memory as before
the
patch.
That is indeed different. Before the patch allocating 1G would be
displayed as 1G.
Now a 1G allocation is 1.3G, 2G is 2.3G, 8G is 8.3G, etc.
So I can reproduce, how are you measuring it?
All the VMs with 2.3G have 2G memory allocated.
root@current:~ # vmctl show
ID PID VCPUS MAXMEM CURMEM TTY OWNER STATE NAME
41 27026 1 2.3G 328M ttypl root running vm29
40 27031 1 2.3G 328M ttypk root running vm28
39 66653 1 2.3G 328M ttypj root running vm27
38 79530 1 2.3G 328M ttypi root running vm26
37 24110 1 2.3G 328M ttyph root running vm25
36 89659 1 2.3G 328M ttypg root running vm24
35 19193 1 2.3G 328M ttypf root running vm23
34 48946 1 2.3G 328M ttype root running vm22
33 32065 1 2.3G 328M ttypd root running vm21
32 61847 1 2.3G 328M ttypc root running vm20
31 42429 1 2.3G 328M ttypb root running vm19
30 50201 1 2.3G 328M ttypa root running vm18
29 18652 1 2.3G 328M ttyp9 root running vm17
28 23312 1 2.3G 328M ttyp8 root running vm16
27 21314 1 2.3G 328M ttyp7 root running vm15
26 79420 1 2.3G 328M ttyp6 root running vm14
25 23214 1 2.3G 328M ttyp5 root running vm13
24 22755 1 2.3G 328M ttyp4 root running vm12
23 7716 1 2.3G 328M ttyp3 root running vm11
22 2758 1 2.3G 328M ttyp2 root running vm10
1 - 1 30.0G - - runbsd stopped vm01
2 - 1 16.0G - - runbsd stopped vm02
3 - 1 8.0G - - runbsd stopped vm03
4 - 1 1.0G - - runbsd04 stopped vm04
5 - 1 1.0G - - runbsd stopped vm42
After starting vm0[1-4].
root@current:~ # vmctl show | grep vm0[1-4]
4 61002 1 1.3G 990M ttypq runbsd04 running vm04
3 60620 1 8.3G 1.4G ttypp runbsd running vm03
2 94240 1 16.3G 2.5G ttypo runbsd running vm02
1 32209 1 30.3G 4.6G ttypn runbsd running vm01
Booting one of the VMs with console:
root@current:~ # vmctl start -c vm04
Connected to /dev/ttypn (speed 115200)
Using drive 0, partition 3.
Loading......
probing: pc0 com0 mem[638K 1022M a20=on]
disk: hd0+
OpenBSD/amd64 BOOT 3.55
\
com0: 115200 baud
switching console to com0
OpenBSD/amd64 BOOT 3.55
boot>
booting hd0a:/bsd: 15615256+3765256+310448+0+1171456
[1138229+128+1224792+927979]=0x170ac00
entry point at 0xffffffff81001000
[ using 3292160 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights
reserved.
Copyright (c) 1995-2022 OpenBSD. All rights reserved.
https://www.OpenBSD.org
OpenBSD 7.2 (GENERIC) #0: Wed Oct 26 11:26:29 MDT 2022
[email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
real mem = 1056952320 (1007MB)
avail mem = 1007689728 (961MB)
Standard 7.2 vmd/vmm:
root@server18:~ # vmctl start -c vm40
Connected to /dev/ttyp7 (speed 115200)
Using drive 0, partition 3.
Loading......
probing: pc0 com0 mem[638K 1022M a20=on]
disk: hd0+
OpenBSD/amd64 BOOT 3.55
\
com0: 115200 baud
switching console to com0
OpenBSD/amd64 BOOT 3.55
boot>
booting hd0a:/bsd: 15615256+3769352+309808+0+1171456
[1143120+128+1224792+927979]=0x170cf18
entry point at 0xffffffff81001000
[ using 3297048 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights
reserved.
Copyright (c) 1995-2022 OpenBSD. All rights reserved.
https://www.OpenBSD.org
OpenBSD 7.2 (GENERIC) #2: Thu Nov 24 23:52:58 MST 2022
[email protected]:/usr/src/sys/arch/amd64/compile/GENERIC
real mem = 1056952320 (1007MB)
avail mem = 1007681536 (961MB)
root@server18:~ # vmctl show vm40
ID PID VCPUS MAXMEM CURMEM TTY OWNER STATE NAME
8 94043 1 1.0G 918M ttyp7 runbsd running vm40
Mischa
Start a bunch of VMs with bsd.rd? Does this still need to be a
decompressed bsd.rd?
Booting compressed bsd.rd's has been working for awhile now, so no
need
to decompress them, btw. If you boot a bsd.rd, it's exercising the
changes to loadfile_elf.c, which is important to test.
I missed that completely, good to know.
Starting/stopping a bunch of VMs with bsd.rd (only) at the moment.
Not sure if this is helpful, but got this in the logs:
Dec 12 16:21:47 current /bsd: vmm_handle_cpuid: function 0x06
(thermal/power mgt) not supported
Dec 12 16:21:47 current /bsd: vcpu_run_vmx: unimplemented exit type 32
(WRMSR instruction)
Ah, this is a different issue! Just noise for now, but I need to add
VMX_EXIT_WRMSR to the list of those we ignore on re-entry. (We're
tripping the default condition in a swtich statement checking on the
last exit type...a default that's only enabled with VMM_DEBUG.)
Dec 12 16:21:47 current /bsd: vcpu @ 0xffff800022e3a000 in long mode
Dec 12 16:21:47 current /bsd: CPL=0
Dec 12 16:21:47 current /bsd: rax=0x0000000000000081
rbx=0xffffffff818f8008 rcx=0x00000000000001a0
Dec 12 16:21:47 current /bsd: rdx=0x0000000000000000
rbp=0xffffffff81a06da0 rdi=0x00000000000001a0
Dec 12 16:21:47 current /bsd: rsi=0xffffffff81a06d88
r8=0x0000000000000028 r9=0x00000000a9144070
Dec 12 16:21:47 current /bsd: r10=0x0000000000000000
r11=0xffffffff81a06ce0 r12=0xffffffff81a06e28
Dec 12 16:21:47 current /bsd: r13=0xffffffff8147da20
r14=0xffffffff818f6ff0 r15=0x0000000000000006
Dec 12 16:21:47 current /bsd: rip=0xffffffff81221d50
rsp=0xffffffff81a06d80
Dec 12 16:21:47 current /bsd: rflags=0x0000000000000246 (cf PF af ZF
sf tf IF df of nt rf vm ac vif vip id IOPL=0)
Dec 12 16:21:47 current /bsd: cr0=0x0000000080010031 (PG cd nw am WP
NE ET ts em mp PE)
Dec 12 16:21:47 current /bsd: cr2=0x0000000000000000
Dec 12 16:21:47 current /bsd: cr3=0x000000007f7d8000 (pwt pcd)
Dec 12 16:21:47 current /bsd: cr4=0x00000000000026b0 (pke smap smep
osxsave pcide fsgsbase smxe VMXE OSXMMEXCPT OSFXSR pce PGE mce PAE PSE
de tsd pvi vme)
Dec 12 16:21:47 current /bsd: --Guest Segment Info--
Dec 12 16:21:47 current /bsd: cs=0x0008 rpl=0 base=0x0000000000000000
limit=0x00000000ffffffff a/r=0xa09b
Dec 12 16:21:47 current /bsd: granularity=1 dib=0 l(64 bit)=1
present=1 sys=1 type=code, r/x, accessed
Dec 12 16:21:47 current /bsd: ds=0x0010 rpl=0 base=0x0000000000000000
limit=0x00000000ffffffff a/r=vmm_handle_cpuid: unsupported
rax=0x40000100
Dec 12 16:21:47 current /bsd: 0xa093
Dec 12 16:21:47 current /bsd: granularity=1 dib=0 l(64 bit)=1
present=1 sys=1 type=data, r/w, accessed
Dec 12 16:21:47 current /bsd: es=0x0010 rpl=0 base=0x0000000000000000
limit=0x00000000ffffffff a/r=0xa093
Dec 12 16:21:47 current /bsd: granularity=1 dib=0 l(64 bit)=1
present=1 sys=1 type=data, r/w, accessed
Dec 12 16:21:47 current /bsd: fs=0x0000 rpl=0 base=0x0000000000000000
limit=0x00000000ffffffff a/r=0x1c000
Dec 12 16:21:47 current /bsd: (unusable)
Dec 12 16:21:47 current /bsd: gs=0x0000 rpl=0 base=0xffffffff818f6ff0
limit=0x00000000ffffffff a/r=0x1c000
Dec 12 16:21:47 current /bsd: (unusable)
Dec 12 16:21:47 current /bsd: ss=0x0010 rpl=0 base=0x0000000000000000
limit=0x00000000ffffffff a/r=0xa093
Dec 12 16:21:47 current /bsd: granularity=1 dib=0 l(64 bit)=1
present=1 sys=1 type=data, r/w, accessed
Dec 12 16:21:47 current /bsd: tr=0x0030 base=0xffffffff818f5000
limit=0x0000000000000067 a/r=0x008b
Dec 12 16:21:47 current /bsd: granularity=0 dib=0 l(64 bit)=0
present=1 sys=0 type=tss (busy)
Dec 12 16:21:47 current /bsd: gdtr base=0xffffffff818f5068
limit=0x000000000000003f
Dec 12 16:21:47 current /bsd: idtr base=0xffff800000020000
limit=0x0000000000000fff
Dec 12 16:21:47 current /bsd: ldtr=0x0000 base=0x0000000000000000
limit=0x00000000ffffffff a/r=0x1c000
Dec 12 16:21:47 current /bsd: (unusable)
Dec 12 16:21:47 current /bsd: vmm_handle_cpuid: function 0x06
(thermal/power mgt) not supported
Dec 12 16:21:47 current /bsd: --Guest MSRs @ 0xfffffddea339d000
(paddr: 0x0000005ea339d000)--
Dec 12 16:21:47 current /bsd: MSR 0 @ 0xfffffddea339d000 :
0xc0000080 (EFER
Dec 12 16:21:47 current /bsd: ), value=0x0000000000000d01 (SCE LME LMA
NXE)
Dec 12 16:21:47 current /bsd: MSR 1 @ 0xfffffddea339d010 :
0xc0000081 (STAR), value=0x001b000800000000
Dec 12 16:21:47 current /bsd: MSR 2 @ 0xfffffddea339d020 :
0xc0000082 (LSTAR), value=0xffffffff813b8000
Dec 12 16:21:47 current /bsd: MSR 3 @ 0xfffffddea339d030 :
0xc0000083 (CSTAR), value=0xffffffff813ba000
Dec 12 16:21:47 current /bsd: MSR 4 @
Dec 12 16:21:47 current /bsd: 0xfffffddea339d040 : 0xc0000084
(SFMASK), val
Dec 12 16:21:47 current /bsd: ue=0x0000000
Dec 12 16:21:47 current /bsd: 000044701
Mischa
On 2022-12-10 23:51, Dave Voutila wrote:
tech@,
The below diff tweaks how vmd and vmm define memory ranges (adding
a
"type" attribute) so we can properly build an e820 memory map to
hand to
things like SeaBIOS or the OpenBSD ramdisk kernel (when direct
booting
bsd.rd).
Why do it? We've been carrying a few patches to SeaBIOS in the
ports
tree to hack around how vmd articulates some memory range details.
By
finally implementing a proper bios memory map table we can drop
some of
those patches. (Diff to ports@ coming shortly.)
Bonus is it cleans up how we were hacking a bios memory map for
direct
booting ramdisk kernels.
Note: the below diff *will* work with the current SeaBIOS
(vmm-firmware), so you do *not* need to build the port.
You will, however, need to:
- build, install, & reboot into a new kernel
- make sure you update /usr/include/amd64/vmmvar.h with a copy of
symlink to sys/arch/amd64/include/vmmvar.h
- rebuild & install vmctl
- rebuild & install vmd
This should *not* result in any behavioral changes of current vmd
guests. If you notice any, especially guests failing to start,
please
rebuild a kernel with VMM_DEBUG to help diagnose the regression.
-dv
diff refs/heads/master refs/heads/vmd-e820
commit - a96642fb40af450c6576e205fab247cdbce0b5ed
commit + f3cb01998127d200e95ff9984a7503eb16c2a8d8
blob - 3f7e0ce405ae3c6b0b4a787de341839886f97436
blob + f2a464217838d3f0a50e4131b5b074b315e490fb
--- sys/arch/amd64/amd64/vmm.c
+++ sys/arch/amd64/amd64/vmm.c
@@ -1643,21 +1643,27 @@ vm_create_check_mem_ranges(struct
vm_create_params *vc
const paddr_t maxgpa = VMM_MAX_VM_MEM_SIZE;
if (vcp->vcp_nmemranges == 0 ||
- vcp->vcp_nmemranges > VMM_MAX_MEM_RANGES)
+ vcp->vcp_nmemranges > VMM_MAX_MEM_RANGES) {
+ DPRINTF("invalid number of guest memory ranges\n");
return (0);
+ }
for (i = 0; i < vcp->vcp_nmemranges; i++) {
vmr = &vcp->vcp_memranges[i];
/* Only page-aligned addresses and sizes are permitted
*/
if ((vmr->vmr_gpa & PAGE_MASK) || (vmr->vmr_va & PAGE_MASK) ||
- (vmr->vmr_size & PAGE_MASK) || vmr->vmr_size == 0)
+ (vmr->vmr_size & PAGE_MASK) || vmr->vmr_size == 0) {
+ DPRINTF("memory range %zu is not page aligned\n", i);
return (0);
+ }
/* Make sure that VMM_MAX_VM_MEM_SIZE is not exceeded
*/
if (vmr->vmr_gpa >= maxgpa ||
- vmr->vmr_size > maxgpa - vmr->vmr_gpa)
+ vmr->vmr_size > maxgpa - vmr->vmr_gpa) {
+ DPRINTF("exceeded max memory size\n");
return (0);
+ }
/*
* Make sure that all virtual addresses are within the address
@@ -1667,39 +1673,55 @@ vm_create_check_mem_ranges(struct
vm_create_params *vc
*/
if (vmr->vmr_va < VM_MIN_ADDRESS ||
vmr->vmr_va >= VM_MAXUSER_ADDRESS ||
- vmr->vmr_size >= VM_MAXUSER_ADDRESS - vmr->vmr_va)
+ vmr->vmr_size >= VM_MAXUSER_ADDRESS - vmr->vmr_va) {
+ DPRINTF("guest va not within range or wraps\n");
return (0);
+ }
/*
* Specifying ranges within the PCI MMIO space is forbidden.
* Disallow ranges that start inside the MMIO space:
* [VMM_PCI_MMIO_BAR_BASE .. VMM_PCI_MMIO_BAR_END]
*/
- if (vmr->vmr_gpa >= VMM_PCI_MMIO_BAR_BASE &&
- vmr->vmr_gpa <= VMM_PCI_MMIO_BAR_END)
+ if (vmr->vmr_type == VM_MEM_RAM &&
+ vmr->vmr_gpa >= VMM_PCI_MMIO_BAR_BASE &&
+ vmr->vmr_gpa <= VMM_PCI_MMIO_BAR_END) {
+ DPRINTF("guest RAM range %zu cannot being in mmio range"
+ " (gpa=0x%lx)\n", i, vmr->vmr_gpa);
return (0);
+ }
/*
* ... and disallow ranges that end inside the MMIO space:
* (VMM_PCI_MMIO_BAR_BASE .. VMM_PCI_MMIO_BAR_END]
*/
- if (vmr->vmr_gpa + vmr->vmr_size > VMM_PCI_MMIO_BAR_BASE &&
- vmr->vmr_gpa + vmr->vmr_size <= VMM_PCI_MMIO_BAR_END)
+ if (vmr->vmr_type == VM_MEM_RAM &&
+ vmr->vmr_gpa + vmr->vmr_size > VMM_PCI_MMIO_BAR_BASE &&
+ vmr->vmr_gpa + vmr->vmr_size <= VMM_PCI_MMIO_BAR_END) {
+ DPRINTF("guest RAM range %zu cannot end in mmio range"
+ " (gpa=0x%lx, sz=0x%lx)\n", i, vmr->vmr_gpa,
+ vmr->vmr_size);
return (0);
+ }
/*
* Make sure that guest physical memory ranges do not overlap
* and that they are ascending.
*/
- if (i > 0 && pvmr->vmr_gpa + pvmr->vmr_size > vmr->vmr_gpa)
+ if (i > 0 && pvmr->vmr_gpa + pvmr->vmr_size > vmr->vmr_gpa) {
+ DPRINTF("guest range %zu overlaps or !ascending\n", i);
return (0);
+ }
memsize += vmr->vmr_size;
pvmr = vmr;
}
- if (memsize % (1024 * 1024) != 0)
+ if (memsize % (1024 * 1024) != 0) {
+ DPRINTF("memory size not a multiple of 1MB\n");
return (0);
+ }
+
return (memsize);
}
blob - 94feca154717c1e3016990ad260036cd79e29b65
blob + 2c57f10b9340e8a779f50bee18d235a299721571
--- sys/arch/amd64/include/vmmvar.h
+++ sys/arch/amd64/include/vmmvar.h
@@ -451,6 +451,9 @@ struct vm_mem_range {
paddr_t vmr_gpa;
vaddr_t vmr_va;
size_t vmr_size;
+ int vmr_type;
+#define VM_MEM_RAM 0
+#define VM_MEM_RESERVED 1
};
/*
blob - 4ec036912cafa154f4eb24ce757f0cb6e4c6bf4a
blob + eb0bea236ed0d6c4d68f6699eb6720ef8fca296c
--- usr.sbin/vmd/fw_cfg.c
+++ usr.sbin/vmd/fw_cfg.c
@@ -16,6 +16,7 @@
*/
#include <sys/types.h>
#include <sys/uio.h>
+#include <machine/biosvar.h> /* bios_memmap_t */
#include <machine/vmmvar.h>
#include <stdlib.h>
@@ -63,6 +64,8 @@ static int fw_cfg_select_file(uint16_t);
static uint64_t fw_cfg_dma_addr;
+static bios_memmap_t e820[VMM_MAX_MEM_RANGES];
+
static int fw_cfg_select_file(uint16_t);
static void fw_cfg_file_dir(void);
@@ -71,7 +74,27 @@ fw_cfg_init(struct vmop_create_params *vmc)
{
const char *bootorder = NULL;
unsigned int sd = 0;
+ size_t i, e820_len = 0;
+ /* Define e820 memory ranges. */
+ memset(&e820, 0, sizeof(e820));
+ for (i = 0; i < vmc->vmc_params.vcp_nmemranges; i++) {
+ struct vm_mem_range *range = &vmc->vmc_params.vcp_memranges[i];
+ bios_memmap_t *entry = &e820[i];
+
+ entry->addr = range->vmr_gpa;
+ entry->size = range->vmr_size;
+ if (range->vmr_type == VM_MEM_RAM)
+ entry->type = BIOS_MAP_FREE;
+ else if (range->vmr_type == VM_MEM_RESERVED)
+ entry->type = BIOS_MAP_RES;
+ else
+ fatalx("undefined memory type %d", entry->type);
+
+ e820_len += sizeof(bios_memmap_t);
+ }
+ fw_cfg_add_file("etc/e820", &e820, e820_len);
+
/* do not double print chars on serial port */
fw_cfg_add_file("etc/screen-and-debug", &sd, sizeof(sd));
blob - 651719542d28ce44bccb0487867ece7e72686606
blob + b7f79eb9e140073f75563a6dcb5fdad3cb2b2d22
--- usr.sbin/vmd/loadfile_elf.c
+++ usr.sbin/vmd/loadfile_elf.c
@@ -334,38 +334,26 @@ create_bios_memmap(struct vm_create_params
*vcp, bios_
static size_t
create_bios_memmap(struct vm_create_params *vcp, bios_memmap_t
*memmap)
{
- size_t i, n = 0, sz;
- paddr_t gpa;
+ size_t i, n = 0;
struct vm_mem_range *vmr;
- for (i = 0; i < vcp->vcp_nmemranges; i++) {
+ for (i = 0; i < vcp->vcp_nmemranges; i++, n++) {
vmr = &vcp->vcp_memranges[i];
- gpa = vmr->vmr_gpa;
- sz = vmr->vmr_size;
-
- /*
- * Make sure that we do not mark the ROM/video RAM area in the
- * low memory as physcal memory available to the kernel.
- */
- if (gpa < 0x100000 && gpa + sz > LOWMEM_KB * 1024) {
- if (gpa >= LOWMEM_KB * 1024)
- sz = 0;
- else
- sz = LOWMEM_KB * 1024 - gpa;
- }
-
- if (sz != 0) {
- memmap[n].addr = gpa;
- memmap[n].size = sz;
- memmap[n].type = 0x1; /* Type 1 : Normal memory */
- n++;
- }
+ memmap[n].addr = vmr->vmr_gpa;
+ memmap[n].size = vmr->vmr_size;
+ if (vmr->vmr_type == VM_MEM_RAM)
+ memmap[n].type = BIOS_MAP_FREE;
+ else if (vmr->vmr_type == VM_MEM_RESERVED)
+ memmap[n].type = BIOS_MAP_RES;
+ else
+ fatalx("%s: invalid vm memory range type %d\n",
+ __func__, vmr->vmr_type);
}
/* Null mem map entry to denote the end of the ranges */
memmap[n].addr = 0x0;
memmap[n].size = 0x0;
- memmap[n].type = 0x0;
+ memmap[n].type = BIOS_MAP_END;
n++;
return (n);
blob - f1d9b97741c11f8cc4faa3f79658cd87135d2b29
blob + 7a1b3bb39cfd4651b076bf5c5e74012bdd11754e
--- usr.sbin/vmd/vm.c
+++ usr.sbin/vmd/vm.c
@@ -899,6 +899,7 @@ create_memory_map(struct vm_create_params *vcp)
len = LOWMEM_KB * 1024;
vcp->vcp_memranges[0].vmr_gpa = 0x0;
vcp->vcp_memranges[0].vmr_size = len;
+ vcp->vcp_memranges[0].vmr_type = VM_MEM_RAM;
mem_bytes -= len;
/*
@@ -913,12 +914,14 @@ create_memory_map(struct vm_create_params
*vcp)
len = MB(1) - (LOWMEM_KB * 1024);
vcp->vcp_memranges[1].vmr_gpa = LOWMEM_KB * 1024;
vcp->vcp_memranges[1].vmr_size = len;
+ vcp->vcp_memranges[1].vmr_type = VM_MEM_RESERVED;
mem_bytes -= len;
/* If we have less than 2MB remaining, still create a 2nd BIOS
area. */
if (mem_bytes <= MB(2)) {
vcp->vcp_memranges[2].vmr_gpa = VMM_PCI_MMIO_BAR_END;
vcp->vcp_memranges[2].vmr_size = MB(2);
+ vcp->vcp_memranges[2].vmr_type = VM_MEM_RESERVED;
vcp->vcp_nmemranges = 3;
return;
}
@@ -939,18 +942,27 @@ create_memory_map(struct vm_create_params
*vcp)
/* Third memory region: area above 1MB to MMIO region */
vcp->vcp_memranges[2].vmr_gpa = MB(1);
vcp->vcp_memranges[2].vmr_size = above_1m;
+ vcp->vcp_memranges[2].vmr_type = VM_MEM_RAM;
- /* Fourth region: 2nd copy of BIOS above MMIO ending at 4GB */
- vcp->vcp_memranges[3].vmr_gpa = VMM_PCI_MMIO_BAR_END + 1;
- vcp->vcp_memranges[3].vmr_size = MB(2);
+ /* Fourth region: PCI MMIO range */
+ vcp->vcp_memranges[3].vmr_gpa = VMM_PCI_MMIO_BAR_BASE;
+ vcp->vcp_memranges[3].vmr_size = VMM_PCI_MMIO_BAR_END -
+ VMM_PCI_MMIO_BAR_BASE + 1;
+ vcp->vcp_memranges[3].vmr_type = VM_MEM_RESERVED;
- /* Fifth region: any remainder above 4GB */
+ /* Fifth region: 2nd copy of BIOS above MMIO ending at 4GB */
+ vcp->vcp_memranges[4].vmr_gpa = VMM_PCI_MMIO_BAR_END + 1;
+ vcp->vcp_memranges[4].vmr_size = MB(2);
+ vcp->vcp_memranges[4].vmr_type = VM_MEM_RESERVED;
+
+ /* Sixth region: any remainder above 4GB */
if (above_4g > 0) {
- vcp->vcp_memranges[4].vmr_gpa = GB(4);
- vcp->vcp_memranges[4].vmr_size = above_4g;
+ vcp->vcp_memranges[5].vmr_gpa = GB(4);
+ vcp->vcp_memranges[5].vmr_size = above_4g;
+ vcp->vcp_memranges[5].vmr_type = VM_MEM_RAM;
+ vcp->vcp_nmemranges = 6;
+ } else
vcp->vcp_nmemranges = 5;
- } else
- vcp->vcp_nmemranges = 4;
}
/*