summary refs log tree commit diff
path: root/pkgs/development/tools/profiling/systemtap/nixos-kernel-store-path.patch
blob: 5881ed84533f5476342145c51e663fb8333575be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
This patch makes stap(1) know about the kernel store path on NixOS.

--- systemtap-1.2/main.cxx	2010-03-22 22:51:49.000000000 +0100
+++ systemtap-1.2/main.cxx	2010-05-04 14:56:19.000000000 +0200
@@ -528,6 +528,32 @@ getmemusage ()
   return oss.str();
 }
 
+/* Read `/proc/cmdline' and extract the store path.  The assumption is that
+   `/proc/cmdline' looks like this:
+
+   BOOT_IMAGE=/nix/store/sxjd69wfcr6w8jlbcc5bc20nwjliq872-linux-2.6.32.8/bzImage systemConfig=/nix/store/kiicqkjwgfvkwrg4fp3dnhwldh7dq7is-system init=/nix/store/czgncihjwx3n58xij6i1rlnz8wv6ym4j-stage-2-init.sh splash=verbose vga=0x317
+
+   This is the case on NixOS GNU/Linux.  */
+static string
+kernel_store_path (void)
+{
+  ifstream proc_cmdline ("/proc/cmdline");
+  string variable_name, store_path;
+
+  getline (proc_cmdline, variable_name, '=');
+  if (variable_name == "BOOT_IMAGE")
+    {
+      string boot_image_path;
+      size_t slash_pos;
+
+      getline (proc_cmdline, boot_image_path, ' ');
+      slash_pos = boot_image_path.find_last_of ('/');
+      store_path = boot_image_path.substr (0, slash_pos);
+    }
+
+  return store_path;
+}
+
 int
 main (int argc, char * const argv [])
 {
@@ -541,7 +567,8 @@ main (int argc, char * const argv [])
   struct utsname buf;
   (void) uname (& buf);
   s.kernel_release = string (buf.release);
-  s.kernel_build_tree = "/lib/modules/" + s.kernel_release + "/build";
+  s.kernel_build_tree =
+    kernel_store_path () + "/lib/modules/" + s.kernel_release + "/build";
 
   // PR4186: Copy logic from coreutils uname (uname -i) to squash
   // i?86->i386.  Actually, copy logic from linux top-level Makefile