Changeset View
Changeset View
Standalone View
Standalone View
lldb/docs/lldb-qemu-aarch64-sve-howto.txt
- This file was added.
################################################################################ | |||||
LLDB Testing on AArch64 SVE Linux using QEMU system mode emulation | |||||
################################################################################ | |||||
QEMU can be used to test LLDB in an emulation environment in the absence of | |||||
actual hardware. This write up will help setup a QEMU environment for testing | |||||
rovka: Nitpick: "in **an** emulation environment in **the** absence of actual [...] | |||||
AArch64 features like SVE, MTE, Pointer Authentication etc. This write can be | |||||
used as reference to setup similar testing environment for other architectures | |||||
Not Done ReplyInline ActionsIsn't this guide still useful after the patches are merged? rovka: Isn't this guide still useful after the patches are merged? | |||||
supported by QEMU emulator. | |||||
Not Done ReplyInline ActionsTypo: all the instructions rovka: Typo: all the instructions | |||||
Ubuntu Bionic/Focal x86_64 host was used to test all the instructions in this | |||||
document. Please update it according to your host distribution/architecture. | |||||
################################################################################ | |||||
# STEP 1 | |||||
################################################################################ | |||||
# Bash script for creating Debian/Ubuntu Linux RootFS for QEMU system emulation | |||||
# Example usage: | |||||
# To create an img file of size 8 GB containing Ubuntu Bionic arm64 rootFS | |||||
# > bash create-qemu-rootfs.sh bionic-arm64 8G bionic arm64 | |||||
################################################################################ | |||||
Not Done ReplyInline ActionsWould it be better for this to be an actual script in lldb/utils or somewhere similar? rovka: Would it be better for this to be an actual script in lldb/utils or somewhere similar? | |||||
#!/bin/bash | |||||
# Prerequisites: | |||||
sudo apt-get install debootstrap qemu-user-static schroot qemu-utils | |||||
if [ $# -gt 3 ]; then | |||||
echo "Your command line contains $# arguments" | |||||
else | |||||
echo "Invalid or no arguments" | |||||
echo "Usage example: create-rootfs-qemu.sh focal-arm64 8G focal arm64" | |||||
echo "focal-arm64 is image name" | |||||
echo "8G is image size in Gigabytes" | |||||
echo "focal is distro name" | |||||
echo "arm64 is rootFS architecture" | |||||
exit | |||||
fi | |||||
RFS_IMG_NAME=$1 | |||||
shift | |||||
RFS_IMG_SIZE_GB=$1 | |||||
labathUnsubmitted Not Done ReplyInline ActionsWhy not just RFS_IMG_SIZE_GB=$2, etc., without all the shifts? labath: Why not just `RFS_IMG_SIZE_GB=$2`, etc., without all the shifts? | |||||
shift | |||||
BOOTSTRAP_DISTRO=$1 | |||||
shift | |||||
BOOTSTRAP_ARCH=$1 | |||||
echo "Root FS image name ... $RFS_IMG_NAME" | |||||
echo "Root FS size in GB ... $RFS_IMG_SIZE_GB" | |||||
echo "Root FS bootstrap distro name ... $BOOTSTRAP_DISTRO" | |||||
echo "Root FS bootstrap distro architecture... $BOOTSTRAP_ARCH" | |||||
qemu-img create $RFS_IMG_NAME.img $RFS_IMG_SIZE_GB | |||||
mkfs.ext4 $RFS_IMG_NAME.img | |||||
mkdir $RFS_IMG_NAME.dir | |||||
sudo mount -o loop $RFS_IMG_NAME.img $RFS_IMG_NAME.dir | |||||
sudo qemu-debootstrap --arch $BOOTSTRAP_ARCH $BOOTSTRAP_DISTRO $RFS_IMG_NAME.dir | |||||
sudo chroot $RFS_IMG_NAME.dir locale-gen en_US.UTF-8 | |||||
sudo chroot $RFS_IMG_NAME.dir sed -i \ | |||||
's/main/main restricted multiverse universe/g' /etc/apt/sources.list | |||||
sudo chroot $RFS_IMG_NAME.dir sed -i '$ a\nameserver 8.8.8.8' /etc/resolv.conf | |||||
sudo chroot $RFS_IMG_NAME.dir apt update | |||||
sudo chroot $RFS_IMG_NAME.dir apt -y install ssh bash-completion | |||||
sudo chroot $RFS_IMG_NAME.dir adduser --gecos "" $USER | |||||
sudo chroot $RFS_IMG_NAME.dir adduser $USER sudo | |||||
sudo umount $RFS_IMG_NAME.dir | |||||
rmdir $RFS_IMG_NAME.dir | |||||
################################################################################ | |||||
# End of STEP 1 | |||||
################################################################################ | |||||
################################################################################ | |||||
# STEP 2 | |||||
# | |||||
Not Done ReplyInline ActionsIs this difficult to infer from QEMU's own docs? If not, maybe just add a link and mention only what's specific to this guide (I'm guessing the target-list). rovka: Is this difficult to infer from QEMU's own docs? If not, maybe just add a link and mention only… | |||||
# Build QEMU from source for AArch64 system-mode emulation | |||||
# | |||||
# Please visit https://wiki.qemu.org/Hosts/Linux for instructions | |||||
# on how to build QEMU from source. | |||||
# | |||||
# In order to enable AArch64 system by QEMU please run configure QEMU resources | |||||
# with following arguments: ./configure --target-list=aarch64-softmmu | |||||
# | |||||
# Please run ./configure --help inside QEMU source directory for a complete | |||||
# list of supported emulation targets. | |||||
################################################################################ | |||||
# Install dependencies | |||||
sudo apt-get build-dep qemu | |||||
sudo apt install libsdl2-dev | |||||
# Checkout source code | |||||
git clone git://git.qemu.org/qemu.git qemu.git | |||||
Not Done ReplyInline ActionsSame as above, could this be just a link to the official docs? rovka: Same as above, could this be just a link to the official docs? | |||||
# Configure and build | |||||
cd qemu.git | |||||
./configure --target-list=aarch64-softmmu | |||||
make | |||||
################################################################################ | |||||
# STEP 3 | |||||
# | |||||
# Cross compile Linux kernel | |||||
################################################################################ | |||||
# Install dependencies | |||||
sudo apt install gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu | |||||
# Checkout source code, select branch and clean up source directory | |||||
git clone \ | |||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux.git | |||||
cd linux.git | |||||
make mrproper | |||||
# kernel_branch=master arch=arm64 config=defconfig | |||||
make O=../linux.build/master/arm64 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ | |||||
defconfig | |||||
make O=../linux.build/master/arm64 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- | |||||
Not Done ReplyInline ActionsSame as step 1: can this live in utils? rovka: Same as step 1: can this live in utils? | |||||
################################################################################ | |||||
# STEP 4 | |||||
# | |||||
# AArch64 SVE System Mode Emulation | |||||
# | |||||
# Bash script given below boots our newly built AArch64 Linux kernel using | |||||
# RootFS img file created in step 1. | |||||
################################################################################ | |||||
#!/bin/bash | |||||
if [ $# -gt 2 ]; then | |||||
echo "Your command line contains $# arguments" | |||||
else | |||||
echo "Invalid or no arguments" | |||||
echo "Usage example: sudo bash run-qemu-emulation.sh \ | |||||
./qemu.git/aarch64-softmmu/qemu-system-aarch64 \ | |||||
./linux.build/master/arm64/ ./bionic-arm64.img" | |||||
echo "First argument is .. qemu-system-aarch64" | |||||
echo "Second argument is .. Linux kernel build directory" | |||||
echo "Third argument is .. RootFS image file" | |||||
exit | |||||
fi | |||||
QEMU_AARCH64=$1 | |||||
shift | |||||
LINUX_BUILD=$1 | |||||
shift | |||||
QEMU_RFS_IMG=$1 | |||||
echo "QEMU AArch64 system emulation executable ... $QEMU_AARCH64" | |||||
echo "Root FS image name ... $QEMU_RFS_IMG" | |||||
echo "Linux ARM64 build directory ... $LINUX_BUILD" | |||||
LINUX_DTBS=$LINUX_BUILD/arch/arm64/boot/dts/ | |||||
QEMU_MACHINE=virt | |||||
QEMU_CPU=max | |||||
QEMU_CORES=2 | |||||
QEMU_MEMORY=2048 | |||||
QEMU_GDBSERVER_HOST_PORT=54321 | |||||
QEMU_GDBSERVER_VM_PORT=54321 | |||||
QEMU_SSH_HOST_PORT=5555 | |||||
$QEMU_AARCH64 \ | |||||
-kernel $LINUX_BUILD/arch/arm64/boot/Image \ | |||||
-M $QEMU_MACHINE \ | |||||
-cpu $QEMU_CPU \ | |||||
-machine type=$QEMU_MACHINE \ | |||||
-smp $QEMU_CORES \ | |||||
-m $QEMU_MEMORY \ | |||||
Not Done ReplyInline ActionsNitpick: For Internet access [...] rovka: Nitpick: **For** Internet access [...] | |||||
-drive file=$QEMU_RFS_IMG,index=0,media=disk,format=raw \ | |||||
-append "root=/dev/vda rw ip=dhcp mem=1024M raid=noautodetect \ | |||||
crashkernel=128M rootwait console=ttyAMA0 devtmpfs.mount=0" \ | |||||
-nographic \ | |||||
-net nic -net user \ | |||||
-nic user,hostfwd=tcp::$QEMU_GDBSERVER_HOST_PORT-:$QEMU_GDBSERVER_VM_PORT,hostfwd=tcp::$QEMU_SSH_HOST_PORT-:22 | |||||
############################################################################### | |||||
# Your default username will be the one with whom you created RootFS image. | |||||
# For internet access inside your emulation environment run: sudo dhclient enp0s2. | |||||
################################################################################ | |||||
# Alternatively setup a tap device on host computer by following this link: | |||||
# https://wiki.qemu.org/Documentation/Networking/NAT | |||||
# | |||||
# Run QEMU emulation using commandline given below: | |||||
$QEMU_AARCH64 \ | |||||
-kernel $LINUX_BUILD/arch/arm64/boot/Image \ | |||||
-M $QEMU_MACHINE \ | |||||
-cpu $QEMU_CPU,sve-max-vq=$QEMU_SVE_MAX_VQ \ | |||||
-machine type=$QEMU_MACHINE \ | |||||
-smp $QEMU_CORES \ | |||||
-m $QEMU_MEMORY \ | |||||
-drive file=$QEMU_RFS_IMG,index=0,media=disk,format=raw \ | |||||
-append "root=/dev/vda rw ip=dhcp mem=1024M raid=noautodetect crashkernel=128M rootwait console=ttyAMA0 devtmpfs.mount=0" \ | |||||
-nographic \ | |||||
-net tap -net nic | |||||
################################################################################ | |||||
# End of STEP 4 | |||||
################################################################################ | |||||
################################################################################ | |||||
# STEP 5 | |||||
# Running lldb-server in QEMU emulation environment | |||||
################################################################################ | |||||
# Login emulation environment and install dependencies | |||||
sudo apt install python-dev libedit-dev libncurses5-dev libexpat1-dev | |||||
# Setup ssh access between host machine and emulation environment | |||||
Not Done ReplyInline ActionsFor consistency, maybe there should be some commands here, or a link to the docs for cross-compiling. rovka: For consistency, maybe there should be some commands here, or a link to the docs for cross… | |||||
# Make sure br0 is enabled on host machine by running: | |||||
ip add | |||||
# Find out ip address assigned to eth0 in emulation environment | |||||
ip add | |||||
# Verify ssh access | |||||
ssh username@ip-address-of-emulation-environment | |||||
# Cross compile LLDB server for AArch64 Linux | |||||
# Please visit https://lldb.llvm.org/resources/build.html for instructions | |||||
# on how to cross compile LLDB server. | |||||
# Transfer LLDB server executable to emulation environment | |||||
scp lldb-server username@ip-address-of-emulation-environment:/home/username |
Nitpick: "in an emulation environment in the absence of actual [...]