		Atomthreads on Realview-PB-A8 Guest

Atomthreads is a free, lightweight, portable, real-time scheduler for 
embedded systems. Please visit: http://atomthreads.com/ for more details.

The Realview-PB-A8 port of atomthreads is still not released officially, but
you can obtain the sources from: https://github.com/avpatel/atomthreads-arm

Atomthreads uses all the CPU & Hardware features except Memory managment unit
(MMU) and Floating point unit (FPU).

Please follow the steps below to build & run Atomthreads on Realview-PB-A8
Guest with Xvisor running on QEMU Realview-PB-A8 Host:

  [1. Build environment for Xvisor]
  # export CROSS_COMPILE=arm-linux-gnueabi-

  [2. GoTo Xvisor source directory]
  # cd <xvisor_source_directory>

  [3. Initialize Xvisor submodules]
  # git submodule init
  # git submodule update
  (Note: This is required to be done only once in freshly cloned xvisor source)

  [4. Configure Xvisor with Generic v7 default settings]
  # make ARCH=arm generic-v7-defconfig

  [5. Build Xvisor & DTBs]
  # make

  [6. Build Basic Firmware]
  # make -C tests/arm32/realview-pb-a8/basic

  [7. GoTo Atomthreads source directory]
  # cd <atomthreads_source_directory>/ports/arm32

  [8. Build Atomthreads]
  # make

  [9. Patch Atomthreads objects to replace sensitive non-priviledged instructions]
  # <xvisor_source_directory>/arch/arm/cpu/arm32/elf2cpatch.py -f build/arm_entry.o | <xvisor_source_directory>/build/tools/cpatch/cpatch32 build/arm_entry.o 0
  # <xvisor_source_directory>/arch/arm/cpu/arm32/elf2cpatch.py -f build/arm_irq.o | <xvisor_source_directory>/build/tools/cpatch/cpatch32 build/arm_irq.o 0
  # <xvisor_source_directory>/arch/arm/cpu/arm32/elf2cpatch.py -f build/atomport-asm.o | <xvisor_source_directory>/build/tools/cpatch/cpatch32 build/atomport-asm.o 0

  [10. Rebuild Atomthreads to reflect changed object files]
  # make

  [11. GoTo Xvisor source directory]
  # cd <xvisor_source_directory>

  [12. Create disk image for Xvisor]
  # mkdir -p ./build/disk/tmp
  # mkdir -p ./build/disk/system
  # cp -f ./docs/banner/roman.txt ./build/disk/system/banner.txt
  # cp -f ./docs/logo/xvisor_logo_name.ppm ./build/disk/system/logo.ppm
  # mkdir -p ./build/disk/images/arm32/realview-pb-a8
  # ./build/tools/dtc/bin/dtc -I dts -O dtb -o ./build/disk/images/arm32/realview-pb-a8.dtb ./tests/arm32/realview-pb-a8/realview-pb-a8.dts
  # cp -f ./build/tests/arm32/realview-pb-a8/basic/firmware.bin.patched ./build/disk/images/arm32/realview-pb-a8/firmware.bin
  # cp -f ./tests/arm32/realview-pb-a8/atomthreads/nor_flash.list ./build/disk/images/arm32/realview-pb-a8/nor_flash.list
  # cp -f ./tests/arm32/realview-pb-a8/xscript/one_guest_pb-a8.xscript ./build/disk/boot.xscript
  # cp -f <atomthreads_source_directory>/ports/arm32/build/kern1.bin ./build/disk/images/arm32/realview-pb-a8/kern1.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/kern2.bin ./build/disk/images/arm32/realview-pb-a8/kern2.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/kern3.bin ./build/disk/images/arm32/realview-pb-a8/kern3.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/kern4.bin ./build/disk/images/arm32/realview-pb-a8/kern4.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex1.bin ./build/disk/images/arm32/realview-pb-a8/mutex1.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex2.bin ./build/disk/images/arm32/realview-pb-a8/mutex2.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex3.bin ./build/disk/images/arm32/realview-pb-a8/mutex3.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex4.bin ./build/disk/images/arm32/realview-pb-a8/mutex4.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex5.bin ./build/disk/images/arm32/realview-pb-a8/mutex5.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex6.bin ./build/disk/images/arm32/realview-pb-a8/mutex6.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex7.bin ./build/disk/images/arm32/realview-pb-a8/mutex7.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex8.bin ./build/disk/images/arm32/realview-pb-a8/mutex8.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/mutex9.bin ./build/disk/images/arm32/realview-pb-a8/mutex9.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue1.bin ./build/disk/images/arm32/realview-pb-a8/queue1.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue2.bin ./build/disk/images/arm32/realview-pb-a8/queue2.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue3.bin ./build/disk/images/arm32/realview-pb-a8/queue3.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue4.bin ./build/disk/images/arm32/realview-pb-a8/queue4.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue5.bin ./build/disk/images/arm32/realview-pb-a8/queue5.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue6.bin ./build/disk/images/arm32/realview-pb-a8/queue6.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue7.bin ./build/disk/images/arm32/realview-pb-a8/queue7.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue8.bin ./build/disk/images/arm32/realview-pb-a8/queue8.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue9.bin ./build/disk/images/arm32/realview-pb-a8/queue9.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/queue10.bin ./build/disk/images/arm32/realview-pb-a8/queue10.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem1.bin ./build/disk/images/arm32/realview-pb-a8/sem1.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem2.bin ./build/disk/images/arm32/realview-pb-a8/sem2.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem3.bin ./build/disk/images/arm32/realview-pb-a8/sem3.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem4.bin ./build/disk/images/arm32/realview-pb-a8/sem4.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem5.bin ./build/disk/images/arm32/realview-pb-a8/sem5.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem6.bin ./build/disk/images/arm32/realview-pb-a8/sem6.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem7.bin ./build/disk/images/arm32/realview-pb-a8/sem7.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem8.bin ./build/disk/images/arm32/realview-pb-a8/sem8.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/sem9.bin ./build/disk/images/arm32/realview-pb-a8/sem9.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer1.bin ./build/disk/images/arm32/realview-pb-a8/timer1.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer2.bin ./build/disk/images/arm32/realview-pb-a8/timer2.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer3.bin ./build/disk/images/arm32/realview-pb-a8/timer3.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer4.bin ./build/disk/images/arm32/realview-pb-a8/timer4.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer5.bin ./build/disk/images/arm32/realview-pb-a8/timer5.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer6.bin ./build/disk/images/arm32/realview-pb-a8/timer6.bin
  # cp -f <atomthreads_source_directory>/ports/arm32/build/timer7.bin ./build/disk/images/arm32/realview-pb-a8/timer7.bin
  # genext2fs -B 1024 -b 32768 -d ./build/disk ./build/disk.img

  [13. Launch QEMU]
  # qemu-system-arm -M realview-pb-a8 -m 512M -display none -serial stdio -kernel build/vmm.bin -dtb build/arch/arm/board/generic/dts/arm/arm-realview-pba8.dtb -initrd build/disk.img

  [14. Kick Guest0 for starting Basic Firmware]
  XVisor# guest kick guest0

  [15. Bind to virtual UART]
  XVisor# vserial bind guest0/uart0

  [16. Copy kern1.bin atomthreads test from NOR flash to DDR]
  [guest0/uart0] basic# copy 0x100000 0x40100000 0x20000

  [17. Start atomthreads]
  [guest0/uart0] basic# go 0x100000

  [18. Enter character seqence 'ESCAPE+x+q" return to Xvisor prompt]
  [guest0/uart0] 

  (Note: replace all <> brackets based on your workspace)
  (Note: some of the above steps will need to be adapted for other
   types of ARM host)
  (Note: for more info on your desired ARM host refer docs/arm/)
  (Note: step 15 copies kern1.bin test case to 0x100000 instead of this you 
   can use kern2.bin, ..., mutex1.bin, ..., etc. testcases. All testcases are
   loaded to NOR flash location 0x40100000 at 0x20000 offset. All testcases are
   compiled for 0x100000 location so you have to copy them to same location and
   you can test only one test case at a time. To try another test after running
   a particular test we have to reset the guest from Xvisor prompt using guest
   command after step 17 and do step 15 to step 17 for another testcase.)
  (Note: step 15 & step 16 assume that text base address for atomthreads
   binary is 0x100000. You can change this in atomthreads source and modify
   the above steps accordingly.)
