diff --git a/rvvm.patch b/rvvm.patch index ccd1ab6..f8880b4 100644 --- a/rvvm.patch +++ b/rvvm.patch @@ -1,6 +1,6 @@ patch file diff --git a/CMakeLists.txt b/CMakeLists.txt -index db82e07..1e24bb5 100644 +index db82e07..03a5e10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,25 @@ @@ -178,7 +178,7 @@ index db82e07..1e24bb5 100644 if (RVVM_USE_GUI AND (NOT BUILD_LIBRETRO)) target_compile_definitions(rvvm_common INTERFACE USE_GUI) -@@ -313,10 +371,45 @@ else() +@@ -313,10 +371,37 @@ else() set_target_properties(rvvm_libretro PROPERTIES SUFFIX "${LIBRETRO_SUFFIX}.bc") elseif (LIBRETRO_STATIC) set_target_properties(rvvm_libretro PROPERTIES SUFFIX "${LIBRETRO_SUFFIX}.a") @@ -217,14 +217,6 @@ index db82e07..1e24bb5 100644 + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" + ) +endif() -+ -+install( -+ FILES -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/rvvmlib.h -+ ${CMAKE_CURRENT_SOURCE_DIR}/src/fdtlib.h -+ ${RVVM_DEVICES_SRC_H} -+ DESTINATION "${INSTALL_INC_DIR}" -+) diff --git a/Makefile b/Makefile index 2366413..e514d84 100644 --- a/Makefile @@ -430,12 +422,425 @@ index 0000000..9ced2aa + target_link_libraries(virglrenderer INTERFACE epoxy) + set(VIRGLRENDERER_TARGET virglrenderer) +endif() +diff --git a/empty.c b/empty.c +new file mode 100644 +index 0000000..e69de29 +diff --git a/src/devices/rvvm_virtio_ids.h b/src/devices/rvvm_virtio_ids.h +new file mode 100644 +index 0000000..46ba2a9 +--- /dev/null ++++ b/src/devices/rvvm_virtio_ids.h +@@ -0,0 +1,111 @@ ++#ifndef _LINUX_VIRTIO_IDS_H ++#define _LINUX_VIRTIO_IDS_H ++ ++#include ++ ++#ifndef __bitwise ++#define __bitwise ++ ++typedef int8_t __s8; ++typedef uint8_t __u8; ++typedef int16_t __s16; ++typedef uint16_t __u16; ++typedef int32_t __s32; ++typedef uint32_t __u32; ++typedef int64_t __s64; ++typedef uint64_t __u64; ++ ++typedef __u16 __bitwise __le16; ++typedef __u16 __bitwise __be16; ++typedef __u32 __bitwise __le32; ++typedef __u32 __bitwise __be32; ++typedef __u64 __bitwise __le64; ++typedef __u64 __bitwise __be64; ++ ++typedef __u16 __bitwise __sum16; ++typedef __u32 __bitwise __wsum; ++ ++#endif ++ ++/* ++ * Virtio IDs ++ * ++ * This header is BSD licensed so anyone can use the definitions to implement ++ * compatible drivers/servers. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of IBM nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. */ ++ ++#define VIRTIO_ID_NET 1 /* virtio net */ ++#define VIRTIO_ID_BLOCK 2 /* virtio block */ ++#define VIRTIO_ID_CONSOLE 3 /* virtio console */ ++#define VIRTIO_ID_RNG 4 /* virtio rng */ ++#define VIRTIO_ID_BALLOON 5 /* virtio balloon */ ++#define VIRTIO_ID_IOMEM 6 /* virtio ioMemory */ ++#define VIRTIO_ID_RPMSG 7 /* virtio remote processor messaging */ ++#define VIRTIO_ID_SCSI 8 /* virtio scsi */ ++#define VIRTIO_ID_9P 9 /* 9p virtio console */ ++#define VIRTIO_ID_MAC80211_WLAN 10 /* virtio WLAN MAC */ ++#define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ ++#define VIRTIO_ID_CAIF 12 /* Virtio caif */ ++#define VIRTIO_ID_MEMORY_BALLOON 13 /* virtio memory balloon */ ++#define VIRTIO_ID_GPU 16 /* virtio GPU */ ++#define VIRTIO_ID_CLOCK 17 /* virtio clock/timer */ ++#define VIRTIO_ID_INPUT 18 /* virtio input */ ++#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */ ++#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ ++#define VIRTIO_ID_SIGNAL_DIST 21 /* virtio signal distribution device */ ++#define VIRTIO_ID_PSTORE 22 /* virtio pstore device */ ++#define VIRTIO_ID_IOMMU 23 /* virtio IOMMU */ ++#define VIRTIO_ID_MEM 24 /* virtio mem */ ++#define VIRTIO_ID_SOUND 25 /* virtio sound */ ++#define VIRTIO_ID_FS 26 /* virtio filesystem */ ++#define VIRTIO_ID_PMEM 27 /* virtio pmem */ ++#define VIRTIO_ID_RPMB 28 /* virtio rpmb */ ++#define VIRTIO_ID_MAC80211_HWSIM 29 /* virtio mac80211-hwsim */ ++#define VIRTIO_ID_VIDEO_ENCODER 30 /* virtio video encoder */ ++#define VIRTIO_ID_VIDEO_DECODER 31 /* virtio video decoder */ ++#define VIRTIO_ID_SCMI 32 /* virtio SCMI */ ++#define VIRTIO_ID_NITRO_SEC_MOD 33 /* virtio nitro secure module*/ ++#define VIRTIO_ID_I2C_ADAPTER 34 /* virtio i2c adapter */ ++#define VIRTIO_ID_WATCHDOG 35 /* virtio watchdog */ ++#define VIRTIO_ID_CAN 36 /* virtio can */ ++#define VIRTIO_ID_DMABUF 37 /* virtio dmabuf */ ++#define VIRTIO_ID_PARAM_SERV 38 /* virtio parameter server */ ++#define VIRTIO_ID_AUDIO_POLICY 39 /* virtio audio policy */ ++#define VIRTIO_ID_BT 40 /* virtio bluetooth */ ++#define VIRTIO_ID_GPIO 41 /* virtio gpio */ ++ ++/* ++ * Virtio Transitional IDs ++ */ ++ ++#define VIRTIO_TRANS_ID_NET 0x1000 /* transitional virtio net */ ++#define VIRTIO_TRANS_ID_BLOCK 0x1001 /* transitional virtio block */ ++#define VIRTIO_TRANS_ID_BALLOON 0x1002 /* transitional virtio balloon */ ++#define VIRTIO_TRANS_ID_CONSOLE 0x1003 /* transitional virtio console */ ++#define VIRTIO_TRANS_ID_SCSI 0x1004 /* transitional virtio SCSI */ ++#define VIRTIO_TRANS_ID_RNG 0x1005 /* transitional virtio rng */ ++#define VIRTIO_TRANS_ID_9P 0x1009 /* transitional virtio 9p console */ ++ ++#endif /* _LINUX_VIRTIO_IDS_H */ +diff --git a/src/devices/rvvm_virtio_pci.h b/src/devices/rvvm_virtio_pci.h +new file mode 100644 +index 0000000..42ec84f +--- /dev/null ++++ b/src/devices/rvvm_virtio_pci.h +@@ -0,0 +1,287 @@ ++/* ++ * Virtio PCI driver ++ * ++ * This module allows virtio devices to be used over a virtual PCI device. ++ * This can be used with QEMU based VMMs like KVM or Xen. ++ * ++ * Copyright IBM Corp. 2007 ++ * ++ * Authors: ++ * Anthony Liguori ++ * ++ * This header is BSD licensed so anyone can use the definitions to implement ++ * compatible drivers/servers. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of IBM nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#ifndef _LINUX_VIRTIO_PCI_H ++#define _LINUX_VIRTIO_PCI_H ++ ++#ifndef VIRTIO_PCI_NO_LEGACY ++ ++/* A 32-bit r/o bitmask of the features supported by the host */ ++#define VIRTIO_PCI_HOST_FEATURES 0 ++ ++/* A 32-bit r/w bitmask of features activated by the guest */ ++#define VIRTIO_PCI_GUEST_FEATURES 4 ++ ++/* A 32-bit r/w PFN for the currently selected queue */ ++#define VIRTIO_PCI_QUEUE_PFN 8 ++ ++/* A 16-bit r/o queue size for the currently selected queue */ ++#define VIRTIO_PCI_QUEUE_NUM 12 ++ ++/* A 16-bit r/w queue selector */ ++#define VIRTIO_PCI_QUEUE_SEL 14 ++ ++/* A 16-bit r/w queue notifier */ ++#define VIRTIO_PCI_QUEUE_NOTIFY 16 ++ ++/* An 8-bit device status register. */ ++#define VIRTIO_PCI_STATUS 18 ++ ++/* An 8-bit r/o interrupt status register. Reading the value will return the ++ * current contents of the ISR and will also clear it. This is effectively ++ * a read-and-acknowledge. */ ++#define VIRTIO_PCI_ISR 19 ++ ++/* MSI-X registers: only enabled if MSI-X is enabled. */ ++/* A 16-bit vector for configuration changes. */ ++#define VIRTIO_MSI_CONFIG_VECTOR 20 ++/* A 16-bit vector for selected queue notifications. */ ++#define VIRTIO_MSI_QUEUE_VECTOR 22 ++ ++/* The remaining space is defined by each driver as the per-driver ++ * configuration space */ ++#define VIRTIO_PCI_CONFIG_OFF(msix_enabled) ((msix_enabled) ? 24 : 20) ++/* Deprecated: please use VIRTIO_PCI_CONFIG_OFF instead */ ++#define VIRTIO_PCI_CONFIG(dev) VIRTIO_PCI_CONFIG_OFF((dev)->msix_enabled) ++ ++/* Virtio ABI version, this must match exactly */ ++#define VIRTIO_PCI_ABI_VERSION 0 ++ ++/* How many bits to shift physical queue address written to QUEUE_PFN. ++ * 12 is historical, and due to x86 page size. */ ++#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 ++ ++/* The alignment to use between consumer and producer parts of vring. ++ * x86 pagesize again. */ ++#define VIRTIO_PCI_VRING_ALIGN 4096 ++ ++#endif /* VIRTIO_PCI_NO_LEGACY */ ++ ++/* The bit of the ISR which indicates a device configuration change. */ ++#define VIRTIO_PCI_ISR_CONFIG 0x2 ++/* Vector value used to disable MSI for queue */ ++#define VIRTIO_MSI_NO_VECTOR 0xffff ++ ++#ifndef VIRTIO_PCI_NO_MODERN ++ ++/* IDs for different capabilities. Must all exist. */ ++ ++/* Common configuration */ ++#define VIRTIO_PCI_CAP_COMMON_CFG 1 ++/* Notifications */ ++#define VIRTIO_PCI_CAP_NOTIFY_CFG 2 ++/* ISR access */ ++#define VIRTIO_PCI_CAP_ISR_CFG 3 ++/* Device specific configuration */ ++#define VIRTIO_PCI_CAP_DEVICE_CFG 4 ++/* PCI configuration access */ ++#define VIRTIO_PCI_CAP_PCI_CFG 5 ++/* Additional shared memory capability */ ++#define VIRTIO_PCI_CAP_SHARED_MEMORY_CFG 8 ++ ++/* This is the PCI capability header: */ ++struct virtio_pci_cap { ++ __u8 cap_vndr; /* Generic PCI field: PCI_CAP_ID_VNDR */ ++ __u8 cap_next; /* Generic PCI field: next ptr. */ ++ __u8 cap_len; /* Generic PCI field: capability length */ ++ __u8 cfg_type; /* Identifies the structure. */ ++ __u8 bar; /* Where to find it. */ ++ __u8 id; /* Multiple capabilities of the same type */ ++ __u8 padding[2]; /* Pad to full dword. */ ++ __le32 offset; /* Offset within bar. */ ++ __le32 length; /* Length of the structure, in bytes. */ ++}; ++ ++struct virtio_pci_cap64 { ++ struct virtio_pci_cap cap; ++ __le32 offset_hi; /* Most sig 32 bits of offset */ ++ __le32 length_hi; /* Most sig 32 bits of length */ ++}; ++ ++struct virtio_pci_notify_cap { ++ struct virtio_pci_cap cap; ++ __le32 notify_off_multiplier; /* Multiplier for queue_notify_off. */ ++}; ++ ++/* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */ ++struct virtio_pci_common_cfg { ++ /* About the whole device. */ ++ __le32 device_feature_select; /* read-write */ ++ __le32 device_feature; /* read-only */ ++ __le32 guest_feature_select; /* read-write */ ++ __le32 guest_feature; /* read-write */ ++ __le16 msix_config; /* read-write */ ++ __le16 num_queues; /* read-only */ ++ __u8 device_status; /* read-write */ ++ __u8 config_generation; /* read-only */ ++ ++ /* About a specific virtqueue. */ ++ __le16 queue_select; /* read-write */ ++ __le16 queue_size; /* read-write, power of 2. */ ++ __le16 queue_msix_vector; /* read-write */ ++ __le16 queue_enable; /* read-write */ ++ __le16 queue_notify_off; /* read-only */ ++ __le32 queue_desc_lo; /* read-write */ ++ __le32 queue_desc_hi; /* read-write */ ++ __le32 queue_avail_lo; /* read-write */ ++ __le32 queue_avail_hi; /* read-write */ ++ __le32 queue_used_lo; /* read-write */ ++ __le32 queue_used_hi; /* read-write */ ++}; ++ ++/* ++ * Warning: do not use sizeof on this: use offsetofend for ++ * specific fields you need. ++ */ ++struct virtio_pci_modern_common_cfg { ++ struct virtio_pci_common_cfg cfg; ++ ++ __le16 queue_notify_data; /* read-write */ ++ __le16 queue_reset; /* read-write */ ++ ++ __le16 admin_queue_index; /* read-only */ ++ __le16 admin_queue_num; /* read-only */ ++}; ++ ++/* Fields in VIRTIO_PCI_CAP_PCI_CFG: */ ++struct virtio_pci_cfg_cap { ++ struct virtio_pci_cap cap; ++ __u8 pci_cfg_data[4]; /* Data for BAR access. */ ++}; ++ ++/* Macro versions of offsets for the Old Timers! */ ++#define VIRTIO_PCI_CAP_VNDR 0 ++#define VIRTIO_PCI_CAP_NEXT 1 ++#define VIRTIO_PCI_CAP_LEN 2 ++#define VIRTIO_PCI_CAP_CFG_TYPE 3 ++#define VIRTIO_PCI_CAP_BAR 4 ++#define VIRTIO_PCI_CAP_OFFSET 8 ++#define VIRTIO_PCI_CAP_LENGTH 12 ++ ++#define VIRTIO_PCI_NOTIFY_CAP_MULT 16 ++ ++#define VIRTIO_PCI_COMMON_DFSELECT 0 ++#define VIRTIO_PCI_COMMON_DF 4 ++#define VIRTIO_PCI_COMMON_GFSELECT 8 ++#define VIRTIO_PCI_COMMON_GF 12 ++#define VIRTIO_PCI_COMMON_MSIX 16 ++#define VIRTIO_PCI_COMMON_NUMQ 18 ++#define VIRTIO_PCI_COMMON_STATUS 20 ++#define VIRTIO_PCI_COMMON_CFGGENERATION 21 ++#define VIRTIO_PCI_COMMON_Q_SELECT 22 ++#define VIRTIO_PCI_COMMON_Q_SIZE 24 ++#define VIRTIO_PCI_COMMON_Q_MSIX 26 ++#define VIRTIO_PCI_COMMON_Q_ENABLE 28 ++#define VIRTIO_PCI_COMMON_Q_NOFF 30 ++#define VIRTIO_PCI_COMMON_Q_DESCLO 32 ++#define VIRTIO_PCI_COMMON_Q_DESCHI 36 ++#define VIRTIO_PCI_COMMON_Q_AVAILLO 40 ++#define VIRTIO_PCI_COMMON_Q_AVAILHI 44 ++#define VIRTIO_PCI_COMMON_Q_USEDLO 48 ++#define VIRTIO_PCI_COMMON_Q_USEDHI 52 ++#define VIRTIO_PCI_COMMON_Q_NDATA 56 ++#define VIRTIO_PCI_COMMON_Q_RESET 58 ++#define VIRTIO_PCI_COMMON_ADM_Q_IDX 60 ++#define VIRTIO_PCI_COMMON_ADM_Q_NUM 62 ++ ++#endif /* VIRTIO_PCI_NO_MODERN */ ++ ++/* Admin command status. */ ++#define VIRTIO_ADMIN_STATUS_OK 0 ++ ++/* Admin command opcode. */ ++#define VIRTIO_ADMIN_CMD_LIST_QUERY 0x0 ++#define VIRTIO_ADMIN_CMD_LIST_USE 0x1 ++ ++/* Admin command group type. */ ++#define VIRTIO_ADMIN_GROUP_TYPE_SRIOV 0x1 ++ ++/* Transitional device admin command. */ ++#define VIRTIO_ADMIN_CMD_LEGACY_COMMON_CFG_WRITE 0x2 ++#define VIRTIO_ADMIN_CMD_LEGACY_COMMON_CFG_READ 0x3 ++#define VIRTIO_ADMIN_CMD_LEGACY_DEV_CFG_WRITE 0x4 ++#define VIRTIO_ADMIN_CMD_LEGACY_DEV_CFG_READ 0x5 ++#define VIRTIO_ADMIN_CMD_LEGACY_NOTIFY_INFO 0x6 ++ ++struct virtio_admin_cmd_hdr { ++ __le16 opcode; ++ /* ++ * 1 - SR-IOV ++ * 2-65535 - reserved ++ */ ++ __le16 group_type; ++ /* Unused, reserved for future extensions. */ ++ __u8 reserved1[12]; ++ __le64 group_member_id; ++}; ++ ++struct virtio_admin_cmd_status { ++ __le16 status; ++ __le16 status_qualifier; ++ /* Unused, reserved for future extensions. */ ++ __u8 reserved2[4]; ++}; ++ ++struct virtio_admin_cmd_legacy_wr_data { ++ __u8 offset; /* Starting offset of the register(s) to write. */ ++ __u8 reserved[7]; ++ __u8 registers[]; ++}; ++ ++struct virtio_admin_cmd_legacy_rd_data { ++ __u8 offset; /* Starting offset of the register(s) to read. */ ++}; ++ ++#define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_END 0 ++#define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_OWNER_DEV 0x1 ++#define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_OWNER_MEM 0x2 ++ ++#define VIRTIO_ADMIN_CMD_MAX_NOTIFY_INFO 4 ++ ++struct virtio_admin_cmd_notify_info_data { ++ __u8 flags; /* 0 = end of list, 1 = owner device, 2 = member device */ ++ __u8 bar; /* BAR of the member or the owner device */ ++ __u8 padding[6]; ++ __le64 offset; /* Offset within bar. */ ++}; ++ ++struct virtio_admin_cmd_notify_info_result { ++ struct virtio_admin_cmd_notify_info_data entries[VIRTIO_ADMIN_CMD_MAX_NOTIFY_INFO]; ++}; ++ ++#endif diff --git a/src/devices/shm.c b/src/devices/shm.c new file mode 100644 -index 0000000..c0a78a9 +index 0000000..e1832ef --- /dev/null +++ b/src/devices/shm.c -@@ -0,0 +1,210 @@ +@@ -0,0 +1,292 @@ +/* +shm.c - Memory-Mapped Shared Memory +Copyright (C) 2024 ZLangJIT @@ -624,21 +1029,103 @@ index 0000000..c0a78a9 + rvvm_mmio_dev_t* mmio = rvvm_attach_mmio(machine, &shm_region); + if (mmio == NULL) return mmio; +#ifdef USE_FDT -+ struct fdt_node* memory = fdt_node_create("reserved_memory"); -+ fdt_node_add_prop_u32(memory, "#address-cells", 3); -+ fdt_node_add_prop_u32(memory, "#size-cells", 2); ++ // struct fdt_node* memory = fdt_node_create("reserved_memory"); ++ // fdt_node_add_prop_u32(memory, "#address-cells", 3); ++ // fdt_node_add_prop_u32(memory, "#size-cells", 2); + // Range header: ((cacheable) << 30 | (space) << 24 | (bus) << 16 | (dev) << 11 | (fun) << 8 | (reg)) -+ uint32_t ranges[2] = { -+ machine->mem.begin, 0x32 -+ }; -+ fdt_node_add_prop_cells(memory, "ranges", ranges, 2); ++ // uint32_t ranges[2] = { ++ // machine->mem.begin, 0x32 ++ // }; ++ // fdt_node_add_prop_cells(memory, "ranges", ranges, 2); + // struct fdt_node* test = fdt_node_create_reg("THIRTY_TWO_BYTES", machine->mem.begin); + // fdt_node_add_prop_reg(memory, "reg", machine->mem.begin, 0x32); -+ fdt_node_add_child(rvvm_get_fdt_root(machine), memory); ++ // fdt_node_add_child(rvvm_get_fdt_root(machine), memory); +#endif + return mmio; +} + ++// from uapi/linux/virtio*.h ++#include "rvvm_virtio_ids.h" ++ ++#define VIRTIO_PCI_NO_LEGACY ++// from uapi/linux/virtio*.h ++#include "rvvm_virtio_pci.h" ++ ++#include "mem_ops.h" ++ ++/* ++ ++ virtualbox is closer to rvvm than qemu in terms of api similarity ++ ++ https://github.com/matthias-prangl/VirtualBox6/blob/2db58873a4141dd42b3f7d34dbd713dca2fa1984/src/VBox/Devices/VirtIO/Virtio.cpp#L832-#L905 ++ ++also see https://github.com/mirror/vbox/blob/master/src/VBox/Devices/EFI/Firmware/OvmfPkg/VirtioGpuDxe/Commands.c ++ ++also see https://github.com/mirror/vbox/blob/master/src/VBox/Devices/VirtIO/VirtioCore.h ++ ++*/ ++ ++// https://github.com/tyler274/magenta/blob/3f71c5b1c71a9802d0316a4f51e70da9c0e0014a/system/ulib/hypervisor/virtio.c#L162 ++ ++static void virtio_pci_remove(rvvm_mmio_dev_t* device) ++{ ++ rvvm_info("virtio_pci_remove"); ++ UNUSED(device); ++} ++ ++static bool virtio_pci_read(rvvm_mmio_dev_t* device, void* data, size_t offset, uint8_t size) ++{ ++ rvvm_info("virtio_pci_read"); ++ UNUSED(device); ++ UNUSED(offset); ++ memset(data, 0, size); ++ return true; ++} ++ ++static bool virtio_pci_write(rvvm_mmio_dev_t* device, void* data, size_t offset, uint8_t size) ++{ ++ rvvm_info("virtio_pci_write"); ++ UNUSED(device); ++ UNUSED(offset); ++ memset(data, 0, size); ++ return true; ++} ++ ++static rvvm_mmio_type_t virtio_pci_type = { ++ .name = "virtio-pci", ++ .remove = virtio_pci_remove, ++}; ++ ++/* ++https://github.com/qemu/qemu/blob/master/include/hw/virtio/virtio-pci.h ++https://github.com/qemu/qemu/blob/master/include/hw/pci/pci_ids.h ++https://github.com/qemu/qemu/blob/master/hw/virtio/virtio-pci.c ++*/ ++ ++PUBLIC pci_dev_t* virtio_pci_init(rvvm_machine_t* machine) { ++ pci_dev_desc_t virtio_device = { ++ .func[0] = { ++ .vendor_id = 0x1AF4, // Virtio ++ .device_id = 0x1040 + VIRTIO_ID_PMEM, ++ .class_code = 0xff, // qemu specified virtio pci bus as PCI_CLASS_OTHERS ++ .irq_pin = PCI_IRQ_PIN_INTA, ++ .bar[0] = { ++ .addr = PCI_BAR_ADDR_64, ++ .size = 4096, ++ .min_op_size = 1, ++ .max_op_size = 1, ++ .read = virtio_pci_read, ++ .write = virtio_pci_write, ++ .type = &virtio_pci_type, ++ } ++ } ++ }; ++ ++ pci_dev_t* pci_dev = pci_bus_add_device(rvvm_get_pci_bus(machine), &virtio_device); ++ return pci_dev; ++} ++ ++ +/* + +cd ASSETS ; ./boot_rvvm_disk.sh "" "-shm_data images/android-logo-mask.png -shm_id foo -shm_data disk.img -shm_id foo -shm_data disk.img -shm_id foo" @@ -649,10 +1136,10 @@ index 0000000..c0a78a9 \ No newline at end of file diff --git a/src/devices/shm.h b/src/devices/shm.h new file mode 100644 -index 0000000..dad2653 +index 0000000..4a0b407 --- /dev/null +++ b/src/devices/shm.h -@@ -0,0 +1,40 @@ +@@ -0,0 +1,44 @@ +/* +shm.h - Memory-Mapped Shared Memory +Copyright (C) 2024 ZLangJIT @@ -692,6 +1179,10 @@ index 0000000..dad2653 +PUBLIC rvvm_mmio_dev_t* shm_init_data(rvvm_machine_t* machine, const char * path, const char * dev_name); +PUBLIC rvvm_mmio_dev_t* shm_init_exe(rvvm_machine_t* machine, const char * path, const char * dev_name); + ++#include "pci-bus.h" ++ ++PUBLIC pci_dev_t* virtio_pci_init(rvvm_machine_t* machine); ++ +#endif diff --git a/src/devices/virtio-blk.c b/src/devices/virtio-blk.c new file mode 100644 @@ -5804,7 +6295,7 @@ index 0000000..c2c53f7 +void window_unlock(uint32_t id); +#endif diff --git a/src/main.c b/src/main.c -index 7cbe407..0b0bcc1 100644 +index 7cbe407..45f0f7d 100644 --- a/src/main.c +++ b/src/main.c @@ -39,6 +39,7 @@ along with this program. If not, see . @@ -5933,7 +6424,17 @@ index 7cbe407..0b0bcc1 100644 } if (rvvm_getarg("dumpdtb")) rvvm_dump_dtb(machine, rvvm_getarg("dumpdtb")); return true; -@@ -263,6 +315,7 @@ static int rvvm_cli_main(int argc, const char** argv) +@@ -248,6 +300,9 @@ static int rvvm_cli_main(int argc, const char** argv) + clint_init_auto(machine); + plic_init_auto(machine); + pci_bus_init_auto(machine); ++ if (!virtio_pci_init(machine)) { ++ rvvm_error("Failed to initialize virtio-pci"); ++ } + i2c_oc_init_auto(machine); + + rtc_goldfish_init_auto(machine); +@@ -263,6 +318,7 @@ static int rvvm_cli_main(int argc, const char** argv) #endif if (rvvm_cli_configure(machine, argc, argv, bootrom, tap)) {