Move all build and run output to out/$arch/

Most of it was present inside buildroot/output.* and the rest scattered
on top level.

This came about for the n-th time when we were reviewing QEMU trace file
locations.

On one hand, it would be cool to have per arch traces.

This made buildroot/output.${arch}~/ a natural choice.

But on the other, those traces have nothing to do with Buildroot,
and could potentially interfere with Buildroot build files.

It also feels nicer to have buildroot/ pristine source code only,
and keep all output under a single directory out/
This commit is contained in:
Ciro Santilli
2018-03-28 23:57:37 +01:00
parent 01a84e7f79
commit 9fd72c786f
12 changed files with 137 additions and 132 deletions

6
.gitignore vendored
View File

@@ -1,5 +1,4 @@
# Extensions and prefixes. # Extensions and prefixes.
*.html
*.log *.log
*.tmp *.tmp
*~ *~
@@ -7,8 +6,5 @@
gitignore* gitignore*
# Specific files. # Specific files.
/out
/9p /9p
/README.html
# GEM5
/m5out

View File

@@ -127,13 +127,13 @@ git clean -xdf .
To only nuke one architecture, do: To only nuke one architecture, do:
.... ....
rm -rf buildroot/output.x86_64~ rm -rf out/x86_64/buildroot
.... ....
Only nuke one one package: Only nuke one one package:
.... ....
rm -rf buildroot/output.x86_64~/build/host-qemu-custom rm -rf out/x86_64/buildroot/build/host-qemu-custom
./build ./build
.... ....
@@ -335,7 +335,7 @@ So for example when you run:
Stdout shows a line with the full command of type: Stdout shows a line with the full command of type:
.... ....
./buildroot/output.arm~/host/usr/bin/qemu-system-arm -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -M versatilepb -append 'root=/dev/sda nokaslr norandmaps printk.devkmsg=on printk.time=y' -device rtl8139,netdev=net0 -dtb ./buildroot/output.arm~/images/versatile-pb.dtb -kernel ./buildroot/output.arm~/images/zImage -serial stdio -drive file='./buildroot/output.arm~/images/rootfs.ext2.qcow2,if=scsi,format=qcow2' ./out/arm/buildroot/host/usr/bin/qemu-system-arm -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -M versatilepb -append 'root=/dev/sda nokaslr norandmaps printk.devkmsg=on printk.time=y' -device rtl8139,netdev=net0 -dtb ./out/arm/buildroot/images/versatile-pb.dtb -kernel ./out/arm/buildroot/images/zImage -serial stdio -drive file='./out/arm/buildroot/images/rootfs.ext2.qcow2,if=scsi,format=qcow2'
.... ....
This line is also saved to a file for convenience: This line is also saved to a file for convenience:
@@ -516,7 +516,7 @@ Shell 2:
In GDB, hit `Ctrl + C`, and note how it says: In GDB, hit `Ctrl + C`, and note how it says:
.... ....
scanning for modules in /home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64~/build/linux-custom scanning for modules in /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64/buildroot/build/linux-custom
loading @0xffffffffc0000000: ../kernel_module-1.0//timer.ko loading @0xffffffffc0000000: ../kernel_module-1.0//timer.ko
.... ....
@@ -851,13 +851,13 @@ But TODO I don't think you can see where you are in the kernel source code and l
Step debug userland processes to understand how they are talking to the kernel. Step debug userland processes to understand how they are talking to the kernel.
Then in guest: Guest:
.... ....
/gdbserver.sh /myinsmod.out /hello.ko /gdbserver.sh /myinsmod.out /hello.ko
.... ....
In host: Host:
.... ....
./rungdbserver kernel_module-1.0/user/myinsmod.out ./rungdbserver kernel_module-1.0/user/myinsmod.out
@@ -866,12 +866,12 @@ In host:
You can find the executable with: You can find the executable with:
.... ....
find buildroot/output.x86_64~/build -name myinsmod.out find out/x86_64/buildroot/build -name myinsmod.out
.... ....
TODO: automate the path finding: TODO: automate the path finding:
* using the executable from under `buildroot/output.x86_64~/target` would be easier as the path is the same as in guest, but unfortunately those executables are stripped to make the guest smaller. `BR2_STRIP_none=y` should disable stripping, but make the image way larger. * using the executable from under `out/x86_64/buildroot/target` would be easier as the path is the same as in guest, but unfortunately those executables are stripped to make the guest smaller. `BR2_STRIP_none=y` should disable stripping, but make the image way larger.
* `outputx86_64~/staging/` would be even better than `target/` as the docs say that this directory contains binaries before they were stripped. However, only a few binaries are pre-installed there by default, and it seems to be a manual per package thing. * `outputx86_64~/staging/` would be even better than `target/` as the docs say that this directory contains binaries before they were stripped. However, only a few binaries are pre-installed there by default, and it seems to be a manual per package thing.
+ +
E.g. `pciutils` has for `lspci`: E.g. `pciutils` has for `lspci`:
@@ -1158,19 +1158,19 @@ Finally, the docs are lying, arguments with dots that come after `-` are still t
We disable networking by default because it starts an userland process, and we want to keep the number of userland processes to a minimum to make the system more understandable. We disable networking by default because it starts an userland process, and we want to keep the number of userland processes to a minimum to make the system more understandable.
To enable it run: Enable:
.... ....
/sbin/ifup -a /sbin/ifup -a
.... ....
To disable it, run: Disable:
.... ....
/sbin/ifdown -a /sbin/ifdown -a
.... ....
To test it out, try: Test:
.... ....
wget google.com wget google.com
@@ -1314,7 +1314,7 @@ This can be solved by increasing the memory with:
The main ingredients to get initrd working are: The main ingredients to get initrd working are:
* `BR2_TARGET_ROOTFS_CPIO=y`: make Buildroot generate `output/images/rootfs.cpio` in addition to the other images. * `BR2_TARGET_ROOTFS_CPIO=y`: make Buildroot generate `images/rootfs.cpio` in addition to the other images.
+ +
It is also possible to compress that image with other options. It is also possible to compress that image with other options.
* `qemu -initrd`: make QEMU put the image into memory and tell the kernel about it. * `qemu -initrd`: make QEMU put the image into memory and tell the kernel about it.
@@ -1361,7 +1361,7 @@ The `-l` (ell) should only be used the first time you move to / from a different
It is interesting to see how this increases the size of the kernel image if you do a: It is interesting to see how this increases the size of the kernel image if you do a:
.... ....
ls -lh buildroot/output.x86_64~/images/bzImage ls -lh out/x86_64/buildroot/images/bzImage
.... ....
before and after using initramfs, since the `.cpio` is now glued to the kernel image. before and after using initramfs, since the `.cpio` is now glued to the kernel image.
@@ -1404,7 +1404,7 @@ Build configuration can be observed in guest with:
or on host: or on host:
.... ....
cat buildroot/output.*~/build/linux-custom/.config cat out/*/buildroot/build/linux-custom/.config
.... ....
=== Find the kernel version === Find the kernel version
@@ -1614,10 +1614,10 @@ instruction count firmware: 20708
gem5: gem5:
.... ....
./run -a arm -g -E 'm5 exit' ./run -a aarch64 -g -E 'm5 exit'
# Or: # Or:
# ./run -a arm -g -E 'm5 exit' -- --cpu-type=HPI --caches # ./run -a arm -g -E 'm5 exit' -- --cpu-type=HPI --caches
grep sim_insts m5out/stats.txt grep sim_insts out/aarch64/gem5/m5out/stats.txt
.... ....
Notes: Notes:
@@ -1627,7 +1627,7 @@ Notes:
It can be found from: It can be found from:
+ +
.... ....
readelf -e buildroot/output.x86_64~/build/linux-*/vmlinux | grep Entry readelf -e out/x86_64/buildroot/build/linux-*/vmlinux | grep Entry
.... ....
+ +
TODO confirm further. If I try to break there with: TODO confirm further. If I try to break there with:
@@ -2014,7 +2014,7 @@ This has nothing to do with the Linux kernel, but it is cool:
.... ....
sudo apt-get install qemu-user sudo apt-get install qemu-user
./build -a arm ./build -a arm
cd buildroot/output.arm~/target cd out/arm/buildroot/target
qemu-arm -L . bin/ls qemu-arm -L . bin/ls
.... ....
@@ -2088,7 +2088,7 @@ To do it for the Linux kernel boot we have a helper:
You can then inspect the instructions with: You can then inspect the instructions with:
.... ....
less ./buildroot/output.x86_64~/lkmc/trace.txt less ./out/x86_64/qemu/trace.txt
.... ....
This functionality relies on the following setup: This functionality relies on the following setup:
@@ -2121,7 +2121,7 @@ We can further use Binutils' `addr2line` to get the line that corresponds to eac
.... ....
./trace-boot -a x86_64 ./trace-boot -a x86_64
./trace2line -a x86_64 ./trace2line -a x86_64
less ./buildroot/output.x86_64~/lkmc/trace-lines.txt less ./out/x86_64/qemu/trace-lines.txt
.... ....
The format is as follows: The format is as follows:
@@ -2308,7 +2308,7 @@ Now you can play a fun little game with your friends:
To find out why your program is slow, a good first step is to have a look at the statistics for the run: To find out why your program is slow, a good first step is to have a look at the statistics for the run:
.... ....
cat m5out/stats.txt cat out/aarch64/gem5/m5out/stats.txt
.... ....
Whenever we run `m5 dumpstats` or `m5 exit`, a section with the following format is added to that file: Whenever we run `m5 dumpstats` or `m5 exit`, a section with the following format is added to that file:
@@ -2463,7 +2463,7 @@ m5 resetstats && sleep 10 && m5 dumpstats
and then: and then:
.... ....
grep numCycles m5out/stats.txt grep numCycles out/aarch64/gem5/m5out/stats.txt
.... ....
TODO: why doesn't this exist: TODO: why doesn't this exist:
@@ -2585,17 +2585,17 @@ Running a benchmark of a different size requires a rebuild with:
.... ....
./build \ ./build \
-a arm \ -a arm \
-c 'BR2_PACKAGE_PARSEC_BENCHMARK_INPUT_SIZE="simsmall"' \
-c BR2_TARGET_ROOTFS_EXT2_SIZE="500M" \
-g \
-b br2_parsec \ -b br2_parsec \
-c 'BR2_PACKAGE_PARSEC_BENCHMARK_INPUT_SIZE="simsmall"' \
-g \
-- parsec-benchmark-reconfigure \ -- parsec-benchmark-reconfigure \
; ;
.... ....
and then try running the benchmarks as before.
The rebuild is required because some of the input sizes Large input sizes will likely require tweaking <<br2_target_rootfs_ext2_size>>.
The rebuild is required because we unpack input files on the host.
Separating input sizes also allows to create smaller images when only running the smaller benchmarks. Separating input sizes also allows to create smaller images when only running the smaller benchmarks.
@@ -2620,7 +2620,7 @@ Note that dots cannot be used as in `1.5G`, so just use Megs as in `1500M` inste
Unfortunately, TODO we don't have a perfect way to find the right value for `BR2_TARGET_ROOTFS_EXT2_SIZE`. One good heuristic is: Unfortunately, TODO we don't have a perfect way to find the right value for `BR2_TARGET_ROOTFS_EXT2_SIZE`. One good heuristic is:
.... ....
du -hsx buildroot/output.arm-gem5~/target/parsec du -hsx out/arm-gem5/buildroot/target/parsec
.... ....
https://stackoverflow.com/questions/49211241/is-there-a-way-to-automatically-detect-the-minimum-required-br2-target-rootfs-ex https://stackoverflow.com/questions/49211241/is-there-a-way-to-automatically-detect-the-minimum-required-br2-target-rootfs-ex
@@ -2693,10 +2693,10 @@ If you want to remove PARSEC later, Buildroot doesn't provide an automated packa
.... ....
rm -rf \ rm -rf \
./buildroot/dl/parsec-* \ ./buildroot/dl/parsec-* \
./buildroot/output.arm-gem5~/build/parsec-* \ ./out/arm-gem5/buildroot/build/parsec-* \
./buildroot/output.arm-gem5~/build/packages-file-list.txt \ ./out/arm-gem5/buildroot/build/packages-file-list.txt \
./buildroot/output.arm-gem5~/images/rootfs.* \ ./out/arm-gem5/buildroot/images/rootfs.* \
./buildroot/output.arm-gem5~/target/parsec-* \ ./out/arm-gem5/buildroot/target/parsec-* \
; ;
./build -a arm -g ./build -a arm -g
.... ....
@@ -2744,7 +2744,7 @@ This is due mainly to the `pkg-generic` `GLOBAL_INSTRUMENTATION_HOOKS` sanitatio
The pause is followed by: The pause is followed by:
.... ....
buildroot/output.arm~/build/parsec-benchmark-custom/.stamp_target_installed out/arm/buildroot/build/parsec-benchmark-custom/.stamp_target_installed
.... ....
so which shows that the whole delay is inside our install itself. so which shows that the whole delay is inside our install itself.
@@ -2824,7 +2824,7 @@ warn: Couldn't read data from debugger.
I've also tried the fix at: https://stackoverflow.com/questions/27411621/remote-g-packet-reply-is-too-long-aarch64-arm64 by adding to the link:rungdb[] script: I've also tried the fix at: https://stackoverflow.com/questions/27411621/remote-g-packet-reply-is-too-long-aarch64-arm64 by adding to the link:rungdb[] script:
.... ....
-ex 'set tdesc filename buildroot/output.aarch64~/build/gdb-7.11.1/./gdb/features/aarch64.xml' -ex 'set tdesc filename out/aarch64/buildroot/build/gdb-7.11.1/./gdb/features/aarch64.xml'
.... ....
but it did not help. but it did not help.
@@ -2924,7 +2924,7 @@ This makes it easier to remember which checkpoint is which, especially since the
Internals: Internals:
* the checkpoints are stored under `m5out/cpts/$arch/cpt.$todo_whatisthis` * the checkpoints are stored under `out/$arch/gem5/m5out/cpt.$todo_whatisthis`
* <<m5>> is a guest utility present inside the gem5 tree which we cross-compiled and installed into the guest * <<m5>> is a guest utility present inside the gem5 tree which we cross-compiled and installed into the guest
==== gem5 restore checkpoint with a different CPU ==== gem5 restore checkpoint with a different CPU
@@ -2998,9 +2998,9 @@ TODO Now we just need to network them up to have some more fun! See dist-gem5: h
We would like to be able to run both gem5 and QEMU with the same minimal kernel build to: We would like to be able to run both gem5 and QEMU with the same minimal kernel build to:
* do a single Buildroot build for both. Otherwise, we have to create two full `buildroot/output*` directories, which takes up a lot of time. * do a single Buildroot build for both. Otherwise, we have to create two full `out/.*/buildroot/` directories, which takes up a lot of time.
+ +
Alternatively, we could try to be brave and switch between two kernel builds inside `buildroot/output.*/`, but that would be too hackish. Alternatively, we could try to be brave and switch between two kernel builds inside `out/.*/buildroot/`, but that would be too hackish.
* be able to compare behaviour between QEMU and gem5 when one is doing something weird. * be able to compare behaviour between QEMU and gem5 when one is doing something weird.
+ +
Note however that there are also variations which need to be controlled, e.g. kernel command line, DTB and QEMU's non-determinism. Note however that there are also variations which need to be controlled, e.g. kernel command line, DTB and QEMU's non-determinism.
@@ -3023,7 +3023,7 @@ but this strategy failed for the other archs for some reason.
===== QEMU with gem5 kernel configuration ARM ===== QEMU with gem5 kernel configuration ARM
To test this, hack up `run` to use the `buildroot/output.arm-gem5~` directory, and then run: To test this, hack up `run` to use the `out/arm-gem5/buildroot` directory, and then run:
.... ....
./run -a arm ./run -a arm
@@ -3084,27 +3084,27 @@ Boot fails with:
.... ....
--- BEGIN LIBC BACKTRACE --- --- BEGIN LIBC BACKTRACE ---
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z15print_backtracev+0x29)[0x557f6290bc89] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z15print_backtracev+0x29)[0x557f6290bc89]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z12abortHandleri+0x4a)[0x557f6291f88a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z12abortHandleri+0x4a)[0x557f6291f88a]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x13150)[0x7fbb3bd13150] /lib/x86_64-linux-gnu/libpthread.so.0(+0x13150)[0x7fbb3bd13150]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7fbb3a3450bb] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7fbb3a3450bb]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x16d)[0x7fbb3a346f5d] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16d)[0x7fbb3a346f5d]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x4110bf)[0x557f626570bf] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x4110bf)[0x557f626570bf]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA8PS2Mouse11processDataEh+0x12a)[0x557f6264940a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA8PS2Mouse11processDataEh+0x12a)[0x557f6264940a]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA5I80425writeEP6Packet+0xa2c)[0x557f6264bb5c] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA5I80425writeEP6Packet+0xa2c)[0x557f6264bb5c]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN7PioPort10recvAtomicEP6Packet+0x6e)[0x557f6311eace] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN7PioPort10recvAtomicEP6Packet+0x6e)[0x557f6311eace]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15NoncoherentXBar10recvAtomicEP6Packets+0x279)[0x557f62b63969] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15NoncoherentXBar10recvAtomicEP6Packets+0x279)[0x557f62b63969]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6Bridge15BridgeSlavePort10recvAtomicEP6Packet+0x36)[0x557f62b3a7f6] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6Bridge15BridgeSlavePort10recvAtomicEP6Packet+0x36)[0x557f62b3a7f6]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN12CoherentXBar10recvAtomicEP6Packets+0x57b)[0x557f62b4724b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN12CoherentXBar10recvAtomicEP6Packets+0x57b)[0x557f62b4724b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU8writeMemEPhjm5FlagsImEPm+0x49d)[0x557f627fd12d] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU8writeMemEPhjm5FlagsImEPm+0x49d)[0x557f627fd12d]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN17SimpleExecContext8writeMemEPhjm5FlagsImEPm+0x29)[0x557f6280b439] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN17SimpleExecContext8writeMemEPhjm5FlagsImEPm+0x29)[0x557f6280b439]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZNK10X86ISAInst2St7executeEP11ExecContextPN5Trace10InstRecordE+0x29b)[0x557f6301712b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZNK10X86ISAInst2St7executeEP11ExecContextPN5Trace10InstRecordE+0x29b)[0x557f6301712b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU4tickEv+0x3b4)[0x557f627fc054] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU4tickEv+0x3b4)[0x557f627fc054]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN10EventQueue10serviceOneEv+0xd9)[0x557f62912f79] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN10EventQueue10serviceOneEv+0xd9)[0x557f62912f79]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z9doSimLoopP10EventQueue+0x58)[0x557f6292cb88] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z9doSimLoopP10EventQueue+0x58)[0x557f6292cb88]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z8simulatem+0xc1a)[0x557f6292db7a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z8simulatem+0xc1a)[0x557f6292db7a]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x8a9c7b)[0x557f62aefc7b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x8a9c7b)[0x557f62aefc7b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x72d5ab)[0x557f629735ab] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x72d5ab)[0x557f629735ab]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x6e54)[0x7fbb3bfd37e4] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x6e54)[0x7fbb3bfd37e4]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7fbb3c0fdb88] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7fbb3c0fdb88]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7fbb3bfd2580] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7fbb3bfd2580]
@@ -3117,7 +3117,7 @@ Boot fails with:
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7fbb3bfd2580] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7fbb3bfd2580]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7fbb3c0fdb88] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7fbb3c0fdb88]
--- END LIBC BACKTRACE --- --- END LIBC BACKTRACE ---
./run: line 249: 21991 Aborted (core dumped) M5_PATH='/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/system' '/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt' '/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/configs/example/fs.py' --checkpoint-dir='./m5out/cpts/x86_64' --disk-image='/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/images/rootfs.ext2' --mem-size=256MB --num-cpus='1' --kernel=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64~/build/linux-custom/vmlinux --command-line='earlyprintk=ttyS0 console=ttyS0 lpj=7999923 root=/dev/hda nokaslr norandmaps printk.devkmsg=on printk.time=y init=/eval_base64.sh - lkmc_eval="bTUgZXhpdA=="' ./run: line 249: 21991 Aborted (core dumped) M5_PATH='/home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/system' '/home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt' '/home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/configs/example/fs.py' --checkpoint-dir='./m5out/cpts/x86_64' --disk-image='/home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/images/rootfs.ext2' --mem-size=256MB --num-cpus='1' --kernel=/home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64/buildroot/build/linux-custom/vmlinux --command-line='earlyprintk=ttyS0 console=ttyS0 lpj=7999923 root=/dev/hda nokaslr norandmaps printk.devkmsg=on printk.time=y init=/eval_base64.sh - lkmc_eval="bTUgZXhpdA=="'
.... ....
dmesg stops at: dmesg stops at:
@@ -3144,27 +3144,27 @@ If I append `savedefconfig` to our `kernel_config_fragment`:
.... ....
--- BEGIN LIBC BACKTRACE --- --- BEGIN LIBC BACKTRACE ---
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z15print_backtracev+0x29)[0x559636f44c89] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z15print_backtracev+0x29)[0x559636f44c89]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z12abortHandleri+0x4a)[0x559636f5888a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z12abortHandleri+0x4a)[0x559636f5888a]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x13150)[0x7f855f8f3150] /lib/x86_64-linux-gnu/libpthread.so.0(+0x13150)[0x7f855f8f3150]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7f855df250bb] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7f855df250bb]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x16d)[0x7f855df26f5d] /lib/x86_64-linux-gnu/libc.so.6(abort+0x16d)[0x7f855df26f5d]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x4110bf)[0x559636c900bf] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x4110bf)[0x559636c900bf]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA8PS2Mouse11processDataEh+0x12a)[0x559636c8240a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA8PS2Mouse11processDataEh+0x12a)[0x559636c8240a]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA5I80425writeEP6Packet+0xa2c)[0x559636c84b5c] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6X86ISA5I80425writeEP6Packet+0xa2c)[0x559636c84b5c]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN7PioPort10recvAtomicEP6Packet+0x6e)[0x559637757ace] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN7PioPort10recvAtomicEP6Packet+0x6e)[0x559637757ace]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15NoncoherentXBar10recvAtomicEP6Packets+0x279)[0x55963719c969] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15NoncoherentXBar10recvAtomicEP6Packets+0x279)[0x55963719c969]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6Bridge15BridgeSlavePort10recvAtomicEP6Packet+0x36)[0x5596371737f6] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN6Bridge15BridgeSlavePort10recvAtomicEP6Packet+0x36)[0x5596371737f6]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN12CoherentXBar10recvAtomicEP6Packets+0x57b)[0x55963718024b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN12CoherentXBar10recvAtomicEP6Packets+0x57b)[0x55963718024b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU8writeMemEPhjm5FlagsImEPm+0x49d)[0x559636e3612d] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU8writeMemEPhjm5FlagsImEPm+0x49d)[0x559636e3612d]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN17SimpleExecContext8writeMemEPhjm5FlagsImEPm+0x29)[0x559636e44439] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN17SimpleExecContext8writeMemEPhjm5FlagsImEPm+0x29)[0x559636e44439]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZNK10X86ISAInst2St7executeEP11ExecContextPN5Trace10InstRecordE+0x29b)[0x55963765012b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZNK10X86ISAInst2St7executeEP11ExecContextPN5Trace10InstRecordE+0x29b)[0x55963765012b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU4tickEv+0x3b4)[0x559636e35054] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN15AtomicSimpleCPU4tickEv+0x3b4)[0x559636e35054]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN10EventQueue10serviceOneEv+0xd9)[0x559636f4bf79] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_ZN10EventQueue10serviceOneEv+0xd9)[0x559636f4bf79]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z9doSimLoopP10EventQueue+0x58)[0x559636f65b88] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z9doSimLoopP10EventQueue+0x58)[0x559636f65b88]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z8simulatem+0xc1a)[0x559636f66b7a] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(_Z8simulatem+0xc1a)[0x559636f66b7a]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x8a9c7b)[0x559637128c7b] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x8a9c7b)[0x559637128c7b]
/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.x86_64-gem5~/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x72d5ab)[0x559636fac5ab] /home/ciro/bak/git/linux-kernel-module-cheat/out/x86_64-gem5/buildroot/build/gem5-1.0/gem5/build/X86/gem5.opt(+0x72d5ab)[0x559636fac5ab]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x6e54)[0x7f855fbb37e4] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x6e54)[0x7f855fbb37e4]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7f855fcddb88] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x7d8)[0x7f855fcddb88]
/usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7f855fbb2580] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf0)[0x7f855fbb2580]
@@ -3231,7 +3231,7 @@ m5 writefile myfileguest myfilehost
Host: Host:
.... ....
cat m5out/myfilehost cat out/aarch64/gem5/m5out/myfilehost
.... ....
Does not work for subdirectories, gem5 crashes: Does not work for subdirectories, gem5 crashes:
@@ -3247,7 +3247,7 @@ https://stackoverflow.com/questions/49516399/how-to-use-m5-readfile-and-m5-execf
Host: Host:
.... ....
date >m5out/myreadfile date >readfile.gitignore
.... ....
Guest: Guest:
@@ -3359,7 +3359,7 @@ cp br2.gitignore.example br2.gitignore
`make menuconfig` is a convenient way to find Buildroot configurations: `make menuconfig` is a convenient way to find Buildroot configurations:
.... ....
cd buildroot/output.x86_64~ cd out/x86_64/buildroot
make menuconfig make menuconfig
.... ....
@@ -3432,7 +3432,7 @@ If you don't set it, the default is to use `~/.buildroot-ccache` with `5G`, whic
I find it very relaxing to watch ccache at work with: I find it very relaxing to watch ccache at work with:
.... ....
watch -n1 'make -C buildroot/output.x86_64~/ ccache-stats' watch -n1 'make -C out/x86_64/buildroot/ ccache-stats'
.... ....
or if you have it installed on host and the environment variables exported simply with: or if you have it installed on host and the environment variables exported simply with:
@@ -3452,7 +3452,7 @@ Send a pull request if you try it out on something significantly different.
=== Find which packages are making the build slow === Find which packages are making the build slow
.... ....
cd buildroot/output.x86_64~ cd out/x86_64/buildroot
make graph-build graph-depends make graph-build graph-depends
xdg-open graphs/build.pie-packages.pdf xdg-open graphs/build.pie-packages.pdf
xdg-open graphs/graph-depends.pdf xdg-open graphs/graph-depends.pdf

