[#50762] VirtIO: Add VirtIOFSDevice, add VirtIO tests for Linux
diff --git a/src/Infrastructure b/src/Infrastructure
index cf2dfa2..b391d50 160000
--- a/src/Infrastructure
+++ b/src/Infrastructure
@@ -1 +1 @@
-Subproject commit cf2dfa24f38eec30a7e1257a72000234f9fc3234
+Subproject commit b391d5008643ed6faa92f02ec0d7a74772ec7e57
diff --git a/tests/peripherals/VirtIO.robot b/tests/peripherals/VirtIO.robot
index b27f6b7..443b183 100644
--- a/tests/peripherals/VirtIO.robot
+++ b/tests/peripherals/VirtIO.robot
@@ -1,28 +1,64 @@
+*** Settings ***
+Suite Setup                     Custom Suite Setup
+Suite Teardown                  Custom Suite Teardown
+Library                         OperatingSystem
+
 *** Variables ***
 ${UART}                         sysbus.uart0
 ${DRIVE}                        https://dl.antmicro.com/projects/renode/empty-ext4-filesystem.img-s_33554432-1eb65a808612389cc35a69b81178fbad5708a863
-${SCRIPT}                       ${CURDIR}/../../scripts/single-node/hifive_unleashed.resc
+${FS}                           https://dl.antmicro.com/projects/renode/virtio-filesystem-passthrough_hp_uds-s_7318728-f7b60ce9b60c82cede19e798e81971663e1c0ad2
+${SCRIPT_BLK}                   ${CURDIR}/../../scripts/single-node/hifive_unleashed.resc
+${SCRIPT_FS}                    ${CURDIR}/../../tests/peripherals/virtio-litex.resc
 ${INPUT}                        Quick Brown Fox Jumps Over the Lazy Dog
 ${PROMPT}                       #
+${SOCK_FILE}                    ${CURDIR}/fs.sock
+${SHARED_FILE}                  testfile
+${SHARED_DIR}                   shareddir
+${VIRTIOFS_TAG}                 "tag0"
+${SYSTEM}=                      Evaluate         platform.system()    modules=platform
 
 *** Keywords ***
-Create Machine
-    Execute Command             \$fdt?=@https://dl.antmicro.com/projects/renode/virtio-hifive_unleashed.dtb-s_10640-08834542504afb748827fdca52515f156e971d5f
-    Execute Script              ${SCRIPT}
-    Execute Command             machine LoadPlatformDescriptionFromString 'virtio: Storage.VirtIOBlockDevice @ sysbus 0x100d0000 { IRQ -> plic@50 }'
+Custom Suite Setup
+    Setup
 
-Prepare Drive
-    ${TEMP_DRIVE}=              Download File  ${DRIVE}
-    Set Suite Variable          ${DRIVE_PATH}    ${TEMP_DRIVE}
+    ${TEMP_DRIVE}=              Download File    ${DRIVE}
+    ${DIR}  ${FILE_NAME}=       Split Path       ${TEMP_DRIVE}
+    Copy File                   ${TEMP_DRIVE}    ${TEMPDIR}
+    Set Suite Variable          ${DRIVE_PATH}    ${TEMPDIR}${/}${FILE_NAME}
+    Set Suite Variable          ${SOCK_PATH}     ${SOCK_FILE}
+    ${TEMP_FS}=                 Download File    ${FS}
+    ${DIR}  ${FILE_NAME}=       Split Path       ${TEMP_FS}
+    Copy File                   ${TEMP_FS}       ${TEMPDIR}
+    Set Suite Variable          ${FS_PATH}       ${TEMPDIR}${/}${FILE_NAME}
+    Run Process                 chmod    +x      ${FS_PATH}
 
-Setup Machine
+Custom Suite Teardown
+    Remove File                 ${DRIVE_PATH}
+    Remove File                 ${FS_PATH}
+    Teardown
+
+Create Machine VirtIOBlock
+    Execute Command             $fdt=@https://dl.antmicro.com/projects/renode/virtio-hifive_unleashed.dtb-s_10640-08834542504afb748827fdca52515f156e971d5f
+    Execute Script              ${SCRIPT_BLK}
+    Execute Command             machine LoadPlatformDescriptionFromString 'virtioblk: Storage.VirtIOBlockDevice @ sysbus 0x100d0000 { IRQ -> plic@50 }'
+
+Create Machine VirtIOFS
+    Execute Command             $platform=@tests/peripherals/virtio-platform.repl
+    Execute Command             $img=@https://dl.antmicro.com/projects/renode/virtio-filesystem-image-s_8448188-414604e8f64c41ebdbffe0f9ae7525c20bb1b124
+    Execute Command             $dtb=@https://dl.antmicro.com/projects/renode/virtio-filesystem-rv32.dtb-s_1806-b2ad3ecaf517c6a6781d1cbb48eff6fca7972094
+    Execute Command             $osbi=@https://dl.antmicro.com/projects/renode/litex_vexriscv_smp--opensbi.bin-s_45360-dcfe5f7b149bd1e0232609d87fb698f95f5e33c4
+    Execute Command             $rootfs=@https://dl.antmicro.com/projects/renode/virtio-filesystem-rootfs.cpio-s_39962112-95a3591d189699f21b988b036a9843c882d8e42f
+    Execute Script              ${SCRIPT_FS}
+    Execute Command             machine LoadPlatformDescriptionFromString 'virtiofs: Storage.VirtIOFSDevice @ sysbus 0x100d0000 { IRQ -> plic@2 }'
+    Execute Command             virtiofs Create @${SOCK_PATH} ${VIRTIOFS_TAG}
+
+Setup Machine VirtIOBlock
     Wait For Prompt On Uart     buildroot login:
     Write Line To Uart          root
     Wait For Prompt On Uart     Password:
     Write Line To Uart          root             waitForEcho=false
     Wait For Prompt On Uart     ${PROMPT}
-    
-    Execute Command             virtio LoadImage @${DRIVE_PATH} true
+    Execute Command             virtioblk LoadImage @${DRIVE_PATH} true
     Wait For Prompt On Uart     ${PROMPT}
     Write Line To Uart          dmesg -n 1
     Wait For Prompt On Uart     ${PROMPT}
@@ -31,14 +67,47 @@
     Write Line To Uart          mount /dev/vda /mnt/drive
     Wait For Prompt On Uart     ${PROMPT}
 
+Setup Machine VirtIOFS
+    Wait For Prompt On Uart     buildroot login: 
+    Write Line To Uart          root
+    Wait For Line On Uart       root login on 'console'
+    Wait For Prompt On Uart     ${PROMPT}
+    Write Line To Uart          mkdir ${SHARED_DIR}
+    Wait For Prompt On Uart     ${PROMPT}
+    Write Line To Uart          mount -t virtiofs ${VIRTIOFS_TAG} ${SHARED_DIR}
+    Wait For Prompt On Uart     ${PROMPT}
+
+Setup Shared Directory
+    Create Directory            ${SHARED_DIR}
+    Create File                 ${SHARED_DIR}/${SHARED_FILE}    ${INPUT}
+
 *** Test Cases ***
-Should Boot
-    Prepare Drive
-    Create Machine
+Read Shared Directory
+    [Tags]                      skip_windows    skip_osx
+    # Unix domain sockets
+
+    Setup Shared Directory
+    ${FS_PROCESS}=              Start Process    ${FS_PATH}    ${SHARED_DIR}    --socket    ${SOCK_PATH}
+
+    Create Machine VirtIOFS
     Create Terminal Tester      ${UART}
     Start Emulation
     
-    Setup Machine
+    Setup Machine VirtIOFS
+    Write Line To Uart          ls -al ${SHARED_DIR}
+    Wait For Prompt On Uart     ${PROMPT}
+    Write Line To Uart          cat ${SHARED_DIR}/${SHARED_FILE}
+    Wait For Prompt On Uart     ${INPUT}
+    Sleep                       5s
+    Terminate Process           ${FS_PROCESS}    kill=true
+    Run Process                 rm    ${SOCK_PATH}
+
+Should Boot
+    Create Machine VirtIOBlock
+    Create Terminal Tester      ${UART}
+    Start Emulation
+    
+    Setup Machine VirtIOBlock
     Write Line To Uart          echo ${INPUT} > /mnt/drive/file
     Wait For Prompt On Uart     ${PROMPT}
     Write Line To Uart          cat /mnt/drive/file
@@ -53,11 +122,11 @@
     Sleep                       5s
 
 Should Be Persistent
-    Create Machine
+    Create Machine VirtIOBlock
     Create Terminal Tester      ${UART}
     Start Emulation
     
-    Setup Machine
+    Setup Machine VirtIOBlock 
     Write Line To Uart          cat /mnt/drive/file
     Wait For Line On Uart       ${INPUT}
     Wait For Prompt On Uart     ${PROMPT}
diff --git a/tests/peripherals/virtio-litex.resc b/tests/peripherals/virtio-litex.resc
new file mode 100644
index 0000000..f61d720
--- /dev/null
+++ b/tests/peripherals/virtio-litex.resc
@@ -0,0 +1,15 @@
+using sysbus
+mach create
+
+machine LoadPlatformDescription $platform
+
+showAnalyzer uart0
+
+sysbus LoadBinary $img 0x40000000
+sysbus LoadBinary $dtb 0x40ef0000
+sysbus LoadBinary $osbi 0x40f00000
+sysbus LoadBinary $rootfs 0x42000000
+
+cpu PC 0x40f00000
+
+machine StartGdbServer 3333
diff --git a/tests/peripherals/virtio-platform.repl b/tests/peripherals/virtio-platform.repl
new file mode 100644
index 0000000..dbfb6ab
--- /dev/null
+++ b/tests/peripherals/virtio-platform.repl
@@ -0,0 +1,41 @@
+rom: Memory.MappedMemory @ sysbus 0x0
+    size: 0x10000
+
+sram: Memory.MappedMemory @ sysbus 0x10000000
+    size: 0x2000
+
+main_ram: Memory.MappedMemory @ sysbus 0x40000000
+    size: 0x10000000
+
+spiflash: Memory.MappedMemory @ sysbus 0xd0000000
+    size: 0x1000000
+
+clint: IRQControllers.CoreLevelInterruptor @ sysbus 0xf0010000
+    frequency: 100000000
+    [0, 1] -> cpu@[3, 7]
+
+plic: IRQControllers.PlatformLevelInterruptController @ sysbus 0xf0c00000
+    [0, 1, 2] -> cpu@[11, 9, 13]
+    numberOfSources: 32
+    numberOfContexts: 3
+    prioritiesEnabled: false
+
+cpu: CPU.VexRiscv @ sysbus
+    cpuType: "rv32imac_zicsr_zifencei"
+    builtInIrqController: false
+    privilegeArchitecture: PrivilegeArchitecture.Priv1_10
+    timeProvider: clint
+
+ctrl: Miscellaneous.LiteX_SoC_Controller @ sysbus 0xf0000000
+
+uart0: UART.LiteX_UART @ sysbus 0xf0001000
+
+timer0: Timers.LiteX_Timer @ sysbus 0xf0001800
+    frequency: 100000000
+
+litespi0: SPI.LiteX_SPI @ sysbus 0xf0007000
+
+sysbus:
+    init add:
+        SilenceRange <4026544128 0x200> # ddrphy
+        SilenceRange <4026546176 0x200> # sdram
diff --git a/tests/tests.yaml b/tests/tests.yaml
index 8804495..171eabd 100644
--- a/tests/tests.yaml
+++ b/tests/tests.yaml
@@ -150,3 +150,4 @@
 - tests/peripherals/S32K3XX_FlexCAN.robot
 - tests/platforms/BeagleV-StarLight.robot
 - tests/unit-tests/virtual-time.robot
+- tests/peripherals/VirtIO.robot