#include <linux/irq_work.h>
 #include <linux/kernel_stat.h>
 #include <linux/kexec.h>
+#include <linux/kgdb.h>
 #include <linux/kvm_host.h>
 #include <linux/nmi.h>
 
         * with trace_ipi_*
         */
        IPI_CPU_BACKTRACE = NR_IPI,
+       IPI_KGDB_ROUNDUP,
        MAX_IPI
 };
 
        nmi_trigger_cpumask_backtrace(mask, exclude_cpu, arm64_backtrace_ipi);
 }
 
+#ifdef CONFIG_KGDB
+void kgdb_roundup_cpus(void)
+{
+       int this_cpu = raw_smp_processor_id();
+       int cpu;
+
+       for_each_online_cpu(cpu) {
+               /* No need to roundup ourselves */
+               if (cpu == this_cpu)
+                       continue;
+
+               __ipi_send_single(ipi_desc[IPI_KGDB_ROUNDUP], cpu);
+       }
+}
+#endif
+
 /*
  * Main handler for inter-processor interrupts
  */
                nmi_cpu_backtrace(get_irq_regs());
                break;
 
+       case IPI_KGDB_ROUNDUP:
+               kgdb_nmicallback(cpu, get_irq_regs());
+               break;
+
        default:
                pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr);
                break;
        case IPI_CPU_STOP:
        case IPI_CPU_CRASH_STOP:
        case IPI_CPU_BACKTRACE:
+       case IPI_KGDB_ROUNDUP:
                return true;
        default:
                return false;