$OpenBSD: patch-src_fw_paravirt_c,v 1.3 2018/12/10 16:25:17 claudio Exp $

Don't use 'rep insb' to read IO ports, vmm does not support that yet.
Allow detection of >4GB RAM. Normally seabios only allows this with the
qemu config device which VMM doesn't have.

Index: src/fw/paravirt.c
--- src/fw/paravirt.c.orig
+++ src/fw/paravirt.c
@@ -257,7 +257,9 @@ qemu_cfg_read(void *buf, int len)
     if (qemu_cfg_dma_enabled()) {
         qemu_cfg_dma_transfer(buf, len, QEMU_CFG_DMA_CTL_READ);
     } else {
-        insb(PORT_QEMU_CFG_DATA, buf, len);
+	u8 *d = buf;
+	while (len-- > 0)
+		*d++ = inb(PORT_QEMU_CFG_DATA);
     }
 }
 
@@ -491,6 +493,18 @@ qemu_cfg_e820(void)
         e820_add(0xfffbc000, 4*4096, E820_RESERVED);
     }
 
+    // Check for memory over 4Gig in cmos
+    u64 high = ((rtc_read(CMOS_MEM_HIGHMEM_LOW) << 16)
+                | ((u32)rtc_read(CMOS_MEM_HIGHMEM_MID) << 24)
+                | ((u64)rtc_read(CMOS_MEM_HIGHMEM_HIGH) << 32));
+    RamSizeOver4G = high;
+    e820_add(0x100000000ull, high, E820_RAM);
+    dprintf(1, "RamSizeOver4G: 0x%016llx [cmos]\n", RamSizeOver4G);
+}
+
+void
+vmm_check_high_mem(void)
+{
     // Check for memory over 4Gig in cmos
     u64 high = ((rtc_read(CMOS_MEM_HIGHMEM_LOW) << 16)
                 | ((u32)rtc_read(CMOS_MEM_HIGHMEM_MID) << 24)
