regulator: hi6421: Fix getting wrong drvdata
[linux-2.6-microblaze.git] / mm / kasan / hw_tags.c
index 2aad21f..4004388 100644 (file)
@@ -25,6 +25,12 @@ enum kasan_arg {
        KASAN_ARG_ON,
 };
 
+enum kasan_arg_mode {
+       KASAN_ARG_MODE_DEFAULT,
+       KASAN_ARG_MODE_SYNC,
+       KASAN_ARG_MODE_ASYNC,
+};
+
 enum kasan_arg_stacktrace {
        KASAN_ARG_STACKTRACE_DEFAULT,
        KASAN_ARG_STACKTRACE_OFF,
@@ -38,6 +44,7 @@ enum kasan_arg_fault {
 };
 
 static enum kasan_arg kasan_arg __ro_after_init;
+static enum kasan_arg_mode kasan_arg_mode __ro_after_init;
 static enum kasan_arg_stacktrace kasan_arg_stacktrace __ro_after_init;
 static enum kasan_arg_fault kasan_arg_fault __ro_after_init;
 
@@ -45,6 +52,10 @@ static enum kasan_arg_fault kasan_arg_fault __ro_after_init;
 DEFINE_STATIC_KEY_FALSE(kasan_flag_enabled);
 EXPORT_SYMBOL(kasan_flag_enabled);
 
+/* Whether the asynchronous mode is enabled. */
+bool kasan_flag_async __ro_after_init;
+EXPORT_SYMBOL_GPL(kasan_flag_async);
+
 /* Whether to collect alloc/free stack traces. */
 DEFINE_STATIC_KEY_FALSE(kasan_flag_stacktrace);
 
@@ -68,6 +79,23 @@ static int __init early_kasan_flag(char *arg)
 }
 early_param("kasan", early_kasan_flag);
 
+/* kasan.mode=sync/async */
+static int __init early_kasan_mode(char *arg)
+{
+       if (!arg)
+               return -EINVAL;
+
+       if (!strcmp(arg, "sync"))
+               kasan_arg_mode = KASAN_ARG_MODE_SYNC;
+       else if (!strcmp(arg, "async"))
+               kasan_arg_mode = KASAN_ARG_MODE_ASYNC;
+       else
+               return -EINVAL;
+
+       return 0;
+}
+early_param("kasan.mode", early_kasan_mode);
+
 /* kasan.stacktrace=off/on */
 static int __init early_kasan_flag_stacktrace(char *arg)
 {
@@ -115,7 +143,15 @@ void kasan_init_hw_tags_cpu(void)
                return;
 
        hw_init_tags(KASAN_TAG_MAX);
-       hw_enable_tagging();
+
+       /*
+        * Enable async mode only when explicitly requested through
+        * the command line.
+        */
+       if (kasan_arg_mode == KASAN_ARG_MODE_ASYNC)
+               hw_enable_tagging_async();
+       else
+               hw_enable_tagging_sync();
 }
 
 /* kasan_init_hw_tags() is called once on boot CPU. */
@@ -132,6 +168,22 @@ void __init kasan_init_hw_tags(void)
        /* Enable KASAN. */
        static_branch_enable(&kasan_flag_enabled);
 
+       switch (kasan_arg_mode) {
+       case KASAN_ARG_MODE_DEFAULT:
+               /*
+                * Default to sync mode.
+                * Do nothing, kasan_flag_async keeps its default value.
+                */
+               break;
+       case KASAN_ARG_MODE_SYNC:
+               /* Do nothing, kasan_flag_async keeps its default value. */
+               break;
+       case KASAN_ARG_MODE_ASYNC:
+               /* Async mode enabled. */
+               kasan_flag_async = true;
+               break;
+       }
+
        switch (kasan_arg_stacktrace) {
        case KASAN_ARG_STACKTRACE_DEFAULT:
                /* Default to enabling stack trace collection. */
@@ -194,10 +246,16 @@ void kasan_set_tagging_report_once(bool state)
 }
 EXPORT_SYMBOL_GPL(kasan_set_tagging_report_once);
 
-void kasan_enable_tagging(void)
+void kasan_enable_tagging_sync(void)
+{
+       hw_enable_tagging_sync();
+}
+EXPORT_SYMBOL_GPL(kasan_enable_tagging_sync);
+
+void kasan_force_async_fault(void)
 {
-       hw_enable_tagging();
+       hw_force_async_tag_fault();
 }
-EXPORT_SYMBOL_GPL(kasan_enable_tagging);
+EXPORT_SYMBOL_GPL(kasan_force_async_fault);
 
 #endif