forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-09-20 a36159eec6ca17402b0e146b86efaf76568dc353
kernel/arch/s390/kernel/nmi.c
....@@ -125,7 +125,7 @@
125125 static notrace void s390_handle_damage(void)
126126 {
127127 smp_emergency_stop();
128
- disabled_wait((unsigned long) __builtin_return_address(0));
128
+ disabled_wait();
129129 while (1);
130130 }
131131 NOKPROBE_SYMBOL(s390_handle_damage);
....@@ -148,7 +148,6 @@
148148 local_mcck_disable();
149149 mcck = *this_cpu_ptr(&cpu_mcck);
150150 memset(this_cpu_ptr(&cpu_mcck), 0, sizeof(mcck));
151
- clear_cpu_flag(CIF_MCCK_PENDING);
152151 local_mcck_enable();
153152 local_irq_restore(flags);
154153
....@@ -179,7 +178,7 @@
179178 "malfunction (code 0x%016lx).\n", mcck.mcck_code);
180179 printk(KERN_EMERG "mcck: task: %s, pid: %d.\n",
181180 current->comm, current->pid);
182
- do_exit(SIGSEGV);
181
+ make_task_dead(SIGSEGV);
183182 }
184183 }
185184 EXPORT_SYMBOL_GPL(s390_handle_mcck);
....@@ -333,7 +332,7 @@
333332 /*
334333 * machine check handler.
335334 */
336
-void notrace s390_do_machine_check(struct pt_regs *regs)
335
+int notrace s390_do_machine_check(struct pt_regs *regs)
337336 {
338337 static int ipd_count;
339338 static DEFINE_SPINLOCK(ipd_lock);
....@@ -342,6 +341,7 @@
342341 unsigned long long tmp;
343342 union mci mci;
344343 unsigned long mcck_dam_code;
344
+ int mcck_pending = 0;
345345
346346 nmi_enter();
347347 inc_irq_stat(NMI_NMI);
....@@ -400,7 +400,7 @@
400400 */
401401 mcck->kill_task = 1;
402402 mcck->mcck_code = mci.val;
403
- set_cpu_flag(CIF_MCCK_PENDING);
403
+ mcck_pending = 1;
404404 }
405405
406406 /*
....@@ -420,8 +420,7 @@
420420 mcck->stp_queue |= stp_sync_check();
421421 if (S390_lowcore.external_damage_code & (1U << ED_STP_ISLAND))
422422 mcck->stp_queue |= stp_island_check();
423
- if (mcck->stp_queue)
424
- set_cpu_flag(CIF_MCCK_PENDING);
423
+ mcck_pending = 1;
425424 }
426425
427426 /*
....@@ -442,12 +441,12 @@
442441 if (mci.cp) {
443442 /* Channel report word pending */
444443 mcck->channel_report = 1;
445
- set_cpu_flag(CIF_MCCK_PENDING);
444
+ mcck_pending = 1;
446445 }
447446 if (mci.w) {
448447 /* Warning pending */
449448 mcck->warning = 1;
450
- set_cpu_flag(CIF_MCCK_PENDING);
449
+ mcck_pending = 1;
451450 }
452451
453452 /*
....@@ -462,7 +461,17 @@
462461 *((long *)(regs->gprs[15] + __SF_SIE_REASON)) = -EINTR;
463462 }
464463 clear_cpu_flag(CIF_MCCK_GUEST);
464
+
465
+ if (user_mode(regs) && mcck_pending) {
466
+ nmi_exit();
467
+ return 1;
468
+ }
469
+
470
+ if (mcck_pending)
471
+ schedule_mcck_handler();
472
+
465473 nmi_exit();
474
+ return 0;
466475 }
467476 NOKPROBE_SYMBOL(s390_do_machine_check);
468477