# Microchip PolarFire Icicle Kit status

**URL:** <https://sel4.discourse.group/t/microchip-polarfire-icicle-kit-status/675>\
**Category:** New to seL4\
**Created:** [March 8, 2023, 2:00am UTC](https://sel4.discourse.group/t/microchip-polarfire-icicle-kit-status/675 "2023-03-08T02:00:49Z")\
**Posts on this page:** 1\
**Showing post:** 24

<div class="post-metadata">

**Author:** ![ivanvelickovic](https://yyz2.discourse-cdn.com/free1/user_avatar/sel4.discourse.group/ivanvelickovic/32/348_2.png) [@ivanvelickovic](https://sel4.discourse.group/u/ivanvelickovic)\
**Post date:** [August 20, 2023, 10:33pm UTC](https://sel4.discourse.group/t/microchip-polarfire-icicle-kit-status/675/24 "2023-08-20T22:33:19Z")

</div>

## Renode

I have not looked into using Renode for seL4CP, I am mainly waiting for it to be more mature as I’ve had various issues with it (see [GitHub - Ivan-Velickovic/sel4\_renode: Simulating seL4 projects with Renode](https://github.com/Ivan-Velickovic/sel4_renode)).

You can load binary files in Renode, for example: `sysbus LoadBinary @../tmp_build/loader.img 0x70000000`. Note that you will also need to set the program counter to where the image is loaded, so in this case `cpu PC 0x70000000`.

Unfortunately I have Renode working with seL4CP in the non-hypervisor case, but not when hypervisor mode is turned on, which is the default configuration in my seL4CP fork for the QEMU ARM virt platform. I don’t have time to investigate right this moment. But given that QEMU and hardware where seL4 is configured in hypervisor mode work, I suspect either this is a bug in Renode or a misconfiguration on my part.

The full platform description is here:

```auto
cpu: CPU.ARMv8A @ sysbus
    cpuType: "cortex-a53"
    genericInterruptController: gic

timer: Timers.ARM_GenericTimer @ cpu
    frequency: 62500000
    EL3PhysicalTimerIRQ -> gic#0@29
    EL1PhysicalTimerIRQ -> gic#0@30
    EL1VirtualTimerIRQ -> gic#0@27
    NonSecureEL2PhysicalTimerIRQ -> gic#0@26
    NonSecureEL2VirtualTimerIRQ -> gic#0@28

gic: IRQControllers.ARM_GenericInterruptController @ {
        sysbus new Bus.BusMultiRegistration { address: 0x8000000; size: 0x010000; region: "distributor" };
        sysbus new Bus.BusMultiRegistration { address: 0x8010000; size: 0x010000; region: "cpuInterface" }
    }
    [0-1] -> cpu@[0-1]
    architectureVersion: IRQControllers.ARM_GenericInterruptControllerVersion.GICv2
    supportsTwoSecurityStates: true

flash: Memory.MappedMemory @ sysbus 0x0
    size: 0x08000000

bl31: Memory.MappedMemory @ sysbus 0x0e000000
    size: 0x01000000

ram: Memory.MappedMemory @ sysbus 0x40000000
    size: 0x80000000

uart0: UART.PL011 @ sysbus 0x09000000
    -> gic@1

```

The full script is here:

```auto
:name: QEMU ARM virt
:description: This script runs QEMU ARM virt seL4CP image on a 64-bit ARM Cortex-A53.

using sysbus
$name?="ARM Cortex-A53"
mach create $name

machine LoadPlatformDescription @qemu_arm_virt.repl

showAnalyzer uart0

macro reset
"""
    uart0 WriteDoubleWord 0x30 0x301
    uart0 WriteDoubleWord 0x2c 0x40
    cpu SetAvailableExceptionLevels true false
    cpu PC 0x70000000
    sysbus LoadBinary @../tmp_build/loader.img 0x70000000
"""
runMacro $reset

```

I ran Renode with the following command:  
`renode -e "start @qemu_arm_virt.resc" --console`

## Polarfire on QEMU

These are the clearest instructions I can produce for getting it working on my end. I am using the same QEMU version as you.

```auto
# Current latest SDK
unzip sel4cp-sdk-dev-d509be2-linux-x86-64.zip
tar xf sel4cp-sdk-1.2.6.tar.gz
cd sel4cp-sdk-1.2.6/board/polarfire/example/hello
git clone git@github.com:seL4/seL4.git
dtc -I dts -O dtb seL4/tools/dts/mpfs_icicle.dts > mpfs_icicle.dtb
mkdir build
make BUILD_DIR=build SEL4CP_SDK=../../../../ SEL4CP_BOARD=polarfire SEL4CP_CONFIG=debug
qemu-system-riscv64 -M microchip-icicle-kit -smp 5 -m 2G -display none -serial stdio -serial null -serial null -kernel build/loader.img -dtb mpfs_icicle.dtb

```

## Polarfire on hardware

It is not necessary to convert the `loader.img` file. By the log it looks like the booting process for Polarfire is OpenSBI → U-Boot → seL4/seL4CP. In this case after U-Boot loads all you need to do is `go 0x80200000` after loading the image into memory at address `0x80200000`. This can be via TFTP booting or `fatload` if you have an MMC device.

---

_[View the full topic](https://sel4.discourse.group/t/microchip-polarfire-icicle-kit-status/675)._