9
br2
View File

@@ -7,6 +7,12 @@ BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_INITRAMFS=n BR2_TARGET_ROOTFS_INITRAMFS=n
BR2_TARGET_ROOTFS_EXT2_SIZE="512M" BR2_TARGET_ROOTFS_EXT2_SIZE="512M"
# We were tempted to do this to disable S40network neatly,
# but that package also creates extra configuration files
# such as /etc/network/interfaces which we need. So we just
# remove the init.d file for now.
#BR2_PACKAGE_IFUPDOWN_SCRIPTS=n
BR2_CCACHE=y BR2_CCACHE=y
# Otherwise our precious debug would break! # Otherwise our precious debug would break!
BR2_CCACHE_USE_BASEDIR=n BR2_CCACHE_USE_BASEDIR=n
@@ -29,9 +35,6 @@ BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_TOOLCHAIN_BUILDROOT_FORTRAN=y BR2_TOOLCHAIN_BUILDROOT_FORTRAN=y
BR2_TOOLCHAIN_BUILDROOT_WCHAR=y BR2_TOOLCHAIN_BUILDROOT_WCHAR=y
# We use our own to turn it on and off at runtime.
BR2_PACKAGE_IFUPDOWN_SCRIPTS=n
# lscpu: TODO not installing? # lscpu: TODO not installing?
BR2_PACKAGE_UTIL_LINUX=y BR2_PACKAGE_UTIL_LINUX=y
BR2_PACKAGE_UTIL_LINUX_BINARIES=y BR2_PACKAGE_UTIL_LINUX_BINARIES=y

