	Xvisor on Raspberry-Pi (or BCM2835 SOC) using SD Booting 

This section of readme explains how to build & run Xvisor on actual 
Raspberry Pi board using SD booting feature of Raspberry Pi (or BCM2835 SOC).

By default, Xvisor for BCM2835 supports Realview-EB-MPCore guest so we will 
show how to run Basic Firmware (and/or Linux) on Realview-EB-MPCore guest.

As first step of SD booting on BCM2835 SOC, we prepare a SD card (> 4GB) with
Uboot. To do this,
 1) Setup SD card with debian weezy image and make sure that you get
    Raspberry Pi linux console on serial port
    (For detailed steps, http://elinux.org/RPi_Easy_SD_Card_Setup)
 2) Now compile and install u-boot on SD card for Raspberry Pi so that you get
    u-boot prompt whenever you power-on Raspberry Pi
    (For detailed steps, http://elinux.org/RPi_U-Boot)

Once we have SD card prepared for SD booting with u-boot, we add 2 images to
the boot partition of SD card:
 1) U-Boot compatible Xvisor binary (uvmm.bin).
 2) Disk image containing guest binaries (disk.img).

Following are steps to create these images and boot Xvisor on Raspberry Pi:

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

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

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

  [4. Build Xvisor and DTBs]
  # make; make dtbs

  [5. Make U-Boot compatible uvmm.bin for use with bootm command]
  # mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n Xvisor -d build/vmm.bin build/uvmm.bin

  [6. Build Basic Firmware for Realview-EB-MPCore Guest, this creates firmware.bin.patched]
  # make -C tests/arm32/realview-eb-mpcore/basic
  
  [7. Create disk image for Xvisor]
  # mkdir -p ./build/disk/images/arm32/realview-eb-mpcore
  # ./build/tools/dtc/dtc -I dts -O dtb -o ./build/disk/images/arm32/realview-eb-mpcore.dtb ./tests/arm32/realview-eb-mpcore/realview-eb-mpcore.dts
  # cp -f ./build/tests/arm32/realview-eb-mpcore/basic/firmware.bin.patched ./build/disk/images/arm32/realview-eb-mpcore/firmware.bin
  # cp -f ./tests/arm32/realview-eb-mpcore/basic/nor_flash.list ./build/disk/images/arm32/realview-eb-mpcore/nor_flash.list
  # genext2fs -B 1024 -b 16384 -d ./build/disk ./build/disk.img
  OR
  # mkdir -p ./build/disk/images/arm32/realview-eb-mpcore
  # ./build/tools/dtc/dtc -I dts -O dtb -o ./build/disk/images/arm32/realview-eb-mpcore.dtb ./tests/arm32/realview-eb-mpcore/realview-eb-mpcore.dts
  # cp -f ./build/tests/arm32/realview-eb-mpcore/basic/firmware.bin.patched ./build/disk/images/arm32/realview-eb-mpcore/firmware.bin
  # cp -f ./tests/arm32/realview-eb-mpcore/linux/nor_flash.list ./build/disk/images/arm32/realview-eb-mpcore/nor_flash.list
  # cp -f ./tests/arm32/realview-eb-mpcore/linux/cmdlist ./build/disk/images/arm32/realview-eb-mpcore/cmdlist
  # cp -f <linux_build_directory>/arch/arm/boot/Image ./build/disk/images/arm32/realview-eb-mpcore/Image
  # cp -f <busybox_rootfs_directory>/rootfs.img ./build/disk/images/arm32/rootfs.img
  # genext2fs -B 1024 -b 16384 -d ./build/disk ./build/disk.img

  (Note: For creating <linux_build_directory>/arch/arm/boot/Image refer
   <xvisor_source_directory>/tests/arm32/realview-eb-mpcore/linux/README)
  (Note: For creating <busybox_rootfs_directory>/rootfs.img refer
   <xvisor_source_directory>/tests/arm32/common/busybox/README)

  [8. Unplug bootable SD card from Raspberry Pi and plug it on your development machine]

  [9. Mount boot partition (or partition 0) of SD card on your development machine]

  [10. Copy uvmm.bin, DTB, and disk.im to boot partition of SD card]
  # cp -f build/uvmm.bin <path_to_mounted_boot_partition_of_sd_card>
  # cp -f build/arch/arm/board/generic/dts/bcm2835/one_guest_ebmp.dtb <path_to_mounted_boot_partition_of_sd_card>
  # cp -f build/disk.img <path_to_mounted_boot_partition_of_sd_card>

  [11. Unmount boot partition (or partition 0) of SD card from your development machine]

  [12. Unplug SD card from your development machine and plug it back on Raspberry Pi]

  [13. Connect to serial port of Raspberry Pi using Putty or Minicom]

  [14. Power-up or Reset Raspberry Pi and press any key when U-Boot shows auto-boot count down]

  [15. Enable MMC interface from U-Boot command line]
  U-Boot> mmc dev 0:0

  [16. Copy Xvisor from SD card to SDRAM]
  U-Boot> fatload mmc 0 0x00200000 uvmm.bin

  [17. Copy Xvisor DTB from SD card to SDRAM]
  U-Boot> fatload mmc 0 0x00800000 one_guest_ebmp.dtb

  [18. Copy disk image from SD card to SDRAM]
  U-Boot> fatload mmc 0 0x01000000 disk.img

  [19. Jump into Xvisor after disabling MMU, interrupts, etc]
  U-Boot> bootm 0x00200000 - 0x00800000

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

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

  [22. Say 'hi' to Basic Firmware]
  [guest0/uart0] basic# hi

  (Note: If you had linux images loaded in guest NOR flash then
   instead of above step you can start booting linux,
   basic# autoexec)

  [23. Say 'hello' to Basic Firmware]
  [guest0/uart0] basic# hello

  [24. Check various commands of Basic Firmware]
  [guest0/uart0] basic# help

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

  (Note: replace all <> brackets based on your workspace)


	Xvisor on QEMU Raspberry-Pi (or BCM2835 SOC) Host

This section of readme explains how to build & run Xvisor on Raspberry-Pi QEMU
(Raspberry-Pi QEMU source, https://github.com/Torlus/qemu.git).

By default, Xvisor for BCM2835 supports Realview-EB-MPCore guest so we will 
show how to run Basic Firmware (and/or Linux) on Realview-EB-MPCore guest.

Please follow the steps below to build & run Basic Firmware on 
Realview-EB-MPCore guest with Xvisor running on QEMU Raspberry-Pi Host:

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

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

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

  [4. Build Xvisor and DTBs]
  # make; make dtbs

  [5. Build Basic Firmware]
  # make -C tests/arm32/realview-eb-mpcore/basic

  [6. Create disk image for Xvisor]
  # mkdir -p ./build/disk/images/arm32/realview-eb-mpcore
  # ./build/tools/dtc/dtc -I dts -O dtb -o ./build/disk/images/arm32/realview-eb-mpcore.dtb ./tests/arm32/realview-eb-mpcore/realview-eb-mpcore.dts
  # cp -f ./build/tests/arm32/realview-eb-mpcore/basic/firmware.bin.patched ./build/disk/images/arm32/realview-eb-mpcore/firmware.bin
  # cp -f ./tests/arm32/realview-eb-mpcore/basic/nor_flash.list ./build/disk/images/arm32/realview-eb-mpcore/nor_flash.list
  # genext2fs -B 1024 -b 16384 -d ./build/disk ./build/disk.img
  OR
  # mkdir -p ./build/disk/images/arm32/realview-eb-mpcore
  # ./build/tools/dtc/dtc -I dts -O dtb -o ./build/disk/images/arm32/realview-eb-mpcore.dtb ./tests/arm32/realview-eb-mpcore/realview-eb-mpcore.dts
  # cp -f ./build/tests/arm32/realview-eb-mpcore/basic/firmware.bin.patched ./build/disk/images/arm32/realview-eb-mpcore/firmware.bin
  # cp -f ./tests/arm32/realview-eb-mpcore/linux/nor_flash.list ./build/disk/images/arm32/realview-eb-mpcore/nor_flash.list
  # cp -f ./tests/arm32/realview-eb-mpcore/linux/cmdlist ./build/disk/images/arm32/realview-eb-mpcore/cmdlist
  # cp -f <linux_build_directory>/arch/arm/boot/Image ./build/disk/images/arm32/realview-eb-mpcore/Image
  # cp -f <busybox_rootfs_directory>/rootfs.img ./build/disk/images/arm32/rootfs.img
  # genext2fs -B 1024 -b 16384 -d ./build/disk ./build/disk.img

  (Note: For creating <linux_build_directory>/arch/arm/boot/Image refer
   <xvisor_source_directory>/tests/arm32/realview-eb-mpcore/linux/README)
  (Note: For creating <busybox_rootfs_directory>/rootfs.img refer
   <xvisor_source_directory>/tests/arm32/common/busybox/README)

  [7. Create qemu.img for running it on QEMU]
  # ./tools/scripts/memimg.py -a 0x00010000 -o build/qemu.img build/vmm.bin@0x00010000 build/disk.img@0x01000000

  [8. Launch QEMU]
  # qemu-system-arm -M raspi -m 256M -display none -serial stdio -kernel build/qemu.img -dtb build/arch/arm/board/generic/dts/bcm2835/one_guest_ebmp.dtb

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

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

  [11. Say 'hi' to Basic Firmware]
  [guest0/uart0] basic# hi

  (Note: If you had linux images loaded in guest NOR flash then
   instead of above step you can start booting linux,
   basic# autoexec)

  [12. Say 'hello' to Basic Firmware]
  [guest0/uart0] basic# hello

  [13. Check various commands of Basic Firmware]
  [guest0/uart0] basic# help

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

  (Note: replace all <> brackets based on your workspace)

