From 9a6f2231b2b3eab3537bc08374e113f8bdcaba85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?=
 <viric@vicerveza.homeunix.net>
Date: Mon, 2 Apr 2012 17:19:21 +0000
Subject: [PATCH] Adding a module for memtest86+, so if enabled, will appear in
 the grub menu.

To enable it:
boot.loader.grub.memtest86 = true;


svn path=/nixos/trunk/; revision=33539
---
 modules/installer/grub/grub-menu-builder.sh |  1 +
 modules/installer/grub/grub.nix             | 10 ++++++-
 modules/installer/grub/memtest.nix          | 33 +++++++++++++++++++++
 modules/module-list.nix                     |  1 +
 4 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 modules/installer/grub/memtest.nix

diff --git a/modules/installer/grub/grub-menu-builder.sh b/modules/installer/grub/grub-menu-builder.sh
index dfe19a9ffe6b..bdf42dd4d790 100644
--- a/modules/installer/grub/grub-menu-builder.sh
+++ b/modules/installer/grub/grub-menu-builder.sh
@@ -240,6 +240,7 @@ if test -n "$copyKernels"; then
     mkdir -p /boot/kernels
 fi
 
+@extraPrepareConfig@
 
 # Additional entries specified verbatim by the configuration.
 extraEntries=`cat <<EOF
diff --git a/modules/installer/grub/grub.nix b/modules/installer/grub/grub.nix
index b7e17c80904f..2d7393b7f870 100644
--- a/modules/installer/grub/grub.nix
+++ b/modules/installer/grub/grub.nix
@@ -12,7 +12,7 @@ let
     inherit grub;
     inherit (pkgs) bash;
     path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
-    inherit (config.boot.loader.grub) copyKernels
+    inherit (config.boot.loader.grub) copyKernels extraPrepareConfig
       extraConfig extraEntries extraEntriesBeforeNixOS extraPerEntryConfig
       splashImage configurationLimit version default timeout;
   };
@@ -85,6 +85,14 @@ in
         '';
       };
 
+      extraPrepareConfig = mkOption {
+        default = "";
+        description = ''
+          Additional bash commands to be run at the script that
+          prepares the grub menu entries.
+        '';
+      };
+
       extraConfig = mkOption {
         default = "";
         example = "serial; terminal_output.serial";
diff --git a/modules/installer/grub/memtest.nix b/modules/installer/grub/memtest.nix
new file mode 100644
index 000000000000..65a5e30d1a54
--- /dev/null
+++ b/modules/installer/grub/memtest.nix
@@ -0,0 +1,33 @@
+# This module adds Memtest86 to the Grub boot menu on the CD.  !!! It
+# would be nice if this also worked for normal configurations.
+
+{config, pkgs, ...}:
+
+with pkgs.lib;
+let
+  isEnabled = config.boot.loader.grub.memtest86;
+in
+{
+  options = {
+    boot.loader.grub.memtest86 = mkOption {
+      default = false;
+      type = types.bool;
+      description = ''
+        Add a menu entry in grub for memtest86+
+      '';
+    };
+  };
+
+  config.boot.loader.grub = mkIf isEnabled {
+    extraEntries = 
+      ''
+        menuentry "Memtest86+" {
+          linux16 $bootRoot/memtest.bin
+        }
+      '';
+    extraPrepareConfig =
+      ''
+        cp ${pkgs.memtest86}/memtest.bin /boot/memtest.bin;
+      '';
+  };
+}
diff --git a/modules/module-list.nix b/modules/module-list.nix
index 27be032f3b7c..fdee87506ad0 100644
--- a/modules/module-list.nix
+++ b/modules/module-list.nix
@@ -25,6 +25,7 @@
   ./installer/efi-boot-stub/efi-boot-stub.nix
   ./installer/generations-dir/generations-dir.nix
   ./installer/grub/grub.nix
+  ./installer/grub/memtest.nix
   ./installer/init-script/init-script.nix
   ./installer/tools/nixos-checkout.nix
   ./installer/tools/tools.nix