I know TrustZone has support for memory virtualization in AArch64, but I'm looking to create a different model. Namely, I'd like to fully virtualize the memory map for the "virt" board.
As a basic example of what I want, assuming an execution environment that runs in a 1GB physical address space (0x0 - 0x3FFFFFFF), I'd like to be able to switch to a second execution environment with a distinct SW stack that runs in the second GB of a board memory (0x40000000 - 0x7FFFFFFF). The key points for my desired memory virtualization are the following...
- Both of these environments should have distinct virtual address spaces
- The OS in each environment should believe it is running on physical addresses 0x0 - 0x3FFFFFFF in both cases.
- Neither environment should have access to the physical memory state of the other
I initialize distinct AddressSpace and MemoryRegion structures for each of these GB blocks. Because all I want is a simple shift of physical address for one environment, I hesitate to mirror the (relatively) complex address translation process for TrustZone. Does anyone know if it would be better to either (a) provide custom read/write functions for the shifted MemoryRegion object, or (b) modify the target/arm code, such as adding a shift to get_phys_addr() in target/arm/helper.c?
Thanks in advance,
Kevin