		Linux on Xvisor Realview-PB-A8 Guest

Linux is a computer operating system which is based on free and open source
software. the underlying source code can be used, freely modified, and
redistributed, both commercially and non-commercially, by anyone under
licenses such as the GNU General Public License. For more information on
Linux read the wiki page http://en.wikipedia.org/wiki/Linux

Linux already contains a support for Realview-PB-A8 Board. We can use
this kernel unmodified to run it as a xvisor guest. We have also provide
Realview-PB-A8 defconfig for various linux kernel versions for ease in
building kernel. To obtain Linux kernel sources visit the following
url: http://www.kernel.org

Follow the steps below to build & run Linux kernel with Busybox RootFS 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. Configure Xvisor with Generic v7 default settings]
  # make ARCH=arm generic-v7-defconfig

  [4. Build Xvisor & DTBs]
  # make

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

  [6. GoTo Linux source directory]
  # cd <linux_source_directory>

  [7. Configure Linux in build directory]
  # sed -i 's/0xff800000UL/0xff000000UL/' arch/arm/include/asm/pgtable.h
  # cp arch/arm/configs/realview_defconfig arch/arm/configs/tmp-realview-pb-a8_defconfig
  # <xvisor_source_directory>/tests/common/scripts/update-linux-defconfig.sh -p arch/arm/configs/tmp-realview-pb-a8_defconfig -f <xvisor_source_directory>/tests/arm32/realview-pb-a8/linux/linux_extra.config
  # make O=<linux_build_directory> ARCH=arm tmp-realview-pb-a8_defconfig

  [8. Build Linux in build directory]
  # make O=<linux_build_directory> ARCH=arm Image dtbs

  [9. Patch Linux kernel to replace sensitive non-priviledged instructions]
  # <xvisor_source_directory>/arch/arm/cpu/arm32/elf2cpatch.py -f <linux_build_directory>/vmlinux | <xvisor_source_directory>/build/tools/cpatch/cpatch32 <linux_build_directory>/vmlinux 0

  [10. Extract patched Linux kernel image]
  # ${CROSS_COMPILE}objcopy -O binary <linux_build_directory>/vmlinux <linux_build_directory>/arch/arm/boot/Image

  [11. Create BusyBox RAMDISK to be used as RootFS for Linux kernel]
  (Note: For subsequent steps, we will assume that your RAMDISK is located at <busybox_rootfs_directory>/rootfs.img)
  (Note: Please refer tests/common/busybox/README.md for creating rootfs.img using BusyBox)

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

  [13. 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
  # dtc -q -I dts -O dtb -o ./build/disk/images/arm32/realview-pb-a8-guest.dtb ./tests/arm32/realview-pb-a8/realview-pb-a8-guest.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/linux/nor_flash.list ./build/disk/images/arm32/realview-pb-a8/nor_flash.list
  # cp -f ./tests/arm32/realview-pb-a8/linux/cmdlist ./build/disk/images/arm32/realview-pb-a8/cmdlist
  # cp -f ./tests/arm32/realview-pb-a8/xscript/one_guest_pb-a8.xscript ./build/disk/boot.xscript
  # cp -f <linux_build_directory>/arch/arm/boot/Image ./build/disk/images/arm32/realview-pb-a8/Image
  # cp -f <linux_build_directory>/arch/arm/boot/dts/arm-realview-pba8.dtb ./build/disk/images/arm32/realview-pb-a8/arm-realview-pba8.dtb
  # cp -f <busybox_rootfs_directory>/rootfs.img ./build/disk/images/arm32/realview-pb-a8/rootfs.img
  # genext2fs -B 1024 -b 32768 -d ./build/disk ./build/disk.img

  [14. 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

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

  [16. Bind to virtual UART0 of Linux Guest]
  XVisor# vserial bind guest0/uart0

  [17. Copy linux from NOR flash to RAM and start linux booting from RAM]
  [guest0/uart0] basic# autoexec
  (Note: "autoexec" is a short-cut command)
  (Note: The <xvisor_source_directory>/tests/arm32/realview-pb-a8/linux/cmdlist
   file which we have added to guest NOR flash contains set of commands for booting
   linux from NOR flash)

  [18. Wait for Linux prompt to come-up and then try out some commands]
  [guest0/uart0] / # ls

  [19. 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: you are free to change the ordering of above steps based
   on your workspace)
