EXPORT_SYMBOL(panic_notifier_list);
  
  #ifdef CONFIG_SYSCTL
 +
 +/*
 + * Taint values can only be increased
 + * This means we can safely use a temporary.
 + */
 +static int proc_taint(const struct ctl_table *table, int write,
 +                             void *buffer, size_t *lenp, loff_t *ppos)
 +{
 +      struct ctl_table t;
 +      unsigned long tmptaint = get_taint();
 +      int err;
 +
 +      if (write && !capable(CAP_SYS_ADMIN))
 +              return -EPERM;
 +
 +      t = *table;
 +      t.data = &tmptaint;
 +      err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
 +      if (err < 0)
 +              return err;
 +
 +      if (write) {
 +              int i;
 +
 +              /*
 +               * If we are relying on panic_on_taint not producing
 +               * false positives due to userspace input, bail out
 +               * before setting the requested taint flags.
 +               */
 +              if (panic_on_taint_nousertaint && (tmptaint & panic_on_taint))
 +                      return -EINVAL;
 +
 +              /*
 +               * Poor man's atomic or. Not worth adding a primitive
 +               * to everyone's atomic.h for this
 +               */
 +              for (i = 0; i < TAINT_FLAGS_COUNT; i++)
 +                      if ((1UL << i) & tmptaint)
 +                              add_taint(i, LOCKDEP_STILL_OK);
 +      }
 +
 +      return err;
 +}
 +
+ static int sysctl_panic_print_handler(const struct ctl_table *table, int write,
+                          void *buffer, size_t *lenp, loff_t *ppos)
+ {
+       pr_info_once("Kernel: 'panic_print' sysctl interface will be obsoleted by both 'panic_sys_info' and 'panic_console_replay'\n");
+       return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
+ }
+ 
  static const struct ctl_table kern_panic_table[] = {
  #ifdef CONFIG_SMP
        {
                .mode           = 0644,
                .proc_handler   = proc_douintvec,
        },
 +#if (defined(CONFIG_X86_32) || defined(CONFIG_PARISC)) && \
 +      defined(CONFIG_DEBUG_STACKOVERFLOW)
 +      {
 +              .procname       = "panic_on_stackoverflow",
 +              .data           = &sysctl_panic_on_stackoverflow,
 +              .maxlen         = sizeof(int),
 +              .mode           = 0644,
 +              .proc_handler   = proc_dointvec,
 +      },
 +#endif
+       {
+               .procname       = "panic_sys_info",
+               .data           = &panic_print,
+               .maxlen         = sizeof(panic_print),
+               .mode           = 0644,
+               .proc_handler   = sysctl_sys_info_handler,
+       },
  };
  
  static __init int kernel_panic_sysctls_init(void)
 
  
          If unsure, say N.
  
+ config TEST_KEXEC_HANDOVER
+       bool "Test for Kexec HandOver"
+       default n
+       depends on KEXEC_HANDOVER
+       help
+         This option enables test for Kexec HandOver (KHO).
+         The test consists of two parts: saving kernel data before kexec and
+         restoring the data after kexec and verifying that it was properly
+         handed over. This test module creates and saves data on the boot of
+         the first kernel and restores and verifies the data on the boot of
+         kexec'ed kernel.
+ 
+         For detailed documentation about KHO, see Documentation/core-api/kho.
+ 
+         To run the test run:
+ 
+         tools/testing/selftests/kho/vmtest.sh -h
+ 
+         If unsure, say N.
+ 
 +config RATELIMIT_KUNIT_TEST
 +      tristate "KUnit Test for correctness and stress of ratelimit" if !KUNIT_ALL_TESTS
 +      depends on KUNIT
 +      default KUNIT_ALL_TESTS
 +      help
 +        This builds the "test_ratelimit" module that should be used
 +        for correctness verification and concurrent testings of rate
 +        limiting.
 +
 +        If unsure, say N.
  
  config INT_POW_KUNIT_TEST
        tristate "Integer exponentiation (int_pow) test" if !KUNIT_ALL_TESTS