diff options
-rw-r--r-- | gnu/packages/debug.scm | 216 | ||||
-rw-r--r-- | gnu/packages/virtualization.scm | 28 |
2 files changed, 160 insertions, 84 deletions
diff --git a/gnu/packages/debug.scm b/gnu/packages/debug.scm index ad207bf707..75dd94d868 100644 --- a/gnu/packages/debug.scm +++ b/gnu/packages/debug.scm @@ -28,16 +28,23 @@ #:use-module (guix utils) #:use-module (guix build-system gnu) #:use-module (guix build-system cmake) + #:use-module (gnu packages) + #:use-module (gnu packages attr) #:use-module (gnu packages autotools) #:use-module (gnu packages base) #:use-module (gnu packages bash) + #:use-module (gnu packages bison) #:use-module (gnu packages code) + #:use-module (gnu packages compression) #:use-module (gnu packages flex) #:use-module (gnu packages gdb) #:use-module (gnu packages glib) #:use-module (gnu packages gtk) #:use-module (gnu packages golang) + #:use-module (gnu packages image) + #:use-module (gnu packages linux) #:use-module (gnu packages llvm) + #:use-module (gnu packages ncurses) #:use-module (gnu packages ninja) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) @@ -47,6 +54,7 @@ #:use-module (gnu packages readline) #:use-module (gnu packages serialization) #:use-module (gnu packages virtualization) + #:use-module (gnu packages xdisorg) #:use-module (ice-9 match) #:use-module (srfi srfi-1)) @@ -183,61 +191,7 @@ tools that process C/C++ code.") (file-name (git-file-name name version)))) (build-system gnu-build-system) (inputs - `(("custom-qemu" - ;; The afl-qemu tool builds qemu 2.10.0 with a few patches applied. - ,(package (inherit qemu-minimal-2.10) - (name "afl-qemu") - (inputs - `(("afl-src" ,source) - ,@(package-inputs qemu-minimal))) - ;; afl only supports using a single afl-qemu-trace executable, so - ;; we only build qemu for the native target. - (arguments - `(#:modules ((srfi srfi-1) - ,@%gnu-build-system-modules) - ,@(substitute-keyword-arguments (package-arguments qemu-minimal) - ((#:configure-flags config-flags) - ``(,(string-append "--target-list=" ,machine "-linux-user") - ,@(remove (λ (f) (string-prefix? "--target-list=" f)) - ,config-flags))) - ((#:phases qemu-phases) - `(modify-phases ,qemu-phases - (add-after - 'unpack 'apply-afl-patches - (lambda* (#:key inputs #:allow-other-keys) - (let* ((afl-src (assoc-ref inputs "afl-src")) - (patch-dir "qemu_mode/patches")) - (copy-recursively (string-append afl-src "/" - patch-dir) - patch-dir) - (install-file - (string-append patch-dir - "/afl-qemu-cpu-inl.h") - ".") - (copy-file (string-append afl-src "/config.h") - "./afl-config.h") - (install-file (string-append afl-src "/types.h") - ".") - (substitute* "afl-qemu-cpu-inl.h" - (("\\.\\./\\.\\./config.h") "afl-config.h")) - (substitute* (string-append patch-dir - "/cpu-exec.diff") - (("\\.\\./patches/") "")) - - ;; These were already applied to qemu-minimal-2.10. - (for-each (lambda (obsolete-patch) - (delete-file (string-append - patch-dir "/" - obsolete-patch))) - (list "configure.diff" - "memfd.diff")) - - (for-each (lambda (patch-file) - (invoke "patch" "--force" "-p1" - "--input" patch-file)) - (find-files patch-dir - "\\.diff$")) - #t)))))))))))) + `(("qemu" ,qemu-for-american-fuzzy-lop))) (arguments `(#:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")) (string-append "DOC_PATH=$(PREFIX)/share/doc/" @@ -267,7 +221,7 @@ tools that process C/C++ code.") ;; TODO: Build and install the afl-llvm tool. 'install 'install-qemu (lambda* (#:key inputs outputs #:allow-other-keys) - (let ((qemu (assoc-ref inputs "custom-qemu")) + (let ((qemu (assoc-ref inputs "qemu")) (out (assoc-ref outputs "out"))) (symlink (string-append qemu "/bin/qemu-" ,machine) (string-append out "/bin/afl-qemu-trace")) @@ -285,6 +239,156 @@ useful for seeding other, more labor- or resource-intensive testing regimes down the road.") (license license:asl2.0)))) +(define-public qemu-for-american-fuzzy-lop + ;; afl only supports using a single afl-qemu-trace executable, so + ;; we only build qemu for the native target. + (let ((machine (match (or (%current-target-system) + (%current-system)) + ("x86_64-linux" "x86_64") + ("i686-linux" "i386") + ("aarch64-linux" "aarch64") + ("armhf-linux" "arm") + ("mips64el-linux" "mips64el") + ;; Prevent errors when querying this package on unsupported + ;; platforms, e.g. when running "guix package --search=" + (_ "UNSUPPORTED")))) + (hidden-package + (package + (name "qemu") + (version "2.10.2") + (source (origin + (method url-fetch) + (uri (string-append "https://download.qemu.org/qemu-" + version ".tar.xz")) + (sha256 + (base32 + "17w21spvaxaidi2am5lpsln8yjpyp2zi3s3gc6nsxj5arlgamzgw")) + (patches + (search-patches "qemu-glibc-2.27.patch")))) + (build-system gnu-build-system) + (arguments + `(;; Running tests in parallel can occasionally lead to failures, like: + ;; boot_sector_test: assertion failed (signature == SIGNATURE): (0x00000000 == 0x0000dead) + #:parallel-tests? #f + #:configure-flags + (list (string-append "--target-list=" ,machine "-linux-user")) + #:make-flags '("V=1") + #:phases + (modify-phases %standard-phases + (replace 'configure + (lambda* (#:key inputs outputs (configure-flags '()) + #:allow-other-keys) + ;; The `configure' script doesn't understand some of the + ;; GNU options. Thus, add a new phase that's compatible. + (let ((out (assoc-ref outputs "out"))) + (setenv "SHELL" (which "bash")) + + ;; While we're at it, patch for tests. + (substitute* "tests/libqtest.c" + (("/bin/sh") (which "sh"))) + + ;; The binaries need to be linked against -lrt. + (setenv "LDFLAGS" "-lrt") + (apply invoke + `("./configure" + ,(string-append "--cc=" (which "gcc")) + ;; Some architectures insist on using HOST_CC + ,(string-append "--host-cc=" (which "gcc")) + "--disable-debug-info" ; save build space + "--enable-virtfs" ; just to be sure + ,(string-append "--prefix=" out) + ,(string-append "--sysconfdir=/etc") + ,@configure-flags))))) + (add-after + 'unpack 'apply-afl-patches + (lambda* (#:key inputs #:allow-other-keys) + (let* ((afl-src (assoc-ref inputs "afl-source")) + (patch-dir "qemu_mode/patches")) + (copy-recursively (string-append afl-src "/" + patch-dir) + patch-dir) + (install-file + (string-append patch-dir + "/afl-qemu-cpu-inl.h") + ".") + (copy-file (string-append afl-src "/config.h") + "./afl-config.h") + (install-file (string-append afl-src "/types.h") + ".") + (substitute* "afl-qemu-cpu-inl.h" + (("\\.\\./\\.\\./config.h") "afl-config.h")) + (substitute* (string-append patch-dir + "/cpu-exec.diff") + (("\\.\\./patches/") "")) + + ;; These were already applied to qemu-minimal-2.10. + (for-each (lambda (obsolete-patch) + (delete-file (string-append + patch-dir "/" + obsolete-patch))) + (list "configure.diff" + "memfd.diff")) + + (for-each (lambda (patch-file) + (invoke "patch" "--force" "-p1" + "--input" patch-file)) + (find-files patch-dir + "\\.diff$")) + #t))) + (add-before 'check 'disable-unusable-tests + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "tests/Makefile.include" + ;; Comment out the test-qga test, which needs /sys and + ;; fails within the build environment. + (("check-unit-.* tests/test-qga" all) + (string-append "# " all))) + (substitute* "tests/Makefile.include" + ;; Comment out the test-char test, which needs networking and + ;; fails within the build environment. + (("check-unit-.* tests/test-char" all) + (string-append "# " all))) + #t))))) + (native-inputs + `(("python-2" ,python-2) ; QEMU 2 needs Python 2 + ("glib:bin" ,glib "bin") + ("perl" ,perl) + ("flex" ,flex) + ("bison" ,bison) + ("pkg-config" ,pkg-config))) + (inputs + `(("afl-source" ,(package-source american-fuzzy-lop)) + ("alsa-lib" ,alsa-lib) + ("attr" ,attr) + ("glib" ,glib) + ("libaio" ,libaio) + ("libattr" ,attr) + ("libcap" ,libcap) + ("libjpeg" ,libjpeg-turbo) + ("libpng" ,libpng) + ("ncurses" ,ncurses) + ("pixman" ,pixman) + ("util-linux" ,util-linux) + ("zlib" ,zlib))) + (home-page "https://www.qemu.org") + (synopsis "Machine emulator and virtualizer (without GUI) for american fuzzy lop") + (description + "QEMU is a generic machine emulator and virtualizer. This package +of QEMU is used only by the american fuzzy lop package. + +When used as a machine emulator, QEMU can run OSes and programs made for one +machine (e.g. an ARM board) on a different machine---e.g., your own PC. By +using dynamic translation, it achieves very good performance. + +When used as a virtualizer, QEMU achieves near native performances by +executing the guest code directly on the host CPU. QEMU supports +virtualization when executing under the Xen hypervisor or using +the KVM kernel module in Linux. When using KVM, QEMU can virtualize x86, +server and embedded PowerPC, and S390 guests.") + ;; Many files are GPLv2+, but some are GPLv2-only---e.g., `memory.c'. + (license license:gpl2) + ;; Several tests fail on MIPS. + (supported-systems (delete "mips64el-linux" %supported-systems)))))) + (define-public stress-make (let ((commit "9e92dff8f0157f012aaf31de5b8b8112ad720100") (revision "1")) ;No official source distribution diff --git a/gnu/packages/virtualization.scm b/gnu/packages/virtualization.scm index 03f0ceaeee..b7e2c415fe 100644 --- a/gnu/packages/virtualization.scm +++ b/gnu/packages/virtualization.scm @@ -284,34 +284,6 @@ server and embedded PowerPC, and S390 guests.") '("libusb" "mesa" "sdl2" "spice" "virglrenderer" "gtk+" "usbredir" "libdrm" "libepoxy" "pulseaudio" "vde2"))))) -;; The GRUB test suite fails with later versions of Qemu, so we -;; keep it at 2.10 for now. See -;; <https://lists.gnu.org/archive/html/bug-grub/2018-02/msg00004.html>. -;; This package is hidden since we do not backport updates to it. -(define-public qemu-minimal-2.10 - (hidden-package - (package - (inherit qemu-minimal) - (version "2.10.2") - (source (origin - (method url-fetch) - (uri (string-append "https://download.qemu.org/qemu-" - version ".tar.xz")) - (sha256 - (base32 - "17w21spvaxaidi2am5lpsln8yjpyp2zi3s3gc6nsxj5arlgamzgw")) - (patches - (search-patches "qemu-glibc-2.27.patch")))) - ;; qemu-minimal-2.10 needs Python 2. Remove below once no longer necessary. - (native-inputs `(("python-2" ,python-2) - ,@(fold alist-delete (package-native-inputs qemu-minimal) - '("python-wrapper" "python-sphinx")))) - (inputs - (fold alist-delete (package-inputs qemu-minimal) - ;; Disable seccomp support, because it's not required for the GRUB - ;; test suite, and because it fails with libseccomp 2.4.2 and later. - '("libseccomp")))))) - (define-public libosinfo (package (name "libosinfo") |