15
build
View File

@@ -83,6 +83,7 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
extra_make_args="$extra_make_args $@" extra_make_args="$extra_make_args $@"
set_common_vars "$arch" "$gem5" set_common_vars "$arch" "$gem5"
config_file="${buildroot_out_dir}/.config"
case "$arch" in case "$arch" in
x86_64) x86_64)
defconfig=qemu_x86_64_defconfig defconfig=qemu_x86_64_defconfig
@@ -108,7 +109,7 @@ if "$configure"; then
for p in $(find "${root_dir}/buildroot_patches/" -maxdepth 1 -name '*.patch' -print); do for p in $(find "${root_dir}/buildroot_patches/" -maxdepth 1 -name '*.patch' -print); do
patch -N -r - -p 1 <"$p" || : patch -N -r - -p 1 <"$p" || :
done done
make O="$out_dir" BR2_EXTERNAL="../kernel_module:../gem5:../parsec-benchmark" "$defconfig" make O="$buildroot_out_dir" BR2_EXTERNAL="../kernel_module:../gem5:../parsec-benchmark" "$defconfig"
# TODO Can't get rid of these for now. # TODO Can't get rid of these for now.
# http://stackoverflow.com/questions/44078245/is-it-possible-to-use-config-fragments-with-buildroots-config # http://stackoverflow.com/questions/44078245/is-it-possible-to-use-config-fragments-with-buildroots-config
for config_fragment in $config_fragments; do for config_fragment in $config_fragments; do
@@ -116,6 +117,7 @@ if "$configure"; then
done done
printf " printf "
BR2_JLEVEL=$j BR2_JLEVEL=$j
BR2_DL_DIR=\"${common_dir}/dl\"
BR2_ROOTFS_POST_SCRIPT_ARGS=\"$post_script_args\" BR2_ROOTFS_POST_SCRIPT_ARGS=\"$post_script_args\"
" >> "${config_file}" " >> "${config_file}"
if "$gem5"; then if "$gem5"; then
@@ -151,13 +153,14 @@ BR2_ROOTFS_POST_SCRIPT_ARGS=\"$post_script_args\"
# http://lists.busybox.net/pipermail/buildroot/2017-August/201053.html # http://lists.busybox.net/pipermail/buildroot/2017-August/201053.html
sed -Ei 's/^BR2_PACKAGE_LINUX_TOOLS_GPIO/BR2_PACKAGE_LINUX_TOOLS_GPIO=n/' "${config_file}" sed -Ei 's/^BR2_PACKAGE_LINUX_TOOLS_GPIO/BR2_PACKAGE_LINUX_TOOLS_GPIO=n/' "${config_file}"
fi fi
make O="$out_dir" olddefconfig make O="$buildroot_out_dir" olddefconfig
fi fi
# Build. # Build.
mkdir -p \ mkdir -p \
"${gem5_out_dir}" \
"${qemu_out_dir}" \
"${root_dir}/9p" \ "${root_dir}/9p" \
"${lkmc_out_dir}" \
; ;
cd "${buildroot_dir}" cd "${buildroot_dir}"
# HOST_QEMU_OPTS is a hack that happens to work because the QEMU package luckly uses += at all times. # HOST_QEMU_OPTS is a hack that happens to work because the QEMU package luckly uses += at all times.
@@ -172,10 +175,10 @@ cmd="time \
env \ env \
-u LD_LIBRARY_PATH \ -u LD_LIBRARY_PATH \
make \ make \
O='${out_dir}' \ O='${buildroot_out_dir}' \
HOST_QEMU_OPTS='--enable-debug --extra-cflags=-DDEBUG_PL061=1 --enable-trace-backends=simple $qemu_sdl' \ HOST_QEMU_OPTS='--enable-debug --extra-cflags=-DDEBUG_PL061=1 --enable-trace-backends=simple ${qemu_sdl}' \
V='$v' \ V='$v' \
$extra_make_args \ ${extra_make_args} \
all \ all \
" "
echo "$cmd" | tee "${root_dir}/build.log" echo "$cmd" | tee "${root_dir}/build.log"

