Dmitry,

> Yes, -fsanitize=kernel-address is highly desirable asap. Because
> current scheme is incompatible with inline instrumentation for kernel.
> So we need to start telling people to use -fsanitize=kernel-address as
> early as possible.

Could you check the attached patch which implements
-fsanitize=kernel-address on top of userspace Asan? It worked for us
here. I'm going to send it for GCC upstream review if it works for
you.

-Y

-- 
You received this message because you are subscribed to the Google Groups 
"address-sanitizer" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to address-sanitizer+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index a83f6c6..70f9c2b 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -5376,6 +5376,11 @@ more details.  The run-time behavior can be influenced 
using the
 @url{https://code.google.com/p/address-sanitizer/wiki/Flags#Run-time_flags} for
 a list of supported options.
 
+@item -fsanitize=kernel-address
+@opindex fsanitize=kernel-address
+Enable AddressSanitizer for Linux kernel.
+See 
@uref{http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerForKernel}
 for more details.
+
 @item -fsanitize=thread
 @opindex fsanitize=thread
 Enable ThreadSanitizer, a fast data race detector.
diff --git a/gcc/flag-types.h b/gcc/flag-types.h
index 2849455..04038f6 100644
--- a/gcc/flag-types.h
+++ b/gcc/flag-types.h
@@ -231,6 +231,7 @@ enum sanitize_code {
   SANITIZE_FLOAT_DIVIDE = 1 << 12,
   SANITIZE_FLOAT_CAST = 1 << 13,
   SANITIZE_BOUNDS = 1 << 14,
+  SANITIZE_KERNEL_ADDRESS = 1 << 15,
   SANITIZE_UNDEFINED = SANITIZE_SHIFT | SANITIZE_DIVIDE | SANITIZE_UNREACHABLE
                       | SANITIZE_VLA | SANITIZE_NULL | SANITIZE_RETURN
                       | SANITIZE_SI_OVERFLOW | SANITIZE_BOOL | SANITIZE_ENUM
diff --git a/gcc/opts.c b/gcc/opts.c
index 419a074..42fef36 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1475,6 +1475,7 @@ common_handle_option (struct gcc_options *opts,
              { "float-cast-overflow", SANITIZE_FLOAT_CAST,
                sizeof "float-cast-overflow" - 1 },
              { "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
+             { "kernel-address", SANITIZE_KERNEL_ADDRESS, sizeof 
"kernel-address" - 1 },
              { NULL, 0, 0 }
            };
            const char *comma;
@@ -1520,6 +1521,25 @@ common_handle_option (struct gcc_options *opts,
           the null pointer checks.  */
        if (flag_sanitize & SANITIZE_NULL)
          opts->x_flag_delete_null_pointer_checks = 0;
+
+       /* Kernel ASan implies normal ASan but does not yet support
+          all features.  */
+       if (flag_sanitize & SANITIZE_KERNEL_ADDRESS)
+         {
+           flag_sanitize |= SANITIZE_ADDRESS;
+           maybe_set_param_value 
(PARAM_ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD, 0,
+                                  opts->x_param_values,
+                                  opts_set->x_param_values);
+           maybe_set_param_value (PARAM_ASAN_GLOBALS, 0,
+                                  opts->x_param_values,
+                                  opts_set->x_param_values);
+           maybe_set_param_value (PARAM_ASAN_STACK, 0,
+                                  opts->x_param_values,
+                                  opts_set->x_param_values);
+           maybe_set_param_value (PARAM_ASAN_USE_AFTER_RETURN, 0,
+                                  opts->x_param_values,
+                                  opts_set->x_param_values);
+         }
        break;
       }
 

Reply via email to