Hi L4 Team,
I am trying to access SD card of Raspberry Pi 4 But the IO fail with
IO | new iomem region: p=0000007e000000 v=00000000400000 s=400000 (bmb=0x24370)
IO | map mem: p=0000007e300000 v=00000000700000 s=1000: failed(-12)
VMM: FATAL: Insufficient memory
Can you help me on what I am missing?
My configurations are:
----------- io.cfg ----------------------------------
local Res = Io.Res
local Hw = Io.Hw
local add_children = Io.Dt.add_children
add_children(Io.system_bus(), function()
mmc = Hw.Device(function()
compatible = { "brcm,bcm2835-mmc" };
Resource.reg0 = Res.mmio(0x7e300000, 0x7e3000FF);
Resource.irq0 = Res.irq(0x7e);
Property.flags = Io.Hw_device_DF_dma_supported;
end)
end)
-------- vm_hw.vbus ---------------------------
Io.add_vbusses
{
vm_hw = Io.Vi.System_bus(function()
MMC = wrap(Io.system_bus().mmc);
end);
}
-------- rpi_mmc.ned -------------------------
local L4 = require("L4");
local l = L4.default_loader;
vbus_l4linux = l:new_channel();
-- Start io & flash memory
l:start({
caps = {
sigma0 = L4.cast(L4.Proto.Factory, L4.Env.sigma0):create(L4.Proto.Sigma0),
icu = L4.Env.icu,
vm_hw = vbus_l4linux:svr()
},
log = {"IO", "y"}
}, "rom/io rom/io.cfg rom/vm_hw.vbus -vvvvvv");
l:startv({
caps = {
ram = L4.Env.user_factory:create(L4.Proto.Dataspace, 256 * 1024 * 1024, 7, 21):m("rws");
vbus = vbus_l4linux;
},
log = L4.Env.log:m("rws")
}, "rom/uvmm", "-v", "-krom/image.bin",
"-rrom/ramdisk-arm64.rd",
"-drom/virt-arm_virt-64-2.dtb",
"-cconsole=hvc0 ramdisk_size=10000 root=/dev/ram0 rw");
--------------- modules.list ---------------------
entry rpi-mmc
kernel fiasco -serial_esc
roottask moe rom/rpi-mmc.ned
module uvmm
module l4re
module ned
module virt-arm_virt-64-mod.dtb
module ramdisk-arm64.rd
module rpi-mmc.ned
module image.bin
module io
module io.cfg
module vm_hw.vbus
------------- I added mmc to device tree ---------
mmc@7e300000 {
compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci";
reg = <0x7e300000 0x100>;
interrupts = <0x0 0x7e 0x4>;
clocks = <0x3 0x1c>;
dmas = <0xa 0xb>;
dma-names = "rx-tx";
brcm,overclock-50 = <0x0>;
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <0x19>;
bus-width = <0x4>;
phandle = <0x2d>;
};
--------------------------------------------------------------------
I tested Linux kernel with uvmm module and without IO module and it was working perfectly. I compiled it with the following options on:
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BLK=y
CONFIG_BLK_MQ_VIRTIO=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_NET=y
---------------------------------------------------------------------
boot log messages are:
L4 Bootstrapper
Build: #104 Wed Oct 7 20:14:57 EET 2020, 7.5.0
Raspberry Pi Model 4B, Rev 1.1, 4096MB, SoC BCM2711 [c03111]
Warranty intact, OTP reading allowed, OTP programming allowed, Overvoltage allowed
RAM: 0000000000000000 - 000000003b3fffff: 970752kB
RAM: 0000000040000000 - 00000000fbffffff: 3080192kB
Total RAM: 3956MB
Scanning fiasco
Scanning sigma0
Scanning moe
Moving up to 14 modules behind 1100000
moving module 13 { 2540000-25400bb } -> { 262c000-262c0bb } [188]
moving module 12 { 253f000-253f555 } -> { 262b000-262b555 } [1366]
moving module 11 { 230c000-253e187 } -> { 23f8000-262a187 } [2302344]
moving module 10 { 15b3000-230b9ff } -> { 169f000-23f79ff } [13994496]
moving module 09 { 15b2000-15b22ea } -> { 169e000-169e2ea } [747]
moving module 08 { 1232000-15b1fff } -> { 131e000-169dfff } [3670016]
moving module 07 { 1231000-123176c } -> { 131d000-131d76c } [1901]
moving module 06 { 11be000-123041f } -> { 12aa000-131c41f } [468000]
moving module 05 { 11a0000-11bd14f } -> { 128c000-12a914f } [119120]
moving module 04 { 119f000-119fdbf } -> { 128b000-128bdbf } [3520]
moving module 03 { 10eb000-119e957 } -> { 11d7000-128a957 } [735576]
moving module 02 { 10ad000-10eaf0f } -> { 1199000-11d6f0f } [253712]
moving module 01 { 10a3000-10ac947 } -> { 118f000-1198947 } [39240]
moving module 00 { 1014000-10a24c7 } -> { 1100000-118e4c7 } [582856]
Loading fiasco
Loading sigma0
Loading moe
find kernel info page...
found kernel info page (via ELF) at 3000
Regions of list 'regions'
[ 0, fff] { 1000} Arch mpspin
[ 1000, 9ffff] { 9f000} Kern fiasco
[ a0000, a01ff] { 200} Root mbi_rt
[ 100000, 10e46f] { e470} Sigma0 sigma0
[ 140000, 17d70f] { 3d710} Root moe
[ 17e710, 189edf] { b7d0} Root moe
[ 1000000, 10122b3] { 122b4} Boot bootstrap
[ 1013210, 1013c1c] { a0d} Boot modinfo
[ 11d7000, 262c0bb] { 14550bc} Root Module
found kernel options (via ELF) at 4000
Sigma0 config ip:0010042c sp:00000000
Roottask config ip:00141594 sp:00000000
Starting kernel fiasco at 00001760
Hello from Startup::stage2
Number of IRQs available at this GIC: 256
FPU: Initialize
ARM generic timer: freq=54000000 interval=54000 cnt=2085101974
SERIAL ESC: allocated IRQ 125 for serial uart
Not using serial hack in slow timer handler.
Welcome to L4/Fiasco.OC!
L4/Fiasco.OC microkernel on arm
Rev: unknown compiled with gcc 7.5.0 for RPi4 (Broadcom 2711) []
Build: #1 Mon Oct 5 13:54:22 EET 2020
Allocate ARM PPI 25 to virtual 0
Allocate ARM PPI 27 to virtual 1
Allocate ARM PPI 25 to virtual 0
Allocate ARM PPI 27 to virtual 1
Allocate ARM PPI 25 to virtual 0
Cache config: ON
Allocate ARM PPI 27 to virtual 1
Calibrating timer loop... Cache config: ON
Allocate ARM PPI 25 to virtual 0
done.
Allocate ARM PPI 27 to virtual 1
MDB: use page size: 30
Cache config: ON
MDB: use page size: 21
ID_PFR[01]: 00002222 00000000MDB: use page size: 12
ID_[DA]FR0: 10305106 00000000
SIGMA0: Hello!
ID_MMFR[04]: 00001124 00000000 00000000 00000000
KIP @ ID_PFR[01]: 00002222 000000003000 ID_[DA]FR0: 10305106 00000000
ID_MMFR[04]: 00001124 00000000 00000000 00000000
allocated ID_PFR[01]: 00002222 000000004 ID_[DA]FR0: 10305106 00000000
KBID_MMFR[04]: 00001124 00000000 00000000 00000000
for maintenance structures
SIGMA0: Dump of all resource maps
RAM:------------------------
[4:RWX:a0000;a0fff]
[0:RWX:a1000;fffff]
[0:RWX:10f000;13ffff]
[4:R-X:140000;17dfff]
[4:RW-:17e000;189fff]
[0:RWX:18a000;11d6fff]
[4:RWX:11d7000;262cfff]
[0:RWX:262d000;3b3fffff]
[0:RWX:40000000;faffffff]
IOMEM:----------------------
[0:RW-:0;fff]
[0:RW-:3b400000;3fffffff]
[0:RWX:fc000000;ffffffffffffffff]
MOE: Hello world
MOE: found 4012740 KByte free memory
MOE: found RAM from a0000 to fb000000
MOE: allocated 4015 KByte for the page array @0x18a000
MOE: virtual user address space [0-7fffffffff]
MOE: rom name space cap -> [C:103000]
MOE: rwfs name space cap -> [C:105000]
BOOTFS: [11d7000-128a958] [C:107000] uvmm
BOOTFS: [128b000-128bdc0] [C:109000] vmm.lua
BOOTFS: [128c000-12a9150] [C:10b000] l4re
BOOTFS: [12aa000-131c420] [C:10d000] ned
BOOTFS: [131d000-131d76d] [C:10f000] virt-arm_virt-64-2.dtb
BOOTFS: [131e000-169e000] [C:111000] ramdisk-arm64.rd
BOOTFS: [169e000-169e2eb] [C:113000] rpi-mmc3.ned
BOOTFS: [169f000-23f7a00] [C:115000] image.bin
BOOTFS: [23f8000-262a188] [C:117000] io
BOOTFS: [262b000-262b556] [C:119000] io.cfg
BOOTFS: [262c000-262c0bc] [C:11b000] vm_hw.vbus
MOE: cmdline: moe rom/rpi-mmc3.ned
MOE: Starting: rom/ned rom/rpi-mmc3.ned
MOE: loading 'rom/ned'
Ned says: Hi World!
Ned: loading file: 'rom/rpi-mmc3.ned'
IO | Io service
IO | Verboseness level: 7
IO | unused physical memory space:
IO | [0000003b400000-0000003fffffff]
IO | [000000fc000000-ffffffffffffffff]
IO | no 'iommu' capability found, using CPU-phys for DMA
VMM[]: Created VCPU 0 @ 16000
IO | Loading: config 'rom/io.cfg'
IO | Loading: config 'rom/vm_hw.vbus'
IO | Add IRQ resources to vbus: IRQ [0000000000007e-0000000000007e 1] none (align=0 flags=1)
IO | vm_hw: [N12_GLOBAL__N_112Virtual_sbusE]
IO | Resources: ==== start ====
IO | Resources: ===== end =====
IO | L4ICU: [N2Vi6Sw_icuE]
IO | Resources: ==== start ====
IO | Resources: ===== end =====
IO | MMC: [N2Vi9Proxy_devE]
IO | Resources: ==== start ====
IO | IRQ [0000000000007e-0000000000007e 1] none (align=0 flags=1)
IO | IOMEM [0000007e300000-0000007e3000ff 100] 32-bit non-pref (align=ff flags=2)
IO | DMADOM [00000000000000-00000000000000 1] (align=0 flags=6)
IO | Resources: ===== end =====
IO | Real Hardware -----------------------------------
IO | System Bus:
IO | Resources: ==== start ====
IO | DMADOM [00000000000000-00000000000000 1] (align=0 flags=6)
IO | Resources: ===== end =====
IO | mmc:
IO | compatible= { "brcm,bcm2835-mmc" }
IO | Clients: ===== start ====
IO | MMC: [N2Vi9Proxy_devE]
IO | Clients: ===== end ====
IO | Resources: ==== start ====
IO | IRQ [0000000000007e-0000000000007e 1] none (align=0 flags=1)
IO | IOMEM [0000007e300000-0000007e3000ff 100] 32-bit non-pref (align=ff flags=2)
IO | DMADOM [00000000000000-00000000000000 1] (align=0 flags=6)
IO | Resources: ===== end =====
IO | warning: could not register control interface at cap 'platform_ctl'
IO | Ready. Waiting for request.
VMM[GIC]: create ARM GICv2
VMM[main]: Hello out there.
VMM[ram]: RAM: @ 0x2800000 size=0x10000000 (ci)
VMM[ram]: RAM: VMM mapping @ 0x1200000 size=0x10000000
VMM[ram]: RAM: VM offset=0xfffffffffea00000
VMM[main]: Loading kernel...
VMM[file]: load: @ 0x2880000
VMM[file]: copy in: to offset 0x80000-0xdd8a00
VMM[]: Create virtual console
VMM[guest]: New mmio mapping: @ f1040000 10000
VMM[GIC]: GICC virtualization only supports sizes up to 0x1000, adjusting device tree node
VMM[GIC]: GIC interrupt-controller.reg update: Adjusting GICC size from 20000 to 1000
VMM[guest]: New mmio mapping: @ f1060000 1000
VMM[guest]: New mmio mapping: @ f1120000 100
VMM[]: virtio_net@10000.l4vmm,virtiocap: capability net is invalid.
VMM[vm]: Device creation for virtual device virtio_net@10000 failed. Disabling device.
VMM[Timer]: Guest timer frequency is 54000000
using (1/54), (9942053/29) to calculate timeouts
VMM[psci]: Register PSCI device: hvc mode
VMM[ioproxy]: Registering IRQ resource MMC.irq0 : 0x7e
VMM[ioproxy]: Adding MMIO resource MMC.reg0 : [0x7e300000 - 0x7e3000ff]
IO | new iomem region: p=0000007e000000 v=00000000400000 s=400000 (bmb=0x24370)
IO | map mem: p=0000007e300000 v=00000000700000 s=1000: failed(-12)
VMM: FATAL: Insufficient memory
Best Regards,
Nasr