View File

@@ -1,2 +1,2 @@
#!/usr/bin/env bash #!/usr/bin/env bash
asciidoctor README.adoc asciidoctor -o out/README.html README.adoc

12
common
View File

@@ -8,8 +8,12 @@ set_common_vars() {
if "$gem5" && [ ! "$arch" = aarch64 ]; then if "$gem5" && [ ! "$arch" = aarch64 ]; then
arch_dir="${arch}-gem5" arch_dir="${arch}-gem5"
fi fi
out_dir="${buildroot_dir}/output.${arch_dir}~" out_dir="${root_dir}/out"
config_file="${out_dir}/.config" out_arch_dir="${out_dir}/${arch_dir}"
lkmc_out_dir="${out_dir}/lkmc" buildroot_out_dir="${out_arch_dir}/buildroot"
images_dir="${out_dir}/images" build_dir="${buildroot_out_dir}/build"
host_dir="${buildroot_out_dir}/host"
gem5_out_dir="${out_arch_dir}/gem5"
qemu_out_dir="${out_arch_dir}/qemu"
common_dir="${out_dir}/common"
} }

33
run
View File

@@ -90,6 +90,7 @@ done
shift "$(($OPTIND - 1))" shift "$(($OPTIND - 1))"
extra_flags="$extra_flags $@" extra_flags="$extra_flags $@"
set_common_vars "$arch" "$gem5" set_common_vars "$arch" "$gem5"
images_dir="${buildroot_out_dir}/images"
if "$debug" && "$kvm"; then if "$debug" && "$kvm"; then
echo 'error: -d and -K are incompatible' 1>&2 echo 'error: -d and -K are incompatible' 1>&2
exit 1 exit 1
@@ -117,29 +118,27 @@ if [ -n "$extra_append_after_dash" ]; then
fi fi
if "$gem5"; then if "$gem5"; then
build_dir="${out_dir}/build/gem5-1.0" gem5_build_dir="${buildroot_out_dir}/build/gem5-1.0"
gem5_src_dir="${gem5_build_dir}/gem5"
memory="${memory}B" memory="${memory}B"
gem5_dir="${build_dir}/gem5"
if [ "$arch" = x86_64 ]; then if [ "$arch" = x86_64 ]; then
gem5_arch=X86 gem5_arch=X86
else else
gem5_arch=ARM gem5_arch=ARM
fi fi
m5out_dir="${root_dir}/m5out" m5out_dir="${gem5_out_dir}/m5out"
gem5_cpt_dir="${m5out_dir}/cpts/${arch}"
mkdir -p "$gem5_cpt_dir"
gem5_common="\ gem5_common="\
M5_PATH='${build_dir}/system' \ M5_PATH='${gem5_build_dir}/system' \
$debug_vm \ ${debug_vm} \
'${gem5_dir}/build/${gem5_arch}/gem5.opt' \ '${gem5_src_dir}/build/${gem5_arch}/gem5.opt' \
${gem5opts} \ ${gem5opts} \
'${gem5_dir}/configs/example/fs.py' \ -d '${m5out_dir}' \
--checkpoint-dir='${gem5_cpt_dir}' \ '${gem5_src_dir}/configs/example/fs.py' \
--disk-image='${out_dir}/images/rootfs.ext2' \ --disk-image='${images_dir}/rootfs.ext2' \
--kernel='${out_dir}/build/linux-custom/vmlinux' \ --kernel='${buildroot_out_dir}/build/linux-custom/vmlinux' \
--mem-size=${memory} \ --mem-size=${memory} \
--num-cpus='${cpus}' \ --num-cpus='${cpus}' \
--script='${m5out_dir}/myreadfile' \ --script='${root_dir}/readfile.gitignore' \
" "
if [ "$arch" = x86_64 ]; then if [ "$arch" = x86_64 ]; then
if "$kvm"; then if "$kvm"; then
@@ -155,7 +154,7 @@ ${extra_flags} \
# Anything smaller than physical blows up as expected, but why can't it auto-detect the right value? # Anything smaller than physical blows up as expected, but why can't it auto-detect the right value?
cmd="${gem5_common} \ cmd="${gem5_common} \
--command-line='earlyprintk=pl011,0x1c090000 console=ttyAMA0 lpj=19988480 rw loglevel=8 mem=${memory} root=/dev/sda ${extra_append}' \ --command-line='earlyprintk=pl011,0x1c090000 console=ttyAMA0 lpj=19988480 rw loglevel=8 mem=${memory} root=/dev/sda ${extra_append}' \
--dtb-file='${gem5_dir}/system/arm/dt/$([ "$arch" = arm ] && echo "armv7_gem5_v1_${cpus}cpu" || echo "armv8_gem5_v1_${cpus}cpu").dtb' \ --dtb-file='${gem5_src_dir}/system/arm/dt/$([ "$arch" = arm ] && echo "armv7_gem5_v1_${cpus}cpu" || echo "armv8_gem5_v1_${cpus}cpu").dtb' \
--machine-type=VExpress_GEM5_V1 \ --machine-type=VExpress_GEM5_V1 \
${extra_flags} \ ${extra_flags} \
" "
@@ -167,15 +166,15 @@ else
extra_flags="${extra_flags_qemu} ${extra_flags}" extra_flags="${extra_flags_qemu} ${extra_flags}"
qemu_common="\ qemu_common="\
${debug_vm} \ ${debug_vm} \
'${out_dir}/host/usr/bin/qemu-system-${arch}' \ '${buildroot_out_dir}/host/usr/bin/qemu-system-${arch}' \
-gdb tcp::1234 \ -gdb tcp::1234 \
-m ${memory} \ -m ${memory} \
-monitor telnet::45454,server,nowait \ -monitor telnet::45454,server,nowait \
-netdev user,hostfwd=tcp::45455-:45455,hostfwd=tcp::45456-:22,id=net0 \ -netdev user,hostfwd=tcp::45455-:45455,hostfwd=tcp::45456-:22,id=net0 \
-smp ${cpus} \ -smp ${cpus} \
-trace enable=${trace_enable},file='${lkmc_out_dir}/trace.bin' \ -trace enable=${trace_enable},file='${qemu_out_dir}/trace.bin' \
-virtfs local,path=9p,mount_tag=host_scratch,security_model=mapped,id=host_scratch \ -virtfs local,path=9p,mount_tag=host_scratch,security_model=mapped,id=host_scratch \
-virtfs local,path=${out_dir}/build,mount_tag=host_out,security_model=mapped,id=host_out \ -virtfs local,path=${buildroot_out_dir}/build,mount_tag=host_out,security_model=mapped,id=host_out \
" "
if "$initrd"; then if "$initrd"; then
extra_flags="${extra_flags} -initrd '${images_dir}/rootfs.cpio'" extra_flags="${extra_flags} -initrd '${images_dir}/rootfs.cpio'"

