blob: 82b1b20aa5143f0947de6db30e8cba6276d9bf3c [file] [log] [blame] [edit]
mach create
include @scripts/single-node/bus-isolation/SampleStateAwareReaderWithTransactionState.cs
include @scripts/single-node/bus-isolation/SampleStateAwareReader.cs
include @scripts/single-node/bus-isolation/SampleStateAwarePeripheral.cs
machine LoadPlatformDescriptionFromString """
cpu0: CPU.CortexM @ sysbus
cpuType: "cortex-m33"
numberOfMPURegions: 8
nvic: nvic
enableTrustZone: true
nvic: IRQControllers.NVIC @ sysbus 0xe000e000
-> cpu0@0
flash0: Memory.MappedMemory @ sysbus 0x8000000
size: 0x80000
"""
using sysbus
# Look at SampleStateAwarePeripheral for an example of implementing different peripheral behavior based on the
# transaction initiator and/or its state, and SampleStateAwareReader for an example of performing a transaction
# with specified initiator identity.
# Of course, 2 peripherals can be registered at the same address as long as they require a different cpu
# state. See the `priv2_` ones as an example.
machine LoadPlatformDescriptionFromString """
unpriv: Python.PythonPeripheral @ sysbus new Bus.BusPointRegistration { address: 0x10000; condition: "(cpuSecure || !privileged) && initiator == cpu0" }
size: 0x4
initable: false
script: "request.Value = 0x1010"
priv: Python.PythonPeripheral @ sysbus new Bus.BusPointRegistration { address: 0x10004; condition: "cpuSecure && privileged && initiator == cpu0" }
size: 0x4
initable: false
script: "request.Value = 0x2020"
both: Python.PythonPeripheral @ sysbus new Bus.BusPointRegistration { address: 0x10008 }
size: 0x4
initable: false
script: "request.Value = 0x3030"
priv2_priv: Python.PythonPeripheral @ sysbus new Bus.BusPointRegistration { address: 0x1000c; condition: "privileged" }
size: 0x4
initable: false
script: "request.Value = 0x4444"
priv2_unpriv: Python.PythonPeripheral @ sysbus new Bus.BusPointRegistration { address: 0x1000c; condition: "!privileged" }
size: 0x4
initable: false
script: "request.Value = 0x0404"
priv_aware: CPU.SampleStateAwarePeripheral @ sysbus new Bus.BusPointRegistration { address: 0x10010; condition: "initiator == cpu0 || initiator == reader || initiator == reader2" }
size: 0x100
priv_aware2: CPU.SampleStateAwarePeripheral @ sysbus new Bus.BusPointRegistration { address: 0x20010; condition: "cpuSecure && initiator == reader" }
size: 0x100
reader: CPU.SampleStateAwareReaderWithTransactionState @ sysbus
reader2: CPU.SampleStateAwareReader @ sysbus
reader3: CPU.SampleStateAwareReader @ sysbus
"""
cpu0 AssembleBlock 0x8000000 """
// First read in privileged mode
ldr r0, =0x10000
ldr r3, [r0] // expect 0x1010 in secure, 0 in nonsecure
ldr r3, [r0] // expect 0x1010 in secure, 0 in nonsecure
ldr r4, [r0, #4] // expect 0x2020 in secure, 0 in nonsecure
ldr r4, [r0, #4] // expect 0x2020 in secure, 0 in nonsecure
ldr r5, [r0, #8] // expect 0x3030
ldr r6, [r0, #12] // expect 0x4444
ldr r7, [r0, #16] // expect 0x63707507 in secure, 0x63707501 in nonsecure
ldr r8, [r0, #20] // expect 0x63707507 in secure, 0x63707501 in nonsecure
// Switch to unprivileged mode
mrs r2, CONTROL
orr r2, r2, #1
msr CONTROL, r2
isb
// Reread in unprivileged mode
ldr r9, [r0] // expect 0x1010 in both S and NS
ldr r10, [r0, #4] // expect 0 in both S and NS
ldr r11, [r0, #8] // expect 0x3030
ldr r12, [r0, #12] // expect 0x0404
ldr r1, [r0, #16] // expect 0x63707506 in secure, 0x63707500 in nonsecure
ldr r2, [r0, #20] // expect 0x63707506 in secure, 0x63707500 in nonsecure
b .
"""
cpu0 IDAUEnabled true
cpu0 TryAddImplementationDefinedExemptionRegion 0x8000000 0x80000ff
cpu0 TryAddImplementationDefinedExemptionRegion 0x10000 0x100ff
cpu0 PC 0x8000000