Hey Nico,
Cool that you're still on it and got so far already. I've applied your "ping"-snippet to my branches. Then in 'os/run/tz_vmm.run' replaced 'run_genode_until STUFF' by 'run_genode_until forever' and outcommented everything after that line. Now I'm getting a working prompt and proper pings at both our imx53-qsb and our imx53-usb-armory.
Are you still targeting Linux 3.14? If your kernel uses the EPIT timer it may interfere with Genodes userland timer-driver (os/src/drivers/timer/hw/epit) that provides the 'Timer::Connection' to you.
You may instrument 'Kernel::Vm::exception(...)' in 'base-hw/src/core/include/kernel/vm.h' or even 'kernel()' in 'base-hw/src/core/kernel/kernel.cc' to see if the context switch really might be problem. If the problem is caused by bad Linux-IO, my IO-tracing/filter tool for Linux may help you debugging/solving it. The initial commit is https://github.com/m-stein/linux/commit/579c91d159905eb61aed9e8e36748069fbbf... and I enhanced it yesterday on the https://github.com/m-stein/linux/tree/usb_armory_genode_esdhc branch.
Cheers, Martin
On 04.02.2015 17:12, Nico Weichbrodt wrote:
Hi,
quick followup: The hang is caused by my Genode "ping" loop. This is my code: int main() { PDBG("creating kernel stuff"); static Vm vm("linux_tzrun", "imx53-qsrb-genode.dtb", "initrd.gz", cmdline, Trustzone::NONSECURE_RAM_BASE, Trustzone::NONSECURE_RAM_SIZE, KERNEL_OFFSET, MACH_TYPE_QSB); PDBG("creating vmm"); static Vmm::Vmm vmm(&vm); PDBG("starting vmm"); vmm.start(); PDBG("creating swmanager"); static SWManager swm(&vmm); PDBG("starting swmanager"); swm.run();
// sleep_forever();
Timer::Connection timer; while(1) { PDBG("ping"); timer.msleep(5000); } return 0; }
If I change the timer sleep value, then the kernel hangs when the next print should be happening. If I uncomment the sleep_forever() then Linux boots and I get a login prompt and I am able to ssh into the system. On our 2.6.x kernel the periodic ping is working. So there seems to be an issue with the worldswitch right? I will investigate this further tomorrow.
Cheers, Nico
Von: Nico Weichbrodt Gesendet: Mittwoch, 4. Februar 2015 15:18 An: Genode OS Framework Mailing List Betreff: AW: AW: AW: AW: Running Linux 3.14 as a Genode VM
Hi,
I have a deadline in the near future so I put my kernel hacking on hold and started working on the software that would run inside the Linux VM and pretended Genode was available. I imported your other changes into my Linux and I now have a kinda booting kernel, many thanks for this. But I can't get to a login prompt. I have a Debian 8 root file system and systemd is initializing all kinds of stuff. I also have a SATA Harddrive on my board and systemd hangs here: [ OK ] Started Remount Root and Kernel File Systems. [ OK ] Started Apply Kernel Variables. Starting Load/Save Random Seed... [ OK ] Reached target Local File Systems (Pre). Starting Copy rules generated while the root was ro... Starting LSB: Tune IDE hard disks... [ OK ] Started Load/Save Random Seed. [ OK ] Started Copy rules generated while the root was ro. [ OK ] Started LSB: Tune IDE hard disks. [ OK ] Found device /dev/ttymxc0. [ OK ] Found device SAMSUNG_HD103UJ 1. Starting File System Check on /dev/sda1... [ 6.584147] random: nonblocking pool is initialized [ 6.648619] systemd-fsck[150]: /dev/sda1: clean, 125/61054976 files, 4207617/244190390 blocks [ OK ] Started File System Check on /dev/sda1.
The root file system is on the micro SD card and sda1 should be mounted to /mnt which is working fine with a standalone Linux. I have a period console output inside Genode which writes "ping" to the console every 250ms but this is not working after the hang. The last ping I see is during the call to my initrd which mounts the root file system and starts systemd through busybox.
I will try if it boots without the harddrive.
I know you use the usb armory and not the i.MX53 Quick Start Board so you don't have a SATA port but if you have any ideas, please let me know.
Cheers, Nico ________________________________________ Von: Martin Stein Gesendet: Dienstag, 3. Februar 2015 18:17 An: Genode OS Framework Mailing List Betreff: Re: AW: AW: AW: Running Linux 3.14 as a Genode VM
Hi Nico,
How's your VM-project doing? We've updated to Linux 3.18.2 in the meantime. It reaches the prompt now and MMC access is working. I have created online branches https://github.com/m-stein/linux/tree/usb_armory_genode_tz_vmm and https://github.com/m-stein/genode/tree/usb_armory_tz_vmm that provide my current state. I'd be glad to hear from you.
Cheers, Martin
On 26.01.2015 12:27, Nico Weichbrodt wrote:
Hi,
awesome! I know it's not a good idea to disable the timer but I thought disabling it might give me more information about what's happening. The data-abort you get is the same I got after disabling the timer. It's Linux trying to access the GPIO. You can take a look what I did here: https://github.com/envy/linux/commit/1aade6f960aec6fa5a18e6b6effa82f8ff1533c... to disable it. This is basically what Stefan Kalkowski did here: https://github.com/skalk/linux/commit/eccce1c595d7962c95086d6fa60291f7c2c1a4...
I will try your fix tomorrow, I forgot to bring my development VM to uni today...
Cheers, Nico ________________________________________ Von: Martin Stein Gesendet: Montag, 26. Januar 2015 12:14 An: Genode OS Framework Mailing List Betreff: Re: AW: AW: Running Linux 3.14 as a Genode VM
Hi Nico,
Thank you for your detailed feedback about your progress :)
Although it enabled you to go on, I don't think that it is a good idea to disable the GPT timer in the long term. Thus I've digged a little deeper into the "Calibrating delay loop" problem. What goes on after the 'msr CPSR_c, rx' is that the kernel catches GPT timer IRQs all the time and thus not getting any further. The IRQs aren't handled because the driver for the interrupt controller (arch/arm/mach-imx/tzic.c) accepts secure interrupts only in 'tzic_handle_irq' (see 'stat = ... & __raw_readl(tzic_base + TZIC_INTSEC0(i))' ). Looking a little bit around, I've found that the driver attempts to set all IRQs secure by doing '__raw_writel(0xFFFFFFFF, tzic_base + TZIC_INTSEC0(i));' in 'tzic_init_irq' which, of course, gets ignored when Linux runs as nonsecure VM. So I've configured out the masking in 'tzic_handle_irq' via a '#define GENODE_TZ_VMM' switch and after that, my Linux got further:
Linux version 3.16.2-ga3bd210-dirty (lypo@...207...) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ) #1 PREEMPT Mon Jan 26 11:42:29 CET 2015 CPU: ARMv7 Processor [412fc085] revision 5 (ARMv7), cr=10c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache Machine model: Freescale i.MX53 Quick Start Board bootconsole [earlycon0] enabled Memory policy: Data cache writeback On node 0 totalpages: 65536 free_area_init_node: node 0, pgdat 803c1be8, node_mem_map 8fdf8000 Normal zone: 512 pages used for memmap Normal zone: 0 pages reserved Normal zone: 65536 pages, LIFO batch:15 CPU: All CPU(s) started in SVC mode. pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 pcpu-alloc: [0] 0 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024 Kernel command line: console=ttymxc0,115200 earlyprintk loglevel=10 PID hash table entries: 1024 (order: 0, 4096 bytes) Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) Memory: 255824K/262144K available (2662K kernel code, 121K rwdata, 904K rodata, 120K init, 86K bss, 6320K reserved, 0K highmem) Virtual kern> <40fiq el memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xffe00000 (2048 kB) vmalloc : 0x90800000 - 0xff000000 (1768 MB) lowmem : 0x80000000 - 0x90000000 ( 256 MB) pkmap : 0x7fe00000 - 0x80000000 ( 2 MB) modules : 0x7f000000 - 0x7fe00000 ( 14 MB) .text : 0x80008000 - 0x80383a94 (3567 kB) .init : 0x80384000 - 0x803a21bc ( 121 kB) .data : 0x803a4000 - 0x803c2620 ( 122 kB) .bss : 0x803c262c - 0x803d8018 ( 87 kB) SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 Preemptible hierarchical RCU implementation. NR_IRQS:0 nr_irqs:0 0 TrustZone Interrupt Controller (TZIC) initialized CPU identified as i.MX53, silicon rev 2.1 Switching to timer-based delay loop sched_clock: 32 bits at 33MHz, resolution 29ns, wraps every 128849015778ns clocksource_of_init: no matching clocksources found Console: colour dummy device 80x30 Calibrating delay loop (skipped), value calculated using timer frequency.. 66.66 BogoMIPS (lpj=333333) pid_max: default: 32768 minimum: 301 Mount-cache hash table entri> <40fiq es: 1024 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) CPU: Testing write buffer coherency: ok Setting up static identity map for 0x8028a820 - 0x8028a878 VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 2 pinctrl core: initialized pinctrl subsystem NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations
dab f5784008
def [init -> tz_vmm] Cpu state: [init -> tz_vmm] Register Virt Phys [init -> tz_vmm] --------------------------------- [init -> tz_vmm] r0 = f5784008 [53f84008] [init -> tz_vmm] r1 = 8f896c10 [8f896c10] [init -> tz_vmm] r2 = 00000001 [00000000] [init -> tz_vmm] r3 = 8018d4e0 [8018d4e0] [init -> tz_vmm] r4 = 8f838e68 [8f838e68] [init -> tz_vmm] r5 = 00000000 [00000000] [init -> tz_vmm] r6 = 00000000 [00000000] [init -> tz_vmm] r7 = f5784004 [53f84004] [init -> tz_vmm] r8 = 8f898340 [8f898340] [init -> tz_vmm] r9 = 8fdedfcc [8fdedfcc] [init -> tz_vmm] r10 = 8f838e68 [8f838e68] [init -> tz_vmm] r11 = 00000000 [00000000] [init -> tz_vmm] r12 = f5784000 [53f84000] [init -> tz_vmm] sp = 00000000 [00000000] [init -> tz_vmm] lr = 00000000 [00000000] [init -> tz_vmm] ip = 8018d4e0 [8018d4e0] [init -> tz_vmm] cpsr = 20000013 [init -> tz_vmm] sp_und = 803c27d8 [803c27d8] [init -> tz_vmm] lr_und = 803c27d8 [803c27d8] [init -> tz_vmm] spsr_und = 00000000 [00000000] [init -> tz_vmm] sp_svc = 8f853cd0 [8f853cd0] [init -> tz_vmm] lr_svc = 8018dbbc [8018dbbc] [init -> tz_vmm] spsr_svc = 20000013 [00000000] [init -> tz_vmm] sp_abt = 803c27cc [803c27cc] [init -> tz_vmm] lr_abt = 803c27cc [803c27cc] [init -> tz_vmm] spsr_abt = 00000000 [00000000] [init -> tz_vmm] sp_irq = 803c27c0 [803c27c0] [init -> tz_vmm] lr_irq = 80010f80 [80010f80] [init -> tz_vmm] spsr_irq = 20000093 [00000000] [init -> tz_vmm] sp_fiq = 00000000 [00000000] [init -> tz_vmm] lr_fiq = 00000000 [00000000] [init -> tz_vmm] spsr_fiq = 00000000 [00000000] [init -> tz_vmm] ttbr0 = 80004019 [init -> tz_vmm] ttbr1 = 80004019 [init -> tz_vmm] ttbrc = 00000000 [init -> tz_vmm] dfar = f5784008 [53f84008] [init -> tz_vmm] exception = data_abort [init -> tz_vmm] Could not handle data-abort will exit!
To be on the safe side, I've also applied the switch to 'tzic_set_irq_fiq' to prevent Linux from thinking it were able to use FIQs:
if (GENODE_TZ_VMM) { printk(KERN_NOTICE, "Warning: Can't use FIQ in nonsecure world" return -EINVAL; }
Cheers, Martin