4
rungdb
View File

@@ -42,8 +42,8 @@ else
port=1234 port=1234
fi fi
set_common_vars "$arch" "$gem5" set_common_vars "$arch" "$gem5"
gdb="${out_dir}/host/usr/bin/${arch}-linux-gdb ${before}" gdb="${host_dir}/usr/bin/${arch}-linux-gdb ${before}"
cd "${out_dir}/build/linux-custom/" cd "${build_dir}/linux-custom/"
if "$kgdb"; then if "$kgdb"; then
cmd="\ cmd="\
${gdb} \ ${gdb} \

View File

@@ -30,8 +30,8 @@ else
brk='' brk=''
fi fi
set_common_vars "$arch" "$gem5" set_common_vars "$arch" "$gem5"
executable="${out_dir}/build/${executable_rel}" executable="${build_dir}/${executable_rel}"
readelf="${out_dir}/host/usr/bin/${arch}-linux-readelf" readelf="${host_dir}/usr/bin/${arch}-linux-readelf"
addr="$("$readelf" -h "$executable" | awk '/Entry/{ print $NF }' )" addr="$("$readelf" -h "$executable" | awk '/Entry/{ print $NF }' )"
ex="-ex \"add-symbol-file $executable $addr\"" ex="-ex \"add-symbol-file $executable $addr\""
# -L or else lx-symbols throws for arm: # -L or else lx-symbols throws for arm:

View File

@@ -16,11 +16,11 @@ done
shift "$(($OPTIND - 1))" shift "$(($OPTIND - 1))"
executable="$1" executable="$1"
set_common_vars "$arch" "$gem5" set_common_vars "$arch" "$gem5"
"${out_dir}/host/usr/bin/${arch}-linux-gdb" \ "${host_dir}/usr/bin/${arch}-linux-gdb" \
-q \ -q \
-ex "set sysroot ${out_dir}/staging" \ -ex "set sysroot ${buildroot_out_dir}/staging" \
-ex 'target remote localhost:45455' \ -ex 'target remote localhost:45455' \
-ex 'tb main' \ -ex 'tb main' \
-ex 'c' \ -ex 'c' \
"${out_dir}/build/${executable}" \ "${build_dir}/${executable}" \
; ;

View File

@@ -11,13 +11,13 @@ while getopts a: OPT; do
done done
set_common_vars "$arch" false set_common_vars "$arch" false
time ./run -a "$arch" -e 'init=/poweroff.out' -T exec_tb time ./run -a "$arch" -e 'init=/poweroff.out' -T exec_tb
time ./qemu/scripts/simpletrace.py "${out_dir}/build/host-qemu-custom/trace-events-all" "${lkmc_out_dir}/trace.bin" >"${lkmc_out_dir}/trace.txt" time ./qemu/scripts/simpletrace.py "${build_dir}/host-qemu-custom/trace-events-all" "${qemu_out_dir}/trace.bin" >"${qemu_out_dir}/trace.txt"
# Instruction count. # Instruction count.
# We could put this on a separate script, but it just adds more arch boilerplate to a new script. # We could put this on a separate script, but it just adds more arch boilerplate to a new script.
# So let's just leave it here for now since it did not add a significant processing time. # So let's just leave it here for now since it did not add a significant processing time.
echo "instruction count all: $(wc -l "${lkmc_out_dir}/trace.txt" | cut -d' ' -f1)" echo "instruction count all: $(wc -l "${qemu_out_dir}/trace.txt" | cut -d' ' -f1)"
entry_addr=$("${out_dir}"/host/bin/*-buildroot-*-readelf -h "${out_dir}/build/linux-custom/vmlinux" | grep 'Entry point address' | sed -E 's/.*: *//') entry_addr=$("${host_dir}"/bin/*-buildroot-*-readelf -h "${build_dir}/linux-custom/vmlinux" | grep 'Entry point address' | sed -E 's/.*: *//')
echo "entry address: ${entry_addr}" echo "entry address: ${entry_addr}"
sed "/${entry_addr}/q" "${lkmc_out_dir}/trace.txt" >"${lkmc_out_dir}/trace-boot.txt" sed "/${entry_addr}/q" "${qemu_out_dir}/trace.txt" >"${qemu_out_dir}/trace-boot.txt"
echo "instruction count firmware: $(wc -l "${lkmc_out_dir}/trace-boot.txt" | cut -d' ' -f1)" echo "instruction count firmware: $(wc -l "${qemu_out_dir}/trace-boot.txt" | cut -d' ' -f1)"

View File

@@ -10,9 +10,9 @@ while getopts a: OPT; do
esac esac
done done
set_common_vars "$arch" false set_common_vars "$arch" false
kernel_dir="${out_dir}/build/linux-custom" kernel_dir="${build_dir}/linux-custom"
sed -E 's/.*pc=//' "${lkmc_out_dir}/trace.txt" | \ sed -E 's/.*pc=//' "${qemu_out_dir}/trace.txt" | \
xargs "${out_dir}/host/bin/${arch}-linux-addr2line" -e "${kernel_dir}/vmlinux" -fp | \ xargs "${host_dir}/bin/${arch}-linux-addr2line" -e "${kernel_dir}/vmlinux" -fp | \
sed -E "s|at ${kernel_dir}/(\./\|)||" | \ sed -E "s|at ${kernel_dir}/(\./\|)||" | \
uniq -c \ uniq -c \
> "${lkmc_out_dir}/trace-lines.txt" > "${qemu_out_dir}/trace-lines.txt"